blob: fb22d402989b7d6eab00e904db7cd993ac47cc4c [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 we're enabling direct-move or power8-vector go ahead and enable vsx
1552 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1553 // incompatible options.
1554 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001555 if (Name == "direct-move" ||
1556 Name == "power8-vector" ||
1557 Name == "float128" ||
1558 Name == "power9-vector") {
1559 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001560 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001561 if (Name == "power9-vector")
1562 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001563 } else {
1564 Features[Name] = true;
1565 }
1566 } else {
1567 if (Name == "vsx") {
1568 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001569 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001570 } else {
1571 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001572 }
1573 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001574}
1575
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001576const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001577 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1578 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1579 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1580 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1581 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1582 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1583 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1584 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001585 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001586 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001588 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1589 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1590 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1591 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001592 "vrsave", "vscr",
1593 "spe_acc", "spefscr",
1594 "sfp"
1595};
Chris Lattner10a5b382007-01-29 05:24:35 +00001596
Craig Topperf054e3a2015-10-19 03:52:27 +00001597ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1598 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001599}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001600
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001601const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1602 // While some of these aliases do map to different registers
1603 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001604 { { "0" }, "r0" },
1605 { { "1"}, "r1" },
1606 { { "2" }, "r2" },
1607 { { "3" }, "r3" },
1608 { { "4" }, "r4" },
1609 { { "5" }, "r5" },
1610 { { "6" }, "r6" },
1611 { { "7" }, "r7" },
1612 { { "8" }, "r8" },
1613 { { "9" }, "r9" },
1614 { { "10" }, "r10" },
1615 { { "11" }, "r11" },
1616 { { "12" }, "r12" },
1617 { { "13" }, "r13" },
1618 { { "14" }, "r14" },
1619 { { "15" }, "r15" },
1620 { { "16" }, "r16" },
1621 { { "17" }, "r17" },
1622 { { "18" }, "r18" },
1623 { { "19" }, "r19" },
1624 { { "20" }, "r20" },
1625 { { "21" }, "r21" },
1626 { { "22" }, "r22" },
1627 { { "23" }, "r23" },
1628 { { "24" }, "r24" },
1629 { { "25" }, "r25" },
1630 { { "26" }, "r26" },
1631 { { "27" }, "r27" },
1632 { { "28" }, "r28" },
1633 { { "29" }, "r29" },
1634 { { "30" }, "r30" },
1635 { { "31" }, "r31" },
1636 { { "fr0" }, "f0" },
1637 { { "fr1" }, "f1" },
1638 { { "fr2" }, "f2" },
1639 { { "fr3" }, "f3" },
1640 { { "fr4" }, "f4" },
1641 { { "fr5" }, "f5" },
1642 { { "fr6" }, "f6" },
1643 { { "fr7" }, "f7" },
1644 { { "fr8" }, "f8" },
1645 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001646 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001647 { { "fr11" }, "f11" },
1648 { { "fr12" }, "f12" },
1649 { { "fr13" }, "f13" },
1650 { { "fr14" }, "f14" },
1651 { { "fr15" }, "f15" },
1652 { { "fr16" }, "f16" },
1653 { { "fr17" }, "f17" },
1654 { { "fr18" }, "f18" },
1655 { { "fr19" }, "f19" },
1656 { { "fr20" }, "f20" },
1657 { { "fr21" }, "f21" },
1658 { { "fr22" }, "f22" },
1659 { { "fr23" }, "f23" },
1660 { { "fr24" }, "f24" },
1661 { { "fr25" }, "f25" },
1662 { { "fr26" }, "f26" },
1663 { { "fr27" }, "f27" },
1664 { { "fr28" }, "f28" },
1665 { { "fr29" }, "f29" },
1666 { { "fr30" }, "f30" },
1667 { { "fr31" }, "f31" },
1668 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001669};
1670
Craig Topperf054e3a2015-10-19 03:52:27 +00001671ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1672 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001673}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001674
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001675class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001677 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1678 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001680
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001681 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001682 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001683 case llvm::Triple::FreeBSD:
1684 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001685 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001686 PtrDiffType = SignedInt;
1687 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001688 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001689 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001690 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001691 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001692
Roman Divacky3ffe7462012-03-13 19:20:17 +00001693 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1694 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001695 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001696 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001697
1698 // PPC32 supports atomics up to 4 bytes.
1699 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 }
1701
Craig Topper3164f332014-03-11 03:39:26 +00001702 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001703 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001704 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001705 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001706};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001707
Bill Schmidt778d3872013-07-26 01:36:11 +00001708// Note: ABI differences may eventually require us to have a separate
1709// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001710class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001711public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001712 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1713 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001714 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001715 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001716 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001717
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001718 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1719 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001720 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001721 } else {
1722 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001723 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001724 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001725
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001726 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001727 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001728 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001729 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001730 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001731 case llvm::Triple::NetBSD:
1732 IntMaxType = SignedLongLong;
1733 Int64Type = SignedLongLong;
1734 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001735 default:
1736 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001737 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001738
1739 // PPC64 supports atomics up to 8 bytes.
1740 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001741 }
Craig Topper3164f332014-03-11 03:39:26 +00001742 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001743 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001744 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001745 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001746 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001747 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001748 ABI = Name;
1749 return true;
1750 }
1751 return false;
1752 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001753};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001754
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001755class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001756public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001757 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1758 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001759 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001760 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001761 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001762 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001763 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001764 }
Craig Topper3164f332014-03-11 03:39:26 +00001765 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001766 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001767 }
1768};
1769
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001770class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001772 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1773 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001774 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001775 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001776 }
1777};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001778
Eric Christopherc48497a2015-09-18 21:26:24 +00001779static const unsigned NVPTXAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00001780 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00001781 1, // opencl_global
1782 3, // opencl_local
1783 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001784 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001785 0, // opencl_generic
1786 1, // cuda_device
1787 4, // cuda_constant
1788 3, // cuda_shared
1789};
1790
1791class NVPTXTargetInfo : public TargetInfo {
1792 static const char *const GCCRegNames[];
1793 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001794 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001795 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001796
Eric Christopherc48497a2015-09-18 21:26:24 +00001797public:
Justin Lebarb6626592017-01-05 16:53:21 +00001798 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1799 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001800 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001801 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1802 "NVPTX only supports 32- and 64-bit modes.");
1803
Eric Christopherc48497a2015-09-18 21:26:24 +00001804 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001805 AddrSpaceMap = &NVPTXAddrSpaceMap;
1806 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001807
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 // Define available target features
1809 // These must be defined in sorted order!
1810 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001811 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001812
Justin Lebarb6626592017-01-05 16:53:21 +00001813 if (TargetPointerWidth == 32)
1814 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1815 else
1816 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1817
Justin Lebar76945b22016-04-29 23:05:19 +00001818 // If possible, get a TargetInfo for our host triple, so we can match its
1819 // types.
1820 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001821 if (!HostTriple.isNVPTX())
1822 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1823
1824 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001825 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001826 LongWidth = LongAlign = TargetPointerWidth;
1827 PointerWidth = PointerAlign = TargetPointerWidth;
1828 switch (TargetPointerWidth) {
1829 case 32:
1830 SizeType = TargetInfo::UnsignedInt;
1831 PtrDiffType = TargetInfo::SignedInt;
1832 IntPtrType = TargetInfo::SignedInt;
1833 break;
1834 case 64:
1835 SizeType = TargetInfo::UnsignedLong;
1836 PtrDiffType = TargetInfo::SignedLong;
1837 IntPtrType = TargetInfo::SignedLong;
1838 break;
1839 default:
1840 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1841 }
Justin Lebar76945b22016-04-29 23:05:19 +00001842 return;
1843 }
1844
Justin Lebarb6626592017-01-05 16:53:21 +00001845 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001846 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1847 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1848 BoolWidth = HostTarget->getBoolWidth();
1849 BoolAlign = HostTarget->getBoolAlign();
1850 IntWidth = HostTarget->getIntWidth();
1851 IntAlign = HostTarget->getIntAlign();
1852 HalfWidth = HostTarget->getHalfWidth();
1853 HalfAlign = HostTarget->getHalfAlign();
1854 FloatWidth = HostTarget->getFloatWidth();
1855 FloatAlign = HostTarget->getFloatAlign();
1856 DoubleWidth = HostTarget->getDoubleWidth();
1857 DoubleAlign = HostTarget->getDoubleAlign();
1858 LongWidth = HostTarget->getLongWidth();
1859 LongAlign = HostTarget->getLongAlign();
1860 LongLongWidth = HostTarget->getLongLongWidth();
1861 LongLongAlign = HostTarget->getLongLongAlign();
1862 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001863 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001864 DefaultAlignForAttributeAligned =
1865 HostTarget->getDefaultAlignForAttributeAligned();
1866 SizeType = HostTarget->getSizeType();
1867 IntMaxType = HostTarget->getIntMaxType();
1868 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1869 IntPtrType = HostTarget->getIntPtrType();
1870 WCharType = HostTarget->getWCharType();
1871 WIntType = HostTarget->getWIntType();
1872 Char16Type = HostTarget->getChar16Type();
1873 Char32Type = HostTarget->getChar32Type();
1874 Int64Type = HostTarget->getInt64Type();
1875 SigAtomicType = HostTarget->getSigAtomicType();
1876 ProcessIDType = HostTarget->getProcessIDType();
1877
1878 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1879 UseZeroLengthBitfieldAlignment =
1880 HostTarget->useZeroLengthBitfieldAlignment();
1881 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1882 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1883
Justin Lebar5057f172016-09-09 20:35:43 +00001884 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1885 // we need those macros to be identical on host and device, because (among
1886 // other things) they affect which standard library classes are defined, and
1887 // we need all classes to be defined on both the host and device.
1888 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1889
Justin Lebar76945b22016-04-29 23:05:19 +00001890 // Properties intentionally not copied from host:
1891 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1892 // host/device boundary.
1893 // - SuitableAlign: Not visible across the host/device boundary, and may
1894 // correctly be different on host/device, e.g. if host has wider vector
1895 // types than device.
1896 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1897 // as its double type, but that's not necessarily true on the host.
1898 // TODO: nvcc emits a warning when using long double on device; we should
1899 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
1901 void getTargetDefines(const LangOptions &Opts,
1902 MacroBuilder &Builder) const override {
1903 Builder.defineMacro("__PTX__");
1904 Builder.defineMacro("__NVPTX__");
1905 if (Opts.CUDAIsDevice) {
1906 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001907 std::string CUDAArchCode = [this] {
1908 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001909 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001910 assert(false && "No GPU arch when compiling CUDA device code.");
1911 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001912 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001913 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001914 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001915 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001916 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001917 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001918 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001919 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001920 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001921 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001922 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001923 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001924 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001925 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001926 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001927 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001928 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001929 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001930 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001931 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001932 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001933 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001934 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001935 return "620";
1936 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001937 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001938 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001940 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001941 }
Craig Topper6c03a542015-10-19 04:51:35 +00001942 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1943 return llvm::makeArrayRef(BuiltinInfo,
1944 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001945 }
Artem Belevichfda99052016-09-28 17:47:35 +00001946 bool
1947 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1948 StringRef CPU,
1949 const std::vector<std::string> &FeaturesVec) const override {
1950 Features["satom"] = GPU >= CudaArch::SM_60;
1951 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1952 }
1953
Eric Christopherc48497a2015-09-18 21:26:24 +00001954 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001955 return llvm::StringSwitch<bool>(Feature)
1956 .Cases("ptx", "nvptx", true)
1957 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1958 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001959 }
1960
Craig Topperf054e3a2015-10-19 03:52:27 +00001961 ArrayRef<const char *> getGCCRegNames() const override;
1962 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001963 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001964 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001965 }
1966 bool validateAsmConstraint(const char *&Name,
1967 TargetInfo::ConstraintInfo &Info) const override {
1968 switch (*Name) {
1969 default:
1970 return false;
1971 case 'c':
1972 case 'h':
1973 case 'r':
1974 case 'l':
1975 case 'f':
1976 case 'd':
1977 Info.setAllowsRegister();
1978 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001979 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001980 }
1981 const char *getClobbers() const override {
1982 // FIXME: Is this really right?
1983 return "";
1984 }
1985 BuiltinVaListKind getBuiltinVaListKind() const override {
1986 // FIXME: implement
1987 return TargetInfo::CharPtrBuiltinVaList;
1988 }
1989 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001990 GPU = StringToCudaArch(Name);
1991 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001992 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001993 void setSupportedOpenCLOpts() override {
1994 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001995 Opts.support("cl_clang_storage_class_specifiers");
1996 Opts.support("cl_khr_gl_sharing");
1997 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001998
Yaxun Liu5b746652016-12-18 05:18:55 +00001999 Opts.support("cl_khr_fp64");
2000 Opts.support("cl_khr_byte_addressable_store");
2001 Opts.support("cl_khr_global_int32_base_atomics");
2002 Opts.support("cl_khr_global_int32_extended_atomics");
2003 Opts.support("cl_khr_local_int32_base_atomics");
2004 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002005 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002006
2007 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2008 // CUDA compilations support all of the host's calling conventions.
2009 //
2010 // TODO: We should warn if you apply a non-default CC to anything other than
2011 // a host function.
2012 if (HostTarget)
2013 return HostTarget->checkCallingConvention(CC);
2014 return CCCR_Warning;
2015 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002016};
2017
2018const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2019#define BUILTIN(ID, TYPE, ATTRS) \
2020 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2021#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2022 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002023#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2024 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002025#include "clang/Basic/BuiltinsNVPTX.def"
2026};
2027
2028const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2029
Craig Topperf054e3a2015-10-19 03:52:27 +00002030ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2031 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002032}
2033
Yaxun Liu3464f922017-03-25 03:46:25 +00002034static const LangAS::Map AMDGPUPrivateIsZeroMap = {
Yaxun Liub34ec822017-04-11 17:24:23 +00002035 4, // Default
Yaxun Liu3464f922017-03-25 03:46:25 +00002036 1, // opencl_global
2037 3, // opencl_local
2038 2, // opencl_constant
2039 4, // opencl_generic
2040 1, // cuda_device
2041 2, // cuda_constant
2042 3 // cuda_shared
2043};
2044static const LangAS::Map AMDGPUGenericIsZeroMap = {
Yaxun Liub34ec822017-04-11 17:24:23 +00002045 0, // Default
Yaxun Liu3464f922017-03-25 03:46:25 +00002046 1, // opencl_global
2047 3, // opencl_local
Yaxun Liub122ed92017-04-06 19:18:36 +00002048 2, // opencl_constant
Yaxun Liu3464f922017-03-25 03:46:25 +00002049 0, // opencl_generic
2050 1, // cuda_device
Yaxun Liub122ed92017-04-06 19:18:36 +00002051 2, // cuda_constant
Yaxun Liu3464f922017-03-25 03:46:25 +00002052 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002053};
2054
Tom Stellarda96344b2014-08-21 13:58:40 +00002055// If you edit the description strings, make sure you update
2056// getPointerWidthV().
2057
Craig Topper273dbc62015-10-18 05:29:26 +00002058static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002059 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2060 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002061
Yaxun Liu3464f922017-03-25 03:46:25 +00002062static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002063 "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 +00002064 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2065 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002066
Yaxun Liu3464f922017-03-25 03:46:25 +00002067static const char *const DataLayoutStringSIGenericIsZero =
Yaxun Liub122ed92017-04-06 19:18:36 +00002068 "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 +00002069 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
Yaxun Liub34ec822017-04-11 17:24:23 +00002070 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64-A5";
Yaxun Liu3464f922017-03-25 03:46:25 +00002071
Matt Arsenault250024f2016-06-08 01:56:42 +00002072class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002073 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002074 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002075
Yaxun Liu3464f922017-03-25 03:46:25 +00002076 struct AddrSpace {
2077 unsigned Generic, Global, Local, Constant, Private;
2078 AddrSpace(bool IsGenericZero_ = false){
2079 if (IsGenericZero_) {
2080 Generic = 0;
2081 Global = 1;
2082 Local = 3;
Yaxun Liub122ed92017-04-06 19:18:36 +00002083 Constant = 2;
Yaxun Liu3464f922017-03-25 03:46:25 +00002084 Private = 5;
2085 } else {
2086 Generic = 4;
2087 Global = 1;
2088 Local = 3;
2089 Constant = 2;
2090 Private = 0;
2091 }
2092 }
2093 };
2094
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002095 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002096 enum GPUKind {
2097 GK_NONE,
2098 GK_R600,
2099 GK_R600_DOUBLE_OPS,
2100 GK_R700,
2101 GK_R700_DOUBLE_OPS,
2102 GK_EVERGREEN,
2103 GK_EVERGREEN_DOUBLE_OPS,
2104 GK_NORTHERN_ISLANDS,
2105 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002106 GK_GFX6,
2107 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002108 GK_GFX8,
2109 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002110 } GPU;
2111
Jan Veselyeebeaea2015-05-04 19:53:36 +00002112 bool hasFP64:1;
2113 bool hasFMAF:1;
2114 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002115 bool hasFullSpeedFP32Denorms:1;
Yaxun Liu354097b2017-03-25 11:34:41 +00002116 const AddrSpace AS;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002117
Matt Arsenault250024f2016-06-08 01:56:42 +00002118 static bool isAMDGCN(const llvm::Triple &TT) {
2119 return TT.getArch() == llvm::Triple::amdgcn;
2120 }
2121
Yaxun Liu3464f922017-03-25 03:46:25 +00002122 static bool isGenericZero(const llvm::Triple &TT) {
2123 return TT.getEnvironmentName() == "amdgiz" ||
2124 TT.getEnvironmentName() == "amdgizcl";
2125 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002126public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002127 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002128 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002129 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002130 hasFP64(false),
2131 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002132 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002133 hasFullSpeedFP32Denorms(false),
2134 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002135 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002136 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002137 hasFMAF = true;
2138 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002139 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002140 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002141 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002142 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2143 DataLayoutStringSIPrivateIsZero)
2144 : DataLayoutStringR600);
Yaxun Liub34ec822017-04-11 17:24:23 +00002145 assert(DataLayout->getAllocaAddrSpace() == AS.Private);
Matt Arsenault250024f2016-06-08 01:56:42 +00002146
Yaxun Liu3464f922017-03-25 03:46:25 +00002147 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2148 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002149 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002150 }
2151
Tom Stellarda96344b2014-08-21 13:58:40 +00002152 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2153 if (GPU <= GK_CAYMAN)
2154 return 32;
2155
Yaxun Liu3464f922017-03-25 03:46:25 +00002156 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2157 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002158 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002159 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002160 }
2161
Yaxun Liu26f75662016-08-19 05:17:25 +00002162 uint64_t getMaxPointerWidth() const override {
2163 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2164 }
2165
Craig Topper3164f332014-03-11 03:39:26 +00002166 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002167 return "";
2168 }
2169
Craig Topperf054e3a2015-10-19 03:52:27 +00002170 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002171
Craig Topperf054e3a2015-10-19 03:52:27 +00002172 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2173 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002174 }
2175
Craig Topper3164f332014-03-11 03:39:26 +00002176 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002177 TargetInfo::ConstraintInfo &Info) const override {
2178 switch (*Name) {
2179 default: break;
2180 case 'v': // vgpr
2181 case 's': // sgpr
2182 Info.setAllowsRegister();
2183 return true;
2184 }
2185 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002186 }
2187
Matt Arsenault250024f2016-06-08 01:56:42 +00002188 bool initFeatureMap(llvm::StringMap<bool> &Features,
2189 DiagnosticsEngine &Diags, StringRef CPU,
2190 const std::vector<std::string> &FeatureVec) const override;
2191
Yaxun Liu2c17e822016-08-09 19:43:38 +00002192 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2193 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002194 bool hasFP32Denormals = false;
2195 bool hasFP64Denormals = false;
2196 for (auto &I : TargetOpts.FeaturesAsWritten) {
2197 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2198 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002199 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002200 hasFP64Denormals = true;
2201 }
2202 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002203 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2204 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002205 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002206 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002207 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002208 }
2209
Craig Topper6c03a542015-10-19 04:51:35 +00002210 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2211 return llvm::makeArrayRef(BuiltinInfo,
2212 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002213 }
2214
Craig Topper3164f332014-03-11 03:39:26 +00002215 void getTargetDefines(const LangOptions &Opts,
2216 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002217 if (getTriple().getArch() == llvm::Triple::amdgcn)
2218 Builder.defineMacro("__AMDGCN__");
2219 else
2220 Builder.defineMacro("__R600__");
2221
Jan Veselyeebeaea2015-05-04 19:53:36 +00002222 if (hasFMAF)
2223 Builder.defineMacro("__HAS_FMAF__");
2224 if (hasLDEXPF)
2225 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002226 if (hasFP64)
2227 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002228 }
2229
Craig Topper3164f332014-03-11 03:39:26 +00002230 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002231 return TargetInfo::CharPtrBuiltinVaList;
2232 }
2233
Matt Arsenault250024f2016-06-08 01:56:42 +00002234 static GPUKind parseR600Name(StringRef Name) {
2235 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002236 .Case("r600" , GK_R600)
2237 .Case("rv610", GK_R600)
2238 .Case("rv620", GK_R600)
2239 .Case("rv630", GK_R600)
2240 .Case("rv635", GK_R600)
2241 .Case("rs780", GK_R600)
2242 .Case("rs880", GK_R600)
2243 .Case("rv670", GK_R600_DOUBLE_OPS)
2244 .Case("rv710", GK_R700)
2245 .Case("rv730", GK_R700)
2246 .Case("rv740", GK_R700_DOUBLE_OPS)
2247 .Case("rv770", GK_R700_DOUBLE_OPS)
2248 .Case("palm", GK_EVERGREEN)
2249 .Case("cedar", GK_EVERGREEN)
2250 .Case("sumo", GK_EVERGREEN)
2251 .Case("sumo2", GK_EVERGREEN)
2252 .Case("redwood", GK_EVERGREEN)
2253 .Case("juniper", GK_EVERGREEN)
2254 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2255 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2256 .Case("barts", GK_NORTHERN_ISLANDS)
2257 .Case("turks", GK_NORTHERN_ISLANDS)
2258 .Case("caicos", GK_NORTHERN_ISLANDS)
2259 .Case("cayman", GK_CAYMAN)
2260 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002261 .Default(GK_NONE);
2262 }
2263
2264 static GPUKind parseAMDGCNName(StringRef Name) {
2265 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002266 .Case("tahiti", GK_GFX6)
2267 .Case("pitcairn", GK_GFX6)
2268 .Case("verde", GK_GFX6)
2269 .Case("oland", GK_GFX6)
2270 .Case("hainan", GK_GFX6)
2271 .Case("bonaire", GK_GFX7)
2272 .Case("kabini", GK_GFX7)
2273 .Case("kaveri", GK_GFX7)
2274 .Case("hawaii", GK_GFX7)
2275 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002276 .Case("gfx700", GK_GFX7)
2277 .Case("gfx701", GK_GFX7)
2278 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002279 .Case("tonga", GK_GFX8)
2280 .Case("iceland", GK_GFX8)
2281 .Case("carrizo", GK_GFX8)
2282 .Case("fiji", GK_GFX8)
2283 .Case("stoney", GK_GFX8)
2284 .Case("polaris10", GK_GFX8)
2285 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002286 .Case("gfx800", GK_GFX8)
2287 .Case("gfx801", GK_GFX8)
2288 .Case("gfx802", GK_GFX8)
2289 .Case("gfx803", GK_GFX8)
2290 .Case("gfx804", GK_GFX8)
2291 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002292 .Case("gfx900", GK_GFX9)
2293 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002294 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002295 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002296
Matt Arsenault250024f2016-06-08 01:56:42 +00002297 bool setCPU(const std::string &Name) override {
2298 if (getTriple().getArch() == llvm::Triple::amdgcn)
2299 GPU = parseAMDGCNName(Name);
2300 else
2301 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002302
Matt Arsenault250024f2016-06-08 01:56:42 +00002303 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002304 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002305
Jan Vesely211ba782016-06-17 02:25:03 +00002306 void setSupportedOpenCLOpts() override {
2307 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002308 Opts.support("cl_clang_storage_class_specifiers");
2309 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002310
Jan Vesely211ba782016-06-17 02:25:03 +00002311 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002312 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002313 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002314 Opts.support("cl_khr_byte_addressable_store");
2315 Opts.support("cl_khr_global_int32_base_atomics");
2316 Opts.support("cl_khr_global_int32_extended_atomics");
2317 Opts.support("cl_khr_local_int32_base_atomics");
2318 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002319 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002320 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002321 Opts.support("cl_khr_fp16");
2322 Opts.support("cl_khr_int64_base_atomics");
2323 Opts.support("cl_khr_int64_extended_atomics");
2324 Opts.support("cl_khr_mipmap_image");
2325 Opts.support("cl_khr_subgroups");
2326 Opts.support("cl_khr_3d_image_writes");
2327 Opts.support("cl_amd_media_ops");
2328 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002329 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002330 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002331
Yaxun Liu99444cb2016-08-03 20:38:06 +00002332 LangAS::ID getOpenCLImageAddrSpace() const override {
2333 return LangAS::opencl_constant;
2334 }
2335
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002336 /// \returns Target specific vtbl ptr address space.
2337 unsigned getVtblPtrAddressSpace() const override {
2338 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2339 // would be nice if we could use it here instead of using bare numbers (same
2340 // applies to getDWARFAddressSpace).
2341 return 2; // constant.
2342 }
2343
2344 /// \returns If a target requires an address within a target specific address
2345 /// space \p AddressSpace to be converted in order to be used, then return the
2346 /// corresponding target specific DWARF address space.
2347 ///
2348 /// \returns Otherwise return None and no conversion will be emitted in the
2349 /// DWARF.
2350 Optional<unsigned> getDWARFAddressSpace(
2351 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002352 const unsigned DWARF_Private = 1;
2353 const unsigned DWARF_Local = 2;
2354 if (AddressSpace == AS.Private) {
2355 return DWARF_Private;
2356 } else if (AddressSpace == AS.Local) {
2357 return DWARF_Local;
2358 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002359 return None;
2360 }
2361 }
2362
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002363 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2364 switch (CC) {
2365 default:
2366 return CCCR_Warning;
2367 case CC_C:
2368 case CC_OpenCLKernel:
2369 return CCCR_OK;
2370 }
2371 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002372
2373 // In amdgcn target the null pointer in global, constant, and generic
2374 // address space has value 0 but in private and local address space has
2375 // value ~0.
2376 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002377 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002378 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002379};
2380
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002381const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002382#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002383 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002384#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2385 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002386#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002387};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002388const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002389 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2390 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2391 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2392 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2393 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2394 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2395 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2396 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2397 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2398 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2399 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2400 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2401 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2402 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2403 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2404 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2405 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2406 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2407 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2408 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2409 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2410 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2411 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2412 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2413 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2414 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2415 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2416 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2417 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2418 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2419 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2420 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2421 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2422 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2423 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2424 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2425 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2426 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2427 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2428 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2429 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2430 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2431 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2432 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2433 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2434 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2435 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002436 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002437 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2438 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002439};
2440
Craig Topperf054e3a2015-10-19 03:52:27 +00002441ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2442 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002443}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002444
Matt Arsenault250024f2016-06-08 01:56:42 +00002445bool AMDGPUTargetInfo::initFeatureMap(
2446 llvm::StringMap<bool> &Features,
2447 DiagnosticsEngine &Diags, StringRef CPU,
2448 const std::vector<std::string> &FeatureVec) const {
2449
2450 // XXX - What does the member GPU mean if device name string passed here?
2451 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2452 if (CPU.empty())
2453 CPU = "tahiti";
2454
2455 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002456 case GK_GFX6:
2457 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002458 break;
2459
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002460 case GK_GFX9:
2461 Features["gfx9-insts"] = true;
2462 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002463 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002464 Features["s-memrealtime"] = true;
2465 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002466 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002467 break;
2468
2469 case GK_NONE:
2470 return false;
2471 default:
2472 llvm_unreachable("unhandled subtarget");
2473 }
2474 } else {
2475 if (CPU.empty())
2476 CPU = "r600";
2477
2478 switch (parseR600Name(CPU)) {
2479 case GK_R600:
2480 case GK_R700:
2481 case GK_EVERGREEN:
2482 case GK_NORTHERN_ISLANDS:
2483 break;
2484 case GK_R600_DOUBLE_OPS:
2485 case GK_R700_DOUBLE_OPS:
2486 case GK_EVERGREEN_DOUBLE_OPS:
2487 case GK_CAYMAN:
2488 Features["fp64"] = true;
2489 break;
2490 case GK_NONE:
2491 return false;
2492 default:
2493 llvm_unreachable("unhandled subtarget");
2494 }
2495 }
2496
2497 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2498}
2499
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002500const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002501#define BUILTIN(ID, TYPE, ATTRS) \
2502 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002503#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002504 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002505#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2506 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002507#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002508
2509#define BUILTIN(ID, TYPE, ATTRS) \
2510 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002511#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2512 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002513#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2514 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2515#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002516};
Eli Friedmanb5366062008-05-20 14:21:01 +00002517
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002518
Nuno Lopescfca1f02009-12-23 17:49:57 +00002519static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002520 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2521 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002522 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002523 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2524 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2525 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002526 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002527 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2528 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002529 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2530 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2531 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2532 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2533 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2534 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2535 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2536 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002537 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002538};
2539
Eric Christophercdd36352011-06-21 00:05:20 +00002540const TargetInfo::AddlRegName AddlRegNames[] = {
2541 { { "al", "ah", "eax", "rax" }, 0 },
2542 { { "bl", "bh", "ebx", "rbx" }, 3 },
2543 { { "cl", "ch", "ecx", "rcx" }, 2 },
2544 { { "dl", "dh", "edx", "rdx" }, 1 },
2545 { { "esi", "rsi" }, 4 },
2546 { { "edi", "rdi" }, 5 },
2547 { { "esp", "rsp" }, 7 },
2548 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002549 { { "r8d", "r8w", "r8b" }, 38 },
2550 { { "r9d", "r9w", "r9b" }, 39 },
2551 { { "r10d", "r10w", "r10b" }, 40 },
2552 { { "r11d", "r11w", "r11b" }, 41 },
2553 { { "r12d", "r12w", "r12b" }, 42 },
2554 { { "r13d", "r13w", "r13b" }, 43 },
2555 { { "r14d", "r14w", "r14b" }, 44 },
2556 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002557};
2558
2559// X86 target abstract base class; x86-32 and x86-64 are very close, so
2560// most of the implementation can be shared.
2561class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002562 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002563 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002564 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002565 enum MMX3DNowEnum {
2566 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002567 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002568 enum XOPEnum {
2569 NoXOP,
2570 SSE4A,
2571 FMA4,
2572 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002573 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002574
Craig Topper543f3bd2015-10-14 23:47:57 +00002575 bool HasAES = false;
2576 bool HasPCLMUL = false;
2577 bool HasLZCNT = false;
2578 bool HasRDRND = false;
2579 bool HasFSGSBASE = false;
2580 bool HasBMI = false;
2581 bool HasBMI2 = false;
2582 bool HasPOPCNT = false;
2583 bool HasRTM = false;
2584 bool HasPRFCHW = false;
2585 bool HasRDSEED = false;
2586 bool HasADX = false;
2587 bool HasTBM = false;
2588 bool HasFMA = false;
2589 bool HasF16C = false;
2590 bool HasAVX512CD = false;
2591 bool HasAVX512ER = false;
2592 bool HasAVX512PF = false;
2593 bool HasAVX512DQ = false;
2594 bool HasAVX512BW = false;
2595 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002596 bool HasAVX512VBMI = false;
2597 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002598 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002599 bool HasMPX = false;
2600 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002601 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002602 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002603 bool HasXSAVE = false;
2604 bool HasXSAVEOPT = false;
2605 bool HasXSAVEC = false;
2606 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002607 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002608 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002609 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002610 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002611 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002612 bool HasMOVBE = false;
2613 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002614
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002615 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2616 ///
2617 /// Each enumeration represents a particular CPU supported by Clang. These
2618 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2619 enum CPUKind {
2620 CK_Generic,
2621
2622 /// \name i386
2623 /// i386-generation processors.
2624 //@{
2625 CK_i386,
2626 //@}
2627
2628 /// \name i486
2629 /// i486-generation processors.
2630 //@{
2631 CK_i486,
2632 CK_WinChipC6,
2633 CK_WinChip2,
2634 CK_C3,
2635 //@}
2636
2637 /// \name i586
2638 /// i586-generation processors, P5 microarchitecture based.
2639 //@{
2640 CK_i586,
2641 CK_Pentium,
2642 CK_PentiumMMX,
2643 //@}
2644
2645 /// \name i686
2646 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2647 //@{
2648 CK_i686,
2649 CK_PentiumPro,
2650 CK_Pentium2,
2651 CK_Pentium3,
2652 CK_Pentium3M,
2653 CK_PentiumM,
2654 CK_C3_2,
2655
2656 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2657 /// Clang however has some logic to suport this.
2658 // FIXME: Warn, deprecate, and potentially remove this.
2659 CK_Yonah,
2660 //@}
2661
2662 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002663 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002664 //@{
2665 CK_Pentium4,
2666 CK_Pentium4M,
2667 CK_Prescott,
2668 CK_Nocona,
2669 //@}
2670
2671 /// \name Core
2672 /// Core microarchitecture based processors.
2673 //@{
2674 CK_Core2,
2675
2676 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2677 /// codename which GCC no longer accepts as an option to -march, but Clang
2678 /// has some logic for recognizing it.
2679 // FIXME: Warn, deprecate, and potentially remove this.
2680 CK_Penryn,
2681 //@}
2682
2683 /// \name Atom
2684 /// Atom processors
2685 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002686 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002687 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002688 //@}
2689
2690 /// \name Nehalem
2691 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002692 CK_Nehalem,
2693
2694 /// \name Westmere
2695 /// Westmere microarchitecture based processors.
2696 CK_Westmere,
2697
2698 /// \name Sandy Bridge
2699 /// Sandy Bridge microarchitecture based processors.
2700 CK_SandyBridge,
2701
2702 /// \name Ivy Bridge
2703 /// Ivy Bridge microarchitecture based processors.
2704 CK_IvyBridge,
2705
2706 /// \name Haswell
2707 /// Haswell microarchitecture based processors.
2708 CK_Haswell,
2709
2710 /// \name Broadwell
2711 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002712 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002713
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002714 /// \name Skylake Client
2715 /// Skylake client microarchitecture based processors.
2716 CK_SkylakeClient,
2717
2718 /// \name Skylake Server
2719 /// Skylake server microarchitecture based processors.
2720 CK_SkylakeServer,
2721
2722 /// \name Cannonlake Client
2723 /// Cannonlake client microarchitecture based processors.
2724 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002725
Craig Topper449314e2013-08-20 07:09:39 +00002726 /// \name Knights Landing
2727 /// Knights Landing processor.
2728 CK_KNL,
2729
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002730 /// \name Lakemont
2731 /// Lakemont microarchitecture based processors.
2732 CK_Lakemont,
2733
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002734 /// \name K6
2735 /// K6 architecture processors.
2736 //@{
2737 CK_K6,
2738 CK_K6_2,
2739 CK_K6_3,
2740 //@}
2741
2742 /// \name K7
2743 /// K7 architecture processors.
2744 //@{
2745 CK_Athlon,
2746 CK_AthlonThunderbird,
2747 CK_Athlon4,
2748 CK_AthlonXP,
2749 CK_AthlonMP,
2750 //@}
2751
2752 /// \name K8
2753 /// K8 architecture processors.
2754 //@{
2755 CK_Athlon64,
2756 CK_Athlon64SSE3,
2757 CK_AthlonFX,
2758 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002759 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002760 CK_Opteron,
2761 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002762 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002763 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002764
Benjamin Kramer569f2152012-01-10 11:50:18 +00002765 /// \name Bobcat
2766 /// Bobcat architecture processors.
2767 //@{
2768 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002769 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002770 //@}
2771
2772 /// \name Bulldozer
2773 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002774 //@{
2775 CK_BDVER1,
2776 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002777 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002778 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002779 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002780
Craig Topperc45744a2017-01-10 06:02:12 +00002781 /// \name zen
2782 /// Zen architecture processors.
2783 //@{
2784 CK_ZNVER1,
2785 //@}
2786
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002787 /// This specification is deprecated and will be removed in the future.
2788 /// Users should prefer \see CK_K8.
2789 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002790 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002791 CK_x86_64,
2792 //@}
2793
2794 /// \name Geode
2795 /// Geode processors.
2796 //@{
2797 CK_Geode
2798 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002799 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002800
Eric Christopherc50738f2015-08-27 00:05:50 +00002801 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002802 return llvm::StringSwitch<CPUKind>(CPU)
2803 .Case("i386", CK_i386)
2804 .Case("i486", CK_i486)
2805 .Case("winchip-c6", CK_WinChipC6)
2806 .Case("winchip2", CK_WinChip2)
2807 .Case("c3", CK_C3)
2808 .Case("i586", CK_i586)
2809 .Case("pentium", CK_Pentium)
2810 .Case("pentium-mmx", CK_PentiumMMX)
2811 .Case("i686", CK_i686)
2812 .Case("pentiumpro", CK_PentiumPro)
2813 .Case("pentium2", CK_Pentium2)
2814 .Case("pentium3", CK_Pentium3)
2815 .Case("pentium3m", CK_Pentium3M)
2816 .Case("pentium-m", CK_PentiumM)
2817 .Case("c3-2", CK_C3_2)
2818 .Case("yonah", CK_Yonah)
2819 .Case("pentium4", CK_Pentium4)
2820 .Case("pentium4m", CK_Pentium4M)
2821 .Case("prescott", CK_Prescott)
2822 .Case("nocona", CK_Nocona)
2823 .Case("core2", CK_Core2)
2824 .Case("penryn", CK_Penryn)
2825 .Case("bonnell", CK_Bonnell)
2826 .Case("atom", CK_Bonnell) // Legacy name.
2827 .Case("silvermont", CK_Silvermont)
2828 .Case("slm", CK_Silvermont) // Legacy name.
2829 .Case("nehalem", CK_Nehalem)
2830 .Case("corei7", CK_Nehalem) // Legacy name.
2831 .Case("westmere", CK_Westmere)
2832 .Case("sandybridge", CK_SandyBridge)
2833 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2834 .Case("ivybridge", CK_IvyBridge)
2835 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2836 .Case("haswell", CK_Haswell)
2837 .Case("core-avx2", CK_Haswell) // Legacy name.
2838 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002839 .Case("skylake", CK_SkylakeClient)
2840 .Case("skylake-avx512", CK_SkylakeServer)
2841 .Case("skx", CK_SkylakeServer) // Legacy name.
2842 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002843 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002844 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002845 .Case("k6", CK_K6)
2846 .Case("k6-2", CK_K6_2)
2847 .Case("k6-3", CK_K6_3)
2848 .Case("athlon", CK_Athlon)
2849 .Case("athlon-tbird", CK_AthlonThunderbird)
2850 .Case("athlon-4", CK_Athlon4)
2851 .Case("athlon-xp", CK_AthlonXP)
2852 .Case("athlon-mp", CK_AthlonMP)
2853 .Case("athlon64", CK_Athlon64)
2854 .Case("athlon64-sse3", CK_Athlon64SSE3)
2855 .Case("athlon-fx", CK_AthlonFX)
2856 .Case("k8", CK_K8)
2857 .Case("k8-sse3", CK_K8SSE3)
2858 .Case("opteron", CK_Opteron)
2859 .Case("opteron-sse3", CK_OpteronSSE3)
2860 .Case("barcelona", CK_AMDFAM10)
2861 .Case("amdfam10", CK_AMDFAM10)
2862 .Case("btver1", CK_BTVER1)
2863 .Case("btver2", CK_BTVER2)
2864 .Case("bdver1", CK_BDVER1)
2865 .Case("bdver2", CK_BDVER2)
2866 .Case("bdver3", CK_BDVER3)
2867 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002868 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002869 .Case("x86-64", CK_x86_64)
2870 .Case("geode", CK_Geode)
2871 .Default(CK_Generic);
2872 }
2873
Rafael Espindolaeb265472013-08-21 21:59:03 +00002874 enum FPMathKind {
2875 FP_Default,
2876 FP_SSE,
2877 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002878 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002879
Eli Friedman3fd920a2008-08-20 02:34:37 +00002880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002881 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2882 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002883 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002884 }
Craig Topper3164f332014-03-11 03:39:26 +00002885 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002886 // X87 evaluates with 80 bits "long double" precision.
2887 return SSELevel == NoSSE ? 2 : 0;
2888 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002889 ArrayRef<const char *> getGCCRegNames() const override {
2890 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002891 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002892 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2893 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002894 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002895 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2896 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002897 }
Eric Christopherd9832702015-06-29 21:00:05 +00002898 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002899 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002900 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002901
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002902 bool validateGlobalRegisterVariable(StringRef RegName,
2903 unsigned RegSize,
2904 bool &HasSizeMismatch) const override {
2905 // esp and ebp are the only 32-bit registers the x86 backend can currently
2906 // handle.
2907 if (RegName.equals("esp") || RegName.equals("ebp")) {
2908 // Check that the register size is 32-bit.
2909 HasSizeMismatch = RegSize != 32;
2910 return true;
2911 }
2912
2913 return false;
2914 }
2915
Akira Hatanaka974131e2014-09-18 18:17:18 +00002916 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2917
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002918 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2919
Akira Hatanaka974131e2014-09-18 18:17:18 +00002920 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2921
Craig Topper3164f332014-03-11 03:39:26 +00002922 std::string convertConstraint(const char *&Constraint) const override;
2923 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002924 return "~{dirflag},~{fpsr},~{flags}";
2925 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002926
2927 StringRef getConstraintRegister(const StringRef &Constraint,
2928 const StringRef &Expression) const override {
2929 StringRef::iterator I, E;
2930 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2931 if (isalpha(*I))
2932 break;
2933 }
2934 if (I == E)
2935 return "";
2936 switch (*I) {
2937 // For the register constraints, return the matching register name
2938 case 'a':
2939 return "ax";
2940 case 'b':
2941 return "bx";
2942 case 'c':
2943 return "cx";
2944 case 'd':
2945 return "dx";
2946 case 'S':
2947 return "si";
2948 case 'D':
2949 return "di";
2950 // In case the constraint is 'r' we need to return Expression
2951 case 'r':
2952 return Expression;
2953 default:
2954 // Default value if there is no constraint for the register
2955 return "";
2956 }
2957 return "";
2958 }
2959
Craig Topper3164f332014-03-11 03:39:26 +00002960 void getTargetDefines(const LangOptions &Opts,
2961 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002962 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2963 bool Enabled);
2964 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2965 bool Enabled);
2966 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2967 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002968 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2969 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002970 setFeatureEnabledImpl(Features, Name, Enabled);
2971 }
2972 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002973 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002974 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2975 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002976 bool
2977 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2978 StringRef CPU,
2979 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002980 bool hasFeature(StringRef Feature) const override;
2981 bool handleTargetFeatures(std::vector<std::string> &Features,
2982 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002983 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002984 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2985 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002986 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002987 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002988 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002989 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002990 return "no-mmx";
2991 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002992 }
Craig Topper3164f332014-03-11 03:39:26 +00002993 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002994 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002995
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002996 // Perform any per-CPU checks necessary to determine if this CPU is
2997 // acceptable.
2998 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2999 // invalid without explaining *why*.
3000 switch (CPU) {
3001 case CK_Generic:
3002 // No processor selected!
3003 return false;
3004
3005 case CK_i386:
3006 case CK_i486:
3007 case CK_WinChipC6:
3008 case CK_WinChip2:
3009 case CK_C3:
3010 case CK_i586:
3011 case CK_Pentium:
3012 case CK_PentiumMMX:
3013 case CK_i686:
3014 case CK_PentiumPro:
3015 case CK_Pentium2:
3016 case CK_Pentium3:
3017 case CK_Pentium3M:
3018 case CK_PentiumM:
3019 case CK_Yonah:
3020 case CK_C3_2:
3021 case CK_Pentium4:
3022 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003023 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003024 case CK_Prescott:
3025 case CK_K6:
3026 case CK_K6_2:
3027 case CK_K6_3:
3028 case CK_Athlon:
3029 case CK_AthlonThunderbird:
3030 case CK_Athlon4:
3031 case CK_AthlonXP:
3032 case CK_AthlonMP:
3033 case CK_Geode:
3034 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003035 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003036 return false;
3037
3038 // Fallthrough
3039 case CK_Nocona:
3040 case CK_Core2:
3041 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003042 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003043 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003044 case CK_Nehalem:
3045 case CK_Westmere:
3046 case CK_SandyBridge:
3047 case CK_IvyBridge:
3048 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003049 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003050 case CK_SkylakeClient:
3051 case CK_SkylakeServer:
3052 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003053 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003054 case CK_Athlon64:
3055 case CK_Athlon64SSE3:
3056 case CK_AthlonFX:
3057 case CK_K8:
3058 case CK_K8SSE3:
3059 case CK_Opteron:
3060 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003061 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003062 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003063 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003064 case CK_BDVER1:
3065 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003066 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003067 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003068 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003069 case CK_x86_64:
3070 return true;
3071 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003072 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003073 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003074
Craig Topper3164f332014-03-11 03:39:26 +00003075 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003076
Craig Topper3164f332014-03-11 03:39:26 +00003077 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003078 // Most of the non-ARM calling conventions are i386 conventions.
3079 switch (CC) {
3080 case CC_X86ThisCall:
3081 case CC_X86FastCall:
3082 case CC_X86StdCall:
3083 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003084 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003085 case CC_C:
3086 case CC_Swift:
3087 case CC_X86Pascal:
3088 case CC_IntelOclBicc:
3089 return CCCR_OK;
3090 default:
3091 return CCCR_Warning;
3092 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003093 }
3094
Craig Topper3164f332014-03-11 03:39:26 +00003095 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003096 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003097 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003098
3099 bool hasSjLjLowering() const override {
3100 return true;
3101 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003102
3103 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003104 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003105 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003106};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003107
Rafael Espindolaeb265472013-08-21 21:59:03 +00003108bool X86TargetInfo::setFPMath(StringRef Name) {
3109 if (Name == "387") {
3110 FPMath = FP_387;
3111 return true;
3112 }
3113 if (Name == "sse") {
3114 FPMath = FP_SSE;
3115 return true;
3116 }
3117 return false;
3118}
3119
Eric Christopher007b0a02015-08-28 22:32:01 +00003120bool X86TargetInfo::initFeatureMap(
3121 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003122 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003123 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003124 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003125 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003126 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003127
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003128 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003129
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003130 // Enable X87 for all X86 processors but Lakemont.
3131 if (Kind != CK_Lakemont)
3132 setFeatureEnabledImpl(Features, "x87", true);
3133
3134 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003135 case CK_Generic:
3136 case CK_i386:
3137 case CK_i486:
3138 case CK_i586:
3139 case CK_Pentium:
3140 case CK_i686:
3141 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003142 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003143 break;
3144 case CK_PentiumMMX:
3145 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003146 case CK_K6:
3147 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003148 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003149 break;
3150 case CK_Pentium3:
3151 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003152 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003153 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003154 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 break;
3156 case CK_PentiumM:
3157 case CK_Pentium4:
3158 case CK_Pentium4M:
3159 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003160 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003161 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003162 break;
3163 case CK_Yonah:
3164 case CK_Prescott:
3165 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003166 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003167 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003168 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003169 break;
3170 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003171 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003172 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003173 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003174 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003175 break;
3176 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003177 setFeatureEnabledImpl(Features, "sse4.1", 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;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003181 case CK_Cannonlake:
3182 setFeatureEnabledImpl(Features, "avx512ifma", true);
3183 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3184 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003185 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003186 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003187 setFeatureEnabledImpl(Features, "avx512f", true);
3188 setFeatureEnabledImpl(Features, "avx512cd", true);
3189 setFeatureEnabledImpl(Features, "avx512dq", true);
3190 setFeatureEnabledImpl(Features, "avx512bw", true);
3191 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003192 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003193 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003194 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003195 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003196 setFeatureEnabledImpl(Features, "xsavec", true);
3197 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003198 setFeatureEnabledImpl(Features, "mpx", true);
3199 setFeatureEnabledImpl(Features, "sgx", true);
3200 setFeatureEnabledImpl(Features, "clflushopt", true);
Eric Christopherfc6ffed2017-03-28 23:03:19 +00003201 setFeatureEnabledImpl(Features, "rtm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003202 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003203 case CK_Broadwell:
3204 setFeatureEnabledImpl(Features, "rdseed", true);
3205 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003206 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003207 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003208 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003209 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003210 setFeatureEnabledImpl(Features, "bmi", true);
3211 setFeatureEnabledImpl(Features, "bmi2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003212 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003213 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003214 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003215 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003216 setFeatureEnabledImpl(Features, "rdrnd", true);
3217 setFeatureEnabledImpl(Features, "f16c", true);
3218 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003219 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003220 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003221 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003222 setFeatureEnabledImpl(Features, "xsave", true);
3223 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003224 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003225 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003226 case CK_Silvermont:
3227 setFeatureEnabledImpl(Features, "aes", true);
3228 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003229 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003230 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003231 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003232 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003233 setFeatureEnabledImpl(Features, "cx16", true);
3234 break;
3235 case CK_KNL:
3236 setFeatureEnabledImpl(Features, "avx512f", true);
3237 setFeatureEnabledImpl(Features, "avx512cd", true);
3238 setFeatureEnabledImpl(Features, "avx512er", true);
3239 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003240 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003241 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003242 setFeatureEnabledImpl(Features, "rdseed", true);
3243 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003244 setFeatureEnabledImpl(Features, "lzcnt", true);
3245 setFeatureEnabledImpl(Features, "bmi", true);
3246 setFeatureEnabledImpl(Features, "bmi2", true);
3247 setFeatureEnabledImpl(Features, "rtm", true);
3248 setFeatureEnabledImpl(Features, "fma", true);
3249 setFeatureEnabledImpl(Features, "rdrnd", true);
3250 setFeatureEnabledImpl(Features, "f16c", true);
3251 setFeatureEnabledImpl(Features, "fsgsbase", true);
3252 setFeatureEnabledImpl(Features, "aes", true);
3253 setFeatureEnabledImpl(Features, "pclmul", true);
3254 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003255 setFeatureEnabledImpl(Features, "xsaveopt", true);
3256 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003257 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003258 break;
3259 case CK_K6_2:
3260 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003261 case CK_WinChip2:
3262 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003263 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003264 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003265 case CK_Athlon:
3266 case CK_AthlonThunderbird:
3267 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003268 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003269 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003270 case CK_Athlon4:
3271 case CK_AthlonXP:
3272 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003273 setFeatureEnabledImpl(Features, "sse", true);
3274 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003275 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003276 break;
3277 case CK_K8:
3278 case CK_Opteron:
3279 case CK_Athlon64:
3280 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003281 setFeatureEnabledImpl(Features, "sse2", true);
3282 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003283 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003284 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003285 case CK_AMDFAM10:
3286 setFeatureEnabledImpl(Features, "sse4a", true);
3287 setFeatureEnabledImpl(Features, "lzcnt", true);
3288 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003289 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003290 case CK_K8SSE3:
3291 case CK_OpteronSSE3:
3292 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003293 setFeatureEnabledImpl(Features, "sse3", true);
3294 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003295 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003296 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003297 case CK_BTVER2:
3298 setFeatureEnabledImpl(Features, "avx", true);
3299 setFeatureEnabledImpl(Features, "aes", true);
3300 setFeatureEnabledImpl(Features, "pclmul", true);
3301 setFeatureEnabledImpl(Features, "bmi", true);
3302 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003303 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003304 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003305 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003306 setFeatureEnabledImpl(Features, "ssse3", true);
3307 setFeatureEnabledImpl(Features, "sse4a", true);
3308 setFeatureEnabledImpl(Features, "lzcnt", true);
3309 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003310 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003311 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003312 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003313 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003314 case CK_ZNVER1:
3315 setFeatureEnabledImpl(Features, "adx", true);
3316 setFeatureEnabledImpl(Features, "aes", true);
3317 setFeatureEnabledImpl(Features, "avx2", true);
3318 setFeatureEnabledImpl(Features, "bmi", true);
3319 setFeatureEnabledImpl(Features, "bmi2", true);
3320 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003321 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003322 setFeatureEnabledImpl(Features, "cx16", true);
3323 setFeatureEnabledImpl(Features, "f16c", true);
3324 setFeatureEnabledImpl(Features, "fma", true);
3325 setFeatureEnabledImpl(Features, "fsgsbase", true);
3326 setFeatureEnabledImpl(Features, "fxsr", true);
3327 setFeatureEnabledImpl(Features, "lzcnt", true);
3328 setFeatureEnabledImpl(Features, "mwaitx", true);
3329 setFeatureEnabledImpl(Features, "movbe", true);
3330 setFeatureEnabledImpl(Features, "pclmul", true);
3331 setFeatureEnabledImpl(Features, "popcnt", true);
3332 setFeatureEnabledImpl(Features, "prfchw", true);
3333 setFeatureEnabledImpl(Features, "rdrnd", true);
3334 setFeatureEnabledImpl(Features, "rdseed", true);
3335 setFeatureEnabledImpl(Features, "sha", true);
3336 setFeatureEnabledImpl(Features, "sse4a", true);
3337 setFeatureEnabledImpl(Features, "xsave", true);
3338 setFeatureEnabledImpl(Features, "xsavec", true);
3339 setFeatureEnabledImpl(Features, "xsaveopt", true);
3340 setFeatureEnabledImpl(Features, "xsaves", true);
3341 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003342 case CK_BDVER4:
3343 setFeatureEnabledImpl(Features, "avx2", true);
3344 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003345 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003346 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003347 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003348 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003349 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003350 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003351 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003352 setFeatureEnabledImpl(Features, "bmi", true);
3353 setFeatureEnabledImpl(Features, "fma", true);
3354 setFeatureEnabledImpl(Features, "f16c", true);
3355 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003356 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003357 case CK_BDVER1:
3358 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003359 setFeatureEnabledImpl(Features, "xop", true);
3360 setFeatureEnabledImpl(Features, "lzcnt", true);
3361 setFeatureEnabledImpl(Features, "aes", true);
3362 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003363 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003364 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003365 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003366 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003367 break;
Eli Friedman33465822011-07-08 23:31:17 +00003368 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003369 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3370 return false;
3371
3372 // Can't do this earlier because we need to be able to explicitly enable
3373 // or disable these features and the things that they depend upon.
3374
3375 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3376 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003377 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003378 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3379 FeaturesVec.end())
3380 Features["popcnt"] = true;
3381
3382 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3383 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003384 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003385 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3386 FeaturesVec.end())
3387 Features["prfchw"] = true;
3388
Eric Christophera7260af2015-10-08 20:10:18 +00003389 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3390 // then enable MMX.
3391 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003392 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003393 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3394 FeaturesVec.end())
3395 Features["mmx"] = true;
3396
Eric Christopherbbd746d2015-10-08 20:10:14 +00003397 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003398}
3399
Rafael Espindolae62e2792013-08-20 13:44:29 +00003400void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003401 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003402 if (Enabled) {
3403 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003404 case AVX512F:
3405 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003406 case AVX2:
3407 Features["avx2"] = true;
3408 case AVX:
3409 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003410 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003411 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003412 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003413 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003414 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003415 case SSSE3:
3416 Features["ssse3"] = true;
3417 case SSE3:
3418 Features["sse3"] = true;
3419 case SSE2:
3420 Features["sse2"] = true;
3421 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003422 Features["sse"] = true;
3423 case NoSSE:
3424 break;
3425 }
3426 return;
3427 }
3428
3429 switch (Level) {
3430 case NoSSE:
3431 case SSE1:
3432 Features["sse"] = false;
3433 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003434 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3435 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003436 case SSE3:
3437 Features["sse3"] = false;
3438 setXOPLevel(Features, NoXOP, false);
3439 case SSSE3:
3440 Features["ssse3"] = false;
3441 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003442 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003443 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003444 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003445 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003446 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3447 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003448 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003449 case AVX2:
3450 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003451 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003452 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003453 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003454 Features["avx512vl"] = Features["avx512vbmi"] =
3455 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003456 }
3457}
3458
3459void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003460 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003461 if (Enabled) {
3462 switch (Level) {
3463 case AMD3DNowAthlon:
3464 Features["3dnowa"] = true;
3465 case AMD3DNow:
3466 Features["3dnow"] = true;
3467 case MMX:
3468 Features["mmx"] = true;
3469 case NoMMX3DNow:
3470 break;
3471 }
3472 return;
3473 }
3474
3475 switch (Level) {
3476 case NoMMX3DNow:
3477 case MMX:
3478 Features["mmx"] = false;
3479 case AMD3DNow:
3480 Features["3dnow"] = false;
3481 case AMD3DNowAthlon:
3482 Features["3dnowa"] = false;
3483 }
3484}
3485
3486void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003487 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003488 if (Enabled) {
3489 switch (Level) {
3490 case XOP:
3491 Features["xop"] = true;
3492 case FMA4:
3493 Features["fma4"] = true;
3494 setSSELevel(Features, AVX, true);
3495 case SSE4A:
3496 Features["sse4a"] = true;
3497 setSSELevel(Features, SSE3, true);
3498 case NoXOP:
3499 break;
3500 }
3501 return;
3502 }
3503
3504 switch (Level) {
3505 case NoXOP:
3506 case SSE4A:
3507 Features["sse4a"] = false;
3508 case FMA4:
3509 Features["fma4"] = false;
3510 case XOP:
3511 Features["xop"] = false;
3512 }
3513}
3514
Craig Topper86d79ef2013-09-17 04:51:29 +00003515void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3516 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003517 // This is a bit of a hack to deal with the sse4 target feature when used
3518 // as part of the target attribute. We handle sse4 correctly everywhere
3519 // else. See below for more information on how we handle the sse4 options.
3520 if (Name != "sse4")
3521 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003522
Craig Topper29561122013-09-19 01:13:07 +00003523 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003524 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003525 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003526 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003527 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003528 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003529 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003530 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003531 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003533 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003534 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003535 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003536 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003537 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003538 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003539 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003540 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003541 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003542 if (Enabled)
3543 setSSELevel(Features, SSE2, Enabled);
3544 } else if (Name == "pclmul") {
3545 if (Enabled)
3546 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003547 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003548 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003549 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003550 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003551 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003552 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003553 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3554 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3555 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003556 if (Enabled)
3557 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003558 // Enable BWI instruction if VBMI is being enabled.
3559 if (Name == "avx512vbmi" && Enabled)
3560 Features["avx512bw"] = true;
3561 // Also disable VBMI if BWI is being disabled.
3562 if (Name == "avx512bw" && !Enabled)
3563 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003564 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003565 if (Enabled)
3566 setSSELevel(Features, AVX, Enabled);
3567 } else if (Name == "fma4") {
3568 setXOPLevel(Features, FMA4, Enabled);
3569 } else if (Name == "xop") {
3570 setXOPLevel(Features, XOP, Enabled);
3571 } else if (Name == "sse4a") {
3572 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003573 } else if (Name == "f16c") {
3574 if (Enabled)
3575 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003576 } else if (Name == "sha") {
3577 if (Enabled)
3578 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003579 } else if (Name == "sse4") {
3580 // We can get here via the __target__ attribute since that's not controlled
3581 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3582 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3583 // disabled.
3584 if (Enabled)
3585 setSSELevel(Features, SSE42, Enabled);
3586 else
3587 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003588 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003589 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003590 Features["xsaveopt"] = false;
3591 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003592 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003593 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003594 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003595}
3596
Eric Christopher3ff21b32013-10-16 21:26:26 +00003597/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003598/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003599bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003600 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003601 for (const auto &Feature : Features) {
3602 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003603 continue;
3604
Eric Christopher610fe112015-08-26 08:21:55 +00003605 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003606 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003607 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003608 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003609 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003610 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003611 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003612 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003613 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003614 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003615 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003616 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003617 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003618 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003619 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003620 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003621 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003622 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003623 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003624 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003625 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003626 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003627 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003628 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003629 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003630 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003631 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003632 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003633 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003634 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003635 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003636 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003637 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003638 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003639 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003640 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003641 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003642 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003643 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003644 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003645 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003646 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003647 } else if (Feature == "+avx512vbmi") {
3648 HasAVX512VBMI = true;
3649 } else if (Feature == "+avx512ifma") {
3650 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003651 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003652 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003653 } else if (Feature == "+mpx") {
3654 HasMPX = true;
3655 } else if (Feature == "+movbe") {
3656 HasMOVBE = true;
3657 } else if (Feature == "+sgx") {
3658 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003659 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003660 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003661 } else if (Feature == "+fxsr") {
3662 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003663 } else if (Feature == "+xsave") {
3664 HasXSAVE = true;
3665 } else if (Feature == "+xsaveopt") {
3666 HasXSAVEOPT = true;
3667 } else if (Feature == "+xsavec") {
3668 HasXSAVEC = true;
3669 } else if (Feature == "+xsaves") {
3670 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003671 } else if (Feature == "+mwaitx") {
3672 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003673 } else if (Feature == "+pku") {
3674 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003675 } else if (Feature == "+clflushopt") {
3676 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003677 } else if (Feature == "+clwb") {
3678 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003679 } else if (Feature == "+prefetchwt1") {
3680 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003681 } else if (Feature == "+clzero") {
3682 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003683 }
3684
Benjamin Kramer27402c62012-03-05 15:10:44 +00003685 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003686 .Case("+avx512f", AVX512F)
3687 .Case("+avx2", AVX2)
3688 .Case("+avx", AVX)
3689 .Case("+sse4.2", SSE42)
3690 .Case("+sse4.1", SSE41)
3691 .Case("+ssse3", SSSE3)
3692 .Case("+sse3", SSE3)
3693 .Case("+sse2", SSE2)
3694 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003695 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003696 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003697
Eli Friedman33465822011-07-08 23:31:17 +00003698 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003699 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003700 .Case("+3dnowa", AMD3DNowAthlon)
3701 .Case("+3dnow", AMD3DNow)
3702 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003703 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003704 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003705
3706 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003707 .Case("+xop", XOP)
3708 .Case("+fma4", FMA4)
3709 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003710 .Default(NoXOP);
3711 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003712 }
Eli Friedman33465822011-07-08 23:31:17 +00003713
Rafael Espindolaeb265472013-08-21 21:59:03 +00003714 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3715 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003716 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3717 (FPMath == FP_387 && SSELevel >= SSE1)) {
3718 Diags.Report(diag::err_target_unsupported_fpmath) <<
3719 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003720 return false;
3721 }
3722
Alexey Bataev00396512015-07-02 03:40:19 +00003723 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003724 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003725 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003726}
Chris Lattnerecd49032009-03-02 22:27:17 +00003727
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003728/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3729/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003730void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003731 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003732 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003733 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 Builder.defineMacro("__amd64__");
3735 Builder.defineMacro("__amd64");
3736 Builder.defineMacro("__x86_64");
3737 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003738 if (getTriple().getArchName() == "x86_64h") {
3739 Builder.defineMacro("__x86_64h");
3740 Builder.defineMacro("__x86_64h__");
3741 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003742 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003743 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003744 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003745
Chris Lattnerecd49032009-03-02 22:27:17 +00003746 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003747 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3748 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003749 switch (CPU) {
3750 case CK_Generic:
3751 break;
3752 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003753 // The rest are coming from the i386 define above.
3754 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003755 break;
3756 case CK_i486:
3757 case CK_WinChipC6:
3758 case CK_WinChip2:
3759 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003760 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003761 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003762 case CK_PentiumMMX:
3763 Builder.defineMacro("__pentium_mmx__");
3764 Builder.defineMacro("__tune_pentium_mmx__");
3765 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003766 case CK_i586:
3767 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003768 defineCPUMacros(Builder, "i586");
3769 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003770 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003771 case CK_Pentium3:
3772 case CK_Pentium3M:
3773 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003774 Builder.defineMacro("__tune_pentium3__");
3775 // Fallthrough
3776 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003777 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003778 Builder.defineMacro("__tune_pentium2__");
3779 // Fallthrough
3780 case CK_PentiumPro:
3781 Builder.defineMacro("__tune_i686__");
3782 Builder.defineMacro("__tune_pentiumpro__");
3783 // Fallthrough
3784 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003785 Builder.defineMacro("__i686");
3786 Builder.defineMacro("__i686__");
3787 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3788 Builder.defineMacro("__pentiumpro");
3789 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003790 break;
3791 case CK_Pentium4:
3792 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003793 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003794 break;
3795 case CK_Yonah:
3796 case CK_Prescott:
3797 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003798 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003799 break;
3800 case CK_Core2:
3801 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003802 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003803 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003804 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003805 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003806 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003807 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003808 defineCPUMacros(Builder, "slm");
3809 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003810 case CK_Nehalem:
3811 case CK_Westmere:
3812 case CK_SandyBridge:
3813 case CK_IvyBridge:
3814 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003815 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003816 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003817 // FIXME: Historically, we defined this legacy name, it would be nice to
3818 // remove it at some point. We've never exposed fine-grained names for
3819 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003820 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003821 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003822 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003823 defineCPUMacros(Builder, "skx");
3824 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003825 case CK_Cannonlake:
3826 break;
Craig Topper449314e2013-08-20 07:09:39 +00003827 case CK_KNL:
3828 defineCPUMacros(Builder, "knl");
3829 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003830 case CK_Lakemont:
3831 Builder.defineMacro("__tune_lakemont__");
3832 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003833 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003834 Builder.defineMacro("__k6_2__");
3835 Builder.defineMacro("__tune_k6_2__");
3836 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003837 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003838 if (CPU != CK_K6_2) { // In case of fallthrough
3839 // FIXME: GCC may be enabling these in cases where some other k6
3840 // architecture is specified but -m3dnow is explicitly provided. The
3841 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003842 Builder.defineMacro("__k6_3__");
3843 Builder.defineMacro("__tune_k6_3__");
3844 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003845 // Fallthrough
3846 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003847 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003848 break;
3849 case CK_Athlon:
3850 case CK_AthlonThunderbird:
3851 case CK_Athlon4:
3852 case CK_AthlonXP:
3853 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003854 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003855 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003856 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003857 Builder.defineMacro("__tune_athlon_sse__");
3858 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003859 break;
3860 case CK_K8:
3861 case CK_K8SSE3:
3862 case CK_x86_64:
3863 case CK_Opteron:
3864 case CK_OpteronSSE3:
3865 case CK_Athlon64:
3866 case CK_Athlon64SSE3:
3867 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003868 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003869 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003870 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003871 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003872 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003873 case CK_BTVER1:
3874 defineCPUMacros(Builder, "btver1");
3875 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003876 case CK_BTVER2:
3877 defineCPUMacros(Builder, "btver2");
3878 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003879 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003880 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003881 break;
3882 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003883 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003884 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003885 case CK_BDVER3:
3886 defineCPUMacros(Builder, "bdver3");
3887 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003888 case CK_BDVER4:
3889 defineCPUMacros(Builder, "bdver4");
3890 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003891 case CK_ZNVER1:
3892 defineCPUMacros(Builder, "znver1");
3893 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003894 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003895 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003896 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003897 }
Chris Lattner96e43572009-03-02 22:40:39 +00003898
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003899 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003900 Builder.defineMacro("__REGISTER_PREFIX__", "");
3901
Chris Lattner6df41af2009-04-19 17:32:33 +00003902 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3903 // functions in glibc header files that use FP Stack inline asm which the
3904 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003905 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003906
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003907 if (HasAES)
3908 Builder.defineMacro("__AES__");
3909
Craig Topper3f122a72012-05-31 05:18:48 +00003910 if (HasPCLMUL)
3911 Builder.defineMacro("__PCLMUL__");
3912
Craig Topper22967d42011-12-25 05:06:45 +00003913 if (HasLZCNT)
3914 Builder.defineMacro("__LZCNT__");
3915
Benjamin Kramer1e250392012-07-07 09:39:18 +00003916 if (HasRDRND)
3917 Builder.defineMacro("__RDRND__");
3918
Craig Topper8c7f2512014-11-03 06:51:41 +00003919 if (HasFSGSBASE)
3920 Builder.defineMacro("__FSGSBASE__");
3921
Craig Topper22967d42011-12-25 05:06:45 +00003922 if (HasBMI)
3923 Builder.defineMacro("__BMI__");
3924
3925 if (HasBMI2)
3926 Builder.defineMacro("__BMI2__");
3927
Craig Topper1de83482011-12-29 16:10:46 +00003928 if (HasPOPCNT)
3929 Builder.defineMacro("__POPCNT__");
3930
Michael Liao625a8752012-11-10 05:17:46 +00003931 if (HasRTM)
3932 Builder.defineMacro("__RTM__");
3933
Michael Liao74f4eaf2013-03-26 17:52:08 +00003934 if (HasPRFCHW)
3935 Builder.defineMacro("__PRFCHW__");
3936
Michael Liaoffaae352013-03-29 05:17:55 +00003937 if (HasRDSEED)
3938 Builder.defineMacro("__RDSEED__");
3939
Robert Khasanov50e6f582014-09-19 09:53:48 +00003940 if (HasADX)
3941 Builder.defineMacro("__ADX__");
3942
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003943 if (HasTBM)
3944 Builder.defineMacro("__TBM__");
3945
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003946 if (HasMWAITX)
3947 Builder.defineMacro("__MWAITX__");
3948
Rafael Espindolae62e2792013-08-20 13:44:29 +00003949 switch (XOPLevel) {
3950 case XOP:
3951 Builder.defineMacro("__XOP__");
3952 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003953 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003954 case SSE4A:
3955 Builder.defineMacro("__SSE4A__");
3956 case NoXOP:
3957 break;
3958 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003959
Craig Topperbba778b2012-06-03 21:46:30 +00003960 if (HasFMA)
3961 Builder.defineMacro("__FMA__");
3962
Manman Rena45358c2012-10-11 00:59:55 +00003963 if (HasF16C)
3964 Builder.defineMacro("__F16C__");
3965
Craig Topper679b53a2013-08-21 05:29:10 +00003966 if (HasAVX512CD)
3967 Builder.defineMacro("__AVX512CD__");
3968 if (HasAVX512ER)
3969 Builder.defineMacro("__AVX512ER__");
3970 if (HasAVX512PF)
3971 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003972 if (HasAVX512DQ)
3973 Builder.defineMacro("__AVX512DQ__");
3974 if (HasAVX512BW)
3975 Builder.defineMacro("__AVX512BW__");
3976 if (HasAVX512VL)
3977 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003978 if (HasAVX512VBMI)
3979 Builder.defineMacro("__AVX512VBMI__");
3980 if (HasAVX512IFMA)
3981 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003982
Ben Langmuir58078d02013-09-19 13:22:04 +00003983 if (HasSHA)
3984 Builder.defineMacro("__SHA__");
3985
Craig Toppere33f51f2015-10-16 06:22:36 +00003986 if (HasFXSR)
3987 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003988 if (HasXSAVE)
3989 Builder.defineMacro("__XSAVE__");
3990 if (HasXSAVEOPT)
3991 Builder.defineMacro("__XSAVEOPT__");
3992 if (HasXSAVEC)
3993 Builder.defineMacro("__XSAVEC__");
3994 if (HasXSAVES)
3995 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003996 if (HasPKU)
3997 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003998 if (HasCX16)
3999 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00004000 if (HasCLFLUSHOPT)
4001 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00004002 if (HasCLWB)
4003 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00004004 if (HasMPX)
4005 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004006 if (HasSGX)
4007 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004008 if (HasPREFETCHWT1)
4009 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004010 if (HasCLZERO)
4011 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004012
Chris Lattner96e43572009-03-02 22:40:39 +00004013 // Each case falls through to the previous one here.
4014 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004015 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004016 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004017 case AVX2:
4018 Builder.defineMacro("__AVX2__");
4019 case AVX:
4020 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004021 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004023 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004024 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004025 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004026 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004027 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004028 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004029 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004030 Builder.defineMacro("__SSE2__");
4031 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004032 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004033 Builder.defineMacro("__SSE__");
4034 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004035 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004036 break;
4037 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004038
Derek Schuffc7dd7222012-10-11 15:52:22 +00004039 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004040 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004041 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004042 case AVX2:
4043 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004044 case SSE42:
4045 case SSE41:
4046 case SSSE3:
4047 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004048 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004049 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004050 break;
4051 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004052 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004053 break;
4054 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004055 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004056 }
4057 }
4058
Anders Carlssone437c682010-01-27 03:47:49 +00004059 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004060 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004061 case AMD3DNowAthlon:
4062 Builder.defineMacro("__3dNOW_A__");
4063 case AMD3DNow:
4064 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004065 case MMX:
4066 Builder.defineMacro("__MMX__");
4067 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004068 break;
4069 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004070
4071 if (CPU >= CK_i486) {
4072 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4073 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4074 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4075 }
4076 if (CPU >= CK_i586)
4077 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004078}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004079
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004080bool X86TargetInfo::hasFeature(StringRef Feature) const {
4081 return llvm::StringSwitch<bool>(Feature)
4082 .Case("aes", HasAES)
4083 .Case("avx", SSELevel >= AVX)
4084 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004085 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004086 .Case("avx512cd", HasAVX512CD)
4087 .Case("avx512er", HasAVX512ER)
4088 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004089 .Case("avx512dq", HasAVX512DQ)
4090 .Case("avx512bw", HasAVX512BW)
4091 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004092 .Case("avx512vbmi", HasAVX512VBMI)
4093 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004094 .Case("bmi", HasBMI)
4095 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004096 .Case("clflushopt", HasCLFLUSHOPT)
4097 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004098 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004099 .Case("cx16", HasCX16)
4100 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004101 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004102 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004103 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004104 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004105 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004106 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4107 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4108 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004109 .Case("movbe", HasMOVBE)
4110 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004111 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004112 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004113 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004114 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004115 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004116 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004117 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004118 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004119 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004120 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004121 .Case("sse", SSELevel >= SSE1)
4122 .Case("sse2", SSELevel >= SSE2)
4123 .Case("sse3", SSELevel >= SSE3)
4124 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004125 .Case("sse4.1", SSELevel >= SSE41)
4126 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004127 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004128 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004129 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004130 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4131 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004132 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004133 .Case("xsave", HasXSAVE)
4134 .Case("xsavec", HasXSAVEC)
4135 .Case("xsaves", HasXSAVES)
4136 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004137 .Default(false);
4138}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004139
Eric Christopherd9832702015-06-29 21:00:05 +00004140// We can't use a generic validation scheme for the features accepted here
4141// versus subtarget features accepted in the target attribute because the
4142// bitfield structure that's initialized in the runtime only supports the
4143// below currently rather than the full range of subtarget features. (See
4144// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4145bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4146 return llvm::StringSwitch<bool>(FeatureStr)
4147 .Case("cmov", true)
4148 .Case("mmx", true)
4149 .Case("popcnt", true)
4150 .Case("sse", true)
4151 .Case("sse2", true)
4152 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004153 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004154 .Case("sse4.1", true)
4155 .Case("sse4.2", true)
4156 .Case("avx", true)
4157 .Case("avx2", true)
4158 .Case("sse4a", true)
4159 .Case("fma4", true)
4160 .Case("xop", true)
4161 .Case("fma", true)
4162 .Case("avx512f", true)
4163 .Case("bmi", true)
4164 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004165 .Case("aes", true)
4166 .Case("pclmul", true)
4167 .Case("avx512vl", true)
4168 .Case("avx512bw", true)
4169 .Case("avx512dq", true)
4170 .Case("avx512cd", true)
4171 .Case("avx512er", true)
4172 .Case("avx512pf", true)
4173 .Case("avx512vbmi", true)
4174 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004175 .Default(false);
4176}
4177
Eli Friedman3fd920a2008-08-20 02:34:37 +00004178bool
Anders Carlsson58436352009-02-28 17:11:49 +00004179X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004180 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004181 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004182 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004183 // Constant constraints.
4184 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4185 // instructions.
4186 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4187 // x86_64 instructions.
4188 case 's':
4189 Info.setRequiresImmediate();
4190 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004191 case 'I':
4192 Info.setRequiresImmediate(0, 31);
4193 return true;
4194 case 'J':
4195 Info.setRequiresImmediate(0, 63);
4196 return true;
4197 case 'K':
4198 Info.setRequiresImmediate(-128, 127);
4199 return true;
4200 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004201 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004202 return true;
4203 case 'M':
4204 Info.setRequiresImmediate(0, 3);
4205 return true;
4206 case 'N':
4207 Info.setRequiresImmediate(0, 255);
4208 return true;
4209 case 'O':
4210 Info.setRequiresImmediate(0, 127);
4211 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004212 // Register constraints.
4213 case 'Y': // 'Y' is the first character for several 2-character constraints.
4214 // Shift the pointer to the second character of the constraint.
4215 Name++;
4216 switch (*Name) {
4217 default:
4218 return false;
4219 case '0': // First SSE register.
4220 case 't': // Any SSE register, when SSE2 is enabled.
4221 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4222 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004223 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004224 Info.setAllowsRegister();
4225 return true;
4226 }
4227 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004228 // Constraint 'f' cannot be used for output operands.
4229 if (Info.ConstraintStr[0] == '=')
4230 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004231 Info.setAllowsRegister();
4232 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004233 case 'a': // eax.
4234 case 'b': // ebx.
4235 case 'c': // ecx.
4236 case 'd': // edx.
4237 case 'S': // esi.
4238 case 'D': // edi.
4239 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004240 case 't': // Top of floating point stack.
4241 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004242 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004243 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004244 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004245 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004246 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4247 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004248 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004249 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4250 case 'l': // "Index" registers: any general register that can be used as an
4251 // index in a base+index memory access.
4252 Info.setAllowsRegister();
4253 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004254 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004255 case 'C': // SSE floating point constant.
4256 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004257 return true;
4258 }
4259}
4260
Akira Hatanaka974131e2014-09-18 18:17:18 +00004261bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4262 unsigned Size) const {
4263 // Strip off constraint modifiers.
4264 while (Constraint[0] == '=' ||
4265 Constraint[0] == '+' ||
4266 Constraint[0] == '&')
4267 Constraint = Constraint.substr(1);
4268
4269 return validateOperandSize(Constraint, Size);
4270}
4271
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004272bool X86TargetInfo::validateInputSize(StringRef Constraint,
4273 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004274 return validateOperandSize(Constraint, Size);
4275}
4276
4277bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4278 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004279 switch (Constraint[0]) {
4280 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004281 case 'k':
4282 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004283 case 'y':
4284 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004285 case 'f':
4286 case 't':
4287 case 'u':
4288 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004289 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004290 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004291 if (SSELevel >= AVX512F)
4292 // 512-bit zmm registers can be used if target supports AVX512F.
4293 return Size <= 512U;
4294 else if (SSELevel >= AVX)
4295 // 256-bit ymm registers can be used if target supports AVX.
4296 return Size <= 256U;
4297 return Size <= 128U;
4298 case 'Y':
4299 // 'Y' is the first character for several 2-character constraints.
4300 switch (Constraint[1]) {
4301 default: break;
4302 case 'm':
4303 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004304 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004305 return Size <= 64;
4306 case 'i':
4307 case 't':
4308 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4309 if (SSELevel >= AVX512F)
4310 return Size <= 512U;
4311 else if (SSELevel >= AVX)
4312 return Size <= 256U;
4313 return SSELevel >= SSE2 && Size <= 128U;
4314 }
4315
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004316 }
4317
4318 return true;
4319}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004320
Eli Friedman3fd920a2008-08-20 02:34:37 +00004321std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004322X86TargetInfo::convertConstraint(const char *&Constraint) const {
4323 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004324 case 'a': return std::string("{ax}");
4325 case 'b': return std::string("{bx}");
4326 case 'c': return std::string("{cx}");
4327 case 'd': return std::string("{dx}");
4328 case 'S': return std::string("{si}");
4329 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004330 case 'p': // address
4331 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004332 case 't': // top of floating point stack.
4333 return std::string("{st}");
4334 case 'u': // second from top of floating point stack.
4335 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004336 case 'Y':
4337 switch (Constraint[1]) {
4338 default:
4339 // Break from inner switch and fall through (copy single char),
4340 // continue parsing after copying the current constraint into
4341 // the return string.
4342 break;
4343 case 'k':
4344 // "^" hints llvm that this is a 2 letter constraint.
4345 // "Constraint++" is used to promote the string iterator
4346 // to the next constraint.
4347 return std::string("^") + std::string(Constraint++, 2);
4348 }
4349 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004350 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004351 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004352 }
4353}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004354
Eli Friedman3fd920a2008-08-20 02:34:37 +00004355// X86-32 generic target
4356class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004357public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004358 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4359 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004360 DoubleAlign = LongLongAlign = 32;
4361 LongDoubleWidth = 96;
4362 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004363 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004364 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004365 SizeType = UnsignedInt;
4366 PtrDiffType = SignedInt;
4367 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004368 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004369
4370 // Use fpret for all types.
4371 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4372 (1 << TargetInfo::Double) |
4373 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004374
4375 // x86-32 has atomics up to 8 bytes
4376 // FIXME: Check that we actually have cmpxchg8b before setting
4377 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4378 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004379 }
Craig Topper3164f332014-03-11 03:39:26 +00004380 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004381 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004382 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004383
Craig Topper3164f332014-03-11 03:39:26 +00004384 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004385 if (RegNo == 0) return 0;
4386 if (RegNo == 1) return 2;
4387 return -1;
4388 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004389 bool validateOperandSize(StringRef Constraint,
4390 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004391 switch (Constraint[0]) {
4392 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004393 case 'R':
4394 case 'q':
4395 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004396 case 'a':
4397 case 'b':
4398 case 'c':
4399 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004400 case 'S':
4401 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004402 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004403 case 'A':
4404 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004405 }
4406
Akira Hatanaka974131e2014-09-18 18:17:18 +00004407 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004408 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004409 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4410 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4411 Builtin::FirstTSBuiltin + 1);
4412 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004413};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004414
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004415class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4416public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004417 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4418 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004419
Craig Topper3164f332014-03-11 03:39:26 +00004420 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004421 unsigned Major, Minor, Micro;
4422 getTriple().getOSVersion(Major, Minor, Micro);
4423 // New NetBSD uses the default rounding mode.
4424 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4425 return X86_32TargetInfo::getFloatEvalMethod();
4426 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004427 return 1;
4428 }
4429};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004430
Eli Friedmane3aa4542009-07-05 18:47:56 +00004431class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4432public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004433 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4434 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004435 SizeType = UnsignedLong;
4436 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004437 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004438 }
4439};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004440
Eli Friedman9fa28852012-08-08 23:57:20 +00004441class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4442public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004443 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4444 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004445 SizeType = UnsignedLong;
4446 IntPtrType = SignedLong;
4447 PtrDiffType = SignedLong;
4448 }
4449};
Eli Friedman9fa28852012-08-08 23:57:20 +00004450
Torok Edwinb2b37c62009-06-30 17:10:35 +00004451class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004452public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004453 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4454 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004455 LongDoubleWidth = 128;
4456 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004457 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004458 MaxVectorAlign = 256;
4459 // The watchOS simulator uses the builtin bool type for Objective-C.
4460 llvm::Triple T = llvm::Triple(Triple);
4461 if (T.isWatchOS())
4462 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004463 SizeType = UnsignedLong;
4464 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004465 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004466 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004467 }
4468
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004469 bool handleTargetFeatures(std::vector<std::string> &Features,
4470 DiagnosticsEngine &Diags) override {
4471 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4472 Diags))
4473 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004474 // We now know the features we have: we can decide how to align vectors.
4475 MaxVectorAlign =
4476 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004477 return true;
4478 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004479};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004480
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004481// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004482class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004483public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004484 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4485 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004486 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004487 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004488 bool IsWinCOFF =
4489 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004490 resetDataLayout(IsWinCOFF
4491 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4492 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004493 }
Craig Topper3164f332014-03-11 03:39:26 +00004494 void getTargetDefines(const LangOptions &Opts,
4495 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004496 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4497 }
4498};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004499
4500// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004501class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004502public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004503 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4504 const TargetOptions &Opts)
4505 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004506 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004507 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004508 }
Craig Topper3164f332014-03-11 03:39:26 +00004509 void getTargetDefines(const LangOptions &Opts,
4510 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004511 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4512 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4513 // The value of the following reflects processor type.
4514 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4515 // We lost the original triple, so we use the default.
4516 Builder.defineMacro("_M_IX86", "600");
4517 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004518};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004519
David Majnemerae1ed0e2015-05-28 04:36:18 +00004520static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004521 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4522 // supports __declspec natively under -fms-extensions, but we define a no-op
4523 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004524 if (Opts.MicrosoftExt)
4525 Builder.defineMacro("__declspec", "__declspec");
4526 else
4527 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4528
4529 if (!Opts.MicrosoftExt) {
4530 // Provide macros for all the calling convention keywords. Provide both
4531 // single and double underscore prefixed variants. These are available on
4532 // x64 as well as x86, even though they have no effect.
4533 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4534 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004535 std::string GCCSpelling = "__attribute__((__";
4536 GCCSpelling += CC;
4537 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004538 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4539 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4540 }
4541 }
4542}
4543
David Majnemerae1ed0e2015-05-28 04:36:18 +00004544static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4545 Builder.defineMacro("__MSVCRT__");
4546 Builder.defineMacro("__MINGW32__");
4547 addCygMingDefines(Opts, Builder);
4548}
4549
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004550// x86-32 MinGW target
4551class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4552public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004553 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4554 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004555 void getTargetDefines(const LangOptions &Opts,
4556 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004557 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004558 DefineStd(Builder, "WIN32", Opts);
4559 DefineStd(Builder, "WINNT", Opts);
4560 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004561 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004562 }
4563};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004564
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004565// x86-32 Cygwin target
4566class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4567public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004568 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4569 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004570 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004571 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004572 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 +00004573 }
Craig Topper3164f332014-03-11 03:39:26 +00004574 void getTargetDefines(const LangOptions &Opts,
4575 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004576 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004577 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004578 Builder.defineMacro("__CYGWIN__");
4579 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004580 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004581 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004582 if (Opts.CPlusPlus)
4583 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004584 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004585};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004586
Chris Lattnerb986aba2010-04-11 19:29:39 +00004587// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004588class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004589public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004590 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004591 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004592 }
Craig Topper3164f332014-03-11 03:39:26 +00004593 void getTargetDefines(const LangOptions &Opts,
4594 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004595 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004596 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004597 }
4598};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004599
Alexey Bataevc99b0492015-11-25 09:24:26 +00004600// X86-32 MCU target
4601class MCUX86_32TargetInfo : public X86_32TargetInfo {
4602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004603 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4604 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004605 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004606 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004607 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 +00004608 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004609 }
4610
4611 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4612 // On MCU we support only C calling convention.
4613 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4614 }
4615
4616 void getTargetDefines(const LangOptions &Opts,
4617 MacroBuilder &Builder) const override {
4618 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4619 Builder.defineMacro("__iamcu");
4620 Builder.defineMacro("__iamcu__");
4621 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004622
4623 bool allowsLargerPreferedTypeAlignment() const override {
4624 return false;
4625 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004626};
4627
Douglas Gregor9fabd852011-07-01 22:41:14 +00004628// RTEMS Target
4629template<typename Target>
4630class RTEMSTargetInfo : public OSTargetInfo<Target> {
4631protected:
Craig Topper3164f332014-03-11 03:39:26 +00004632 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4633 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004634 // RTEMS defines; list based off of gcc output
4635
Douglas Gregor9fabd852011-07-01 22:41:14 +00004636 Builder.defineMacro("__rtems__");
4637 Builder.defineMacro("__ELF__");
4638 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004639
Douglas Gregor9fabd852011-07-01 22:41:14 +00004640public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004641 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4642 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004643 switch (Triple.getArch()) {
4644 default:
4645 case llvm::Triple::x86:
4646 // this->MCountName = ".mcount";
4647 break;
4648 case llvm::Triple::mips:
4649 case llvm::Triple::mipsel:
4650 case llvm::Triple::ppc:
4651 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004652 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004653 // this->MCountName = "_mcount";
4654 break;
4655 case llvm::Triple::arm:
4656 // this->MCountName = "__mcount";
4657 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004658 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004659 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004660};
4661
Douglas Gregor9fabd852011-07-01 22:41:14 +00004662// x86-32 RTEMS target
4663class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4664public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004665 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4666 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004667 SizeType = UnsignedLong;
4668 IntPtrType = SignedLong;
4669 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004670 }
Craig Topper3164f332014-03-11 03:39:26 +00004671 void getTargetDefines(const LangOptions &Opts,
4672 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004673 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4674 Builder.defineMacro("__INTEL__");
4675 Builder.defineMacro("__rtems__");
4676 }
4677};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004678
Eli Friedman3fd920a2008-08-20 02:34:37 +00004679// x86-64 generic target
4680class X86_64TargetInfo : public X86TargetInfo {
4681public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004682 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4683 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004684 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004685 bool IsWinCOFF =
4686 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004687 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004688 LongDoubleWidth = 128;
4689 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004690 LargeArrayMinWidth = 128;
4691 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004692 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004693 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4694 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4695 IntPtrType = IsX32 ? SignedInt : SignedLong;
4696 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004697 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004698 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004699
Eric Christopher917e9522014-11-18 22:36:15 +00004700 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004701 resetDataLayout(IsX32
4702 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4703 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4704 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004705
4706 // Use fpret only for long double.
4707 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004708
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004709 // Use fp2ret for _Complex long double.
4710 ComplexLongDoubleUsesFP2Ret = true;
4711
Charles Davisc7d5c942015-09-17 20:55:33 +00004712 // Make __builtin_ms_va_list available.
4713 HasBuiltinMSVaList = true;
4714
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004715 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004716 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004717 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004718 }
Craig Topper3164f332014-03-11 03:39:26 +00004719 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004720 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004721 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004722
Craig Topper3164f332014-03-11 03:39:26 +00004723 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004724 if (RegNo == 0) return 0;
4725 if (RegNo == 1) return 1;
4726 return -1;
4727 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004728
Craig Topper3164f332014-03-11 03:39:26 +00004729 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004730 switch (CC) {
4731 case CC_C:
4732 case CC_Swift:
4733 case CC_X86VectorCall:
4734 case CC_IntelOclBicc:
4735 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004736 case CC_PreserveMost:
4737 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004738 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004739 return CCCR_OK;
4740 default:
4741 return CCCR_Warning;
4742 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004743 }
4744
Craig Topper3164f332014-03-11 03:39:26 +00004745 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004746 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004747 }
4748
Pavel Chupinfd223e12014-08-04 12:39:43 +00004749 // for x32 we need it here explicitly
4750 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004751 unsigned getUnwindWordWidth() const override { return 64; }
4752 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004753
4754 bool validateGlobalRegisterVariable(StringRef RegName,
4755 unsigned RegSize,
4756 bool &HasSizeMismatch) const override {
4757 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4758 // handle.
4759 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4760 // Check that the register size is 64-bit.
4761 HasSizeMismatch = RegSize != 64;
4762 return true;
4763 }
4764
4765 // Check if the register is a 32-bit register the backend can handle.
4766 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4767 HasSizeMismatch);
4768 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004769 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4770 return llvm::makeArrayRef(BuiltinInfoX86,
4771 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4772 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004773};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004774
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004775// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004776class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004777public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004778 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4779 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004780 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004781 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004782 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004783 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004784 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004785 SizeType = UnsignedLongLong;
4786 PtrDiffType = SignedLongLong;
4787 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004788 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004789
Craig Topper3164f332014-03-11 03:39:26 +00004790 void getTargetDefines(const LangOptions &Opts,
4791 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004792 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004793 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004794 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004795
Craig Topper3164f332014-03-11 03:39:26 +00004796 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004797 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004798 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004799
Craig Topper3164f332014-03-11 03:39:26 +00004800 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004801 switch (CC) {
4802 case CC_X86StdCall:
4803 case CC_X86ThisCall:
4804 case CC_X86FastCall:
4805 return CCCR_Ignore;
4806 case CC_C:
4807 case CC_X86VectorCall:
4808 case CC_IntelOclBicc:
4809 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004810 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004811 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004812 return CCCR_OK;
4813 default:
4814 return CCCR_Warning;
4815 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004816 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004817};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004818
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004819// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004820class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004821public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004822 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4823 const TargetOptions &Opts)
4824 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004825 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004826 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004827 }
Craig Topper3164f332014-03-11 03:39:26 +00004828 void getTargetDefines(const LangOptions &Opts,
4829 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004830 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4831 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004832 Builder.defineMacro("_M_X64", "100");
4833 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004834 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004835};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004836
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004837// x86-64 MinGW target
4838class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004840 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4841 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004842 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4843 // with x86 FP ops. Weird.
4844 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004845 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004846 }
4847
Craig Topper3164f332014-03-11 03:39:26 +00004848 void getTargetDefines(const LangOptions &Opts,
4849 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004850 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004851 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004852 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004853 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004854
4855 // GCC defines this macro when it is using __gxx_personality_seh0.
4856 if (!Opts.SjLjExceptions)
4857 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004858 }
4859};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004860
Yaron Kerend030d112015-07-22 17:38:19 +00004861// x86-64 Cygwin target
4862class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4863public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004864 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4865 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004866 TLSSupported = false;
4867 WCharType = UnsignedShort;
4868 }
4869 void getTargetDefines(const LangOptions &Opts,
4870 MacroBuilder &Builder) const override {
4871 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4872 Builder.defineMacro("__x86_64__");
4873 Builder.defineMacro("__CYGWIN__");
4874 Builder.defineMacro("__CYGWIN64__");
4875 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004876 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004877 if (Opts.CPlusPlus)
4878 Builder.defineMacro("_GNU_SOURCE");
4879
4880 // GCC defines this macro when it is using __gxx_personality_seh0.
4881 if (!Opts.SjLjExceptions)
4882 Builder.defineMacro("__SEH__");
4883 }
4884};
4885
Eli Friedman2857ccb2009-07-01 03:36:11 +00004886class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4887public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004888 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4889 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004890 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004891 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4892 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004893 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004894 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004895 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004896 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004897
4898 bool handleTargetFeatures(std::vector<std::string> &Features,
4899 DiagnosticsEngine &Diags) override {
4900 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4901 Diags))
4902 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004903 // We now know the features we have: we can decide how to align vectors.
4904 MaxVectorAlign =
4905 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004906 return true;
4907 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004908};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004909
Eli Friedman245f2292009-07-05 22:31:18 +00004910class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4911public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004912 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4913 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004914 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004915 Int64Type = SignedLongLong;
4916 }
4917};
Eli Friedman245f2292009-07-05 22:31:18 +00004918
Eli Friedman9fa28852012-08-08 23:57:20 +00004919class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4920public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004921 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4922 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004923 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004924 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004925 }
4926};
Tim Northover9bb857a2013-01-31 12:13:10 +00004927
Eli Friedmanf05b7722008-08-20 07:44:10 +00004928class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004929 // Possible FPU choices.
4930 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004931 VFP2FPU = (1 << 0),
4932 VFP3FPU = (1 << 1),
4933 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004934 NeonFPU = (1 << 3),
4935 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004936 };
4937
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004938 // Possible HWDiv features.
4939 enum HWDivMode {
4940 HWDivThumb = (1 << 0),
4941 HWDivARM = (1 << 1)
4942 };
4943
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004944 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004945 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004946 }
4947
4948 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4949 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004950
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004951 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004952
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004953 StringRef CPUProfile;
4954 StringRef CPUAttr;
4955
Rafael Espindolaeb265472013-08-21 21:59:03 +00004956 enum {
4957 FP_Default,
4958 FP_VFP,
4959 FP_Neon
4960 } FPMath;
4961
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004962 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004963 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004964 unsigned ArchProfile;
4965 unsigned ArchVersion;
4966
Bernard Ogdenda13af32013-10-24 18:32:51 +00004967 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004968
Logan Chien57086ce2012-10-10 06:56:20 +00004969 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004970 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004971
4972 // Initialized via features.
4973 unsigned SoftFloat : 1;
4974 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004975
Bernard Ogden18b57012013-10-29 09:47:51 +00004976 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004977 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004978 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004979 unsigned Unaligned : 1;
4980
4981 enum {
4982 LDREX_B = (1 << 0), /// byte (8-bit)
4983 LDREX_H = (1 << 1), /// half (16-bit)
4984 LDREX_W = (1 << 2), /// word (32-bit)
4985 LDREX_D = (1 << 3), /// double (64-bit)
4986 };
4987
4988 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004989
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004990 // ACLE 6.5.1 Hardware floating point
4991 enum {
4992 HW_FP_HP = (1 << 1), /// half (16-bit)
4993 HW_FP_SP = (1 << 2), /// single (32-bit)
4994 HW_FP_DP = (1 << 3), /// double (64-bit)
4995 };
4996 uint32_t HW_FP;
4997
Chris Lattner5cc15e02010-03-03 19:03:45 +00004998 static const Builtin::Info BuiltinInfo[];
4999
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005000 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005001 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005002
5003 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00005004 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005005
Renato Golin0201a9e2016-09-22 19:28:20 +00005006 // size_t is unsigned long on MachO-derived environments, NetBSD,
5007 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005008 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005009 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005010 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005011 SizeType = UnsignedLong;
5012 else
5013 SizeType = UnsignedInt;
5014
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005015 switch (T.getOS()) {
5016 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005017 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005018 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005019 break;
5020 case llvm::Triple::Win32:
5021 WCharType = UnsignedShort;
5022 break;
5023 case llvm::Triple::Linux:
5024 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005025 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5026 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005027 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005028 }
5029
5030 UseBitFieldTypeAlignment = true;
5031
5032 ZeroLengthBitfieldBoundary = 0;
5033
Tim Northover147cd2f2014-10-14 22:12:21 +00005034 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5035 // so set preferred for small types to 32.
5036 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005037 resetDataLayout(BigEndian
5038 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5039 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005040 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005041 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005042 resetDataLayout("e"
5043 "-m:w"
5044 "-p:32:32"
5045 "-i64:64"
5046 "-v128:64:128"
5047 "-a:0:32"
5048 "-n32"
5049 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005050 } else if (T.isOSNaCl()) {
5051 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005052 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005053 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005054 resetDataLayout(BigEndian
5055 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5056 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005057 }
5058
5059 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005060 }
5061
Tim Northover5627d392015-10-30 16:30:45 +00005062 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005063 const llvm::Triple &T = getTriple();
5064
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005065 IsAAPCS = false;
5066
Tim Northover5627d392015-10-30 16:30:45 +00005067 if (IsAAPCS16)
5068 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5069 else
5070 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005071
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005072 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005073 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005074 SizeType = UnsignedInt;
5075 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005076 SizeType = UnsignedLong;
5077
5078 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5079 WCharType = SignedInt;
5080
5081 // Do not respect the alignment of bit-field types when laying out
5082 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5083 UseBitFieldTypeAlignment = false;
5084
5085 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5086 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5087 /// gcc.
5088 ZeroLengthBitfieldBoundary = 32;
5089
Tim Northover5627d392015-10-30 16:30:45 +00005090 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5091 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005092 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005093 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005094 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005095 BigEndian
5096 ? "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 +00005097 : "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 +00005098 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005099 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005100 BigEndian
5101 ? "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 +00005102 : "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 +00005103
5104 // FIXME: Override "preferred align" for double and long long.
5105 }
5106
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005107 void setArchInfo() {
5108 StringRef ArchName = getTriple().getArchName();
5109
Renato Goline84b0002015-10-08 16:43:26 +00005110 ArchISA = llvm::ARM::parseArchISA(ArchName);
5111 CPU = llvm::ARM::getDefaultCPU(ArchName);
5112 unsigned AK = llvm::ARM::parseArch(ArchName);
5113 if (AK != llvm::ARM::AK_INVALID)
5114 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005115 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005116 }
5117
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005118 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005119 StringRef SubArch;
5120
5121 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005122 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005123 SubArch = llvm::ARM::getSubArch(ArchKind);
5124 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5125 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005126
5127 // cache CPU related strings
5128 CPUAttr = getCPUAttr();
5129 CPUProfile = getCPUProfile();
5130 }
5131
5132 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005133 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005134 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005135 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005136 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5137 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005138 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005139 if (ArchProfile == llvm::ARM::PK_M) {
5140 MaxAtomicPromoteWidth = 32;
5141 if (ShouldUseInlineAtomic)
5142 MaxAtomicInlineWidth = 32;
5143 }
5144 else {
5145 MaxAtomicPromoteWidth = 64;
5146 if (ShouldUseInlineAtomic)
5147 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005148 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005149 }
5150
5151 bool isThumb() const {
5152 return (ArchISA == llvm::ARM::IK_THUMB);
5153 }
5154
5155 bool supportsThumb() const {
5156 return CPUAttr.count('T') || ArchVersion >= 6;
5157 }
5158
5159 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005160 return CPUAttr.equals("6T2") ||
5161 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005162 }
5163
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005164 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005165 // For most sub-arches, the build attribute CPU name is enough.
5166 // For Cortex variants, it's slightly different.
5167 switch(ArchKind) {
5168 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005169 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005170 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005172 case llvm::ARM::AK_ARMV7S:
5173 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005174 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005175 return "7A";
5176 case llvm::ARM::AK_ARMV7R:
5177 return "7R";
5178 case llvm::ARM::AK_ARMV7M:
5179 return "7M";
5180 case llvm::ARM::AK_ARMV7EM:
5181 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005182 case llvm::ARM::AK_ARMV7VE:
5183 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005184 case llvm::ARM::AK_ARMV8A:
5185 return "8A";
5186 case llvm::ARM::AK_ARMV8_1A:
5187 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005188 case llvm::ARM::AK_ARMV8_2A:
5189 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005190 case llvm::ARM::AK_ARMV8MBaseline:
5191 return "8M_BASE";
5192 case llvm::ARM::AK_ARMV8MMainline:
5193 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005194 case llvm::ARM::AK_ARMV8R:
5195 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005196 }
5197 }
5198
5199 StringRef getCPUProfile() const {
5200 switch(ArchProfile) {
5201 case llvm::ARM::PK_A:
5202 return "A";
5203 case llvm::ARM::PK_R:
5204 return "R";
5205 case llvm::ARM::PK_M:
5206 return "M";
5207 default:
5208 return "";
5209 }
5210 }
5211
Chris Lattner17df24e2008-04-21 18:56:49 +00005212public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005213 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005214 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5215 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005216
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005217 switch (getTriple().getOS()) {
5218 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005219 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005220 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005221 break;
5222 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005223 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005224 break;
5225 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005226
Renato Goline84b0002015-10-08 16:43:26 +00005227 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005228 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005229
Chris Lattner1a8f3942010-04-23 16:29:58 +00005230 // {} in inline assembly are neon specifiers, not assembly variant
5231 // specifiers.
5232 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005233
Eric Christopher0e261882014-12-05 01:06:59 +00005234 // FIXME: This duplicates code from the driver that sets the -target-abi
5235 // option - this code is used if -target-abi isn't passed and should
5236 // be unified in some way.
5237 if (Triple.isOSBinFormatMachO()) {
5238 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5239 // the frontend matches that.
5240 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5241 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005242 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005243 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005244 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005245 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005246 } else {
5247 setABI("apcs-gnu");
5248 }
5249 } else if (Triple.isOSWindows()) {
5250 // FIXME: this is invalid for WindowsCE
5251 setABI("aapcs");
5252 } else {
5253 // Select the default based on the platform.
5254 switch (Triple.getEnvironment()) {
5255 case llvm::Triple::Android:
5256 case llvm::Triple::GNUEABI:
5257 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005258 case llvm::Triple::MuslEABI:
5259 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005260 setABI("aapcs-linux");
5261 break;
5262 case llvm::Triple::EABIHF:
5263 case llvm::Triple::EABI:
5264 setABI("aapcs");
5265 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005266 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005267 setABI("apcs-gnu");
5268 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005269 default:
5270 if (Triple.getOS() == llvm::Triple::NetBSD)
5271 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005272 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5273 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005274 else
5275 setABI("aapcs");
5276 break;
5277 }
5278 }
John McCall86353412010-08-21 22:46:04 +00005279
5280 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005281 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005282
Renato Golin15b86152015-07-03 16:41:13 +00005283 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005284 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005285
James Molloya7139222012-03-12 09:14:10 +00005286 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005287 // the alignment of the zero-length bitfield is greater than the member
5288 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005289 // zero length bitfield.
5290 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005291
5292 if (Triple.getOS() == llvm::Triple::Linux ||
5293 Triple.getOS() == llvm::Triple::UnknownOS)
5294 this->MCountName =
5295 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005296 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005297
Alp Toker4925ba72014-06-07 23:30:42 +00005298 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005299
Craig Topper3164f332014-03-11 03:39:26 +00005300 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005301 ABI = Name;
5302
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005303 // The defaults (above) are for AAPCS, check if we need to change them.
5304 //
5305 // FIXME: We need support for -meabi... we could just mangle it into the
5306 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005307 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005308 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005309 return true;
5310 }
5311 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5312 setABIAAPCS();
5313 return true;
5314 }
5315 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005316 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005317
Renato Golinf5c4dec2015-05-27 13:33:00 +00005318 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005319 bool
5320 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5321 StringRef CPU,
5322 const std::vector<std::string> &FeaturesVec) const override {
5323
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005324 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005325 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005326
5327 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005328 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005329 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5330
5331 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005332 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005333 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5334
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005335 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005336 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005337 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005338
Eric Christopher007b0a02015-08-28 22:32:01 +00005339 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005340 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005341
Craig Topper3164f332014-03-11 03:39:26 +00005342 bool handleTargetFeatures(std::vector<std::string> &Features,
5343 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005344 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005345 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005346 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005347 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005348 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005349 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005350 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005351
Ranjeet Singhac08e532015-06-24 23:39:25 +00005352 // This does not diagnose illegal cases like having both
5353 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5354 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005355 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005356 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005357 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005358 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005359 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005360 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005361 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005362 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005363 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005364 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005365 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005366 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005367 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005368 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005369 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005370 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005371 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005372 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005373 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005374 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005375 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005376 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005377 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005378 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005379 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005380 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005381 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005382 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005383 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005384 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005385 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005386 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005387 } else if (Feature == "+strict-align") {
5388 Unaligned = 0;
5389 } else if (Feature == "+fp16") {
5390 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005391 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005392 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005393 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005394
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005395 switch (ArchVersion) {
5396 case 6:
5397 if (ArchProfile == llvm::ARM::PK_M)
5398 LDREX = 0;
5399 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5400 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5401 else
5402 LDREX = LDREX_W;
5403 break;
5404 case 7:
5405 if (ArchProfile == llvm::ARM::PK_M)
5406 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5407 else
5408 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5409 break;
5410 case 8:
5411 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5412 }
5413
Rafael Espindolaeb265472013-08-21 21:59:03 +00005414 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5415 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5416 return false;
5417 }
5418
5419 if (FPMath == FP_Neon)
5420 Features.push_back("+neonfp");
5421 else if (FPMath == FP_VFP)
5422 Features.push_back("-neonfp");
5423
Daniel Dunbar893d4752009-12-19 04:15:38 +00005424 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005425 auto Feature =
5426 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5427 if (Feature != Features.end())
5428 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005429
Rafael Espindolaeb265472013-08-21 21:59:03 +00005430 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005431 }
5432
Craig Topper3164f332014-03-11 03:39:26 +00005433 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005434 return llvm::StringSwitch<bool>(Feature)
5435 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005436 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005437 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005438 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005439 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005440 .Case("hwdiv", HWDiv & HWDivThumb)
5441 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005442 .Default(false);
5443 }
Renato Golin15b86152015-07-03 16:41:13 +00005444
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005445 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005446 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005447 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005448
Renato Golin15b86152015-07-03 16:41:13 +00005449 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005450 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005451 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005452 CPU = Name;
5453 return true;
5454 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005455
Craig Topper3164f332014-03-11 03:39:26 +00005456 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005457
Craig Topper3164f332014-03-11 03:39:26 +00005458 void getTargetDefines(const LangOptions &Opts,
5459 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005460 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005461 Builder.defineMacro("__arm");
5462 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005463 // For bare-metal none-eabi.
5464 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5465 getTriple().getEnvironment() == llvm::Triple::EABI)
5466 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005467
Chris Lattnerecd49032009-03-02 22:27:17 +00005468 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005469 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005470
5471 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5472 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005473 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005474 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5475
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005476 if (!CPUAttr.empty())
5477 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005478
5479 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005480 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005481 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005482
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005483 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005484 // ACLE 6.5.7 Crypto Extension
5485 if (Crypto)
5486 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5487 // ACLE 6.5.8 CRC32 Extension
5488 if (CRC)
5489 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5490 // ACLE 6.5.10 Numeric Maximum and Minimum
5491 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5492 // ACLE 6.5.9 Directed Rounding
5493 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005494 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005495
5496 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5497 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005498 // NOTE that the default profile is assumed to be 'A'
5499 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005500 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5501
Bradley Smithf4affc12016-03-03 13:52:22 +00005502 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5503 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5504 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5505 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005506 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005507 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005508 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005509 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5510
5511 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5512 // instruction set such as ARM or Thumb.
5513 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5514
5515 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5516
5517 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005518 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005519 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005520
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005521 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005522 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005523 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005524
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005525 // ACLE 6.4.4 LDREX/STREX
5526 if (LDREX)
5527 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5528
5529 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005530 if (ArchVersion == 5 ||
5531 (ArchVersion == 6 && CPUProfile != "M") ||
5532 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005533 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5534
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005535 // ACLE 6.5.1 Hardware Floating Point
5536 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005537 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005538
Yi Konga44c4d72014-06-27 21:25:42 +00005539 // ACLE predefines.
5540 Builder.defineMacro("__ARM_ACLE", "200");
5541
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005542 // FP16 support (we currently only support IEEE format).
5543 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5544 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5545
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005546 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005547 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005548 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5549
Mike Stump9d54bd72009-04-08 02:07:04 +00005550 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005551
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005552 // FIXME: It's more complicated than this and we don't really support
5553 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005554 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005555 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005556 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005557
David Tweed8f676532012-10-25 13:33:01 +00005558 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005559 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005560 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005561 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005562 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005563 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005564 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005565
Tim Northover28fc0e12016-04-28 13:59:55 +00005566 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5567 ABI == "aapcs16")
5568 Builder.defineMacro("__ARM_PCS_VFP", "1");
5569
Daniel Dunbar893d4752009-12-19 04:15:38 +00005570 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005571 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005572
Zijiao Ma56a83722016-08-17 02:13:33 +00005573 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005574 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005575
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005576 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005577 Builder.defineMacro("__THUMBEL__");
5578 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005579 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005580 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005581 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005582
5583 // ACLE 6.4.9 32-bit SIMD instructions
5584 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5585 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5586
5587 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005588 if (((HWDiv & HWDivThumb) && isThumb()) ||
5589 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005590 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005591 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005592 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005593
5594 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005595 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005596
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005597 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005598 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005599 if (FPU & VFP2FPU)
5600 Builder.defineMacro("__ARM_VFPV2__");
5601 if (FPU & VFP3FPU)
5602 Builder.defineMacro("__ARM_VFPV3__");
5603 if (FPU & VFP4FPU)
5604 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005605 if (FPU & FPARMV8)
5606 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005607 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005608
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005609 // This only gets set when Neon instructions are actually available, unlike
5610 // the VFP define, hence the soft float and arch check. This is subtly
5611 // different from gcc, we follow the intent which was that it should be set
5612 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005613 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005614 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005615 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005616 // current AArch32 NEON implementations do not support double-precision
5617 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005618 Builder.defineMacro("__ARM_NEON_FP",
5619 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005620 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005621
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005622 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5623 Opts.ShortWChar ? "2" : "4");
5624
5625 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5626 Opts.ShortEnums ? "1" : "4");
5627
Bradley Smithf4affc12016-03-03 13:52:22 +00005628 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005629 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5630 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5631 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5632 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5633 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005634
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005635 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005636 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005637 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005638 }
5639
5640 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005641 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005642 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5643 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005644 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005645 }
5646
5647 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005648 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005649 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005650
5651 if (Opts.UnsafeFPMath)
5652 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005653
5654 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5655 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005656 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005657
Craig Topper6c03a542015-10-19 04:51:35 +00005658 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5659 return llvm::makeArrayRef(BuiltinInfo,
5660 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005661 }
Craig Topper3164f332014-03-11 03:39:26 +00005662 bool isCLZForZeroUndef() const override { return false; }
5663 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005664 return IsAAPCS
5665 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005666 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5667 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005668 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005669 ArrayRef<const char *> getGCCRegNames() const override;
5670 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005671 bool validateAsmConstraint(const char *&Name,
5672 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005673 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005674 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005675 case 'l': // r0-r7
5676 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005677 case 't': // VFP Floating point register single precision
5678 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005679 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005680 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005681 case 'I':
5682 case 'J':
5683 case 'K':
5684 case 'L':
5685 case 'M':
5686 // FIXME
5687 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005688 case 'Q': // A memory address that is a single base register.
5689 Info.setAllowsMemory();
5690 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005691 case 'U': // a memory reference...
5692 switch (Name[1]) {
5693 case 'q': // ...ARMV4 ldrsb
5694 case 'v': // ...VFP load/store (reg+constant offset)
5695 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005696 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005697 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005698 case 'n': // valid address for Neon doubleword vector load/store
5699 case 'm': // valid address for Neon element and structure load/store
5700 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005701 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005702 Info.setAllowsMemory();
5703 Name++;
5704 return true;
5705 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005706 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005707 return false;
5708 }
Craig Topper3164f332014-03-11 03:39:26 +00005709 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005710 std::string R;
5711 switch (*Constraint) {
5712 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005713 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005714 Constraint++;
5715 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005716 case 'p': // 'p' should be translated to 'r' by default.
5717 R = std::string("r");
5718 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005719 default:
5720 return std::string(1, *Constraint);
5721 }
5722 return R;
5723 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005724 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005725 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005726 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005727 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005728 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005729
Bill Wendling9d1ee112012-10-25 23:28:48 +00005730 // Strip off constraint modifiers.
5731 while (Constraint[0] == '=' ||
5732 Constraint[0] == '+' ||
5733 Constraint[0] == '&')
5734 Constraint = Constraint.substr(1);
5735
5736 switch (Constraint[0]) {
5737 default: break;
5738 case 'r': {
5739 switch (Modifier) {
5740 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005741 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005742 case 'q':
5743 // A register of size 32 cannot fit a vector type.
5744 return false;
5745 }
5746 }
5747 }
5748
5749 return true;
5750 }
Craig Topper3164f332014-03-11 03:39:26 +00005751 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005752 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005753 return "";
5754 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005755
Craig Topper3164f332014-03-11 03:39:26 +00005756 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005757 switch (CC) {
5758 case CC_AAPCS:
5759 case CC_AAPCS_VFP:
5760 case CC_Swift:
5761 return CCCR_OK;
5762 default:
5763 return CCCR_Warning;
5764 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005765 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005766
Craig Topper3164f332014-03-11 03:39:26 +00005767 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005768 if (RegNo == 0) return 0;
5769 if (RegNo == 1) return 1;
5770 return -1;
5771 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005772
5773 bool hasSjLjLowering() const override {
5774 return true;
5775 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005776};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005777
Rafael Espindolaeb265472013-08-21 21:59:03 +00005778bool ARMTargetInfo::setFPMath(StringRef Name) {
5779 if (Name == "neon") {
5780 FPMath = FP_Neon;
5781 return true;
5782 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5783 Name == "vfp4") {
5784 FPMath = FP_VFP;
5785 return true;
5786 }
5787 return false;
5788}
5789
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005790const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005791 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005792 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005793 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5794
5795 // Float registers
5796 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5797 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5798 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005799 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005800
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005801 // Double registers
5802 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5803 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005804 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5805 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005806
5807 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005808 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5809 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005810};
5811
Craig Topperf054e3a2015-10-19 03:52:27 +00005812ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5813 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005814}
5815
5816const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005817 { { "a1" }, "r0" },
5818 { { "a2" }, "r1" },
5819 { { "a3" }, "r2" },
5820 { { "a4" }, "r3" },
5821 { { "v1" }, "r4" },
5822 { { "v2" }, "r5" },
5823 { { "v3" }, "r6" },
5824 { { "v4" }, "r7" },
5825 { { "v5" }, "r8" },
5826 { { "v6", "rfp" }, "r9" },
5827 { { "sl" }, "r10" },
5828 { { "fp" }, "r11" },
5829 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005830 { { "r13" }, "sp" },
5831 { { "r14" }, "lr" },
5832 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005833 // The S, D and Q registers overlap, but aren't really aliases; we
5834 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005835};
5836
Craig Topperf054e3a2015-10-19 03:52:27 +00005837ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5838 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005839}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005840
5841const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005842#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005843 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005844#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5845 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005846#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005847
Craig Topper07d3b622015-08-07 05:14:44 +00005848#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005849 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005850#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005851 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005852#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5853 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005854#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5855 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005856#include "clang/Basic/BuiltinsARM.def"
5857};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005858
5859class ARMleTargetInfo : public ARMTargetInfo {
5860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005861 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005862 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005863 void getTargetDefines(const LangOptions &Opts,
5864 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005865 Builder.defineMacro("__ARMEL__");
5866 ARMTargetInfo::getTargetDefines(Opts, Builder);
5867 }
5868};
5869
5870class ARMbeTargetInfo : public ARMTargetInfo {
5871public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005872 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005873 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005874 void getTargetDefines(const LangOptions &Opts,
5875 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005876 Builder.defineMacro("__ARMEB__");
5877 Builder.defineMacro("__ARM_BIG_ENDIAN");
5878 ARMTargetInfo::getTargetDefines(Opts, Builder);
5879 }
5880};
Chris Lattner17df24e2008-04-21 18:56:49 +00005881
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005882class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5883 const llvm::Triple Triple;
5884public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005885 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5886 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005887 WCharType = UnsignedShort;
5888 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005889 }
5890 void getVisualStudioDefines(const LangOptions &Opts,
5891 MacroBuilder &Builder) const {
5892 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5893
5894 // FIXME: this is invalid for WindowsCE
5895 Builder.defineMacro("_M_ARM_NT", "1");
5896 Builder.defineMacro("_M_ARMT", "_M_ARM");
5897 Builder.defineMacro("_M_THUMB", "_M_ARM");
5898
5899 assert((Triple.getArch() == llvm::Triple::arm ||
5900 Triple.getArch() == llvm::Triple::thumb) &&
5901 "invalid architecture for Windows ARM target info");
5902 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5903 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5904
5905 // TODO map the complete set of values
5906 // 31: VFPv3 40: VFPv4
5907 Builder.defineMacro("_M_ARM_FP", "31");
5908 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005909 BuiltinVaListKind getBuiltinVaListKind() const override {
5910 return TargetInfo::CharPtrBuiltinVaList;
5911 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005912 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5913 switch (CC) {
5914 case CC_X86StdCall:
5915 case CC_X86ThisCall:
5916 case CC_X86FastCall:
5917 case CC_X86VectorCall:
5918 return CCCR_Ignore;
5919 case CC_C:
5920 return CCCR_OK;
5921 default:
5922 return CCCR_Warning;
5923 }
5924 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005925};
5926
5927// Windows ARM + Itanium C++ ABI Target
5928class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5929public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005930 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5931 const TargetOptions &Opts)
5932 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005933 TheCXXABI.set(TargetCXXABI::GenericARM);
5934 }
5935
5936 void getTargetDefines(const LangOptions &Opts,
5937 MacroBuilder &Builder) const override {
5938 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5939
5940 if (Opts.MSVCCompat)
5941 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5942 }
5943};
5944
5945// Windows ARM, MS (C++) ABI
5946class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5947public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005948 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5949 const TargetOptions &Opts)
5950 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005951 TheCXXABI.set(TargetCXXABI::Microsoft);
5952 }
5953
5954 void getTargetDefines(const LangOptions &Opts,
5955 MacroBuilder &Builder) const override {
5956 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5957 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5958 }
5959};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005960
Yaron Keren321249c2015-07-15 13:32:23 +00005961// ARM MinGW target
5962class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5963public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005964 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5965 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005966 TheCXXABI.set(TargetCXXABI::GenericARM);
5967 }
5968
5969 void getTargetDefines(const LangOptions &Opts,
5970 MacroBuilder &Builder) const override {
5971 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5972 DefineStd(Builder, "WIN32", Opts);
5973 DefineStd(Builder, "WINNT", Opts);
5974 Builder.defineMacro("_ARM_");
5975 addMinGWDefines(Opts, Builder);
5976 }
5977};
5978
5979// ARM Cygwin target
5980class CygwinARMTargetInfo : public ARMleTargetInfo {
5981public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005982 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5983 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005984 TLSSupported = false;
5985 WCharType = UnsignedShort;
5986 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005987 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005988 }
5989 void getTargetDefines(const LangOptions &Opts,
5990 MacroBuilder &Builder) const override {
5991 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5992 Builder.defineMacro("_ARM_");
5993 Builder.defineMacro("__CYGWIN__");
5994 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005995 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005996 if (Opts.CPlusPlus)
5997 Builder.defineMacro("_GNU_SOURCE");
5998 }
5999};
6000
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006001class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00006002protected:
Craig Topper3164f332014-03-11 03:39:26 +00006003 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6004 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00006005 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006006 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006007
Torok Edwinb2b37c62009-06-30 17:10:35 +00006008public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006009 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6010 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006011 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006012 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006013 // FIXME: This should be based off of the target features in
6014 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006015 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006016
Tim Northoverd88ecb32016-01-27 19:32:40 +00006017 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006018 // Darwin on iOS uses a variant of the ARM C++ ABI.
6019 TheCXXABI.set(TargetCXXABI::WatchOS);
6020
6021 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6022 // size_t is long, it's a bit weird for it to be int.
6023 PtrDiffType = SignedLong;
6024
6025 // BOOL should be a real boolean on the new ABI
6026 UseSignedCharForObjCBool = false;
6027 } else
6028 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006029 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006030};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006031
Tim Northover573cbee2014-05-24 12:52:07 +00006032class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006033 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006034 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6035 static const char *const GCCRegNames[];
6036
James Molloy75f5f9e2014-04-16 15:33:48 +00006037 enum FPUModeEnum {
6038 FPUMode,
6039 NeonMode
6040 };
6041
6042 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006043 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006044 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006045 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006046 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006047
Tim Northovera2ee4332014-03-29 15:09:45 +00006048 static const Builtin::Info BuiltinInfo[];
6049
6050 std::string ABI;
6051
6052public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006053 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006054 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006055 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6056 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006057 WCharType = SignedInt;
6058
6059 // NetBSD apparently prefers consistency across ARM targets to consistency
6060 // across 64-bit targets.
6061 Int64Type = SignedLongLong;
6062 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006063 } else {
6064 WCharType = UnsignedInt;
6065 Int64Type = SignedLong;
6066 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006067 }
6068
Tim Northovera2ee4332014-03-29 15:09:45 +00006069 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006070 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006071 MaxAtomicInlineWidth = 128;
6072 MaxAtomicPromoteWidth = 128;
6073
Tim Northovera6a19f12015-02-06 01:25:07 +00006074 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006075 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006076
Tim Northovera2ee4332014-03-29 15:09:45 +00006077 // {} in inline assembly are neon specifiers, not assembly variant
6078 // specifiers.
6079 NoAsmVariants = true;
6080
Tim Northover7ad87af2015-01-16 18:44:04 +00006081 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6082 // contributes to the alignment of the containing aggregate in the same way
6083 // a plain (non bit-field) member of that type would, without exception for
6084 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006085 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006086 UseZeroLengthBitfieldAlignment = true;
6087
Tim Northover573cbee2014-05-24 12:52:07 +00006088 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006089 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006090
Eric Christopherfb834a82017-02-28 17:22:05 +00006091 if (Triple.getOS() == llvm::Triple::Linux)
6092 this->MCountName = "\01_mcount";
6093 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006094 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006095 }
6096
Alp Toker4925ba72014-06-07 23:30:42 +00006097 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006098 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006099 if (Name != "aapcs" && Name != "darwinpcs")
6100 return false;
6101
6102 ABI = Name;
6103 return true;
6104 }
6105
David Blaikie1cbb9712014-11-14 19:09:44 +00006106 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006107 return Name == "generic" ||
6108 llvm::AArch64::parseCPUArch(Name) !=
6109 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006110 }
6111
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006112 void getTargetDefines(const LangOptions &Opts,
6113 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006114 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006115 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006116
6117 // Target properties.
6118 Builder.defineMacro("_LP64");
6119 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006120
6121 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6122 Builder.defineMacro("__ARM_ACLE", "200");
6123 Builder.defineMacro("__ARM_ARCH", "8");
6124 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6125
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006126 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006127 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006128 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006129
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006130 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6131 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6132 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6133 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006134 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006135 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6136 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006137
6138 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6139
6140 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006141 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006142
6143 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6144 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006145 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6146 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006147
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006148 if (Opts.UnsafeFPMath)
6149 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006150
6151 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6152
6153 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6154 Opts.ShortEnums ? "1" : "4");
6155
James Molloy75f5f9e2014-04-16 15:33:48 +00006156 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006157 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006158 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006159 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006160 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006161
Bradley Smith418c5932014-05-02 15:17:51 +00006162 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006163 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006164
James Molloy75f5f9e2014-04-16 15:33:48 +00006165 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006166 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6167
6168 if (Unaligned)
6169 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006170
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006171 if (V8_1A)
6172 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6173
Reid Klecknerd167d422015-05-06 15:31:46 +00006174 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6175 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6176 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6177 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006179 }
6180
Craig Topper6c03a542015-10-19 04:51:35 +00006181 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6182 return llvm::makeArrayRef(BuiltinInfo,
6183 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006184 }
6185
David Blaikie1cbb9712014-11-14 19:09:44 +00006186 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006187 return Feature == "aarch64" ||
6188 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006189 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006190 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006191 }
6192
James Molloy5e73df52014-04-16 15:06:20 +00006193 bool handleTargetFeatures(std::vector<std::string> &Features,
6194 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006195 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006196 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006197 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006198 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006199 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006200
Eric Christopher610fe112015-08-26 08:21:55 +00006201 for (const auto &Feature : Features) {
6202 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006203 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006204 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006205 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006206 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006207 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006208 if (Feature == "+strict-align")
6209 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006210 if (Feature == "+v8.1a")
6211 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006212 }
6213
James Y Knightb214cbc2016-03-04 19:00:41 +00006214 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006215
6216 return true;
6217 }
6218
John McCall477f2bb2016-03-03 06:39:32 +00006219 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6220 switch (CC) {
6221 case CC_C:
6222 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006223 case CC_PreserveMost:
6224 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006225 return CCCR_OK;
6226 default:
6227 return CCCR_Warning;
6228 }
6229 }
6230
David Blaikie1cbb9712014-11-14 19:09:44 +00006231 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006232
David Blaikie1cbb9712014-11-14 19:09:44 +00006233 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006234 return TargetInfo::AArch64ABIBuiltinVaList;
6235 }
6236
Craig Topperf054e3a2015-10-19 03:52:27 +00006237 ArrayRef<const char *> getGCCRegNames() const override;
6238 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006239
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006240 bool validateAsmConstraint(const char *&Name,
6241 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006242 switch (*Name) {
6243 default:
6244 return false;
6245 case 'w': // Floating point and SIMD registers (V0-V31)
6246 Info.setAllowsRegister();
6247 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006248 case 'I': // Constant that can be used with an ADD instruction
6249 case 'J': // Constant that can be used with a SUB instruction
6250 case 'K': // Constant that can be used with a 32-bit logical instruction
6251 case 'L': // Constant that can be used with a 64-bit logical instruction
6252 case 'M': // Constant that can be used as a 32-bit MOV immediate
6253 case 'N': // Constant that can be used as a 64-bit MOV immediate
6254 case 'Y': // Floating point constant zero
6255 case 'Z': // Integer constant zero
6256 return true;
6257 case 'Q': // A memory reference with base register and no offset
6258 Info.setAllowsMemory();
6259 return true;
6260 case 'S': // A symbolic address
6261 Info.setAllowsRegister();
6262 return true;
6263 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006264 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6265 // Utf: A memory address suitable for ldp/stp in TF mode.
6266 // Usa: An absolute symbolic address.
6267 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6268 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006269 case 'z': // Zero register, wzr or xzr
6270 Info.setAllowsRegister();
6271 return true;
6272 case 'x': // Floating point and SIMD registers (V0-V15)
6273 Info.setAllowsRegister();
6274 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006275 }
6276 return false;
6277 }
6278
Akira Hatanaka987f1862014-08-22 06:05:21 +00006279 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006280 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006281 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006282 // Strip off constraint modifiers.
6283 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6284 Constraint = Constraint.substr(1);
6285
6286 switch (Constraint[0]) {
6287 default:
6288 return true;
6289 case 'z':
6290 case 'r': {
6291 switch (Modifier) {
6292 case 'x':
6293 case 'w':
6294 // For now assume that the person knows what they're
6295 // doing with the modifier.
6296 return true;
6297 default:
6298 // By default an 'r' constraint will be in the 'x'
6299 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006300 if (Size == 64)
6301 return true;
6302
6303 SuggestedModifier = "w";
6304 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006305 }
6306 }
6307 }
6308 }
6309
David Blaikie1cbb9712014-11-14 19:09:44 +00006310 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006311
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006312 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006313 if (RegNo == 0)
6314 return 0;
6315 if (RegNo == 1)
6316 return 1;
6317 return -1;
6318 }
6319};
6320
Tim Northover573cbee2014-05-24 12:52:07 +00006321const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006322 // 32-bit Integer registers
6323 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6324 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6325 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6326
6327 // 64-bit Integer registers
6328 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6329 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6330 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6331
6332 // 32-bit floating point regsisters
6333 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6334 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6335 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6336
6337 // 64-bit floating point regsisters
6338 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6339 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6340 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6341
6342 // Vector registers
6343 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6344 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6345 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6346};
6347
Craig Topperf054e3a2015-10-19 03:52:27 +00006348ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6349 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006350}
6351
Tim Northover573cbee2014-05-24 12:52:07 +00006352const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006353 { { "w31" }, "wsp" },
6354 { { "x29" }, "fp" },
6355 { { "x30" }, "lr" },
6356 { { "x31" }, "sp" },
6357 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6358 // don't want to substitute one of these for a different-sized one.
6359};
6360
Craig Topperf054e3a2015-10-19 03:52:27 +00006361ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6362 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006363}
6364
Tim Northover573cbee2014-05-24 12:52:07 +00006365const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006366#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006367 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006368#include "clang/Basic/BuiltinsNEON.def"
6369
6370#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006371 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006372#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006373};
James Molloy5e73df52014-04-16 15:06:20 +00006374
Tim Northover573cbee2014-05-24 12:52:07 +00006375class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006376 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006377 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006378 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006379 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006380 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006381 }
6382
6383public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006384 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6385 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006386 }
James Molloy5e73df52014-04-16 15:06:20 +00006387 void getTargetDefines(const LangOptions &Opts,
6388 MacroBuilder &Builder) const override {
6389 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006390 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006391 }
6392};
6393
Tim Northover573cbee2014-05-24 12:52:07 +00006394class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006395 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006396 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006397 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006398 }
6399
6400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006401 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6402 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006403 void getTargetDefines(const LangOptions &Opts,
6404 MacroBuilder &Builder) const override {
6405 Builder.defineMacro("__AARCH64EB__");
6406 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6407 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006408 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006409 }
6410};
Tim Northovera2ee4332014-03-29 15:09:45 +00006411
Tim Northover573cbee2014-05-24 12:52:07 +00006412class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006413protected:
6414 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6415 MacroBuilder &Builder) const override {
6416 Builder.defineMacro("__AARCH64_SIMD__");
6417 Builder.defineMacro("__ARM64_ARCH_8__");
6418 Builder.defineMacro("__ARM_NEON__");
6419 Builder.defineMacro("__LITTLE_ENDIAN__");
6420 Builder.defineMacro("__REGISTER_PREFIX__", "");
6421 Builder.defineMacro("__arm64", "1");
6422 Builder.defineMacro("__arm64__", "1");
6423
6424 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6425 }
6426
Tim Northovera2ee4332014-03-29 15:09:45 +00006427public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006428 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6429 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006430 Int64Type = SignedLongLong;
6431 WCharType = SignedInt;
6432 UseSignedCharForObjCBool = false;
6433
Tim Northovera6a19f12015-02-06 01:25:07 +00006434 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006435 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006436
6437 TheCXXABI.set(TargetCXXABI::iOS64);
6438 }
6439
David Blaikie1cbb9712014-11-14 19:09:44 +00006440 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006441 return TargetInfo::CharPtrBuiltinVaList;
6442 }
6443};
Tim Northovera2ee4332014-03-29 15:09:45 +00006444
Tony Linthicum76329bf2011-12-12 21:14:55 +00006445// Hexagon abstract base class
6446class HexagonTargetInfo : public TargetInfo {
6447 static const Builtin::Info BuiltinInfo[];
6448 static const char * const GCCRegNames[];
6449 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6450 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006451 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006452 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006455 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6456 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006457 // Specify the vector alignment explicitly. For v512x1, the calculated
6458 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6459 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006460 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006461 "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 +00006462 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006463 SizeType = UnsignedInt;
6464 PtrDiffType = SignedInt;
6465 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006466
6467 // {} in inline assembly are packet specifiers, not assembly variant
6468 // specifiers.
6469 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006470
6471 LargeArrayMinWidth = 64;
6472 LargeArrayAlign = 64;
6473 UseBitFieldTypeAlignment = true;
6474 ZeroLengthBitfieldBoundary = 32;
6475 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006476 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006477 }
6478
Craig Topper6c03a542015-10-19 04:51:35 +00006479 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6480 return llvm::makeArrayRef(BuiltinInfo,
6481 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482 }
6483
Craig Topper3164f332014-03-11 03:39:26 +00006484 bool validateAsmConstraint(const char *&Name,
6485 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006486 switch (*Name) {
6487 case 'v':
6488 case 'q':
6489 if (HasHVX) {
6490 Info.setAllowsRegister();
6491 return true;
6492 }
6493 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006494 case 's':
6495 // Relocatable constant.
6496 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006497 }
6498 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006499 }
6500
Craig Topper3164f332014-03-11 03:39:26 +00006501 void getTargetDefines(const LangOptions &Opts,
6502 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006503
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006504 bool isCLZForZeroUndef() const override { return false; }
6505
Craig Topper3164f332014-03-11 03:39:26 +00006506 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006507 return llvm::StringSwitch<bool>(Feature)
6508 .Case("hexagon", true)
6509 .Case("hvx", HasHVX)
6510 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006511 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006512 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006513 }
Craig Topper3164f332014-03-11 03:39:26 +00006514
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006515 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6516 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6517 const override;
6518
6519 bool handleTargetFeatures(std::vector<std::string> &Features,
6520 DiagnosticsEngine &Diags) override;
6521
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006522 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6523 bool Enabled) const override;
6524
Craig Topper3164f332014-03-11 03:39:26 +00006525 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006526 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006527 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006528 ArrayRef<const char *> getGCCRegNames() const override;
6529 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006530 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006531 return "";
6532 }
Sebastian Pop86500282012-01-13 20:37:10 +00006533
6534 static const char *getHexagonCPUSuffix(StringRef Name) {
6535 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006536 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006537 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006538 .Case("hexagonv55", "55")
6539 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006540 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006541 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006542 }
6543
Craig Topper3164f332014-03-11 03:39:26 +00006544 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006545 if (!getHexagonCPUSuffix(Name))
6546 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006547 CPU = Name;
6548 return true;
6549 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006550
6551 int getEHDataRegisterNumber(unsigned RegNo) const override {
6552 return RegNo < 2 ? RegNo : -1;
6553 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006554};
6555
6556void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006557 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006558 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559 Builder.defineMacro("__hexagon__", "1");
6560
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006561 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006562 Builder.defineMacro("__HEXAGON_V4__");
6563 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006564 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006565 Builder.defineMacro("__QDSP6_V4__");
6566 Builder.defineMacro("__QDSP6_ARCH__", "4");
6567 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006569 Builder.defineMacro("__HEXAGON_V5__");
6570 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6571 if(Opts.HexagonQdsp6Compat) {
6572 Builder.defineMacro("__QDSP6_V5__");
6573 Builder.defineMacro("__QDSP6_ARCH__", "5");
6574 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006575 } else if (CPU == "hexagonv55") {
6576 Builder.defineMacro("__HEXAGON_V55__");
6577 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6578 Builder.defineMacro("__QDSP6_V55__");
6579 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006580 } else if (CPU == "hexagonv60") {
6581 Builder.defineMacro("__HEXAGON_V60__");
6582 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6583 Builder.defineMacro("__QDSP6_V60__");
6584 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006585 } else if (CPU == "hexagonv62") {
6586 Builder.defineMacro("__HEXAGON_V62__");
6587 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006588 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006589
6590 if (hasFeature("hvx")) {
6591 Builder.defineMacro("__HVX__");
6592 if (hasFeature("hvx-double"))
6593 Builder.defineMacro("__HVXDBL__");
6594 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006595}
6596
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006597bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6598 DiagnosticsEngine &Diags, StringRef CPU,
6599 const std::vector<std::string> &FeaturesVec) const {
6600 // Default for v60: -hvx, -hvx-double.
6601 Features["hvx"] = false;
6602 Features["hvx-double"] = false;
6603 Features["long-calls"] = false;
6604
6605 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6606}
6607
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006608bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6609 DiagnosticsEngine &Diags) {
6610 for (auto &F : Features) {
6611 if (F == "+hvx")
6612 HasHVX = true;
6613 else if (F == "-hvx")
6614 HasHVX = HasHVXDouble = false;
6615 else if (F == "+hvx-double")
6616 HasHVX = HasHVXDouble = true;
6617 else if (F == "-hvx-double")
6618 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006619
6620 if (F == "+long-calls")
6621 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006622 else if (F == "-long-calls")
6623 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006624 }
6625 return true;
6626}
6627
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006628void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6629 StringRef Name, bool Enabled) const {
6630 if (Enabled) {
6631 if (Name == "hvx-double")
6632 Features["hvx"] = true;
6633 } else {
6634 if (Name == "hvx")
6635 Features["hvx-double"] = false;
6636 }
6637 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006638}
6639
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006640const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006641 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6642 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6643 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6644 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6645 "p0", "p1", "p2", "p3",
6646 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6647};
6648
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006649ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006650 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006651}
6652
Tony Linthicum76329bf2011-12-12 21:14:55 +00006653const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6654 { { "sp" }, "r29" },
6655 { { "fp" }, "r30" },
6656 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006657};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006658
Craig Topperf054e3a2015-10-19 03:52:27 +00006659ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6660 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006661}
6662
6663
6664const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006665#define BUILTIN(ID, TYPE, ATTRS) \
6666 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6667#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6668 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006669#include "clang/Basic/BuiltinsHexagon.def"
6670};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006671
Jacques Pienaard964cc22016-03-28 21:02:54 +00006672class LanaiTargetInfo : public TargetInfo {
6673 // Class for Lanai (32-bit).
6674 // The CPU profiles supported by the Lanai backend
6675 enum CPUKind {
6676 CK_NONE,
6677 CK_V11,
6678 } CPU;
6679
6680 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6681 static const char *const GCCRegNames[];
6682
6683public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006684 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6685 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006686 // Description string has to be kept in sync with backend.
6687 resetDataLayout("E" // Big endian
6688 "-m:e" // ELF name manging
6689 "-p:32:32" // 32 bit pointers, 32 bit aligned
6690 "-i64:64" // 64 bit integers, 64 bit aligned
6691 "-a:0:32" // 32 bit alignment of objects of aggregate type
6692 "-n32" // 32 bit native integer width
6693 "-S64" // 64 bit natural stack alignment
6694 );
6695
6696 // Setting RegParmMax equal to what mregparm was set to in the old
6697 // toolchain
6698 RegParmMax = 4;
6699
6700 // Set the default CPU to V11
6701 CPU = CK_V11;
6702
6703 // Temporary approach to make everything at least word-aligned and allow for
6704 // safely casting between pointers with different alignment requirements.
6705 // TODO: Remove this when there are no more cast align warnings on the
6706 // firmware.
6707 MinGlobalAlign = 32;
6708 }
6709
6710 void getTargetDefines(const LangOptions &Opts,
6711 MacroBuilder &Builder) const override {
6712 // Define __lanai__ when building for target lanai.
6713 Builder.defineMacro("__lanai__");
6714
6715 // Set define for the CPU specified.
6716 switch (CPU) {
6717 case CK_V11:
6718 Builder.defineMacro("__LANAI_V11__");
6719 break;
6720 case CK_NONE:
6721 llvm_unreachable("Unhandled target CPU");
6722 }
6723 }
6724
6725 bool setCPU(const std::string &Name) override {
6726 CPU = llvm::StringSwitch<CPUKind>(Name)
6727 .Case("v11", CK_V11)
6728 .Default(CK_NONE);
6729
6730 return CPU != CK_NONE;
6731 }
6732
6733 bool hasFeature(StringRef Feature) const override {
6734 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6735 }
6736
6737 ArrayRef<const char *> getGCCRegNames() const override;
6738
6739 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6740
6741 BuiltinVaListKind getBuiltinVaListKind() const override {
6742 return TargetInfo::VoidPtrBuiltinVaList;
6743 }
6744
6745 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6746
6747 bool validateAsmConstraint(const char *&Name,
6748 TargetInfo::ConstraintInfo &info) const override {
6749 return false;
6750 }
6751
6752 const char *getClobbers() const override { return ""; }
6753};
6754
6755const char *const LanaiTargetInfo::GCCRegNames[] = {
6756 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6757 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6758 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6759
6760ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6761 return llvm::makeArrayRef(GCCRegNames);
6762}
6763
6764const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6765 {{"pc"}, "r2"},
6766 {{"sp"}, "r4"},
6767 {{"fp"}, "r5"},
6768 {{"rv"}, "r8"},
6769 {{"rr1"}, "r10"},
6770 {{"rr2"}, "r11"},
6771 {{"rca"}, "r15"},
6772};
6773
6774ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6775 return llvm::makeArrayRef(GCCRegAliases);
6776}
6777
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006778// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6779class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006780 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6781 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006782 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006783public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006784 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006785 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006786
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006787 int getEHDataRegisterNumber(unsigned RegNo) const override {
6788 if (RegNo == 0) return 24;
6789 if (RegNo == 1) return 25;
6790 return -1;
6791 }
6792
Craig Topper3164f332014-03-11 03:39:26 +00006793 bool handleTargetFeatures(std::vector<std::string> &Features,
6794 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006795 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006796 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6797 if (Feature != Features.end()) {
6798 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006799 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006800 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006801 }
Craig Topper3164f332014-03-11 03:39:26 +00006802 void getTargetDefines(const LangOptions &Opts,
6803 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006804 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006805 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006806
6807 if (SoftFloat)
6808 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006809 }
Craig Topper3164f332014-03-11 03:39:26 +00006810
6811 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006812 return llvm::StringSwitch<bool>(Feature)
6813 .Case("softfloat", SoftFloat)
6814 .Case("sparc", true)
6815 .Default(false);
6816 }
Craig Topper3164f332014-03-11 03:39:26 +00006817
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006818 bool hasSjLjLowering() const override {
6819 return true;
6820 }
6821
Craig Topper6c03a542015-10-19 04:51:35 +00006822 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006823 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006824 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006825 }
Craig Topper3164f332014-03-11 03:39:26 +00006826 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006827 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006828 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006829 ArrayRef<const char *> getGCCRegNames() const override;
6830 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006831 bool validateAsmConstraint(const char *&Name,
6832 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006833 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006834 switch (*Name) {
6835 case 'I': // Signed 13-bit constant
6836 case 'J': // Zero
6837 case 'K': // 32-bit constant with the low 12 bits clear
6838 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6839 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6840 case 'N': // Same as 'K' but zext (required for SIMode)
6841 case 'O': // The constant 4096
6842 return true;
6843 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006844 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006845 }
Craig Topper3164f332014-03-11 03:39:26 +00006846 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006847 // FIXME: Implement!
6848 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006849 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006850
6851 // No Sparc V7 for now, the backend doesn't support it anyway.
6852 enum CPUKind {
6853 CK_GENERIC,
6854 CK_V8,
6855 CK_SUPERSPARC,
6856 CK_SPARCLITE,
6857 CK_F934,
6858 CK_HYPERSPARC,
6859 CK_SPARCLITE86X,
6860 CK_SPARCLET,
6861 CK_TSC701,
6862 CK_V9,
6863 CK_ULTRASPARC,
6864 CK_ULTRASPARC3,
6865 CK_NIAGARA,
6866 CK_NIAGARA2,
6867 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006868 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006869 CK_MYRIAD2100,
6870 CK_MYRIAD2150,
6871 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006872 CK_LEON2,
6873 CK_LEON2_AT697E,
6874 CK_LEON2_AT697F,
6875 CK_LEON3,
6876 CK_LEON3_UT699,
6877 CK_LEON3_GR712RC,
6878 CK_LEON4,
6879 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006880 } CPU = CK_GENERIC;
6881
6882 enum CPUGeneration {
6883 CG_V8,
6884 CG_V9,
6885 };
6886
6887 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6888 switch (Kind) {
6889 case CK_GENERIC:
6890 case CK_V8:
6891 case CK_SUPERSPARC:
6892 case CK_SPARCLITE:
6893 case CK_F934:
6894 case CK_HYPERSPARC:
6895 case CK_SPARCLITE86X:
6896 case CK_SPARCLET:
6897 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006898 case CK_MYRIAD2100:
6899 case CK_MYRIAD2150:
6900 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006901 case CK_LEON2:
6902 case CK_LEON2_AT697E:
6903 case CK_LEON2_AT697F:
6904 case CK_LEON3:
6905 case CK_LEON3_UT699:
6906 case CK_LEON3_GR712RC:
6907 case CK_LEON4:
6908 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006909 return CG_V8;
6910 case CK_V9:
6911 case CK_ULTRASPARC:
6912 case CK_ULTRASPARC3:
6913 case CK_NIAGARA:
6914 case CK_NIAGARA2:
6915 case CK_NIAGARA3:
6916 case CK_NIAGARA4:
6917 return CG_V9;
6918 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006919 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006920 }
6921
6922 CPUKind getCPUKind(StringRef Name) const {
6923 return llvm::StringSwitch<CPUKind>(Name)
6924 .Case("v8", CK_V8)
6925 .Case("supersparc", CK_SUPERSPARC)
6926 .Case("sparclite", CK_SPARCLITE)
6927 .Case("f934", CK_F934)
6928 .Case("hypersparc", CK_HYPERSPARC)
6929 .Case("sparclite86x", CK_SPARCLITE86X)
6930 .Case("sparclet", CK_SPARCLET)
6931 .Case("tsc701", CK_TSC701)
6932 .Case("v9", CK_V9)
6933 .Case("ultrasparc", CK_ULTRASPARC)
6934 .Case("ultrasparc3", CK_ULTRASPARC3)
6935 .Case("niagara", CK_NIAGARA)
6936 .Case("niagara2", CK_NIAGARA2)
6937 .Case("niagara3", CK_NIAGARA3)
6938 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006939 .Case("ma2100", CK_MYRIAD2100)
6940 .Case("ma2150", CK_MYRIAD2150)
6941 .Case("ma2450", CK_MYRIAD2450)
6942 // FIXME: the myriad2[.n] spellings are obsolete,
6943 // but a grace period is needed to allow updating dependent builds.
6944 .Case("myriad2", CK_MYRIAD2100)
6945 .Case("myriad2.1", CK_MYRIAD2100)
6946 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006947 .Case("leon2", CK_LEON2)
6948 .Case("at697e", CK_LEON2_AT697E)
6949 .Case("at697f", CK_LEON2_AT697F)
6950 .Case("leon3", CK_LEON3)
6951 .Case("ut699", CK_LEON3_UT699)
6952 .Case("gr712rc", CK_LEON3_GR712RC)
6953 .Case("leon4", CK_LEON4)
6954 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006955 .Default(CK_GENERIC);
6956 }
6957
6958 bool setCPU(const std::string &Name) override {
6959 CPU = getCPUKind(Name);
6960 return CPU != CK_GENERIC;
6961 }
Gabor Greif49991682008-02-21 16:29:08 +00006962};
6963
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006964const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006965 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6966 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6967 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6968 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6969};
6970
Craig Topperf054e3a2015-10-19 03:52:27 +00006971ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6972 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006973}
6974
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006975const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006976 { { "g0" }, "r0" },
6977 { { "g1" }, "r1" },
6978 { { "g2" }, "r2" },
6979 { { "g3" }, "r3" },
6980 { { "g4" }, "r4" },
6981 { { "g5" }, "r5" },
6982 { { "g6" }, "r6" },
6983 { { "g7" }, "r7" },
6984 { { "o0" }, "r8" },
6985 { { "o1" }, "r9" },
6986 { { "o2" }, "r10" },
6987 { { "o3" }, "r11" },
6988 { { "o4" }, "r12" },
6989 { { "o5" }, "r13" },
6990 { { "o6", "sp" }, "r14" },
6991 { { "o7" }, "r15" },
6992 { { "l0" }, "r16" },
6993 { { "l1" }, "r17" },
6994 { { "l2" }, "r18" },
6995 { { "l3" }, "r19" },
6996 { { "l4" }, "r20" },
6997 { { "l5" }, "r21" },
6998 { { "l6" }, "r22" },
6999 { { "l7" }, "r23" },
7000 { { "i0" }, "r24" },
7001 { { "i1" }, "r25" },
7002 { { "i2" }, "r26" },
7003 { { "i3" }, "r27" },
7004 { { "i4" }, "r28" },
7005 { { "i5" }, "r29" },
7006 { { "i6", "fp" }, "r30" },
7007 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007008};
7009
Craig Topperf054e3a2015-10-19 03:52:27 +00007010ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7011 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007012}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007013
7014// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7015class SparcV8TargetInfo : public SparcTargetInfo {
7016public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007017 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7018 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007019 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007020 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7021 switch (getTriple().getOS()) {
7022 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007023 SizeType = UnsignedInt;
7024 IntPtrType = SignedInt;
7025 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007026 break;
7027 case llvm::Triple::NetBSD:
7028 case llvm::Triple::OpenBSD:
7029 SizeType = UnsignedLong;
7030 IntPtrType = SignedLong;
7031 PtrDiffType = SignedLong;
7032 break;
Brad Smith56495d52015-08-13 22:00:53 +00007033 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007034 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7035 // on up to 64 bits.
7036 MaxAtomicPromoteWidth = 64;
7037 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007038 }
7039
Craig Topper3164f332014-03-11 03:39:26 +00007040 void getTargetDefines(const LangOptions &Opts,
7041 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007042 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007043 switch (getCPUGeneration(CPU)) {
7044 case CG_V8:
7045 Builder.defineMacro("__sparcv8");
7046 if (getTriple().getOS() != llvm::Triple::Solaris)
7047 Builder.defineMacro("__sparcv8__");
7048 break;
7049 case CG_V9:
7050 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007051 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007052 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007053 Builder.defineMacro("__sparc_v9__");
7054 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007055 break;
7056 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007057 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007058 std::string MyriadArchValue, Myriad2Value;
7059 Builder.defineMacro("__sparc_v8__");
7060 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007061 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007062 case CK_MYRIAD2150:
7063 MyriadArchValue = "__ma2150";
7064 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007065 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007066 case CK_MYRIAD2450:
7067 MyriadArchValue = "__ma2450";
7068 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007069 break;
7070 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007071 MyriadArchValue = "__ma2100";
7072 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007073 break;
7074 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007075 Builder.defineMacro(MyriadArchValue, "1");
7076 Builder.defineMacro(MyriadArchValue+"__", "1");
7077 Builder.defineMacro("__myriad2__", Myriad2Value);
7078 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007079 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007080 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007081
7082 bool hasSjLjLowering() const override {
7083 return true;
7084 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007085};
7086
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007087// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7088class SparcV8elTargetInfo : public SparcV8TargetInfo {
7089 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007090 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7091 : SparcV8TargetInfo(Triple, Opts) {
7092 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007093 }
7094};
7095
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007096// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7097class SparcV9TargetInfo : public SparcTargetInfo {
7098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007099 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7100 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007101 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007102 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007103 // This is an LP64 platform.
7104 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007105
7106 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007107 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007108 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007109 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007110 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007111 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007112
7113 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7114 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7115 LongDoubleWidth = 128;
7116 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007117 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007118 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007119 }
7120
Craig Topper3164f332014-03-11 03:39:26 +00007121 void getTargetDefines(const LangOptions &Opts,
7122 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007123 SparcTargetInfo::getTargetDefines(Opts, Builder);
7124 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007125 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007126 // Solaris doesn't need these variants, but the BSDs do.
7127 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007128 Builder.defineMacro("__sparc64__");
7129 Builder.defineMacro("__sparc_v9__");
7130 Builder.defineMacro("__sparcv9__");
7131 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007132 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007133
Craig Topper3164f332014-03-11 03:39:26 +00007134 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007135 if (!SparcTargetInfo::setCPU(Name))
7136 return false;
7137 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007138 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007139};
7140
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007141class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007142 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007143 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007144 std::string CPU;
7145 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007146 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007147
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007148public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007149 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007150 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7151 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007152 IntMaxType = SignedLong;
7153 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007154 TLSSupported = true;
7155 IntWidth = IntAlign = 32;
7156 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7157 PointerWidth = PointerAlign = 64;
7158 LongDoubleWidth = 128;
7159 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007160 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007161 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007162 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007163 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 +00007164 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7165 }
7166 void getTargetDefines(const LangOptions &Opts,
7167 MacroBuilder &Builder) const override {
7168 Builder.defineMacro("__s390__");
7169 Builder.defineMacro("__s390x__");
7170 Builder.defineMacro("__zarch__");
7171 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007172
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007173 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7174 .Cases("arch8", "z10", "8")
7175 .Cases("arch9", "z196", "9")
7176 .Cases("arch10", "zEC12", "10")
7177 .Cases("arch11", "z13", "11")
7178 .Default("");
7179 if (!ISARev.empty())
7180 Builder.defineMacro("__ARCH__", ISARev);
7181
Ulrich Weigandb038a522016-02-05 21:34:28 +00007182 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7183 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7184 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7185 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7186
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007187 if (HasTransactionalExecution)
7188 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007189 if (HasVector)
7190 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007191 if (Opts.ZVector)
7192 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007193 }
Craig Topper6c03a542015-10-19 04:51:35 +00007194 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7195 return llvm::makeArrayRef(BuiltinInfo,
7196 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007197 }
7198
Craig Topperf054e3a2015-10-19 03:52:27 +00007199 ArrayRef<const char *> getGCCRegNames() const override;
7200 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007201 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007202 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007203 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007204 bool validateAsmConstraint(const char *&Name,
7205 TargetInfo::ConstraintInfo &info) const override;
7206 const char *getClobbers() const override {
7207 // FIXME: Is this really right?
7208 return "";
7209 }
7210 BuiltinVaListKind getBuiltinVaListKind() const override {
7211 return TargetInfo::SystemZBuiltinVaList;
7212 }
7213 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007214 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007215 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7216 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007217 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007218 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007219 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007220 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007221 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007222 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007223 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007224 .Default(false);
7225
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007226 return CPUKnown;
7227 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007228 bool
7229 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7230 StringRef CPU,
7231 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007232 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007233 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007234 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007235 Features["transactional-execution"] = true;
7236 Features["vector"] = true;
7237 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007238 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007239 }
7240
7241 bool handleTargetFeatures(std::vector<std::string> &Features,
7242 DiagnosticsEngine &Diags) override {
7243 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007244 for (const auto &Feature : Features) {
7245 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007246 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007247 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007248 HasVector = true;
7249 }
7250 // If we use the vector ABI, vector types are 64-bit aligned.
7251 if (HasVector) {
7252 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007253 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7254 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007255 }
7256 return true;
7257 }
7258
7259 bool hasFeature(StringRef Feature) const override {
7260 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007261 .Case("systemz", true)
7262 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007263 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007264 .Default(false);
7265 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007266
Bryan Chane3f1ed52016-04-28 13:56:43 +00007267 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7268 switch (CC) {
7269 case CC_C:
7270 case CC_Swift:
7271 return CCCR_OK;
7272 default:
7273 return CCCR_Warning;
7274 }
7275 }
7276
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007277 StringRef getABI() const override {
7278 if (HasVector)
7279 return "vector";
7280 return "";
7281 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007282
7283 bool useFloat128ManglingForLongDouble() const override {
7284 return true;
7285 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007286};
7287
7288const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7289#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007290 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007291#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7292 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007293#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007294};
7295
7296const char *const SystemZTargetInfo::GCCRegNames[] = {
7297 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7298 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7299 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7300 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7301};
7302
Craig Topperf054e3a2015-10-19 03:52:27 +00007303ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7304 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007305}
7306
7307bool SystemZTargetInfo::
7308validateAsmConstraint(const char *&Name,
7309 TargetInfo::ConstraintInfo &Info) const {
7310 switch (*Name) {
7311 default:
7312 return false;
7313
7314 case 'a': // Address register
7315 case 'd': // Data register (equivalent to 'r')
7316 case 'f': // Floating-point register
7317 Info.setAllowsRegister();
7318 return true;
7319
7320 case 'I': // Unsigned 8-bit constant
7321 case 'J': // Unsigned 12-bit constant
7322 case 'K': // Signed 16-bit constant
7323 case 'L': // Signed 20-bit displacement (on all targets we support)
7324 case 'M': // 0x7fffffff
7325 return true;
7326
7327 case 'Q': // Memory with base and unsigned 12-bit displacement
7328 case 'R': // Likewise, plus an index
7329 case 'S': // Memory with base and signed 20-bit displacement
7330 case 'T': // Likewise, plus an index
7331 Info.setAllowsMemory();
7332 return true;
7333 }
7334}
Ulrich Weigand47445072013-05-06 16:26:41 +00007335
Eric Christopherc48497a2015-09-18 21:26:24 +00007336class MSP430TargetInfo : public TargetInfo {
7337 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007338
Eric Christopherc48497a2015-09-18 21:26:24 +00007339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007340 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7341 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007342 TLSSupported = false;
7343 IntWidth = 16;
7344 IntAlign = 16;
7345 LongWidth = 32;
7346 LongLongWidth = 64;
7347 LongAlign = LongLongAlign = 16;
7348 PointerWidth = 16;
7349 PointerAlign = 16;
7350 SuitableAlign = 16;
7351 SizeType = UnsignedInt;
7352 IntMaxType = SignedLongLong;
7353 IntPtrType = SignedInt;
7354 PtrDiffType = SignedInt;
7355 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007356 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007357 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007358 void getTargetDefines(const LangOptions &Opts,
7359 MacroBuilder &Builder) const override {
7360 Builder.defineMacro("MSP430");
7361 Builder.defineMacro("__MSP430__");
7362 // FIXME: defines for different 'flavours' of MCU
7363 }
Craig Topper6c03a542015-10-19 04:51:35 +00007364 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007365 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007366 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007367 }
7368 bool hasFeature(StringRef Feature) const override {
7369 return Feature == "msp430";
7370 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007371 ArrayRef<const char *> getGCCRegNames() const override;
7372 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007373 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007374 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007375 }
7376 bool validateAsmConstraint(const char *&Name,
7377 TargetInfo::ConstraintInfo &info) const override {
7378 // FIXME: implement
7379 switch (*Name) {
7380 case 'K': // the constant 1
7381 case 'L': // constant -1^20 .. 1^19
7382 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007383 return true;
7384 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007385 // No target constraints for now.
7386 return false;
7387 }
7388 const char *getClobbers() const override {
7389 // FIXME: Is this really right?
7390 return "";
7391 }
7392 BuiltinVaListKind getBuiltinVaListKind() const override {
7393 // FIXME: implement
7394 return TargetInfo::CharPtrBuiltinVaList;
7395 }
7396};
7397
7398const char *const MSP430TargetInfo::GCCRegNames[] = {
7399 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7400 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7401
Craig Topperf054e3a2015-10-19 03:52:27 +00007402ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7403 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007404}
7405
7406// LLVM and Clang cannot be used directly to output native binaries for
7407// target, but is used to compile C code to llvm bitcode with correct
7408// type and alignment information.
7409//
7410// TCE uses the llvm bitcode as input and uses it for generating customized
7411// target processor and program binary. TCE co-design environment is
7412// publicly available in http://tce.cs.tut.fi
7413
7414static const unsigned TCEOpenCLAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00007415 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00007416 3, // opencl_global
7417 4, // opencl_local
7418 5, // opencl_constant
7419 // FIXME: generic has to be added to the target
7420 0, // opencl_generic
7421 0, // cuda_device
7422 0, // cuda_constant
7423 0 // cuda_shared
7424};
7425
7426class TCETargetInfo : public TargetInfo {
7427public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007428 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7429 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007430 TLSSupported = false;
7431 IntWidth = 32;
7432 LongWidth = LongLongWidth = 32;
7433 PointerWidth = 32;
7434 IntAlign = 32;
7435 LongAlign = LongLongAlign = 32;
7436 PointerAlign = 32;
7437 SuitableAlign = 32;
7438 SizeType = UnsignedInt;
7439 IntMaxType = SignedLong;
7440 IntPtrType = SignedInt;
7441 PtrDiffType = SignedInt;
7442 FloatWidth = 32;
7443 FloatAlign = 32;
7444 DoubleWidth = 32;
7445 DoubleAlign = 32;
7446 LongDoubleWidth = 32;
7447 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007448 FloatFormat = &llvm::APFloat::IEEEsingle();
7449 DoubleFormat = &llvm::APFloat::IEEEsingle();
7450 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007451 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7452 "i16:16:32-i32:32:32-i64:32:32-"
7453 "f32:32:32-f64:32:32-v64:32:32-"
7454 "v128:32:32-v256:32:32-v512:32:32-"
7455 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007456 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7457 UseAddrSpaceMapMangling = true;
7458 }
7459
7460 void getTargetDefines(const LangOptions &Opts,
7461 MacroBuilder &Builder) const override {
7462 DefineStd(Builder, "tce", Opts);
7463 Builder.defineMacro("__TCE__");
7464 Builder.defineMacro("__TCE_V1__");
7465 }
7466 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7467
Craig Topper6c03a542015-10-19 04:51:35 +00007468 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007469 const char *getClobbers() const override { return ""; }
7470 BuiltinVaListKind getBuiltinVaListKind() const override {
7471 return TargetInfo::VoidPtrBuiltinVaList;
7472 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007473 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007474 bool validateAsmConstraint(const char *&Name,
7475 TargetInfo::ConstraintInfo &info) const override {
7476 return true;
7477 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007478 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7479 return None;
7480 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007481};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007482
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007483class TCELETargetInfo : public TCETargetInfo {
7484public:
7485 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7486 : TCETargetInfo(Triple, Opts) {
7487 BigEndian = false;
7488
7489 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7490 "i16:16:32-i32:32:32-i64:32:32-"
7491 "f32:32:32-f64:32:32-v64:32:32-"
7492 "v128:32:32-v256:32:32-v512:32:32-"
7493 "v1024:32:32-a0:0:32-n32");
7494
7495 }
7496
7497 virtual void getTargetDefines(const LangOptions &Opts,
7498 MacroBuilder &Builder) const {
7499 DefineStd(Builder, "tcele", Opts);
7500 Builder.defineMacro("__TCE__");
7501 Builder.defineMacro("__TCE_V1__");
7502 Builder.defineMacro("__TCELE__");
7503 Builder.defineMacro("__TCELE_V1__");
7504 }
7505
7506};
7507
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007508class BPFTargetInfo : public TargetInfo {
7509public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007510 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7511 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007512 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7513 SizeType = UnsignedLong;
7514 PtrDiffType = SignedLong;
7515 IntPtrType = SignedLong;
7516 IntMaxType = SignedLong;
7517 Int64Type = SignedLong;
7518 RegParmMax = 5;
7519 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007520 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007521 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007522 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007523 }
7524 MaxAtomicPromoteWidth = 64;
7525 MaxAtomicInlineWidth = 64;
7526 TLSSupported = false;
7527 }
7528 void getTargetDefines(const LangOptions &Opts,
7529 MacroBuilder &Builder) const override {
7530 DefineStd(Builder, "bpf", Opts);
7531 Builder.defineMacro("__BPF__");
7532 }
7533 bool hasFeature(StringRef Feature) const override {
7534 return Feature == "bpf";
7535 }
7536
Craig Topper6c03a542015-10-19 04:51:35 +00007537 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007538 const char *getClobbers() const override {
7539 return "";
7540 }
7541 BuiltinVaListKind getBuiltinVaListKind() const override {
7542 return TargetInfo::VoidPtrBuiltinVaList;
7543 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007544 ArrayRef<const char *> getGCCRegNames() const override {
7545 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007546 }
7547 bool validateAsmConstraint(const char *&Name,
7548 TargetInfo::ConstraintInfo &info) const override {
7549 return true;
7550 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007551 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7552 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007553 }
7554};
7555
Daniel Sanders4672af62016-05-27 11:51:02 +00007556class MipsTargetInfo : public TargetInfo {
7557 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007558 StringRef Layout;
7559
7560 if (ABI == "o32")
7561 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7562 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007563 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007564 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007565 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007566 else
7567 llvm_unreachable("Invalid ABI");
7568
7569 if (BigEndian)
7570 resetDataLayout(("E-" + Layout).str());
7571 else
7572 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007573 }
7574
Akira Hatanaka9064e362013-10-29 18:30:33 +00007575
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007576 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007577 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007578 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007579 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007580 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007581 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007582 bool IsNoABICalls;
7583 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007584 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007585 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007586 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007587 enum DspRevEnum {
7588 NoDSP, DSP1, DSP2
7589 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007590 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007591
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007592protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007593 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007594 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007595
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007596public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007597 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007598 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007599 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7600 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7601 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007602 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007603
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007604 setABI((getTriple().getArch() == llvm::Triple::mips ||
7605 getTriple().getArch() == llvm::Triple::mipsel)
7606 ? "o32"
7607 : "n64");
7608
7609 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007610
7611 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7612 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007613 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007614
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007615 bool isNaN2008Default() const {
7616 return CPU == "mips32r6" || CPU == "mips64r6";
7617 }
7618
7619 bool isFP64Default() const {
7620 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7621 }
7622
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007623 bool isNan2008() const override {
7624 return IsNan2008;
7625 }
7626
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007627 bool processorSupportsGPR64() const {
7628 return llvm::StringSwitch<bool>(CPU)
7629 .Case("mips3", true)
7630 .Case("mips4", true)
7631 .Case("mips5", true)
7632 .Case("mips64", true)
7633 .Case("mips64r2", true)
7634 .Case("mips64r3", true)
7635 .Case("mips64r5", true)
7636 .Case("mips64r6", true)
7637 .Case("octeon", true)
7638 .Default(false);
7639 return false;
7640 }
7641
Alp Toker4925ba72014-06-07 23:30:42 +00007642 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007643 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007644 if (Name == "o32") {
7645 setO32ABITypes();
7646 ABI = Name;
7647 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007648 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007649
7650 if (Name == "n32") {
7651 setN32ABITypes();
7652 ABI = Name;
7653 return true;
7654 }
7655 if (Name == "n64") {
7656 setN64ABITypes();
7657 ABI = Name;
7658 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007659 }
7660 return false;
7661 }
7662
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007663 void setO32ABITypes() {
7664 Int64Type = SignedLongLong;
7665 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007666 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007667 LongDoubleWidth = LongDoubleAlign = 64;
7668 LongWidth = LongAlign = 32;
7669 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7670 PointerWidth = PointerAlign = 32;
7671 PtrDiffType = SignedInt;
7672 SizeType = UnsignedInt;
7673 SuitableAlign = 64;
7674 }
7675
7676 void setN32N64ABITypes() {
7677 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007678 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007679 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7680 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007681 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007682 }
7683 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7684 SuitableAlign = 128;
7685 }
7686
Daniel Sanders4672af62016-05-27 11:51:02 +00007687 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007688 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007689 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7690 Int64Type = SignedLongLong;
7691 } else {
7692 Int64Type = SignedLong;
7693 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007694 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007695 LongWidth = LongAlign = 64;
7696 PointerWidth = PointerAlign = 64;
7697 PtrDiffType = SignedLong;
7698 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007699 }
7700
7701 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007702 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007703 Int64Type = SignedLongLong;
7704 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007705 LongWidth = LongAlign = 32;
7706 PointerWidth = PointerAlign = 32;
7707 PtrDiffType = SignedInt;
7708 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007709 }
7710
Craig Topper3164f332014-03-11 03:39:26 +00007711 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007712 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007713 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007714 .Case("mips1", true)
7715 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007716 .Case("mips3", true)
7717 .Case("mips4", true)
7718 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007719 .Case("mips32", true)
7720 .Case("mips32r2", true)
7721 .Case("mips32r3", true)
7722 .Case("mips32r5", true)
7723 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007724 .Case("mips64", true)
7725 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007726 .Case("mips64r3", true)
7727 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007728 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007729 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007730 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007731 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007732 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007733 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007734 bool
7735 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7736 StringRef CPU,
7737 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007738 if (CPU.empty())
7739 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007740 if (CPU == "octeon")
7741 Features["mips64r2"] = Features["cnmips"] = true;
7742 else
7743 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007744 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007745 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007746
Craig Topper3164f332014-03-11 03:39:26 +00007747 void getTargetDefines(const LangOptions &Opts,
7748 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007749 if (BigEndian) {
7750 DefineStd(Builder, "MIPSEB", Opts);
7751 Builder.defineMacro("_MIPSEB");
7752 } else {
7753 DefineStd(Builder, "MIPSEL", Opts);
7754 Builder.defineMacro("_MIPSEL");
7755 }
7756
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007757 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007758 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007759 if (Opts.GNUMode)
7760 Builder.defineMacro("mips");
7761
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007762 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007763 Builder.defineMacro("__mips", "32");
7764 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7765 } else {
7766 Builder.defineMacro("__mips", "64");
7767 Builder.defineMacro("__mips64");
7768 Builder.defineMacro("__mips64__");
7769 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7770 }
7771
7772 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7773 .Cases("mips32", "mips64", "1")
7774 .Cases("mips32r2", "mips64r2", "2")
7775 .Cases("mips32r3", "mips64r3", "3")
7776 .Cases("mips32r5", "mips64r5", "5")
7777 .Cases("mips32r6", "mips64r6", "6")
7778 .Default("");
7779 if (!ISARev.empty())
7780 Builder.defineMacro("__mips_isa_rev", ISARev);
7781
7782 if (ABI == "o32") {
7783 Builder.defineMacro("__mips_o32");
7784 Builder.defineMacro("_ABIO32", "1");
7785 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007786 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007787 Builder.defineMacro("__mips_n32");
7788 Builder.defineMacro("_ABIN32", "2");
7789 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7790 } else if (ABI == "n64") {
7791 Builder.defineMacro("__mips_n64");
7792 Builder.defineMacro("_ABI64", "3");
7793 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7794 } else
7795 llvm_unreachable("Invalid ABI.");
7796
Simon Dardisdf827a72017-02-21 16:01:00 +00007797 if (!IsNoABICalls) {
7798 Builder.defineMacro("__mips_abicalls");
7799 if (CanUseBSDABICalls)
7800 Builder.defineMacro("__ABICALLS__");
7801 }
7802
Simon Atanasyan683535b2012-08-29 19:14:58 +00007803 Builder.defineMacro("__REGISTER_PREFIX__", "");
7804
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007805 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007806 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007807 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007808 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007809 case SoftFloat:
7810 Builder.defineMacro("__mips_soft_float", Twine(1));
7811 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007812 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007813
Simon Atanasyan16071912013-04-14 14:07:30 +00007814 if (IsSingleFloat)
7815 Builder.defineMacro("__mips_single_float", Twine(1));
7816
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007817 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7818 Builder.defineMacro("_MIPS_FPSET",
7819 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7820
Simon Atanasyan72244b62012-07-05 16:06:06 +00007821 if (IsMips16)
7822 Builder.defineMacro("__mips16", Twine(1));
7823
Simon Atanasyan60777612013-04-14 14:07:51 +00007824 if (IsMicromips)
7825 Builder.defineMacro("__mips_micromips", Twine(1));
7826
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007827 if (IsNan2008)
7828 Builder.defineMacro("__mips_nan2008", Twine(1));
7829
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007830 switch (DspRev) {
7831 default:
7832 break;
7833 case DSP1:
7834 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7835 Builder.defineMacro("__mips_dsp", Twine(1));
7836 break;
7837 case DSP2:
7838 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7839 Builder.defineMacro("__mips_dspr2", Twine(1));
7840 Builder.defineMacro("__mips_dsp", Twine(1));
7841 break;
7842 }
7843
Jack Carter44ff1e52013-08-12 17:20:29 +00007844 if (HasMSA)
7845 Builder.defineMacro("__mips_msa", Twine(1));
7846
Simon Atanasyan26f19672012-04-05 19:28:31 +00007847 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7848 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7849 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007850
7851 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7852 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007853
7854 // These shouldn't be defined for MIPS-I but there's no need to check
7855 // for that since MIPS-I isn't supported.
7856 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7857 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7858 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007859
7860 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7861 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7862 // the instructions exist but using them violates the ABI since they
7863 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7864 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007865 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007866 }
7867
Craig Topper6c03a542015-10-19 04:51:35 +00007868 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7869 return llvm::makeArrayRef(BuiltinInfo,
7870 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007871 }
Craig Topper3164f332014-03-11 03:39:26 +00007872 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007873 return llvm::StringSwitch<bool>(Feature)
7874 .Case("mips", true)
7875 .Case("fp64", HasFP64)
7876 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007877 }
Craig Topper3164f332014-03-11 03:39:26 +00007878 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007879 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007880 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007881 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007882 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007883 // CPU register names
7884 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007885 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7886 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7887 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007888 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7889 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007890 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7891 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7892 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7893 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007894 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007895 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007896 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7897 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007898 // MSA register names
7899 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7900 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7901 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7902 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7903 // MSA control register names
7904 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7905 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007906 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007907 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007908 }
Craig Topper3164f332014-03-11 03:39:26 +00007909 bool validateAsmConstraint(const char *&Name,
7910 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007911 switch (*Name) {
7912 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007913 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007914 case 'r': // CPU registers.
7915 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007916 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007917 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007918 case 'c': // $25 for indirect jumps
7919 case 'l': // lo register
7920 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007921 Info.setAllowsRegister();
7922 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007923 case 'I': // Signed 16-bit constant
7924 case 'J': // Integer 0
7925 case 'K': // Unsigned 16-bit constant
7926 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7927 case 'M': // Constants not loadable via lui, addiu, or ori
7928 case 'N': // Constant -1 to -65535
7929 case 'O': // A signed 15-bit constant
7930 case 'P': // A constant between 1 go 65535
7931 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007932 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007933 Info.setAllowsMemory();
7934 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007935 case 'Z':
7936 if (Name[1] == 'C') { // An address usable by ll, and sc.
7937 Info.setAllowsMemory();
7938 Name++; // Skip over 'Z'.
7939 return true;
7940 }
7941 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007942 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007943 }
7944
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007945 std::string convertConstraint(const char *&Constraint) const override {
7946 std::string R;
7947 switch (*Constraint) {
7948 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7949 if (Constraint[1] == 'C') {
7950 R = std::string("^") + std::string(Constraint, 2);
7951 Constraint++;
7952 return R;
7953 }
7954 break;
7955 }
7956 return TargetInfo::convertConstraint(Constraint);
7957 }
7958
Craig Topper3164f332014-03-11 03:39:26 +00007959 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007960 // In GCC, $1 is not widely used in generated code (it's used only in a few
7961 // specific situations), so there is no real need for users to add it to
7962 // the clobbers list if they want to use it in their inline assembly code.
7963 //
7964 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7965 // code generation, so using it in inline assembly without adding it to the
7966 // clobbers list can cause conflicts between the inline assembly code and
7967 // the surrounding generated code.
7968 //
7969 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7970 // operands, which will conflict with the ".set at" assembler option (which
7971 // we use only for inline assembly, in order to maintain compatibility with
7972 // GCC) and will also conflict with the user's usage of $1.
7973 //
7974 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7975 // register for generated code is to automatically clobber $1 for all inline
7976 // assembly code.
7977 //
7978 // FIXME: We should automatically clobber $1 only for inline assembly code
7979 // which actually uses it. This would allow LLVM to use $1 for inline
7980 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007981 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007982 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007983
Craig Topper3164f332014-03-11 03:39:26 +00007984 bool handleTargetFeatures(std::vector<std::string> &Features,
7985 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007986 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007987 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007988 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007989 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007990 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007991 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007992 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007993
Eric Christopher610fe112015-08-26 08:21:55 +00007994 for (const auto &Feature : Features) {
7995 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007996 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007997 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007998 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007999 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00008000 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008001 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00008002 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008003 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008004 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00008005 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00008006 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008007 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008008 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008009 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008010 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008011 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008012 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008013 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008014 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008015 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008016 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008017 else if (Feature == "+noabicalls")
8018 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008019 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008020
James Y Knightb214cbc2016-03-04 19:00:41 +00008021 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008022
Rafael Espindolaeb265472013-08-21 21:59:03 +00008023 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008024 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008025
Craig Topper3164f332014-03-11 03:39:26 +00008026 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008027 if (RegNo == 0) return 4;
8028 if (RegNo == 1) return 5;
8029 return -1;
8030 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008031
8032 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008033
8034 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8035 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8036 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8037 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8038 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8039 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8040 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8041 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8042 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8043 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8044 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8045 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8046 {{"ra"}, "$31"}};
8047 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8048 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8049 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8050 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8051 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8052 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$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"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008059 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008060 return llvm::makeArrayRef(O32RegAliases);
8061 return llvm::makeArrayRef(NewABIRegAliases);
8062 }
8063
8064 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008065 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008066 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008067
8068 bool validateTarget(DiagnosticsEngine &Diags) const override {
8069 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8070 // this yet. It's better to fail here than on the backend assertion.
8071 if (processorSupportsGPR64() && ABI == "o32") {
8072 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8073 return false;
8074 }
8075
8076 // 64-bit ABI's require 64-bit CPU's.
8077 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8078 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8079 return false;
8080 }
8081
8082 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8083 // can't handle this yet. It's better to fail here than on the
8084 // backend assertion.
8085 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8086 getTriple().getArch() == llvm::Triple::mips64el) &&
8087 ABI == "o32") {
8088 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8089 << ABI << getTriple().str();
8090 return false;
8091 }
8092
8093 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8094 // can't handle this yet. It's better to fail here than on the
8095 // backend assertion.
8096 if ((getTriple().getArch() == llvm::Triple::mips ||
8097 getTriple().getArch() == llvm::Triple::mipsel) &&
8098 (ABI == "n32" || ABI == "n64")) {
8099 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8100 << ABI << getTriple().str();
8101 return false;
8102 }
8103
8104 return true;
8105 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008106};
8107
Daniel Sanders4672af62016-05-27 11:51:02 +00008108const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008109#define BUILTIN(ID, TYPE, ATTRS) \
8110 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8111#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8112 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008113#include "clang/Basic/BuiltinsMips.def"
8114};
8115
Ivan Krasindd7403e2011-08-24 20:22:22 +00008116class PNaClTargetInfo : public TargetInfo {
8117public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008118 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8119 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008120 this->LongAlign = 32;
8121 this->LongWidth = 32;
8122 this->PointerAlign = 32;
8123 this->PointerWidth = 32;
8124 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008125 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008126 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008127 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008128 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008129 this->SizeType = TargetInfo::UnsignedInt;
8130 this->PtrDiffType = TargetInfo::SignedInt;
8131 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008132 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008133 }
8134
Craig Toppere6f17d02014-03-11 04:07:52 +00008135 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008136 Builder.defineMacro("__le32__");
8137 Builder.defineMacro("__pnacl__");
8138 }
Craig Topper3164f332014-03-11 03:39:26 +00008139 void getTargetDefines(const LangOptions &Opts,
8140 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008141 getArchDefines(Opts, Builder);
8142 }
Craig Topper3164f332014-03-11 03:39:26 +00008143 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008144 return Feature == "pnacl";
8145 }
Craig Topper6c03a542015-10-19 04:51:35 +00008146 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008147 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008148 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008149 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008150 ArrayRef<const char *> getGCCRegNames() const override;
8151 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008152 bool validateAsmConstraint(const char *&Name,
8153 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008154 return false;
8155 }
8156
Craig Topper3164f332014-03-11 03:39:26 +00008157 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008158 return "";
8159 }
8160};
8161
Craig Topperf054e3a2015-10-19 03:52:27 +00008162ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8163 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008164}
8165
Craig Topperf054e3a2015-10-19 03:52:27 +00008166ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8167 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008168}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008169
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008170// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008171class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008172public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008173 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8174 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008175
8176 BuiltinVaListKind getBuiltinVaListKind() const override {
8177 return TargetInfo::PNaClABIBuiltinVaList;
8178 }
8179};
8180
JF Bastien643817d2014-09-12 17:52:47 +00008181class Le64TargetInfo : public TargetInfo {
8182 static const Builtin::Info BuiltinInfo[];
8183
8184public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8186 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008187 NoAsmVariants = true;
8188 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8189 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008190 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008191 }
8192
8193 void getTargetDefines(const LangOptions &Opts,
8194 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008195 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008196 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8197 Builder.defineMacro("__ELF__");
8198 }
Craig Topper6c03a542015-10-19 04:51:35 +00008199 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8200 return llvm::makeArrayRef(BuiltinInfo,
8201 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008202 }
8203 BuiltinVaListKind getBuiltinVaListKind() const override {
8204 return TargetInfo::PNaClABIBuiltinVaList;
8205 }
8206 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008207 ArrayRef<const char *> getGCCRegNames() const override {
8208 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008209 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008210 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8211 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008212 }
8213 bool validateAsmConstraint(const char *&Name,
8214 TargetInfo::ConstraintInfo &Info) const override {
8215 return false;
8216 }
8217
8218 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008219};
Dan Gohmanc2853072015-09-03 22:51:53 +00008220
8221class WebAssemblyTargetInfo : public TargetInfo {
8222 static const Builtin::Info BuiltinInfo[];
8223
8224 enum SIMDEnum {
8225 NoSIMD,
8226 SIMD128,
8227 } SIMDLevel;
8228
8229public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008231 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008232 NoAsmVariants = true;
8233 SuitableAlign = 128;
8234 LargeArrayMinWidth = 128;
8235 LargeArrayAlign = 128;
8236 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008237 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008238 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008239 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008240 SizeType = UnsignedInt;
8241 PtrDiffType = SignedInt;
8242 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008243 }
8244
8245protected:
8246 void getTargetDefines(const LangOptions &Opts,
8247 MacroBuilder &Builder) const override {
8248 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8249 if (SIMDLevel >= SIMD128)
8250 Builder.defineMacro("__wasm_simd128__");
8251 }
8252
8253private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008254 bool
8255 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8256 StringRef CPU,
8257 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008258 if (CPU == "bleeding-edge")
8259 Features["simd128"] = true;
8260 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8261 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008262 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008263 return llvm::StringSwitch<bool>(Feature)
8264 .Case("simd128", SIMDLevel >= SIMD128)
8265 .Default(false);
8266 }
8267 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008268 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008269 for (const auto &Feature : Features) {
8270 if (Feature == "+simd128") {
8271 SIMDLevel = std::max(SIMDLevel, SIMD128);
8272 continue;
8273 }
8274 if (Feature == "-simd128") {
8275 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8276 continue;
8277 }
8278
8279 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8280 << "-target-feature";
8281 return false;
8282 }
8283 return true;
8284 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008285 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008286 return llvm::StringSwitch<bool>(Name)
8287 .Case("mvp", true)
8288 .Case("bleeding-edge", true)
8289 .Case("generic", true)
8290 .Default(false);
8291 }
Craig Topper6c03a542015-10-19 04:51:35 +00008292 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8293 return llvm::makeArrayRef(BuiltinInfo,
8294 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008295 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008296 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008297 return VoidPtrBuiltinVaList;
8298 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008299 ArrayRef<const char *> getGCCRegNames() const final {
8300 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008301 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008302 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8303 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008304 }
8305 bool
8306 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008307 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008308 return false;
8309 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008310 const char *getClobbers() const final { return ""; }
8311 bool isCLZForZeroUndef() const final { return false; }
8312 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008313 IntType getIntTypeByWidth(unsigned BitWidth,
8314 bool IsSigned) const final {
8315 // WebAssembly prefers long long for explicitly 64-bit integers.
8316 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8317 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8318 }
8319 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8320 bool IsSigned) const final {
8321 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8322 return BitWidth == 64
8323 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8324 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8325 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008326};
8327
8328const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8329#define BUILTIN(ID, TYPE, ATTRS) \
8330 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8331#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8332 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8333#include "clang/Basic/BuiltinsWebAssembly.def"
8334};
8335
8336class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8337public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8339 const TargetOptions &Opts)
8340 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008341 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008342 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008343 }
8344
8345protected:
8346 void getTargetDefines(const LangOptions &Opts,
8347 MacroBuilder &Builder) const override {
8348 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8349 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8350 }
8351};
8352
8353class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8354public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8356 const TargetOptions &Opts)
8357 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008358 LongAlign = LongWidth = 64;
8359 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008360 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008361 SizeType = UnsignedLong;
8362 PtrDiffType = SignedLong;
8363 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008364 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008365 }
8366
8367protected:
8368 void getTargetDefines(const LangOptions &Opts,
8369 MacroBuilder &Builder) const override {
8370 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8371 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8372 }
8373};
8374
JF Bastien643817d2014-09-12 17:52:47 +00008375const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8376#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008377 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008378#include "clang/Basic/BuiltinsLe64.def"
8379};
8380
Eric Christopherc48497a2015-09-18 21:26:24 +00008381static const unsigned SPIRAddrSpaceMap[] = {
Yaxun Liub34ec822017-04-11 17:24:23 +00008382 0, // Default
Eric Christopherc48497a2015-09-18 21:26:24 +00008383 1, // opencl_global
8384 3, // opencl_local
8385 2, // opencl_constant
8386 4, // opencl_generic
8387 0, // cuda_device
8388 0, // cuda_constant
8389 0 // cuda_shared
8390};
8391class SPIRTargetInfo : public TargetInfo {
8392public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8394 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008395 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8396 "SPIR target must use unknown OS");
8397 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8398 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008399 TLSSupported = false;
8400 LongWidth = LongAlign = 64;
8401 AddrSpaceMap = &SPIRAddrSpaceMap;
8402 UseAddrSpaceMapMangling = true;
8403 // Define available target features
8404 // These must be defined in sorted order!
8405 NoAsmVariants = true;
8406 }
8407 void getTargetDefines(const LangOptions &Opts,
8408 MacroBuilder &Builder) const override {
8409 DefineStd(Builder, "SPIR", Opts);
8410 }
8411 bool hasFeature(StringRef Feature) const override {
8412 return Feature == "spir";
8413 }
Craig Topper3164f332014-03-11 03:39:26 +00008414
Craig Topper6c03a542015-10-19 04:51:35 +00008415 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008416 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008417 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008418 bool validateAsmConstraint(const char *&Name,
8419 TargetInfo::ConstraintInfo &info) const override {
8420 return true;
8421 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008422 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8423 return None;
8424 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008425 BuiltinVaListKind getBuiltinVaListKind() const override {
8426 return TargetInfo::VoidPtrBuiltinVaList;
8427 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008428
Eric Christopherc48497a2015-09-18 21:26:24 +00008429 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008430 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8431 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008432 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008433
Eric Christopherc48497a2015-09-18 21:26:24 +00008434 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8435 return CC_SpirFunction;
8436 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008437
8438 void setSupportedOpenCLOpts() override {
8439 // Assume all OpenCL extensions and optional core features are supported
8440 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008441 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008442 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008443};
Guy Benyeib798fc92012-12-11 21:38:14 +00008444
Eric Christopherc48497a2015-09-18 21:26:24 +00008445class SPIR32TargetInfo : public SPIRTargetInfo {
8446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8448 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008449 PointerWidth = PointerAlign = 32;
8450 SizeType = TargetInfo::UnsignedInt;
8451 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008452 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8453 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008454 }
8455 void getTargetDefines(const LangOptions &Opts,
8456 MacroBuilder &Builder) const override {
8457 DefineStd(Builder, "SPIR32", Opts);
8458 }
8459};
Guy Benyeib798fc92012-12-11 21:38:14 +00008460
Eric Christopherc48497a2015-09-18 21:26:24 +00008461class SPIR64TargetInfo : public SPIRTargetInfo {
8462public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8464 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008465 PointerWidth = PointerAlign = 64;
8466 SizeType = TargetInfo::UnsignedLong;
8467 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008468 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8469 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008470 }
8471 void getTargetDefines(const LangOptions &Opts,
8472 MacroBuilder &Builder) const override {
8473 DefineStd(Builder, "SPIR64", Opts);
8474 }
8475};
Guy Benyeib798fc92012-12-11 21:38:14 +00008476
Robert Lytton0e076492013-08-13 09:43:10 +00008477class XCoreTargetInfo : public TargetInfo {
8478 static const Builtin::Info BuiltinInfo[];
8479public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8481 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008482 NoAsmVariants = true;
8483 LongLongAlign = 32;
8484 SuitableAlign = 32;
8485 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008486 SizeType = UnsignedInt;
8487 PtrDiffType = SignedInt;
8488 IntPtrType = SignedInt;
8489 WCharType = UnsignedChar;
8490 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008491 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008492 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8493 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008494 }
Craig Topper3164f332014-03-11 03:39:26 +00008495 void getTargetDefines(const LangOptions &Opts,
8496 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008497 Builder.defineMacro("__XS1B__");
8498 }
Craig Topper6c03a542015-10-19 04:51:35 +00008499 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8500 return llvm::makeArrayRef(BuiltinInfo,
8501 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008502 }
Craig Topper3164f332014-03-11 03:39:26 +00008503 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008504 return TargetInfo::VoidPtrBuiltinVaList;
8505 }
Craig Topper3164f332014-03-11 03:39:26 +00008506 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008507 return "";
8508 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008509 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008510 static const char * const GCCRegNames[] = {
8511 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8512 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8513 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008514 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008515 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008516 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8517 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008518 }
Craig Topper3164f332014-03-11 03:39:26 +00008519 bool validateAsmConstraint(const char *&Name,
8520 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008521 return false;
8522 }
Craig Topper3164f332014-03-11 03:39:26 +00008523 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008524 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8525 return (RegNo < 2)? RegNo : -1;
8526 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008527 bool allowsLargerPreferedTypeAlignment() const override {
8528 return false;
8529 }
Robert Lytton0e076492013-08-13 09:43:10 +00008530};
8531
8532const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008533#define BUILTIN(ID, TYPE, ATTRS) \
8534 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8535#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8536 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008537#include "clang/Basic/BuiltinsXCore.def"
8538};
Robert Lytton0e076492013-08-13 09:43:10 +00008539
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008540// x86_32 Android target
8541class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8544 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008545 SuitableAlign = 32;
8546 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008547 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008548 }
8549};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008550
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008551// x86_64 Android target
8552class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8553public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8555 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008556 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008557 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008558
8559 bool useFloat128ManglingForLongDouble() const override {
8560 return true;
8561 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008562};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008563
8564// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8565class RenderScript32TargetInfo : public ARMleTargetInfo {
8566public:
8567 RenderScript32TargetInfo(const llvm::Triple &Triple,
8568 const TargetOptions &Opts)
8569 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8570 Triple.getOSName(),
8571 Triple.getEnvironmentName()),
8572 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008573 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008574 LongWidth = LongAlign = 64;
8575 }
8576 void getTargetDefines(const LangOptions &Opts,
8577 MacroBuilder &Builder) const override {
8578 Builder.defineMacro("__RENDERSCRIPT__");
8579 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8580 }
8581};
8582
8583// 64-bit RenderScript is aarch64
8584class RenderScript64TargetInfo : public AArch64leTargetInfo {
8585public:
8586 RenderScript64TargetInfo(const llvm::Triple &Triple,
8587 const TargetOptions &Opts)
8588 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8589 Triple.getOSName(),
8590 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008591 Opts) {
8592 IsRenderScriptTarget = true;
8593 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008594
8595 void getTargetDefines(const LangOptions &Opts,
8596 MacroBuilder &Builder) const override {
8597 Builder.defineMacro("__RENDERSCRIPT__");
8598 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8599 }
8600};
8601
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008602/// Information about a specific microcontroller.
8603struct MCUInfo {
8604 const char *Name;
8605 const char *DefineName;
8606};
8607
8608// This list should be kept up-to-date with AVRDevices.td in LLVM.
8609static ArrayRef<MCUInfo> AVRMcus = {
8610 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008611 { "attiny11", "__AVR_ATtiny11__" },
8612 { "attiny12", "__AVR_ATtiny12__" },
8613 { "attiny15", "__AVR_ATtiny15__" },
8614 { "attiny28", "__AVR_ATtiny28__" },
8615 { "at90s2313", "__AVR_AT90S2313__" },
8616 { "at90s2323", "__AVR_AT90S2323__" },
8617 { "at90s2333", "__AVR_AT90S2333__" },
8618 { "at90s2343", "__AVR_AT90S2343__" },
8619 { "attiny22", "__AVR_ATtiny22__" },
8620 { "attiny26", "__AVR_ATtiny26__" },
8621 { "at86rf401", "__AVR_AT86RF401__" },
8622 { "at90s4414", "__AVR_AT90S4414__" },
8623 { "at90s4433", "__AVR_AT90S4433__" },
8624 { "at90s4434", "__AVR_AT90S4434__" },
8625 { "at90s8515", "__AVR_AT90S8515__" },
8626 { "at90c8534", "__AVR_AT90c8534__" },
8627 { "at90s8535", "__AVR_AT90S8535__" },
8628 { "ata5272", "__AVR_ATA5272__" },
8629 { "attiny13", "__AVR_ATtiny13__" },
8630 { "attiny13a", "__AVR_ATtiny13A__" },
8631 { "attiny2313", "__AVR_ATtiny2313__" },
8632 { "attiny2313a", "__AVR_ATtiny2313A__" },
8633 { "attiny24", "__AVR_ATtiny24__" },
8634 { "attiny24a", "__AVR_ATtiny24A__" },
8635 { "attiny4313", "__AVR_ATtiny4313__" },
8636 { "attiny44", "__AVR_ATtiny44__" },
8637 { "attiny44a", "__AVR_ATtiny44A__" },
8638 { "attiny84", "__AVR_ATtiny84__" },
8639 { "attiny84a", "__AVR_ATtiny84A__" },
8640 { "attiny25", "__AVR_ATtiny25__" },
8641 { "attiny45", "__AVR_ATtiny45__" },
8642 { "attiny85", "__AVR_ATtiny85__" },
8643 { "attiny261", "__AVR_ATtiny261__" },
8644 { "attiny261a", "__AVR_ATtiny261A__" },
8645 { "attiny461", "__AVR_ATtiny461__" },
8646 { "attiny461a", "__AVR_ATtiny461A__" },
8647 { "attiny861", "__AVR_ATtiny861__" },
8648 { "attiny861a", "__AVR_ATtiny861A__" },
8649 { "attiny87", "__AVR_ATtiny87__" },
8650 { "attiny43u", "__AVR_ATtiny43U__" },
8651 { "attiny48", "__AVR_ATtiny48__" },
8652 { "attiny88", "__AVR_ATtiny88__" },
8653 { "attiny828", "__AVR_ATtiny828__" },
8654 { "at43usb355", "__AVR_AT43USB355__" },
8655 { "at76c711", "__AVR_AT76C711__" },
8656 { "atmega103", "__AVR_ATmega103__" },
8657 { "at43usb320", "__AVR_AT43USB320__" },
8658 { "attiny167", "__AVR_ATtiny167__" },
8659 { "at90usb82", "__AVR_AT90USB82__" },
8660 { "at90usb162", "__AVR_AT90USB162__" },
8661 { "ata5505", "__AVR_ATA5505__" },
8662 { "atmega8u2", "__AVR_ATmega8U2__" },
8663 { "atmega16u2", "__AVR_ATmega16U2__" },
8664 { "atmega32u2", "__AVR_ATmega32U2__" },
8665 { "attiny1634", "__AVR_ATtiny1634__" },
8666 { "atmega8", "__AVR_ATmega8__" },
8667 { "ata6289", "__AVR_ATA6289__" },
8668 { "atmega8a", "__AVR_ATmega8A__" },
8669 { "ata6285", "__AVR_ATA6285__" },
8670 { "ata6286", "__AVR_ATA6286__" },
8671 { "atmega48", "__AVR_ATmega48__" },
8672 { "atmega48a", "__AVR_ATmega48A__" },
8673 { "atmega48pa", "__AVR_ATmega48PA__" },
8674 { "atmega48p", "__AVR_ATmega48P__" },
8675 { "atmega88", "__AVR_ATmega88__" },
8676 { "atmega88a", "__AVR_ATmega88A__" },
8677 { "atmega88p", "__AVR_ATmega88P__" },
8678 { "atmega88pa", "__AVR_ATmega88PA__" },
8679 { "atmega8515", "__AVR_ATmega8515__" },
8680 { "atmega8535", "__AVR_ATmega8535__" },
8681 { "atmega8hva", "__AVR_ATmega8HVA__" },
8682 { "at90pwm1", "__AVR_AT90PWM1__" },
8683 { "at90pwm2", "__AVR_AT90PWM2__" },
8684 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8685 { "at90pwm3", "__AVR_AT90PWM3__" },
8686 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8687 { "at90pwm81", "__AVR_AT90PWM81__" },
8688 { "ata5790", "__AVR_ATA5790__" },
8689 { "ata5795", "__AVR_ATA5795__" },
8690 { "atmega16", "__AVR_ATmega16__" },
8691 { "atmega16a", "__AVR_ATmega16A__" },
8692 { "atmega161", "__AVR_ATmega161__" },
8693 { "atmega162", "__AVR_ATmega162__" },
8694 { "atmega163", "__AVR_ATmega163__" },
8695 { "atmega164a", "__AVR_ATmega164A__" },
8696 { "atmega164p", "__AVR_ATmega164P__" },
8697 { "atmega164pa", "__AVR_ATmega164PA__" },
8698 { "atmega165", "__AVR_ATmega165__" },
8699 { "atmega165a", "__AVR_ATmega165A__" },
8700 { "atmega165p", "__AVR_ATmega165P__" },
8701 { "atmega165pa", "__AVR_ATmega165PA__" },
8702 { "atmega168", "__AVR_ATmega168__" },
8703 { "atmega168a", "__AVR_ATmega168A__" },
8704 { "atmega168p", "__AVR_ATmega168P__" },
8705 { "atmega168pa", "__AVR_ATmega168PA__" },
8706 { "atmega169", "__AVR_ATmega169__" },
8707 { "atmega169a", "__AVR_ATmega169A__" },
8708 { "atmega169p", "__AVR_ATmega169P__" },
8709 { "atmega169pa", "__AVR_ATmega169PA__" },
8710 { "atmega32", "__AVR_ATmega32__" },
8711 { "atmega32a", "__AVR_ATmega32A__" },
8712 { "atmega323", "__AVR_ATmega323__" },
8713 { "atmega324a", "__AVR_ATmega324A__" },
8714 { "atmega324p", "__AVR_ATmega324P__" },
8715 { "atmega324pa", "__AVR_ATmega324PA__" },
8716 { "atmega325", "__AVR_ATmega325__" },
8717 { "atmega325a", "__AVR_ATmega325A__" },
8718 { "atmega325p", "__AVR_ATmega325P__" },
8719 { "atmega325pa", "__AVR_ATmega325PA__" },
8720 { "atmega3250", "__AVR_ATmega3250__" },
8721 { "atmega3250a", "__AVR_ATmega3250A__" },
8722 { "atmega3250p", "__AVR_ATmega3250P__" },
8723 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8724 { "atmega328", "__AVR_ATmega328__" },
8725 { "atmega328p", "__AVR_ATmega328P__" },
8726 { "atmega329", "__AVR_ATmega329__" },
8727 { "atmega329a", "__AVR_ATmega329A__" },
8728 { "atmega329p", "__AVR_ATmega329P__" },
8729 { "atmega329pa", "__AVR_ATmega329PA__" },
8730 { "atmega3290", "__AVR_ATmega3290__" },
8731 { "atmega3290a", "__AVR_ATmega3290A__" },
8732 { "atmega3290p", "__AVR_ATmega3290P__" },
8733 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8734 { "atmega406", "__AVR_ATmega406__" },
8735 { "atmega64", "__AVR_ATmega64__" },
8736 { "atmega64a", "__AVR_ATmega64A__" },
8737 { "atmega640", "__AVR_ATmega640__" },
8738 { "atmega644", "__AVR_ATmega644__" },
8739 { "atmega644a", "__AVR_ATmega644A__" },
8740 { "atmega644p", "__AVR_ATmega644P__" },
8741 { "atmega644pa", "__AVR_ATmega644PA__" },
8742 { "atmega645", "__AVR_ATmega645__" },
8743 { "atmega645a", "__AVR_ATmega645A__" },
8744 { "atmega645p", "__AVR_ATmega645P__" },
8745 { "atmega649", "__AVR_ATmega649__" },
8746 { "atmega649a", "__AVR_ATmega649A__" },
8747 { "atmega649p", "__AVR_ATmega649P__" },
8748 { "atmega6450", "__AVR_ATmega6450__" },
8749 { "atmega6450a", "__AVR_ATmega6450A__" },
8750 { "atmega6450p", "__AVR_ATmega6450P__" },
8751 { "atmega6490", "__AVR_ATmega6490__" },
8752 { "atmega6490a", "__AVR_ATmega6490A__" },
8753 { "atmega6490p", "__AVR_ATmega6490P__" },
8754 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8755 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8756 { "atmega16hva", "__AVR_ATmega16HVA__" },
8757 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8758 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8759 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8760 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8761 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8762 { "atmega64hve", "__AVR_ATmega64HVE__" },
8763 { "at90can32", "__AVR_AT90CAN32__" },
8764 { "at90can64", "__AVR_AT90CAN64__" },
8765 { "at90pwm161", "__AVR_AT90PWM161__" },
8766 { "at90pwm216", "__AVR_AT90PWM216__" },
8767 { "at90pwm316", "__AVR_AT90PWM316__" },
8768 { "atmega32c1", "__AVR_ATmega32C1__" },
8769 { "atmega64c1", "__AVR_ATmega64C1__" },
8770 { "atmega16m1", "__AVR_ATmega16M1__" },
8771 { "atmega32m1", "__AVR_ATmega32M1__" },
8772 { "atmega64m1", "__AVR_ATmega64M1__" },
8773 { "atmega16u4", "__AVR_ATmega16U4__" },
8774 { "atmega32u4", "__AVR_ATmega32U4__" },
8775 { "atmega32u6", "__AVR_ATmega32U6__" },
8776 { "at90usb646", "__AVR_AT90USB646__" },
8777 { "at90usb647", "__AVR_AT90USB647__" },
8778 { "at90scr100", "__AVR_AT90SCR100__" },
8779 { "at94k", "__AVR_AT94K__" },
8780 { "m3000", "__AVR_AT000__" },
8781 { "atmega128", "__AVR_ATmega128__" },
8782 { "atmega128a", "__AVR_ATmega128A__" },
8783 { "atmega1280", "__AVR_ATmega1280__" },
8784 { "atmega1281", "__AVR_ATmega1281__" },
8785 { "atmega1284", "__AVR_ATmega1284__" },
8786 { "atmega1284p", "__AVR_ATmega1284P__" },
8787 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8788 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8789 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8790 { "at90can128", "__AVR_AT90CAN128__" },
8791 { "at90usb1286", "__AVR_AT90USB1286__" },
8792 { "at90usb1287", "__AVR_AT90USB1287__" },
8793 { "atmega2560", "__AVR_ATmega2560__" },
8794 { "atmega2561", "__AVR_ATmega2561__" },
8795 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8796 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8797 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8798 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8799 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8800 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8801 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8802 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8803 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8804 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8805 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8806 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8807 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8808 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8809 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8810 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8811 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8812 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8813 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8814 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8815 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8816 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8817 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8818 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8819 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8820 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8821 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8822 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8823 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8824 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8825 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8826 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8827 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8828 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8829 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8830 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8831 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8832 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8833 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8834 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8835 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8836 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8837 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8838 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8839 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8840 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8841 { "attiny4", "__AVR_ATtiny4__" },
8842 { "attiny5", "__AVR_ATtiny5__" },
8843 { "attiny9", "__AVR_ATtiny9__" },
8844 { "attiny10", "__AVR_ATtiny10__" },
8845 { "attiny20", "__AVR_ATtiny20__" },
8846 { "attiny40", "__AVR_ATtiny40__" },
8847 { "attiny102", "__AVR_ATtiny102__" },
8848 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008849};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008850
8851// AVR Target
8852class AVRTargetInfo : public TargetInfo {
8853public:
8854 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8855 : TargetInfo(Triple) {
8856 TLSSupported = false;
8857 PointerWidth = 16;
8858 PointerAlign = 8;
8859 IntWidth = 16;
8860 IntAlign = 8;
8861 LongWidth = 32;
8862 LongAlign = 8;
8863 LongLongWidth = 64;
8864 LongLongAlign = 8;
8865 SuitableAlign = 8;
8866 DefaultAlignForAttributeAligned = 8;
8867 HalfWidth = 16;
8868 HalfAlign = 8;
8869 FloatWidth = 32;
8870 FloatAlign = 8;
8871 DoubleWidth = 32;
8872 DoubleAlign = 8;
8873 DoubleFormat = &llvm::APFloat::IEEEsingle();
8874 LongDoubleWidth = 32;
8875 LongDoubleAlign = 8;
8876 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8877 SizeType = UnsignedInt;
8878 PtrDiffType = SignedInt;
8879 IntPtrType = SignedInt;
8880 Char16Type = UnsignedInt;
8881 WCharType = SignedInt;
8882 WIntType = SignedInt;
8883 Char32Type = UnsignedLong;
8884 SigAtomicType = SignedChar;
8885 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8886 "-f32:32:32-f64:64:64-n8");
8887 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008888
Dylan McKay924fa3a2017-01-05 05:20:27 +00008889 void getTargetDefines(const LangOptions &Opts,
8890 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008891 Builder.defineMacro("AVR");
8892 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008893 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008894
8895 if (!this->CPU.empty()) {
8896 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8897 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8898
8899 if (It != AVRMcus.end())
8900 Builder.defineMacro(It->DefineName);
8901 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008902 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008903
Dylan McKay924fa3a2017-01-05 05:20:27 +00008904 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8905 return None;
8906 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008907
Dylan McKay924fa3a2017-01-05 05:20:27 +00008908 BuiltinVaListKind getBuiltinVaListKind() const override {
8909 return TargetInfo::VoidPtrBuiltinVaList;
8910 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008911
Dylan McKay924fa3a2017-01-05 05:20:27 +00008912 const char *getClobbers() const override {
8913 return "";
8914 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008915
Dylan McKay924fa3a2017-01-05 05:20:27 +00008916 ArrayRef<const char *> getGCCRegNames() const override {
8917 static const char * const GCCRegNames[] = {
8918 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8919 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8920 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008921 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008922 };
8923 return llvm::makeArrayRef(GCCRegNames);
8924 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008925
Dylan McKay924fa3a2017-01-05 05:20:27 +00008926 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8927 return None;
8928 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008929
Dylan McKay924fa3a2017-01-05 05:20:27 +00008930 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8931 static const TargetInfo::AddlRegName AddlRegNames[] = {
8932 { { "r26", "r27"}, 26 },
8933 { { "r28", "r29"}, 27 },
8934 { { "r30", "r31"}, 28 },
8935 { { "SPL", "SPH"}, 29 },
8936 };
8937 return llvm::makeArrayRef(AddlRegNames);
8938 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008939
Dylan McKay924fa3a2017-01-05 05:20:27 +00008940 bool validateAsmConstraint(const char *&Name,
8941 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008942 // There aren't any multi-character AVR specific constraints.
8943 if (StringRef(Name).size() > 1) return false;
8944
8945 switch (*Name) {
8946 default: return false;
8947 case 'a': // Simple upper registers
8948 case 'b': // Base pointer registers pairs
8949 case 'd': // Upper register
8950 case 'l': // Lower registers
8951 case 'e': // Pointer register pairs
8952 case 'q': // Stack pointer register
8953 case 'r': // Any register
8954 case 'w': // Special upper register pairs
8955 case 't': // Temporary register
8956 case 'x': case 'X': // Pointer register pair X
8957 case 'y': case 'Y': // Pointer register pair Y
8958 case 'z': case 'Z': // Pointer register pair Z
8959 Info.setAllowsRegister();
8960 return true;
8961 case 'I': // 6-bit positive integer constant
8962 Info.setRequiresImmediate(0, 63);
8963 return true;
8964 case 'J': // 6-bit negative integer constant
8965 Info.setRequiresImmediate(-63, 0);
8966 return true;
8967 case 'K': // Integer constant (Range: 2)
8968 Info.setRequiresImmediate(2);
8969 return true;
8970 case 'L': // Integer constant (Range: 0)
8971 Info.setRequiresImmediate(0);
8972 return true;
8973 case 'M': // 8-bit integer constant
8974 Info.setRequiresImmediate(0, 0xff);
8975 return true;
8976 case 'N': // Integer constant (Range: -1)
8977 Info.setRequiresImmediate(-1);
8978 return true;
8979 case 'O': // Integer constant (Range: 8, 16, 24)
8980 Info.setRequiresImmediate({8, 16, 24});
8981 return true;
8982 case 'P': // Integer constant (Range: 1)
8983 Info.setRequiresImmediate(1);
8984 return true;
8985 case 'R': // Integer constant (Range: -6 to 5)
8986 Info.setRequiresImmediate(-6, 5);
8987 return true;
8988 case 'G': // Floating point constant
8989 case 'Q': // A memory address based on Y or Z pointer with displacement.
8990 return true;
8991 }
8992
Dylan McKay924fa3a2017-01-05 05:20:27 +00008993 return false;
8994 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008995
Dylan McKay924fa3a2017-01-05 05:20:27 +00008996 IntType getIntTypeByWidth(unsigned BitWidth,
8997 bool IsSigned) const final {
8998 // AVR prefers int for 16-bit integers.
8999 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
9000 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
9001 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00009002
Dylan McKay924fa3a2017-01-05 05:20:27 +00009003 IntType getLeastIntTypeByWidth(unsigned BitWidth,
9004 bool IsSigned) const final {
9005 // AVR uses int for int_least16_t and int_fast16_t.
9006 return BitWidth == 16
9007 ? (IsSigned ? SignedInt : UnsignedInt)
9008 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9009 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009010
9011 bool setCPU(const std::string &Name) override {
9012 bool IsFamily = llvm::StringSwitch<bool>(Name)
9013 .Case("avr1", true)
9014 .Case("avr2", true)
9015 .Case("avr25", true)
9016 .Case("avr3", true)
9017 .Case("avr31", true)
9018 .Case("avr35", true)
9019 .Case("avr4", true)
9020 .Case("avr5", true)
9021 .Case("avr51", true)
9022 .Case("avr6", true)
9023 .Case("avrxmega1", true)
9024 .Case("avrxmega2", true)
9025 .Case("avrxmega3", true)
9026 .Case("avrxmega4", true)
9027 .Case("avrxmega5", true)
9028 .Case("avrxmega6", true)
9029 .Case("avrxmega7", true)
9030 .Case("avrtiny", true)
9031 .Default(false);
9032
9033 if (IsFamily) this->CPU = Name;
9034
9035 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9036 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9037
9038 if (IsMCU) this->CPU = Name;
9039
9040 return IsFamily || IsMCU;
9041 }
9042
9043protected:
9044 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009045};
9046
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009047} // end anonymous namespace
9048
Chris Lattner5ba61f02006-10-14 07:39:34 +00009049//===----------------------------------------------------------------------===//
9050// Driver code
9051//===----------------------------------------------------------------------===//
9052
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009053static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9054 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009055 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009056
Daniel Dunbar52322032009-08-18 05:47:58 +00009057 switch (Triple.getArch()) {
9058 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009059 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009060
Tim Northover2a0783d2014-05-30 14:14:07 +00009061 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009062 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009063
9064 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009065 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009066
Jacques Pienaard964cc22016-03-28 21:02:54 +00009067 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009068 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009069
Tim Northover2a0783d2014-05-30 14:14:07 +00009070 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009071 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009072 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009073
9074 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009075 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009076 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009077 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009078 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009079 case llvm::Triple::Fuchsia:
9080 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009081 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009082 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009083 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009084 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009085 case llvm::Triple::OpenBSD:
9086 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009087 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009088 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009089 }
9090
Christian Pirker9b019ae2014-02-25 13:51:00 +00009091 case llvm::Triple::aarch64_be:
9092 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009093 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009094 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009095 case llvm::Triple::Fuchsia:
9096 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009097 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009098 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009099 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009100 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009101 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009102 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009103 }
9104
Daniel Dunbar52322032009-08-18 05:47:58 +00009105 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009106 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009107 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009108 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009109
Daniel Dunbar52322032009-08-18 05:47:58 +00009110 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009111 case llvm::Triple::CloudABI:
9112 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009113 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009115 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009116 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009117 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009119 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009120 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009121 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009122 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009123 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009124 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009125 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009127 case llvm::Triple::Win32:
9128 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009129 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009130 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009131 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009132 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009133 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009134 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009135 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009136 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009137 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009138 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009139 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009140 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009141 }
9142
9143 case llvm::Triple::armeb:
9144 case llvm::Triple::thumbeb:
9145 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009147
9148 switch (os) {
9149 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009151 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009153 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009155 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009156 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009157 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009159 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009160 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009161 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009162 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009163 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009164 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009165 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009166
Dylan McKay924fa3a2017-01-05 05:20:27 +00009167 case llvm::Triple::avr:
9168 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009169 case llvm::Triple::bpfeb:
9170 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009172
Daniel Dunbar52322032009-08-18 05:47:58 +00009173 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009174 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009175
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009176 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009177 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009178 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009179 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009180 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009181 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009182 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009183 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009184 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009185 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009186 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009187 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009188 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009189
9190 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009191 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009192 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009193 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009194 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009195 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009196 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009197 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009198 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009199 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009200 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009201 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009202 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009203 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009204 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009205
Akira Hatanakabef17452011-09-20 19:21:49 +00009206 case llvm::Triple::mips64:
9207 switch (os) {
9208 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009209 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009210 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009211 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009212 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009213 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009214 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009215 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009216 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009217 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009218 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009219 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009220 }
9221
9222 case llvm::Triple::mips64el:
9223 switch (os) {
9224 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009225 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009226 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009227 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009228 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009229 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009230 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009231 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009232 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009233 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009234 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009235 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009236 }
9237
Ivan Krasindd7403e2011-08-24 20:22:22 +00009238 case llvm::Triple::le32:
9239 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009240 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009241 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009242 default:
9243 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009244 }
9245
JF Bastien643817d2014-09-12 17:52:47 +00009246 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009247 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009248
Daniel Dunbar52322032009-08-18 05:47:58 +00009249 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009250 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009251 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009252 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009253 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009255 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009257 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009259 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009261 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009262 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009263 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009264 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009265 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009266
9267 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009268 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009270 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009271 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009273 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009275 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009276 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009277 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009278 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009279 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009280 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009281 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009282
Bill Schmidt778d3872013-07-26 01:36:11 +00009283 case llvm::Triple::ppc64le:
9284 switch (os) {
9285 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009286 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009287 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009288 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009289 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009290 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009291 }
9292
Peter Collingbournec947aae2012-05-20 23:28:41 +00009293 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009294 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009295 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009296 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009297
Tom Stellardd8e38a32015-01-06 20:34:47 +00009298 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009299 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009301
Daniel Dunbar52322032009-08-18 05:47:58 +00009302 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009303 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009304 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009306 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009307 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009308 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009309 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009310 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009312 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009313 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009314 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009315 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009316 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009317
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009318 // The 'sparcel' architecture copies all the above cases except for Solaris.
9319 case llvm::Triple::sparcel:
9320 switch (os) {
9321 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009323 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009325 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009327 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009329 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009331 }
9332
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009333 case llvm::Triple::sparcv9:
9334 switch (os) {
9335 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009337 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009339 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009340 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009341 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009342 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009343 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009344 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009345 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009346 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009347 }
9348
Ulrich Weigand47445072013-05-06 16:26:41 +00009349 case llvm::Triple::systemz:
9350 switch (os) {
9351 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009352 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009353 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009355 }
9356
Eli Friedmana9c3d712009-08-19 20:47:07 +00009357 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009359
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009360 case llvm::Triple::tcele:
9361 return new TCELETargetInfo(Triple, Opts);
9362
Daniel Dunbar52322032009-08-18 05:47:58 +00009363 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009364 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009366
Daniel Dunbar52322032009-08-18 05:47:58 +00009367 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009368 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009369 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009370 case llvm::Triple::Linux: {
9371 switch (Triple.getEnvironment()) {
9372 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009373 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009374 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009376 }
9377 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009378 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009379 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009380 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009382 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009384 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009386 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009387 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009388 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009389 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009390 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009391 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009392 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009393 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009394 case llvm::Triple::Win32: {
9395 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009396 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009397 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009398 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009399 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009400 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009401 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009402 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009403 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009404 }
9405 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009406 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009407 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009408 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009409 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009410 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009411 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009412 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009413 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009414 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009415 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009416 }
9417
9418 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009419 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009420 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009421
Daniel Dunbar52322032009-08-18 05:47:58 +00009422 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009423 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009424 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009425 case llvm::Triple::Linux: {
9426 switch (Triple.getEnvironment()) {
9427 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009428 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009429 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009430 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009431 }
9432 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009433 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009434 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009435 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009436 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009437 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009438 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009439 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009440 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009441 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009442 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009443 case llvm::Triple::Fuchsia:
9444 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009445 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009446 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009447 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009448 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009449 case llvm::Triple::Win32: {
9450 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009451 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009452 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009453 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009454 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009455 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009456 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009457 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009458 }
9459 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009460 case llvm::Triple::Haiku:
9461 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009462 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009463 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009464 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009465 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009466 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009467 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009468 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009469
Douglas Katzman78d7c542015-05-12 21:18:10 +00009470 case llvm::Triple::spir: {
9471 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9472 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9473 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009474 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009475 }
9476 case llvm::Triple::spir64: {
9477 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9478 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9479 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009480 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009481 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009482 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009483 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9484 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9485 Triple.getOS() != llvm::Triple::UnknownOS ||
9486 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9487 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009488 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009489 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009490 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009491 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9492 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9493 Triple.getOS() != llvm::Triple::UnknownOS ||
9494 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9495 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009496 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009497 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009498
9499 case llvm::Triple::renderscript32:
9500 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9501 case llvm::Triple::renderscript64:
9502 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009503 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009504}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009505
9506/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009507/// options.
Alp Toker80758082014-07-06 05:26:44 +00009508TargetInfo *
9509TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009510 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009511 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009512
9513 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009514 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009515 if (!Target) {
9516 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009517 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009518 }
Alp Toker80758082014-07-06 05:26:44 +00009519 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009520
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009521 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009522 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9523 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009524 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009525 }
9526
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009527 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009528 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9529 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009530 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009531 }
9532
Rafael Espindolaeb265472013-08-21 21:59:03 +00009533 // Set the fp math unit.
9534 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9535 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009536 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009537 }
9538
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009539 // Compute the default target features, we need the target to handle this
9540 // because features may have dependencies on one another.
9541 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009542 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9543 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009544 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009545
9546 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009547 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009548 for (const auto &F : Features)
9549 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9550
Eric Christopher3ff21b32013-10-16 21:26:26 +00009551 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009552 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009553
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009554 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009555 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009556
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009557 if (!Target->validateTarget(Diags))
9558 return nullptr;
9559
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009560 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009561}