blob: 1971042fc873e71ae348b76c1c59251cf678f46e [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000346 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000391 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000414 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000444 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000458 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000515 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000544 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Brad Smith0561a5a2017-02-20 03:18:15 +0000548 if (this->HasFloat128)
549 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 }
551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000552 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
553 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000555
Eli Friedman3715d1f2011-12-15 02:15:56 +0000556 switch (Triple.getArch()) {
Eli Friedman3715d1f2011-12-15 02:15:56 +0000557 case llvm::Triple::x86:
558 case llvm::Triple::x86_64:
Brad Smith0561a5a2017-02-20 03:18:15 +0000559 this->HasFloat128 = true;
560 // FALLTHROUGH
561 default:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000562 this->MCountName = "__mcount";
563 break;
564 case llvm::Triple::mips64:
565 case llvm::Triple::mips64el:
566 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000567 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000568 this->MCountName = "_mcount";
569 break;
570 }
571 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000572};
573
Eli Friedman9fa28852012-08-08 23:57:20 +0000574// Bitrig Target
575template<typename Target>
576class BitrigTargetInfo : public OSTargetInfo<Target> {
577protected:
Craig Topper3164f332014-03-11 03:39:26 +0000578 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
579 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000580 // Bitrig defines; list based off of gcc output
581
582 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000583 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000584 Builder.defineMacro("__ELF__");
585 if (Opts.POSIXThreads)
586 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000587
588 switch (Triple.getArch()) {
589 default:
590 break;
591 case llvm::Triple::arm:
592 case llvm::Triple::armeb:
593 case llvm::Triple::thumb:
594 case llvm::Triple::thumbeb:
595 Builder.defineMacro("__ARM_DWARF_EH__");
596 break;
597 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000598 }
599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000600 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
601 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000603 }
604};
605
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000606// PSP Target
607template<typename Target>
608class PSPTargetInfo : public OSTargetInfo<Target> {
609protected:
Craig Topper3164f332014-03-11 03:39:26 +0000610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
611 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000612 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("PSP");
614 Builder.defineMacro("_PSP");
615 Builder.defineMacro("__psp__");
616 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000617 }
618public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000619 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000620};
621
John Thompsone467e192009-11-19 17:18:50 +0000622// PS3 PPU Target
623template<typename Target>
624class PS3PPUTargetInfo : public OSTargetInfo<Target> {
625protected:
Craig Topper3164f332014-03-11 03:39:26 +0000626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
627 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000628 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000629 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000630 Builder.defineMacro("__PPU__");
631 Builder.defineMacro("__CELLOS_LV2__");
632 Builder.defineMacro("__ELF__");
633 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000634 Builder.defineMacro("_ARCH_PPC64");
635 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000640 this->LongWidth = this->LongAlign = 32;
641 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000642 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000643 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000644 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000645 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000646 }
647};
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649template <typename Target>
650class PS4OSTargetInfo : public OSTargetInfo<Target> {
651protected:
652 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
653 MacroBuilder &Builder) const override {
654 Builder.defineMacro("__FreeBSD__", "9");
655 Builder.defineMacro("__FreeBSD_cc_version", "900001");
656 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000657 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000659 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 }
661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000662 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
663 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664 this->WCharType = this->UnsignedShort;
665
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000666 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
667 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000668
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000669 // On PS4, do not honor explicit bit field alignment,
670 // as in "__attribute__((aligned(2))) int b : 1;".
671 this->UseExplicitBitFieldAlignment = false;
672
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000673 switch (Triple.getArch()) {
674 default:
675 case llvm::Triple::x86_64:
676 this->MCountName = ".mcount";
677 break;
678 }
679 }
680};
681
Torok Edwinb2b37c62009-06-30 17:10:35 +0000682// Solaris target
683template<typename Target>
684class SolarisTargetInfo : public OSTargetInfo<Target> {
685protected:
Craig Topper3164f332014-03-11 03:39:26 +0000686 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
687 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000689 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000690 Builder.defineMacro("__ELF__");
691 Builder.defineMacro("__svr4__");
692 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000693 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
694 // newer, but to 500 for everything else. feature_test.h has a check to
695 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000696 // with a new version.
697 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("_XOPEN_SOURCE", "600");
699 else
700 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000701 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000703 Builder.defineMacro("_LARGEFILE_SOURCE");
704 Builder.defineMacro("_LARGEFILE64_SOURCE");
705 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000706 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000707 }
708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000709 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
710 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000711 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000712 // FIXME: WIntType should be SignedLong
713 }
714};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715
716// Windows target
717template<typename Target>
718class WindowsTargetInfo : public OSTargetInfo<Target> {
719protected:
Craig Topper3164f332014-03-11 03:39:26 +0000720 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
721 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000722 Builder.defineMacro("_WIN32");
723 }
724 void getVisualStudioDefines(const LangOptions &Opts,
725 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000727 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000728 Builder.defineMacro("_CPPRTTI");
729
Reid Kleckner16514352015-01-30 21:42:55 +0000730 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000731 Builder.defineMacro("_CPPUNWIND");
732 }
733
David Majnemer6a658902015-07-22 22:36:26 +0000734 if (Opts.Bool)
735 Builder.defineMacro("__BOOL_DEFINED");
736
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000737 if (!Opts.CharIsSigned)
738 Builder.defineMacro("_CHAR_UNSIGNED");
739
740 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
741 // but it works for now.
742 if (Opts.POSIXThreads)
743 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000744
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000745 if (Opts.MSCompatibilityVersion) {
746 Builder.defineMacro("_MSC_VER",
747 Twine(Opts.MSCompatibilityVersion / 100000));
748 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000749 // FIXME We cannot encode the revision information into 32-bits
750 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000751
David Majnemerb710a932015-05-11 03:57:49 +0000752 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000753 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000754
755 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
756 if (Opts.CPlusPlus1z)
757 Builder.defineMacro("_MSVC_LANG", "201403L");
758 else if (Opts.CPlusPlus14)
759 Builder.defineMacro("_MSVC_LANG", "201402L");
760 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000761 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000762
763 if (Opts.MicrosoftExt) {
764 Builder.defineMacro("_MSC_EXTENSIONS");
765
766 if (Opts.CPlusPlus11) {
767 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
768 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
769 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
770 }
771 }
772
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000773 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774 }
775
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000777 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
778 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000779};
780
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000781template <typename Target>
782class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000783protected:
Craig Topper3164f332014-03-11 03:39:26 +0000784 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
785 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 if (Opts.POSIXThreads)
787 Builder.defineMacro("_REENTRANT");
788 if (Opts.CPlusPlus)
789 Builder.defineMacro("_GNU_SOURCE");
790
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000791 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000792 Builder.defineMacro("__ELF__");
793 Builder.defineMacro("__native_client__");
794 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000795
796public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000797 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
798 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000799 this->LongAlign = 32;
800 this->LongWidth = 32;
801 this->PointerAlign = 32;
802 this->PointerWidth = 32;
803 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000804 this->Int64Type = TargetInfo::SignedLongLong;
805 this->DoubleAlign = 64;
806 this->LongDoubleWidth = 64;
807 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000808 this->LongLongWidth = 64;
809 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->SizeType = TargetInfo::UnsignedInt;
811 this->PtrDiffType = TargetInfo::SignedInt;
812 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000813 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000814 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000816 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000822 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000823 } else {
824 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000825 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000826 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000827 }
828};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000829
Petr Hosek62e1d232016-10-06 06:08:09 +0000830// Fuchsia Target
831template<typename Target>
832class FuchsiaTargetInfo : public OSTargetInfo<Target> {
833protected:
834 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
835 MacroBuilder &Builder) const override {
836 Builder.defineMacro("__Fuchsia__");
837 Builder.defineMacro("__ELF__");
838 if (Opts.POSIXThreads)
839 Builder.defineMacro("_REENTRANT");
840 // Required by the libc++ locale support.
841 if (Opts.CPlusPlus)
842 Builder.defineMacro("_GNU_SOURCE");
843 }
844public:
845 FuchsiaTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
848 this->MCountName = "__mcount";
849 }
850};
851
Dan Gohmanc2853072015-09-03 22:51:53 +0000852// WebAssembly target
853template <typename Target>
854class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
855 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000856 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000857 // A common platform macro.
858 if (Opts.POSIXThreads)
859 Builder.defineMacro("_REENTRANT");
860 // Follow g++ convention and predefine _GNU_SOURCE for C++.
861 if (Opts.CPlusPlus)
862 Builder.defineMacro("_GNU_SOURCE");
863 }
864
865 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000866 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000867 return ".text.__startup";
868 }
869
870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000871 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
872 const TargetOptions &Opts)
873 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000874 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000875 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
876 }
877};
Dan Gohmanc2853072015-09-03 22:51:53 +0000878
Chris Lattner09d98f52008-10-05 21:50:58 +0000879//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000880// Specific target implementations.
881//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000882
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000883// PPC abstract base class
884class PPCTargetInfo : public TargetInfo {
885 static const Builtin::Info BuiltinInfo[];
886 static const char * const GCCRegNames[];
887 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000889
890 // Target cpu features.
Eric Christopher758aad72017-03-21 22:06:18 +0000891 bool HasAltivec;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000892 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000893 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000894 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000895 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000896 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000897 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000898 bool HasBPERMD;
899 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000900 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000901
Ulrich Weigand8afad612014-07-28 13:17:52 +0000902protected:
903 std::string ABI;
904
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000906 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopher758aad72017-03-21 22:06:18 +0000907 : TargetInfo(Triple), HasAltivec(false), HasVSX(false), HasP8Vector(false),
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000908 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000909 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Eric Christopher153dad42017-03-25 02:55:21 +0000910 SuitableAlign = 128;
Alexey Bataev00396512015-07-02 03:40:19 +0000911 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000912 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000913 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000914 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000915
Hal Finkel6b984f02012-07-03 16:51:04 +0000916 /// \brief Flags for architecture specific defines.
917 typedef enum {
918 ArchDefineNone = 0,
919 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
920 ArchDefinePpcgr = 1 << 1,
921 ArchDefinePpcsq = 1 << 2,
922 ArchDefine440 = 1 << 3,
923 ArchDefine603 = 1 << 4,
924 ArchDefine604 = 1 << 5,
925 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 ArchDefinePwr5 = 1 << 7,
927 ArchDefinePwr5x = 1 << 8,
928 ArchDefinePwr6 = 1 << 9,
929 ArchDefinePwr6x = 1 << 10,
930 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000931 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000932 ArchDefinePwr9 = 1 << 13,
933 ArchDefineA2 = 1 << 14,
934 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000935 } ArchDefineTypes;
936
Eric Christopher3646e622017-03-22 06:36:09 +0000937 // Set the language option for altivec based on our value.
938 void adjust(LangOptions &Opts) override {
939 if (HasAltivec)
940 Opts.AltiVec = 1;
941 TargetInfo::adjust(Opts);
942 }
943
Bill Schmidt38378a02013-02-01 20:23:10 +0000944 // Note: GCC recognizes the following additional cpus:
945 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
946 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
947 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000948 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 bool CPUKnown = llvm::StringSwitch<bool>(Name)
950 .Case("generic", true)
951 .Case("440", true)
952 .Case("450", true)
953 .Case("601", true)
954 .Case("602", true)
955 .Case("603", true)
956 .Case("603e", true)
957 .Case("603ev", true)
958 .Case("604", true)
959 .Case("604e", true)
960 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Case("g3", true)
963 .Case("7400", true)
964 .Case("g4", true)
965 .Case("7450", true)
966 .Case("g4+", true)
967 .Case("750", true)
968 .Case("970", true)
969 .Case("g5", true)
970 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000971 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000972 .Case("e500mc", true)
973 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000974 .Case("power3", true)
975 .Case("pwr3", true)
976 .Case("power4", true)
977 .Case("pwr4", true)
978 .Case("power5", true)
979 .Case("pwr5", true)
980 .Case("power5x", true)
981 .Case("pwr5x", true)
982 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000983 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000984 .Case("power6x", true)
985 .Case("pwr6x", true)
986 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000988 .Case("power8", true)
989 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000990 .Case("power9", true)
991 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000992 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000993 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000994 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000995 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000996 .Case("powerpc64le", true)
997 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000998 .Default(false);
999
1000 if (CPUKnown)
1001 CPU = Name;
1002
1003 return CPUKnown;
1004 }
1005
Ulrich Weigand8afad612014-07-28 13:17:52 +00001006
1007 StringRef getABI() const override { return ABI; }
1008
Craig Topper6c03a542015-10-19 04:51:35 +00001009 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1010 return llvm::makeArrayRef(BuiltinInfo,
1011 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001012 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001013
Craig Topper3164f332014-03-11 03:39:26 +00001014 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001015
Craig Topper3164f332014-03-11 03:39:26 +00001016 void getTargetDefines(const LangOptions &Opts,
1017 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001018
Eric Christopher8c47b422015-10-09 18:39:55 +00001019 bool
1020 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1021 StringRef CPU,
1022 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001023
Craig Topper3164f332014-03-11 03:39:26 +00001024 bool handleTargetFeatures(std::vector<std::string> &Features,
1025 DiagnosticsEngine &Diags) override;
1026 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001027 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1028 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001029
Craig Topperf054e3a2015-10-19 03:52:27 +00001030 ArrayRef<const char *> getGCCRegNames() const override;
1031 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001032 bool validateAsmConstraint(const char *&Name,
1033 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001034 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001035 default: return false;
1036 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001037 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001038 case 'b': // Base register
1039 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001040 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001041 break;
1042 // FIXME: The following are added to allow parsing.
1043 // I just took a guess at what the actions should be.
1044 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'v': // Altivec vector register
1047 Info.setAllowsRegister();
1048 break;
1049 case 'w':
1050 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001051 case 'd':// VSX vector register to hold vector double data
1052 case 'f':// VSX vector register to hold vector float data
1053 case 's':// VSX vector register to hold scalar float data
1054 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001055 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001056 break;
1057 default:
1058 return false;
1059 }
1060 Info.setAllowsRegister();
1061 Name++; // Skip over 'w'.
1062 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 case 'h': // `MQ', `CTR', or `LINK' register
1064 case 'q': // `MQ' register
1065 case 'c': // `CTR' register
1066 case 'l': // `LINK' register
1067 case 'x': // `CR' register (condition register) number 0
1068 case 'y': // `CR' register (condition register)
1069 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsRegister();
1071 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001073 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // (use `L' instead for SImode constants)
1075 case 'K': // Unsigned 16-bit constant
1076 case 'L': // Signed 16-bit constant shifted left 16 bits
1077 case 'M': // Constant larger than 31
1078 case 'N': // Exact power of 2
1079 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001080 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001084 break;
1085 case 'm': // Memory operand. Note that on PowerPC targets, m can
1086 // include addresses that update the base register. It
1087 // is therefore only safe to use `m' in an asm statement
1088 // if that asm statement accesses the operand exactly once.
1089 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001090 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001091 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001092 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001093 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001094 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1095 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // register to be updated.
1097 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001098 if (Name[1] != 's')
1099 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001100 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001101 // include any automodification of the base register. Unlike
1102 // `m', this constraint can be used in asm statements that
1103 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001104 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001105 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001106 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001107 break;
1108 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001110 case 'Z': // Memory operand that is an indexed or indirect from a
1111 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001113 Info.setAllowsMemory();
1114 Info.setAllowsRegister();
1115 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001116 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001117 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001118 // register (`p' is preferable for asm statements)
1119 case 'S': // Constant suitable as a 64-bit mask operand
1120 case 'T': // Constant suitable as a 32-bit mask operand
1121 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001122 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001123 // instructions
1124 case 'W': // Vector constant that does not require memory
1125 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001126 break;
1127 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001128 }
John Thompson07a61a42010-06-24 22:44:13 +00001129 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001130 }
Craig Topper3164f332014-03-11 03:39:26 +00001131 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001132 std::string R;
1133 switch (*Constraint) {
1134 case 'e':
1135 case 'w':
1136 // Two-character constraint; add "^" hint for later parsing.
1137 R = std::string("^") + std::string(Constraint, 2);
1138 Constraint++;
1139 break;
1140 default:
1141 return TargetInfo::convertConstraint(Constraint);
1142 }
1143 return R;
1144 }
Craig Topper3164f332014-03-11 03:39:26 +00001145 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001146 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001147 }
Craig Topper3164f332014-03-11 03:39:26 +00001148 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001149 if (RegNo == 0) return 3;
1150 if (RegNo == 1) return 4;
1151 return -1;
1152 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001153
1154 bool hasSjLjLowering() const override {
1155 return true;
1156 }
David Majnemer2617ea62015-06-09 18:05:33 +00001157
1158 bool useFloat128ManglingForLongDouble() const override {
1159 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001160 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001161 getTriple().isOSBinFormatELF();
1162 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001163};
Anders Carlssonf511f642007-11-27 04:11:28 +00001164
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001165const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001166#define BUILTIN(ID, TYPE, ATTRS) \
1167 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1168#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1169 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001170#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001171};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001172
Eric Christopher917e9522014-11-18 22:36:15 +00001173/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001174/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001175bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001176 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001177 for (const auto &Feature : Features) {
Eric Christopher758aad72017-03-21 22:06:18 +00001178 if (Feature == "+altivec") {
1179 HasAltivec = true;
1180 } else if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001181 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001182 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001183 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001184 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001185 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001186 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001187 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001188 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001189 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001190 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001191 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001192 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001193 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001194 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001195 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001196 } else if (Feature == "+float128") {
1197 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001198 } else if (Feature == "+power9-vector") {
1199 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001200 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001201 // TODO: Finish this list and add an assert that we've handled them
1202 // all.
1203 }
Eric Christopher02c33352015-08-25 00:59:11 +00001204
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001205 return true;
1206}
1207
Chris Lattnerecd49032009-03-02 22:27:17 +00001208/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1209/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001210void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001211 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001213 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001214 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001215 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001216 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001217 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001218 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001219 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001220 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001221 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001222 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001223 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001226 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1227 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001228 } else {
1229 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1230 getTriple().getOS() != llvm::Triple::OpenBSD)
1231 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001232 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001233
Ulrich Weigand8afad612014-07-28 13:17:52 +00001234 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001235 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001236 Builder.defineMacro("_CALL_ELF", "1");
1237 if (ABI == "elfv2")
1238 Builder.defineMacro("_CALL_ELF", "2");
1239
Eric Christopher2fd2eda2017-03-25 03:33:59 +00001240 // This typically is only for a new enough linker (bfd >= 2.16.2 or gold), but
1241 // our suppport post-dates this and it should work on all linux platforms. It
1242 // is guaranteed to work on all elfv2 platforms.
1243 if (getTriple().getOS() == llvm::Triple::Linux)
1244 Builder.defineMacro("_CALL_LINUX", "1");
1245
Chris Lattnerecd49032009-03-02 22:27:17 +00001246 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001247 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1248 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001249
Chris Lattnerecd49032009-03-02 22:27:17 +00001250 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001251 if (LongDoubleWidth == 128)
1252 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001253
Eric Christopher32ac5e42017-02-15 07:50:11 +00001254 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1255 if (ABI == "elfv2" ||
1256 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1257 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1258
Hal Finkel8eb59282012-06-11 22:35:19 +00001259 // CPU identification.
Eric Christopherb70819e2017-03-25 02:29:18 +00001260 ArchDefineTypes defs =
1261 (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1262 .Case("440", ArchDefineName)
1263 .Case("450", ArchDefineName | ArchDefine440)
1264 .Case("601", ArchDefineName)
1265 .Case("602", ArchDefineName | ArchDefinePpcgr)
1266 .Case("603", ArchDefineName | ArchDefinePpcgr)
1267 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1268 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1269 .Case("604", ArchDefineName | ArchDefinePpcgr)
1270 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1271 .Case("620", ArchDefineName | ArchDefinePpcgr)
1272 .Case("630", ArchDefineName | ArchDefinePpcgr)
1273 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1274 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1275 .Case("750", ArchDefineName | ArchDefinePpcgr)
1276 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1277 ArchDefinePpcsq)
1278 .Case("a2", ArchDefineA2)
1279 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1280 .Case("pwr3", ArchDefinePpcgr)
1281 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1282 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr |
1283 ArchDefinePpcsq)
1284 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4 |
1285 ArchDefinePpcgr | ArchDefinePpcsq)
1286 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5 |
1287 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1288 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x |
1289 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1290 ArchDefinePpcsq)
1291 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6 |
1292 ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1293 ArchDefinePpcgr | ArchDefinePpcsq)
1294 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x |
1295 ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1296 ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1297 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7 |
1298 ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1299 ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1300 ArchDefinePpcsq)
1301 .Case("power3", ArchDefinePpcgr)
1302 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1303 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr |
1304 ArchDefinePpcsq)
1305 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4 |
1306 ArchDefinePpcgr | ArchDefinePpcsq)
1307 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5 |
1308 ArchDefinePwr4 | ArchDefinePpcgr |
1309 ArchDefinePpcsq)
1310 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x |
1311 ArchDefinePwr5 | ArchDefinePwr4 |
1312 ArchDefinePpcgr | ArchDefinePpcsq)
1313 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6 |
1314 ArchDefinePwr5x | ArchDefinePwr5 |
1315 ArchDefinePwr4 | ArchDefinePpcgr |
1316 ArchDefinePpcsq)
1317 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1318 ArchDefinePwr6 | ArchDefinePwr5x |
1319 ArchDefinePwr5 | ArchDefinePwr4 |
1320 ArchDefinePpcgr | ArchDefinePpcsq)
1321 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7 |
1322 ArchDefinePwr6x | ArchDefinePwr6 |
1323 ArchDefinePwr5x | ArchDefinePwr5 |
1324 ArchDefinePwr4 | ArchDefinePpcgr |
1325 ArchDefinePpcsq)
1326 // powerpc64le automatically defaults to at least power8.
1327 .Case("ppc64le", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x |
1328 ArchDefinePwr6 | ArchDefinePwr5x |
1329 ArchDefinePwr5 | ArchDefinePwr4 |
1330 ArchDefinePpcgr | ArchDefinePpcsq)
1331 .Default(ArchDefineNone);
Hal Finkel6b984f02012-07-03 16:51:04 +00001332
1333 if (defs & ArchDefineName)
1334 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1335 if (defs & ArchDefinePpcgr)
1336 Builder.defineMacro("_ARCH_PPCGR");
1337 if (defs & ArchDefinePpcsq)
1338 Builder.defineMacro("_ARCH_PPCSQ");
1339 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001340 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001341 if (defs & ArchDefine603)
1342 Builder.defineMacro("_ARCH_603");
1343 if (defs & ArchDefine604)
1344 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001345 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001346 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001348 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001349 if (defs & ArchDefinePwr5x)
1350 Builder.defineMacro("_ARCH_PWR5X");
1351 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001352 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001353 if (defs & ArchDefinePwr6x)
1354 Builder.defineMacro("_ARCH_PWR6X");
1355 if (defs & ArchDefinePwr7)
1356 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001357 if (defs & ArchDefinePwr8)
1358 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001359 if (defs & ArchDefinePwr9)
1360 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001361 if (defs & ArchDefineA2)
1362 Builder.defineMacro("_ARCH_A2");
1363 if (defs & ArchDefineA2q) {
1364 Builder.defineMacro("_ARCH_A2Q");
1365 Builder.defineMacro("_ARCH_QP");
1366 }
1367
1368 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1369 Builder.defineMacro("__bg__");
1370 Builder.defineMacro("__THW_BLUEGENE__");
1371 Builder.defineMacro("__bgq__");
1372 Builder.defineMacro("__TOS_BGQ__");
1373 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001374
Eric Christopher758aad72017-03-21 22:06:18 +00001375 if (HasAltivec) {
1376 Builder.defineMacro("__VEC__", "10206");
1377 Builder.defineMacro("__ALTIVEC__");
1378 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001379 if (HasVSX)
1380 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001381 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001382 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001383 if (HasP8Crypto)
1384 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001385 if (HasHTM)
1386 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001387 if (HasFloat128)
1388 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001389 if (HasP9Vector)
1390 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001391
1392 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1393 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1394 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1395 if (PointerWidth == 64)
1396 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001397
Bill Schmidt38378a02013-02-01 20:23:10 +00001398 // FIXME: The following are not yet generated here by Clang, but are
1399 // generated by GCC:
1400 //
1401 // _SOFT_FLOAT_
1402 // __RECIP_PRECISION__
1403 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001404 // __RECIP__
1405 // __RECIPF__
1406 // __RSQRTE__
1407 // __RSQRTEF__
1408 // _SOFT_DOUBLE_
1409 // __NO_LWSYNC__
1410 // __HAVE_BSWAP__
1411 // __LONGDOUBLE128
1412 // __CMODEL_MEDIUM__
1413 // __CMODEL_LARGE__
1414 // _CALL_SYSV
1415 // _CALL_DARWIN
1416 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001417}
1418
Eric Christophera8a14c32015-08-31 18:39:16 +00001419// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001420// explicitly turned off vsx and turned on any of:
1421// - power8-vector
1422// - direct-move
1423// - float128
1424// - power9-vector
1425// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001426// set of options.
1427static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001428 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001429
1430 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1431 FeaturesVec.end()) {
1432 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1433 FeaturesVec.end()) {
1434 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1435 << "-mno-vsx";
1436 return false;
1437 }
1438
1439 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1440 FeaturesVec.end()) {
1441 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1442 << "-mno-vsx";
1443 return false;
1444 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001445
1446 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1447 FeaturesVec.end()) {
1448 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1449 << "-mno-vsx";
1450 return false;
1451 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001452
1453 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1454 FeaturesVec.end()) {
1455 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1456 << "-mno-vsx";
1457 return false;
1458 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001459 }
1460
1461 return true;
1462}
1463
Eric Christopher8c47b422015-10-09 18:39:55 +00001464bool PPCTargetInfo::initFeatureMap(
1465 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1466 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001467 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("7400", true)
1469 .Case("g4", true)
1470 .Case("7450", true)
1471 .Case("g4+", true)
1472 .Case("970", true)
1473 .Case("g5", true)
1474 .Case("pwr6", true)
1475 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001476 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001477 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001478 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001479 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001480 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001481
1482 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001483 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001484 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1485 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001486 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001487 .Case("pwr8", true)
1488 .Default(false);
1489 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1490 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001491 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001492 .Case("pwr8", true)
1493 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001494 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1495 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001496 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001497 .Case("pwr8", true)
1498 .Case("pwr7", true)
1499 .Default(false);
1500 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1501 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001502 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001503 .Case("pwr8", true)
1504 .Case("pwr7", true)
1505 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001506 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1507 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001508 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001509 .Case("pwr8", true)
1510 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001511 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1512 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001513 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001514 .Case("pwr8", true)
1515 .Case("pwr7", true)
1516 .Default(false);
Eric Christopher74fa24f2017-03-20 21:12:53 +00001517 Features["htm"] = llvm::StringSwitch<bool>(CPU)
1518 .Case("ppc64le", true)
1519 .Case("pwr9", true)
1520 .Case("pwr8", true)
1521 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001522
Eric Christophera8a14c32015-08-31 18:39:16 +00001523 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1524 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001525
Eric Christopher007b0a02015-08-28 22:32:01 +00001526 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001527}
1528
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001529bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001530 return llvm::StringSwitch<bool>(Feature)
Eric Christopher758aad72017-03-21 22:06:18 +00001531 .Case("powerpc", true)
1532 .Case("altivec", HasAltivec)
1533 .Case("vsx", HasVSX)
1534 .Case("power8-vector", HasP8Vector)
1535 .Case("crypto", HasP8Crypto)
1536 .Case("direct-move", HasDirectMove)
1537 .Case("qpx", HasQPX)
1538 .Case("htm", HasHTM)
1539 .Case("bpermd", HasBPERMD)
1540 .Case("extdiv", HasExtDiv)
1541 .Case("float128", HasFloat128)
1542 .Case("power9-vector", HasP9Vector)
1543 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001544}
Chris Lattner17df24e2008-04-21 18:56:49 +00001545
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001546void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1547 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001548 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1549 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1550 // incompatible options.
1551 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001552 if (Name == "direct-move" ||
1553 Name == "power8-vector" ||
1554 Name == "float128" ||
1555 Name == "power9-vector") {
1556 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001557 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001558 if (Name == "power9-vector")
1559 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001560 } else {
1561 Features[Name] = true;
1562 }
1563 } else {
1564 if (Name == "vsx") {
1565 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001566 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001567 } else {
1568 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001569 }
1570 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001571}
1572
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001573const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001574 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1575 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1576 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1577 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1578 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1579 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1580 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1581 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001582 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001583 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001584 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001585 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1586 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1587 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1588 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589 "vrsave", "vscr",
1590 "spe_acc", "spefscr",
1591 "sfp"
1592};
Chris Lattner10a5b382007-01-29 05:24:35 +00001593
Craig Topperf054e3a2015-10-19 03:52:27 +00001594ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1595 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001596}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001597
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001598const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1599 // While some of these aliases do map to different registers
1600 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001601 { { "0" }, "r0" },
1602 { { "1"}, "r1" },
1603 { { "2" }, "r2" },
1604 { { "3" }, "r3" },
1605 { { "4" }, "r4" },
1606 { { "5" }, "r5" },
1607 { { "6" }, "r6" },
1608 { { "7" }, "r7" },
1609 { { "8" }, "r8" },
1610 { { "9" }, "r9" },
1611 { { "10" }, "r10" },
1612 { { "11" }, "r11" },
1613 { { "12" }, "r12" },
1614 { { "13" }, "r13" },
1615 { { "14" }, "r14" },
1616 { { "15" }, "r15" },
1617 { { "16" }, "r16" },
1618 { { "17" }, "r17" },
1619 { { "18" }, "r18" },
1620 { { "19" }, "r19" },
1621 { { "20" }, "r20" },
1622 { { "21" }, "r21" },
1623 { { "22" }, "r22" },
1624 { { "23" }, "r23" },
1625 { { "24" }, "r24" },
1626 { { "25" }, "r25" },
1627 { { "26" }, "r26" },
1628 { { "27" }, "r27" },
1629 { { "28" }, "r28" },
1630 { { "29" }, "r29" },
1631 { { "30" }, "r30" },
1632 { { "31" }, "r31" },
1633 { { "fr0" }, "f0" },
1634 { { "fr1" }, "f1" },
1635 { { "fr2" }, "f2" },
1636 { { "fr3" }, "f3" },
1637 { { "fr4" }, "f4" },
1638 { { "fr5" }, "f5" },
1639 { { "fr6" }, "f6" },
1640 { { "fr7" }, "f7" },
1641 { { "fr8" }, "f8" },
1642 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001643 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001644 { { "fr11" }, "f11" },
1645 { { "fr12" }, "f12" },
1646 { { "fr13" }, "f13" },
1647 { { "fr14" }, "f14" },
1648 { { "fr15" }, "f15" },
1649 { { "fr16" }, "f16" },
1650 { { "fr17" }, "f17" },
1651 { { "fr18" }, "f18" },
1652 { { "fr19" }, "f19" },
1653 { { "fr20" }, "f20" },
1654 { { "fr21" }, "f21" },
1655 { { "fr22" }, "f22" },
1656 { { "fr23" }, "f23" },
1657 { { "fr24" }, "f24" },
1658 { { "fr25" }, "f25" },
1659 { { "fr26" }, "f26" },
1660 { { "fr27" }, "f27" },
1661 { { "fr28" }, "f28" },
1662 { { "fr29" }, "f29" },
1663 { { "fr30" }, "f30" },
1664 { { "fr31" }, "f31" },
1665 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001666};
1667
Craig Topperf054e3a2015-10-19 03:52:27 +00001668ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1669 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001670}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001671
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001672class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001673public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001674 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1675 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001676 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001677
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001678 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001679 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001680 case llvm::Triple::FreeBSD:
1681 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001682 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001683 PtrDiffType = SignedInt;
1684 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001685 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001686 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001687 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001688 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001689
Roman Divacky3ffe7462012-03-13 19:20:17 +00001690 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1691 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001692 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001693 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001694
1695 // PPC32 supports atomics up to 4 bytes.
1696 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001697 }
1698
Craig Topper3164f332014-03-11 03:39:26 +00001699 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001702 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001703};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001704
Bill Schmidt778d3872013-07-26 01:36:11 +00001705// Note: ABI differences may eventually require us to have a separate
1706// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001707class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001709 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1710 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001711 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001712 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001713 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001714
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001715 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1716 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001717 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001718 } else {
1719 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001720 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001721 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001722
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001723 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001724 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001725 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001726 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001727 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001728 case llvm::Triple::NetBSD:
1729 IntMaxType = SignedLongLong;
1730 Int64Type = SignedLongLong;
1731 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001732 default:
1733 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001734 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001735
1736 // PPC64 supports atomics up to 8 bytes.
1737 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001738 }
Craig Topper3164f332014-03-11 03:39:26 +00001739 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001740 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001741 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001742 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001743 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001744 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001745 ABI = Name;
1746 return true;
1747 }
1748 return false;
1749 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001750};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001751
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001752class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001753public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001754 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1755 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001756 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001757 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001758 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001759 LongLongAlign = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00001760 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001761 }
Craig Topper3164f332014-03-11 03:39:26 +00001762 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001763 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001764 }
1765};
1766
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001767class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001768public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001769 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1770 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001771 HasAlignMac68kSupport = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00001772 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001773 }
1774};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001775
Eric Christopherc48497a2015-09-18 21:26:24 +00001776static const unsigned NVPTXAddrSpaceMap[] = {
1777 1, // opencl_global
1778 3, // opencl_local
1779 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001780 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001781 0, // opencl_generic
1782 1, // cuda_device
1783 4, // cuda_constant
1784 3, // cuda_shared
1785};
1786
1787class NVPTXTargetInfo : public TargetInfo {
1788 static const char *const GCCRegNames[];
1789 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001790 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001791 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001792
Eric Christopherc48497a2015-09-18 21:26:24 +00001793public:
Justin Lebarb6626592017-01-05 16:53:21 +00001794 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1795 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001796 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001797 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1798 "NVPTX only supports 32- and 64-bit modes.");
1799
Eric Christopherc48497a2015-09-18 21:26:24 +00001800 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001801 AddrSpaceMap = &NVPTXAddrSpaceMap;
1802 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001803
Eric Christopherc48497a2015-09-18 21:26:24 +00001804 // Define available target features
1805 // These must be defined in sorted order!
1806 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001807 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001808
Justin Lebarb6626592017-01-05 16:53:21 +00001809 if (TargetPointerWidth == 32)
1810 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1811 else
1812 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1813
Justin Lebar76945b22016-04-29 23:05:19 +00001814 // If possible, get a TargetInfo for our host triple, so we can match its
1815 // types.
1816 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001817 if (!HostTriple.isNVPTX())
1818 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1819
1820 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001821 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001822 LongWidth = LongAlign = TargetPointerWidth;
1823 PointerWidth = PointerAlign = TargetPointerWidth;
1824 switch (TargetPointerWidth) {
1825 case 32:
1826 SizeType = TargetInfo::UnsignedInt;
1827 PtrDiffType = TargetInfo::SignedInt;
1828 IntPtrType = TargetInfo::SignedInt;
1829 break;
1830 case 64:
1831 SizeType = TargetInfo::UnsignedLong;
1832 PtrDiffType = TargetInfo::SignedLong;
1833 IntPtrType = TargetInfo::SignedLong;
1834 break;
1835 default:
1836 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1837 }
Justin Lebar76945b22016-04-29 23:05:19 +00001838 return;
1839 }
1840
Justin Lebarb6626592017-01-05 16:53:21 +00001841 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001842 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1843 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1844 BoolWidth = HostTarget->getBoolWidth();
1845 BoolAlign = HostTarget->getBoolAlign();
1846 IntWidth = HostTarget->getIntWidth();
1847 IntAlign = HostTarget->getIntAlign();
1848 HalfWidth = HostTarget->getHalfWidth();
1849 HalfAlign = HostTarget->getHalfAlign();
1850 FloatWidth = HostTarget->getFloatWidth();
1851 FloatAlign = HostTarget->getFloatAlign();
1852 DoubleWidth = HostTarget->getDoubleWidth();
1853 DoubleAlign = HostTarget->getDoubleAlign();
1854 LongWidth = HostTarget->getLongWidth();
1855 LongAlign = HostTarget->getLongAlign();
1856 LongLongWidth = HostTarget->getLongLongWidth();
1857 LongLongAlign = HostTarget->getLongLongAlign();
1858 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001859 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001860 DefaultAlignForAttributeAligned =
1861 HostTarget->getDefaultAlignForAttributeAligned();
1862 SizeType = HostTarget->getSizeType();
1863 IntMaxType = HostTarget->getIntMaxType();
1864 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1865 IntPtrType = HostTarget->getIntPtrType();
1866 WCharType = HostTarget->getWCharType();
1867 WIntType = HostTarget->getWIntType();
1868 Char16Type = HostTarget->getChar16Type();
1869 Char32Type = HostTarget->getChar32Type();
1870 Int64Type = HostTarget->getInt64Type();
1871 SigAtomicType = HostTarget->getSigAtomicType();
1872 ProcessIDType = HostTarget->getProcessIDType();
1873
1874 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1875 UseZeroLengthBitfieldAlignment =
1876 HostTarget->useZeroLengthBitfieldAlignment();
1877 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1878 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1879
Justin Lebar5057f172016-09-09 20:35:43 +00001880 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1881 // we need those macros to be identical on host and device, because (among
1882 // other things) they affect which standard library classes are defined, and
1883 // we need all classes to be defined on both the host and device.
1884 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1885
Justin Lebar76945b22016-04-29 23:05:19 +00001886 // Properties intentionally not copied from host:
1887 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1888 // host/device boundary.
1889 // - SuitableAlign: Not visible across the host/device boundary, and may
1890 // correctly be different on host/device, e.g. if host has wider vector
1891 // types than device.
1892 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1893 // as its double type, but that's not necessarily true on the host.
1894 // TODO: nvcc emits a warning when using long double on device; we should
1895 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001896 }
1897 void getTargetDefines(const LangOptions &Opts,
1898 MacroBuilder &Builder) const override {
1899 Builder.defineMacro("__PTX__");
1900 Builder.defineMacro("__NVPTX__");
1901 if (Opts.CUDAIsDevice) {
1902 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001903 std::string CUDAArchCode = [this] {
1904 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001905 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001906 assert(false && "No GPU arch when compiling CUDA device code.");
1907 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001908 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001909 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001910 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001911 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001912 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001913 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001914 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001915 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001916 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001917 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001918 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001919 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001920 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001921 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001922 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001923 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001924 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001925 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001926 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001927 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001928 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001929 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001930 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001931 return "620";
1932 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001933 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001934 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001935 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001936 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001937 }
Craig Topper6c03a542015-10-19 04:51:35 +00001938 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1939 return llvm::makeArrayRef(BuiltinInfo,
1940 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001941 }
Artem Belevichfda99052016-09-28 17:47:35 +00001942 bool
1943 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1944 StringRef CPU,
1945 const std::vector<std::string> &FeaturesVec) const override {
1946 Features["satom"] = GPU >= CudaArch::SM_60;
1947 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1948 }
1949
Eric Christopherc48497a2015-09-18 21:26:24 +00001950 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001951 return llvm::StringSwitch<bool>(Feature)
1952 .Cases("ptx", "nvptx", true)
1953 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1954 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001955 }
1956
Craig Topperf054e3a2015-10-19 03:52:27 +00001957 ArrayRef<const char *> getGCCRegNames() const override;
1958 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001960 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001961 }
1962 bool validateAsmConstraint(const char *&Name,
1963 TargetInfo::ConstraintInfo &Info) const override {
1964 switch (*Name) {
1965 default:
1966 return false;
1967 case 'c':
1968 case 'h':
1969 case 'r':
1970 case 'l':
1971 case 'f':
1972 case 'd':
1973 Info.setAllowsRegister();
1974 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001975 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001976 }
1977 const char *getClobbers() const override {
1978 // FIXME: Is this really right?
1979 return "";
1980 }
1981 BuiltinVaListKind getBuiltinVaListKind() const override {
1982 // FIXME: implement
1983 return TargetInfo::CharPtrBuiltinVaList;
1984 }
1985 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001986 GPU = StringToCudaArch(Name);
1987 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001988 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001989 void setSupportedOpenCLOpts() override {
1990 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001991 Opts.support("cl_clang_storage_class_specifiers");
1992 Opts.support("cl_khr_gl_sharing");
1993 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001994
Yaxun Liu5b746652016-12-18 05:18:55 +00001995 Opts.support("cl_khr_fp64");
1996 Opts.support("cl_khr_byte_addressable_store");
1997 Opts.support("cl_khr_global_int32_base_atomics");
1998 Opts.support("cl_khr_global_int32_extended_atomics");
1999 Opts.support("cl_khr_local_int32_base_atomics");
2000 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00002001 }
Justin Lebar86c4e632017-01-05 16:53:38 +00002002
2003 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2004 // CUDA compilations support all of the host's calling conventions.
2005 //
2006 // TODO: We should warn if you apply a non-default CC to anything other than
2007 // a host function.
2008 if (HostTarget)
2009 return HostTarget->checkCallingConvention(CC);
2010 return CCCR_Warning;
2011 }
Eric Christopherc48497a2015-09-18 21:26:24 +00002012};
2013
2014const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
2015#define BUILTIN(ID, TYPE, ATTRS) \
2016 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2017#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
2018 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00002019#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2020 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00002021#include "clang/Basic/BuiltinsNVPTX.def"
2022};
2023
2024const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
2025
Craig Topperf054e3a2015-10-19 03:52:27 +00002026ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
2027 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00002028}
2029
Yaxun Liu3464f922017-03-25 03:46:25 +00002030static const LangAS::Map AMDGPUPrivateIsZeroMap = {
2031 1, // opencl_global
2032 3, // opencl_local
2033 2, // opencl_constant
2034 4, // opencl_generic
2035 1, // cuda_device
2036 2, // cuda_constant
2037 3 // cuda_shared
2038};
2039static const LangAS::Map AMDGPUGenericIsZeroMap = {
2040 1, // opencl_global
2041 3, // opencl_local
2042 4, // opencl_constant
2043 0, // opencl_generic
2044 1, // cuda_device
2045 4, // cuda_constant
2046 3 // cuda_shared
Eli Friedmand13b41e2012-10-12 23:32:00 +00002047};
2048
Tom Stellarda96344b2014-08-21 13:58:40 +00002049// If you edit the description strings, make sure you update
2050// getPointerWidthV().
2051
Craig Topper273dbc62015-10-18 05:29:26 +00002052static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002053 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2054 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002055
Yaxun Liu3464f922017-03-25 03:46:25 +00002056static const char *const DataLayoutStringSIPrivateIsZero =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002057 "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 +00002058 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2059 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002060
Yaxun Liu3464f922017-03-25 03:46:25 +00002061static const char *const DataLayoutStringSIGenericIsZero =
2062 "e-p:64:64-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
2063 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2064 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
2065
Matt Arsenault250024f2016-06-08 01:56:42 +00002066class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002067 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002068 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002069
Yaxun Liu3464f922017-03-25 03:46:25 +00002070 struct AddrSpace {
2071 unsigned Generic, Global, Local, Constant, Private;
2072 AddrSpace(bool IsGenericZero_ = false){
2073 if (IsGenericZero_) {
2074 Generic = 0;
2075 Global = 1;
2076 Local = 3;
2077 Constant = 4;
2078 Private = 5;
2079 } else {
2080 Generic = 4;
2081 Global = 1;
2082 Local = 3;
2083 Constant = 2;
2084 Private = 0;
2085 }
2086 }
2087 };
2088
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002089 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002090 enum GPUKind {
2091 GK_NONE,
2092 GK_R600,
2093 GK_R600_DOUBLE_OPS,
2094 GK_R700,
2095 GK_R700_DOUBLE_OPS,
2096 GK_EVERGREEN,
2097 GK_EVERGREEN_DOUBLE_OPS,
2098 GK_NORTHERN_ISLANDS,
2099 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002100 GK_GFX6,
2101 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002102 GK_GFX8,
2103 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002104 } GPU;
2105
Jan Veselyeebeaea2015-05-04 19:53:36 +00002106 bool hasFP64:1;
2107 bool hasFMAF:1;
2108 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002109 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002110
Matt Arsenault250024f2016-06-08 01:56:42 +00002111 static bool isAMDGCN(const llvm::Triple &TT) {
2112 return TT.getArch() == llvm::Triple::amdgcn;
2113 }
2114
Yaxun Liu3464f922017-03-25 03:46:25 +00002115 static bool isGenericZero(const llvm::Triple &TT) {
2116 return TT.getEnvironmentName() == "amdgiz" ||
2117 TT.getEnvironmentName() == "amdgizcl";
2118 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002119public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002120 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002121 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002122 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002123 hasFP64(false),
2124 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 hasLDEXPF(false),
Yaxun Liu3464f922017-03-25 03:46:25 +00002126 hasFullSpeedFP32Denorms(false),
2127 AS(isGenericZero(Triple)){
Matt Arsenault250024f2016-06-08 01:56:42 +00002128 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002129 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002130 hasFMAF = true;
2131 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002132 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002133 auto IsGenericZero = isGenericZero(Triple);
Matt Arsenault250024f2016-06-08 01:56:42 +00002134 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
Yaxun Liu3464f922017-03-25 03:46:25 +00002135 (IsGenericZero ? DataLayoutStringSIGenericIsZero :
2136 DataLayoutStringSIPrivateIsZero)
2137 : DataLayoutStringR600);
Matt Arsenault250024f2016-06-08 01:56:42 +00002138
Yaxun Liu3464f922017-03-25 03:46:25 +00002139 AddrSpaceMap = IsGenericZero ? &AMDGPUGenericIsZeroMap :
2140 &AMDGPUPrivateIsZeroMap;
David Tweed31d09b02013-09-13 12:04:22 +00002141 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002142 }
2143
Tom Stellarda96344b2014-08-21 13:58:40 +00002144 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2145 if (GPU <= GK_CAYMAN)
2146 return 32;
2147
Yaxun Liu3464f922017-03-25 03:46:25 +00002148 if (AddrSpace == AS.Private || AddrSpace == AS.Local) {
2149 return 32;
Tom Stellarda96344b2014-08-21 13:58:40 +00002150 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002151 return 64;
Tom Stellarda96344b2014-08-21 13:58:40 +00002152 }
2153
Yaxun Liu26f75662016-08-19 05:17:25 +00002154 uint64_t getMaxPointerWidth() const override {
2155 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2156 }
2157
Craig Topper3164f332014-03-11 03:39:26 +00002158 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002159 return "";
2160 }
2161
Craig Topperf054e3a2015-10-19 03:52:27 +00002162 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002163
Craig Topperf054e3a2015-10-19 03:52:27 +00002164 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2165 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002166 }
2167
Craig Topper3164f332014-03-11 03:39:26 +00002168 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002169 TargetInfo::ConstraintInfo &Info) const override {
2170 switch (*Name) {
2171 default: break;
2172 case 'v': // vgpr
2173 case 's': // sgpr
2174 Info.setAllowsRegister();
2175 return true;
2176 }
2177 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002178 }
2179
Matt Arsenault250024f2016-06-08 01:56:42 +00002180 bool initFeatureMap(llvm::StringMap<bool> &Features,
2181 DiagnosticsEngine &Diags, StringRef CPU,
2182 const std::vector<std::string> &FeatureVec) const override;
2183
Yaxun Liu2c17e822016-08-09 19:43:38 +00002184 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2185 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002186 bool hasFP32Denormals = false;
2187 bool hasFP64Denormals = false;
2188 for (auto &I : TargetOpts.FeaturesAsWritten) {
2189 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2190 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002191 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002192 hasFP64Denormals = true;
2193 }
2194 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002195 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2196 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002197 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002198 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002199 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002200 }
2201
Craig Topper6c03a542015-10-19 04:51:35 +00002202 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2203 return llvm::makeArrayRef(BuiltinInfo,
2204 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002205 }
2206
Craig Topper3164f332014-03-11 03:39:26 +00002207 void getTargetDefines(const LangOptions &Opts,
2208 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002209 if (getTriple().getArch() == llvm::Triple::amdgcn)
2210 Builder.defineMacro("__AMDGCN__");
2211 else
2212 Builder.defineMacro("__R600__");
2213
Jan Veselyeebeaea2015-05-04 19:53:36 +00002214 if (hasFMAF)
2215 Builder.defineMacro("__HAS_FMAF__");
2216 if (hasLDEXPF)
2217 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002218 if (hasFP64)
2219 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002220 }
2221
Craig Topper3164f332014-03-11 03:39:26 +00002222 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002223 return TargetInfo::CharPtrBuiltinVaList;
2224 }
2225
Matt Arsenault250024f2016-06-08 01:56:42 +00002226 static GPUKind parseR600Name(StringRef Name) {
2227 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002228 .Case("r600" , GK_R600)
2229 .Case("rv610", GK_R600)
2230 .Case("rv620", GK_R600)
2231 .Case("rv630", GK_R600)
2232 .Case("rv635", GK_R600)
2233 .Case("rs780", GK_R600)
2234 .Case("rs880", GK_R600)
2235 .Case("rv670", GK_R600_DOUBLE_OPS)
2236 .Case("rv710", GK_R700)
2237 .Case("rv730", GK_R700)
2238 .Case("rv740", GK_R700_DOUBLE_OPS)
2239 .Case("rv770", GK_R700_DOUBLE_OPS)
2240 .Case("palm", GK_EVERGREEN)
2241 .Case("cedar", GK_EVERGREEN)
2242 .Case("sumo", GK_EVERGREEN)
2243 .Case("sumo2", GK_EVERGREEN)
2244 .Case("redwood", GK_EVERGREEN)
2245 .Case("juniper", GK_EVERGREEN)
2246 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2247 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2248 .Case("barts", GK_NORTHERN_ISLANDS)
2249 .Case("turks", GK_NORTHERN_ISLANDS)
2250 .Case("caicos", GK_NORTHERN_ISLANDS)
2251 .Case("cayman", GK_CAYMAN)
2252 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002253 .Default(GK_NONE);
2254 }
2255
2256 static GPUKind parseAMDGCNName(StringRef Name) {
2257 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002258 .Case("tahiti", GK_GFX6)
2259 .Case("pitcairn", GK_GFX6)
2260 .Case("verde", GK_GFX6)
2261 .Case("oland", GK_GFX6)
2262 .Case("hainan", GK_GFX6)
2263 .Case("bonaire", GK_GFX7)
2264 .Case("kabini", GK_GFX7)
2265 .Case("kaveri", GK_GFX7)
2266 .Case("hawaii", GK_GFX7)
2267 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002268 .Case("gfx700", GK_GFX7)
2269 .Case("gfx701", GK_GFX7)
2270 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002271 .Case("tonga", GK_GFX8)
2272 .Case("iceland", GK_GFX8)
2273 .Case("carrizo", GK_GFX8)
2274 .Case("fiji", GK_GFX8)
2275 .Case("stoney", GK_GFX8)
2276 .Case("polaris10", GK_GFX8)
2277 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002278 .Case("gfx800", GK_GFX8)
2279 .Case("gfx801", GK_GFX8)
2280 .Case("gfx802", GK_GFX8)
2281 .Case("gfx803", GK_GFX8)
2282 .Case("gfx804", GK_GFX8)
2283 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002284 .Case("gfx900", GK_GFX9)
2285 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002286 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002287 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002288
Matt Arsenault250024f2016-06-08 01:56:42 +00002289 bool setCPU(const std::string &Name) override {
2290 if (getTriple().getArch() == llvm::Triple::amdgcn)
2291 GPU = parseAMDGCNName(Name);
2292 else
2293 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002294
Matt Arsenault250024f2016-06-08 01:56:42 +00002295 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002296 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002297
Jan Vesely211ba782016-06-17 02:25:03 +00002298 void setSupportedOpenCLOpts() override {
2299 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002300 Opts.support("cl_clang_storage_class_specifiers");
2301 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002302
Jan Vesely211ba782016-06-17 02:25:03 +00002303 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002304 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002305 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002306 Opts.support("cl_khr_byte_addressable_store");
2307 Opts.support("cl_khr_global_int32_base_atomics");
2308 Opts.support("cl_khr_global_int32_extended_atomics");
2309 Opts.support("cl_khr_local_int32_base_atomics");
2310 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002311 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002312 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002313 Opts.support("cl_khr_fp16");
2314 Opts.support("cl_khr_int64_base_atomics");
2315 Opts.support("cl_khr_int64_extended_atomics");
2316 Opts.support("cl_khr_mipmap_image");
2317 Opts.support("cl_khr_subgroups");
2318 Opts.support("cl_khr_3d_image_writes");
2319 Opts.support("cl_amd_media_ops");
2320 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002321 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002322 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002323
Yaxun Liu99444cb2016-08-03 20:38:06 +00002324 LangAS::ID getOpenCLImageAddrSpace() const override {
2325 return LangAS::opencl_constant;
2326 }
2327
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002328 /// \returns Target specific vtbl ptr address space.
2329 unsigned getVtblPtrAddressSpace() const override {
2330 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2331 // would be nice if we could use it here instead of using bare numbers (same
2332 // applies to getDWARFAddressSpace).
2333 return 2; // constant.
2334 }
2335
2336 /// \returns If a target requires an address within a target specific address
2337 /// space \p AddressSpace to be converted in order to be used, then return the
2338 /// corresponding target specific DWARF address space.
2339 ///
2340 /// \returns Otherwise return None and no conversion will be emitted in the
2341 /// DWARF.
2342 Optional<unsigned> getDWARFAddressSpace(
2343 unsigned AddressSpace) const override {
Yaxun Liu3464f922017-03-25 03:46:25 +00002344 const unsigned DWARF_Private = 1;
2345 const unsigned DWARF_Local = 2;
2346 if (AddressSpace == AS.Private) {
2347 return DWARF_Private;
2348 } else if (AddressSpace == AS.Local) {
2349 return DWARF_Local;
2350 } else {
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002351 return None;
2352 }
2353 }
2354
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002355 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2356 switch (CC) {
2357 default:
2358 return CCCR_Warning;
2359 case CC_C:
2360 case CC_OpenCLKernel:
2361 return CCCR_OK;
2362 }
2363 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002364
2365 // In amdgcn target the null pointer in global, constant, and generic
2366 // address space has value 0 but in private and local address space has
2367 // value ~0.
2368 uint64_t getNullPointerValue(unsigned AS) const override {
Matt Arsenaultbf5e3e42017-03-13 19:47:53 +00002369 return AS == LangAS::opencl_local ? ~0 : 0;
Yaxun Liu402804b2016-12-15 08:09:08 +00002370 }
Yaxun Liu3464f922017-03-25 03:46:25 +00002371
2372 const AddrSpace AS;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002373};
2374
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002375const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002376#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002377 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002378#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2379 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002380#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002381};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002382const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002383 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2384 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2385 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2386 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2387 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2388 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2389 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2390 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2391 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2392 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2393 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2394 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2395 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2396 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2397 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2398 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2399 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2400 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2401 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2402 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2403 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2404 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2405 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2406 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2407 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2408 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2409 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2410 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2411 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2412 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2413 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2414 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2415 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2416 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2417 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2418 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2419 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2420 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2421 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2422 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2423 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2424 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2425 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2426 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2427 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2428 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2429 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002430 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002431 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2432 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002433};
2434
Craig Topperf054e3a2015-10-19 03:52:27 +00002435ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2436 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002437}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002438
Matt Arsenault250024f2016-06-08 01:56:42 +00002439bool AMDGPUTargetInfo::initFeatureMap(
2440 llvm::StringMap<bool> &Features,
2441 DiagnosticsEngine &Diags, StringRef CPU,
2442 const std::vector<std::string> &FeatureVec) const {
2443
2444 // XXX - What does the member GPU mean if device name string passed here?
2445 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2446 if (CPU.empty())
2447 CPU = "tahiti";
2448
2449 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002450 case GK_GFX6:
2451 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002452 break;
2453
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002454 case GK_GFX9:
2455 Features["gfx9-insts"] = true;
2456 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002457 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002458 Features["s-memrealtime"] = true;
2459 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002460 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002461 break;
2462
2463 case GK_NONE:
2464 return false;
2465 default:
2466 llvm_unreachable("unhandled subtarget");
2467 }
2468 } else {
2469 if (CPU.empty())
2470 CPU = "r600";
2471
2472 switch (parseR600Name(CPU)) {
2473 case GK_R600:
2474 case GK_R700:
2475 case GK_EVERGREEN:
2476 case GK_NORTHERN_ISLANDS:
2477 break;
2478 case GK_R600_DOUBLE_OPS:
2479 case GK_R700_DOUBLE_OPS:
2480 case GK_EVERGREEN_DOUBLE_OPS:
2481 case GK_CAYMAN:
2482 Features["fp64"] = true;
2483 break;
2484 case GK_NONE:
2485 return false;
2486 default:
2487 llvm_unreachable("unhandled subtarget");
2488 }
2489 }
2490
2491 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2492}
2493
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002494const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002495#define BUILTIN(ID, TYPE, ATTRS) \
2496 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002497#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002498 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002499#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2500 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002501#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002502
2503#define BUILTIN(ID, TYPE, ATTRS) \
2504 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002505#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2506 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002507#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2508 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2509#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002510};
Eli Friedmanb5366062008-05-20 14:21:01 +00002511
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002512
Nuno Lopescfca1f02009-12-23 17:49:57 +00002513static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002514 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2515 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002516 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002517 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2518 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2519 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002520 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002521 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2522 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002523 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2524 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2525 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2526 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2527 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2528 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2529 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2530 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002531 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002532};
2533
Eric Christophercdd36352011-06-21 00:05:20 +00002534const TargetInfo::AddlRegName AddlRegNames[] = {
2535 { { "al", "ah", "eax", "rax" }, 0 },
2536 { { "bl", "bh", "ebx", "rbx" }, 3 },
2537 { { "cl", "ch", "ecx", "rcx" }, 2 },
2538 { { "dl", "dh", "edx", "rdx" }, 1 },
2539 { { "esi", "rsi" }, 4 },
2540 { { "edi", "rdi" }, 5 },
2541 { { "esp", "rsp" }, 7 },
2542 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002543 { { "r8d", "r8w", "r8b" }, 38 },
2544 { { "r9d", "r9w", "r9b" }, 39 },
2545 { { "r10d", "r10w", "r10b" }, 40 },
2546 { { "r11d", "r11w", "r11b" }, 41 },
2547 { { "r12d", "r12w", "r12b" }, 42 },
2548 { { "r13d", "r13w", "r13b" }, 43 },
2549 { { "r14d", "r14w", "r14b" }, 44 },
2550 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002551};
2552
2553// X86 target abstract base class; x86-32 and x86-64 are very close, so
2554// most of the implementation can be shared.
2555class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002556 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002557 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002558 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002559 enum MMX3DNowEnum {
2560 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002561 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002562 enum XOPEnum {
2563 NoXOP,
2564 SSE4A,
2565 FMA4,
2566 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002567 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002568
Craig Topper543f3bd2015-10-14 23:47:57 +00002569 bool HasAES = false;
2570 bool HasPCLMUL = false;
2571 bool HasLZCNT = false;
2572 bool HasRDRND = false;
2573 bool HasFSGSBASE = false;
2574 bool HasBMI = false;
2575 bool HasBMI2 = false;
2576 bool HasPOPCNT = false;
2577 bool HasRTM = false;
2578 bool HasPRFCHW = false;
2579 bool HasRDSEED = false;
2580 bool HasADX = false;
2581 bool HasTBM = false;
2582 bool HasFMA = false;
2583 bool HasF16C = false;
2584 bool HasAVX512CD = false;
2585 bool HasAVX512ER = false;
2586 bool HasAVX512PF = false;
2587 bool HasAVX512DQ = false;
2588 bool HasAVX512BW = false;
2589 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002590 bool HasAVX512VBMI = false;
2591 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002592 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002593 bool HasMPX = false;
2594 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002595 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002596 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002597 bool HasXSAVE = false;
2598 bool HasXSAVEOPT = false;
2599 bool HasXSAVEC = false;
2600 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002601 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002602 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002603 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002604 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002605 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002606 bool HasMOVBE = false;
2607 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002608
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002609 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2610 ///
2611 /// Each enumeration represents a particular CPU supported by Clang. These
2612 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2613 enum CPUKind {
2614 CK_Generic,
2615
2616 /// \name i386
2617 /// i386-generation processors.
2618 //@{
2619 CK_i386,
2620 //@}
2621
2622 /// \name i486
2623 /// i486-generation processors.
2624 //@{
2625 CK_i486,
2626 CK_WinChipC6,
2627 CK_WinChip2,
2628 CK_C3,
2629 //@}
2630
2631 /// \name i586
2632 /// i586-generation processors, P5 microarchitecture based.
2633 //@{
2634 CK_i586,
2635 CK_Pentium,
2636 CK_PentiumMMX,
2637 //@}
2638
2639 /// \name i686
2640 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2641 //@{
2642 CK_i686,
2643 CK_PentiumPro,
2644 CK_Pentium2,
2645 CK_Pentium3,
2646 CK_Pentium3M,
2647 CK_PentiumM,
2648 CK_C3_2,
2649
2650 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2651 /// Clang however has some logic to suport this.
2652 // FIXME: Warn, deprecate, and potentially remove this.
2653 CK_Yonah,
2654 //@}
2655
2656 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002657 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002658 //@{
2659 CK_Pentium4,
2660 CK_Pentium4M,
2661 CK_Prescott,
2662 CK_Nocona,
2663 //@}
2664
2665 /// \name Core
2666 /// Core microarchitecture based processors.
2667 //@{
2668 CK_Core2,
2669
2670 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2671 /// codename which GCC no longer accepts as an option to -march, but Clang
2672 /// has some logic for recognizing it.
2673 // FIXME: Warn, deprecate, and potentially remove this.
2674 CK_Penryn,
2675 //@}
2676
2677 /// \name Atom
2678 /// Atom processors
2679 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002680 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002681 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002682 //@}
2683
2684 /// \name Nehalem
2685 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002686 CK_Nehalem,
2687
2688 /// \name Westmere
2689 /// Westmere microarchitecture based processors.
2690 CK_Westmere,
2691
2692 /// \name Sandy Bridge
2693 /// Sandy Bridge microarchitecture based processors.
2694 CK_SandyBridge,
2695
2696 /// \name Ivy Bridge
2697 /// Ivy Bridge microarchitecture based processors.
2698 CK_IvyBridge,
2699
2700 /// \name Haswell
2701 /// Haswell microarchitecture based processors.
2702 CK_Haswell,
2703
2704 /// \name Broadwell
2705 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002706 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002707
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002708 /// \name Skylake Client
2709 /// Skylake client microarchitecture based processors.
2710 CK_SkylakeClient,
2711
2712 /// \name Skylake Server
2713 /// Skylake server microarchitecture based processors.
2714 CK_SkylakeServer,
2715
2716 /// \name Cannonlake Client
2717 /// Cannonlake client microarchitecture based processors.
2718 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002719
Craig Topper449314e2013-08-20 07:09:39 +00002720 /// \name Knights Landing
2721 /// Knights Landing processor.
2722 CK_KNL,
2723
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002724 /// \name Lakemont
2725 /// Lakemont microarchitecture based processors.
2726 CK_Lakemont,
2727
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002728 /// \name K6
2729 /// K6 architecture processors.
2730 //@{
2731 CK_K6,
2732 CK_K6_2,
2733 CK_K6_3,
2734 //@}
2735
2736 /// \name K7
2737 /// K7 architecture processors.
2738 //@{
2739 CK_Athlon,
2740 CK_AthlonThunderbird,
2741 CK_Athlon4,
2742 CK_AthlonXP,
2743 CK_AthlonMP,
2744 //@}
2745
2746 /// \name K8
2747 /// K8 architecture processors.
2748 //@{
2749 CK_Athlon64,
2750 CK_Athlon64SSE3,
2751 CK_AthlonFX,
2752 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002753 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002754 CK_Opteron,
2755 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002756 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002757 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002758
Benjamin Kramer569f2152012-01-10 11:50:18 +00002759 /// \name Bobcat
2760 /// Bobcat architecture processors.
2761 //@{
2762 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002763 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002764 //@}
2765
2766 /// \name Bulldozer
2767 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002768 //@{
2769 CK_BDVER1,
2770 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002771 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002772 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002773 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002774
Craig Topperc45744a2017-01-10 06:02:12 +00002775 /// \name zen
2776 /// Zen architecture processors.
2777 //@{
2778 CK_ZNVER1,
2779 //@}
2780
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002781 /// This specification is deprecated and will be removed in the future.
2782 /// Users should prefer \see CK_K8.
2783 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002784 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002785 CK_x86_64,
2786 //@}
2787
2788 /// \name Geode
2789 /// Geode processors.
2790 //@{
2791 CK_Geode
2792 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002793 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002794
Eric Christopherc50738f2015-08-27 00:05:50 +00002795 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002796 return llvm::StringSwitch<CPUKind>(CPU)
2797 .Case("i386", CK_i386)
2798 .Case("i486", CK_i486)
2799 .Case("winchip-c6", CK_WinChipC6)
2800 .Case("winchip2", CK_WinChip2)
2801 .Case("c3", CK_C3)
2802 .Case("i586", CK_i586)
2803 .Case("pentium", CK_Pentium)
2804 .Case("pentium-mmx", CK_PentiumMMX)
2805 .Case("i686", CK_i686)
2806 .Case("pentiumpro", CK_PentiumPro)
2807 .Case("pentium2", CK_Pentium2)
2808 .Case("pentium3", CK_Pentium3)
2809 .Case("pentium3m", CK_Pentium3M)
2810 .Case("pentium-m", CK_PentiumM)
2811 .Case("c3-2", CK_C3_2)
2812 .Case("yonah", CK_Yonah)
2813 .Case("pentium4", CK_Pentium4)
2814 .Case("pentium4m", CK_Pentium4M)
2815 .Case("prescott", CK_Prescott)
2816 .Case("nocona", CK_Nocona)
2817 .Case("core2", CK_Core2)
2818 .Case("penryn", CK_Penryn)
2819 .Case("bonnell", CK_Bonnell)
2820 .Case("atom", CK_Bonnell) // Legacy name.
2821 .Case("silvermont", CK_Silvermont)
2822 .Case("slm", CK_Silvermont) // Legacy name.
2823 .Case("nehalem", CK_Nehalem)
2824 .Case("corei7", CK_Nehalem) // Legacy name.
2825 .Case("westmere", CK_Westmere)
2826 .Case("sandybridge", CK_SandyBridge)
2827 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2828 .Case("ivybridge", CK_IvyBridge)
2829 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2830 .Case("haswell", CK_Haswell)
2831 .Case("core-avx2", CK_Haswell) // Legacy name.
2832 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002833 .Case("skylake", CK_SkylakeClient)
2834 .Case("skylake-avx512", CK_SkylakeServer)
2835 .Case("skx", CK_SkylakeServer) // Legacy name.
2836 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002837 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002838 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002839 .Case("k6", CK_K6)
2840 .Case("k6-2", CK_K6_2)
2841 .Case("k6-3", CK_K6_3)
2842 .Case("athlon", CK_Athlon)
2843 .Case("athlon-tbird", CK_AthlonThunderbird)
2844 .Case("athlon-4", CK_Athlon4)
2845 .Case("athlon-xp", CK_AthlonXP)
2846 .Case("athlon-mp", CK_AthlonMP)
2847 .Case("athlon64", CK_Athlon64)
2848 .Case("athlon64-sse3", CK_Athlon64SSE3)
2849 .Case("athlon-fx", CK_AthlonFX)
2850 .Case("k8", CK_K8)
2851 .Case("k8-sse3", CK_K8SSE3)
2852 .Case("opteron", CK_Opteron)
2853 .Case("opteron-sse3", CK_OpteronSSE3)
2854 .Case("barcelona", CK_AMDFAM10)
2855 .Case("amdfam10", CK_AMDFAM10)
2856 .Case("btver1", CK_BTVER1)
2857 .Case("btver2", CK_BTVER2)
2858 .Case("bdver1", CK_BDVER1)
2859 .Case("bdver2", CK_BDVER2)
2860 .Case("bdver3", CK_BDVER3)
2861 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002862 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002863 .Case("x86-64", CK_x86_64)
2864 .Case("geode", CK_Geode)
2865 .Default(CK_Generic);
2866 }
2867
Rafael Espindolaeb265472013-08-21 21:59:03 +00002868 enum FPMathKind {
2869 FP_Default,
2870 FP_SSE,
2871 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002872 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002873
Eli Friedman3fd920a2008-08-20 02:34:37 +00002874public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002875 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2876 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002877 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002878 }
Craig Topper3164f332014-03-11 03:39:26 +00002879 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002880 // X87 evaluates with 80 bits "long double" precision.
2881 return SSELevel == NoSSE ? 2 : 0;
2882 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002883 ArrayRef<const char *> getGCCRegNames() const override {
2884 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002885 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002886 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2887 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002888 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002889 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2890 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002891 }
Eric Christopherd9832702015-06-29 21:00:05 +00002892 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002893 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002894 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002895
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002896 bool validateGlobalRegisterVariable(StringRef RegName,
2897 unsigned RegSize,
2898 bool &HasSizeMismatch) const override {
2899 // esp and ebp are the only 32-bit registers the x86 backend can currently
2900 // handle.
2901 if (RegName.equals("esp") || RegName.equals("ebp")) {
2902 // Check that the register size is 32-bit.
2903 HasSizeMismatch = RegSize != 32;
2904 return true;
2905 }
2906
2907 return false;
2908 }
2909
Akira Hatanaka974131e2014-09-18 18:17:18 +00002910 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2911
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002912 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2913
Akira Hatanaka974131e2014-09-18 18:17:18 +00002914 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2915
Craig Topper3164f332014-03-11 03:39:26 +00002916 std::string convertConstraint(const char *&Constraint) const override;
2917 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002918 return "~{dirflag},~{fpsr},~{flags}";
2919 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002920
2921 StringRef getConstraintRegister(const StringRef &Constraint,
2922 const StringRef &Expression) const override {
2923 StringRef::iterator I, E;
2924 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2925 if (isalpha(*I))
2926 break;
2927 }
2928 if (I == E)
2929 return "";
2930 switch (*I) {
2931 // For the register constraints, return the matching register name
2932 case 'a':
2933 return "ax";
2934 case 'b':
2935 return "bx";
2936 case 'c':
2937 return "cx";
2938 case 'd':
2939 return "dx";
2940 case 'S':
2941 return "si";
2942 case 'D':
2943 return "di";
2944 // In case the constraint is 'r' we need to return Expression
2945 case 'r':
2946 return Expression;
2947 default:
2948 // Default value if there is no constraint for the register
2949 return "";
2950 }
2951 return "";
2952 }
2953
Craig Topper3164f332014-03-11 03:39:26 +00002954 void getTargetDefines(const LangOptions &Opts,
2955 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002956 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2957 bool Enabled);
2958 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2959 bool Enabled);
2960 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2961 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002962 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2963 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002964 setFeatureEnabledImpl(Features, Name, Enabled);
2965 }
2966 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002967 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002968 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2969 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002970 bool
2971 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2972 StringRef CPU,
2973 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002974 bool hasFeature(StringRef Feature) const override;
2975 bool handleTargetFeatures(std::vector<std::string> &Features,
2976 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002977 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002978 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2979 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002980 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002981 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002982 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002983 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002984 return "no-mmx";
2985 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002986 }
Craig Topper3164f332014-03-11 03:39:26 +00002987 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002988 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002989
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002990 // Perform any per-CPU checks necessary to determine if this CPU is
2991 // acceptable.
2992 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2993 // invalid without explaining *why*.
2994 switch (CPU) {
2995 case CK_Generic:
2996 // No processor selected!
2997 return false;
2998
2999 case CK_i386:
3000 case CK_i486:
3001 case CK_WinChipC6:
3002 case CK_WinChip2:
3003 case CK_C3:
3004 case CK_i586:
3005 case CK_Pentium:
3006 case CK_PentiumMMX:
3007 case CK_i686:
3008 case CK_PentiumPro:
3009 case CK_Pentium2:
3010 case CK_Pentium3:
3011 case CK_Pentium3M:
3012 case CK_PentiumM:
3013 case CK_Yonah:
3014 case CK_C3_2:
3015 case CK_Pentium4:
3016 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003017 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003018 case CK_Prescott:
3019 case CK_K6:
3020 case CK_K6_2:
3021 case CK_K6_3:
3022 case CK_Athlon:
3023 case CK_AthlonThunderbird:
3024 case CK_Athlon4:
3025 case CK_AthlonXP:
3026 case CK_AthlonMP:
3027 case CK_Geode:
3028 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003029 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003030 return false;
3031
3032 // Fallthrough
3033 case CK_Nocona:
3034 case CK_Core2:
3035 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003036 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00003037 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003038 case CK_Nehalem:
3039 case CK_Westmere:
3040 case CK_SandyBridge:
3041 case CK_IvyBridge:
3042 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003043 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003044 case CK_SkylakeClient:
3045 case CK_SkylakeServer:
3046 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00003047 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003048 case CK_Athlon64:
3049 case CK_Athlon64SSE3:
3050 case CK_AthlonFX:
3051 case CK_K8:
3052 case CK_K8SSE3:
3053 case CK_Opteron:
3054 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00003055 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00003056 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003057 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003058 case CK_BDVER1:
3059 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003060 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00003061 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00003062 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00003063 case CK_x86_64:
3064 return true;
3065 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00003066 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003067 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003068
Craig Topper3164f332014-03-11 03:39:26 +00003069 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003070
Craig Topper3164f332014-03-11 03:39:26 +00003071 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003072 // Most of the non-ARM calling conventions are i386 conventions.
3073 switch (CC) {
3074 case CC_X86ThisCall:
3075 case CC_X86FastCall:
3076 case CC_X86StdCall:
3077 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003078 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003079 case CC_C:
3080 case CC_Swift:
3081 case CC_X86Pascal:
3082 case CC_IntelOclBicc:
3083 return CCCR_OK;
3084 default:
3085 return CCCR_Warning;
3086 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003087 }
3088
Craig Topper3164f332014-03-11 03:39:26 +00003089 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003090 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003091 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003092
3093 bool hasSjLjLowering() const override {
3094 return true;
3095 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003096
3097 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003098 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003099 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003100};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003101
Rafael Espindolaeb265472013-08-21 21:59:03 +00003102bool X86TargetInfo::setFPMath(StringRef Name) {
3103 if (Name == "387") {
3104 FPMath = FP_387;
3105 return true;
3106 }
3107 if (Name == "sse") {
3108 FPMath = FP_SSE;
3109 return true;
3110 }
3111 return false;
3112}
3113
Eric Christopher007b0a02015-08-28 22:32:01 +00003114bool X86TargetInfo::initFeatureMap(
3115 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003116 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003117 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003118 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003119 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003120 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003121
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003122 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003123
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003124 // Enable X87 for all X86 processors but Lakemont.
3125 if (Kind != CK_Lakemont)
3126 setFeatureEnabledImpl(Features, "x87", true);
3127
3128 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003129 case CK_Generic:
3130 case CK_i386:
3131 case CK_i486:
3132 case CK_i586:
3133 case CK_Pentium:
3134 case CK_i686:
3135 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003136 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003137 break;
3138 case CK_PentiumMMX:
3139 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003140 case CK_K6:
3141 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003142 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003143 break;
3144 case CK_Pentium3:
3145 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003146 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003147 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003148 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003149 break;
3150 case CK_PentiumM:
3151 case CK_Pentium4:
3152 case CK_Pentium4M:
3153 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003154 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003155 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003156 break;
3157 case CK_Yonah:
3158 case CK_Prescott:
3159 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003160 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003161 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003162 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003163 break;
3164 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003165 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003166 setFeatureEnabledImpl(Features, "ssse3", 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_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003171 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003172 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003173 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003174 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003175 case CK_Cannonlake:
3176 setFeatureEnabledImpl(Features, "avx512ifma", true);
3177 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3178 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003179 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003180 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003181 setFeatureEnabledImpl(Features, "avx512f", true);
3182 setFeatureEnabledImpl(Features, "avx512cd", true);
3183 setFeatureEnabledImpl(Features, "avx512dq", true);
3184 setFeatureEnabledImpl(Features, "avx512bw", true);
3185 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003186 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003187 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003188 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003189 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003190 setFeatureEnabledImpl(Features, "xsavec", true);
3191 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003192 setFeatureEnabledImpl(Features, "mpx", true);
3193 setFeatureEnabledImpl(Features, "sgx", true);
3194 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003195 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003196 case CK_Broadwell:
3197 setFeatureEnabledImpl(Features, "rdseed", true);
3198 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003199 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003200 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003201 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003202 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003203 setFeatureEnabledImpl(Features, "bmi", true);
3204 setFeatureEnabledImpl(Features, "bmi2", true);
3205 setFeatureEnabledImpl(Features, "rtm", true);
3206 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003207 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003208 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003209 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003210 setFeatureEnabledImpl(Features, "rdrnd", true);
3211 setFeatureEnabledImpl(Features, "f16c", true);
3212 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003213 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003214 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003215 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003216 setFeatureEnabledImpl(Features, "xsave", true);
3217 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003218 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003219 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003220 case CK_Silvermont:
3221 setFeatureEnabledImpl(Features, "aes", true);
3222 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003223 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003224 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003225 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003226 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003227 setFeatureEnabledImpl(Features, "cx16", true);
3228 break;
3229 case CK_KNL:
3230 setFeatureEnabledImpl(Features, "avx512f", true);
3231 setFeatureEnabledImpl(Features, "avx512cd", true);
3232 setFeatureEnabledImpl(Features, "avx512er", true);
3233 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003234 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003235 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003236 setFeatureEnabledImpl(Features, "rdseed", true);
3237 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003238 setFeatureEnabledImpl(Features, "lzcnt", true);
3239 setFeatureEnabledImpl(Features, "bmi", true);
3240 setFeatureEnabledImpl(Features, "bmi2", true);
3241 setFeatureEnabledImpl(Features, "rtm", true);
3242 setFeatureEnabledImpl(Features, "fma", true);
3243 setFeatureEnabledImpl(Features, "rdrnd", true);
3244 setFeatureEnabledImpl(Features, "f16c", true);
3245 setFeatureEnabledImpl(Features, "fsgsbase", true);
3246 setFeatureEnabledImpl(Features, "aes", true);
3247 setFeatureEnabledImpl(Features, "pclmul", true);
3248 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003249 setFeatureEnabledImpl(Features, "xsaveopt", true);
3250 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003251 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003252 break;
3253 case CK_K6_2:
3254 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003255 case CK_WinChip2:
3256 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003257 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003258 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003259 case CK_Athlon:
3260 case CK_AthlonThunderbird:
3261 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003262 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003263 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003264 case CK_Athlon4:
3265 case CK_AthlonXP:
3266 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003267 setFeatureEnabledImpl(Features, "sse", true);
3268 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003269 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003270 break;
3271 case CK_K8:
3272 case CK_Opteron:
3273 case CK_Athlon64:
3274 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003275 setFeatureEnabledImpl(Features, "sse2", true);
3276 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003277 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003278 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003279 case CK_AMDFAM10:
3280 setFeatureEnabledImpl(Features, "sse4a", true);
3281 setFeatureEnabledImpl(Features, "lzcnt", true);
3282 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003283 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003284 case CK_K8SSE3:
3285 case CK_OpteronSSE3:
3286 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003287 setFeatureEnabledImpl(Features, "sse3", true);
3288 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003289 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003290 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003291 case CK_BTVER2:
3292 setFeatureEnabledImpl(Features, "avx", true);
3293 setFeatureEnabledImpl(Features, "aes", true);
3294 setFeatureEnabledImpl(Features, "pclmul", true);
3295 setFeatureEnabledImpl(Features, "bmi", true);
3296 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003297 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003298 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003299 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003300 setFeatureEnabledImpl(Features, "ssse3", true);
3301 setFeatureEnabledImpl(Features, "sse4a", true);
3302 setFeatureEnabledImpl(Features, "lzcnt", true);
3303 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003304 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003305 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003306 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003307 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003308 case CK_ZNVER1:
3309 setFeatureEnabledImpl(Features, "adx", true);
3310 setFeatureEnabledImpl(Features, "aes", true);
3311 setFeatureEnabledImpl(Features, "avx2", true);
3312 setFeatureEnabledImpl(Features, "bmi", true);
3313 setFeatureEnabledImpl(Features, "bmi2", true);
3314 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003315 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003316 setFeatureEnabledImpl(Features, "cx16", true);
3317 setFeatureEnabledImpl(Features, "f16c", true);
3318 setFeatureEnabledImpl(Features, "fma", true);
3319 setFeatureEnabledImpl(Features, "fsgsbase", true);
3320 setFeatureEnabledImpl(Features, "fxsr", true);
3321 setFeatureEnabledImpl(Features, "lzcnt", true);
3322 setFeatureEnabledImpl(Features, "mwaitx", true);
3323 setFeatureEnabledImpl(Features, "movbe", true);
3324 setFeatureEnabledImpl(Features, "pclmul", true);
3325 setFeatureEnabledImpl(Features, "popcnt", true);
3326 setFeatureEnabledImpl(Features, "prfchw", true);
3327 setFeatureEnabledImpl(Features, "rdrnd", true);
3328 setFeatureEnabledImpl(Features, "rdseed", true);
3329 setFeatureEnabledImpl(Features, "sha", true);
3330 setFeatureEnabledImpl(Features, "sse4a", true);
3331 setFeatureEnabledImpl(Features, "xsave", true);
3332 setFeatureEnabledImpl(Features, "xsavec", true);
3333 setFeatureEnabledImpl(Features, "xsaveopt", true);
3334 setFeatureEnabledImpl(Features, "xsaves", true);
3335 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003336 case CK_BDVER4:
3337 setFeatureEnabledImpl(Features, "avx2", true);
3338 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003339 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003340 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003341 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003342 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003343 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003344 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003345 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003346 setFeatureEnabledImpl(Features, "bmi", true);
3347 setFeatureEnabledImpl(Features, "fma", true);
3348 setFeatureEnabledImpl(Features, "f16c", true);
3349 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003350 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003351 case CK_BDVER1:
3352 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003353 setFeatureEnabledImpl(Features, "xop", true);
3354 setFeatureEnabledImpl(Features, "lzcnt", true);
3355 setFeatureEnabledImpl(Features, "aes", true);
3356 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003357 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003358 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003359 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003360 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003361 break;
Eli Friedman33465822011-07-08 23:31:17 +00003362 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003363 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3364 return false;
3365
3366 // Can't do this earlier because we need to be able to explicitly enable
3367 // or disable these features and the things that they depend upon.
3368
3369 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3370 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003371 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003372 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3373 FeaturesVec.end())
3374 Features["popcnt"] = true;
3375
3376 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3377 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003378 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003379 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3380 FeaturesVec.end())
3381 Features["prfchw"] = true;
3382
Eric Christophera7260af2015-10-08 20:10:18 +00003383 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3384 // then enable MMX.
3385 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003386 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003387 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3388 FeaturesVec.end())
3389 Features["mmx"] = true;
3390
Eric Christopherbbd746d2015-10-08 20:10:14 +00003391 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003392}
3393
Rafael Espindolae62e2792013-08-20 13:44:29 +00003394void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003395 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003396 if (Enabled) {
3397 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003398 case AVX512F:
3399 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003400 case AVX2:
3401 Features["avx2"] = true;
3402 case AVX:
3403 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003404 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003405 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003406 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003407 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003408 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003409 case SSSE3:
3410 Features["ssse3"] = true;
3411 case SSE3:
3412 Features["sse3"] = true;
3413 case SSE2:
3414 Features["sse2"] = true;
3415 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003416 Features["sse"] = true;
3417 case NoSSE:
3418 break;
3419 }
3420 return;
3421 }
3422
3423 switch (Level) {
3424 case NoSSE:
3425 case SSE1:
3426 Features["sse"] = false;
3427 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003428 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3429 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003430 case SSE3:
3431 Features["sse3"] = false;
3432 setXOPLevel(Features, NoXOP, false);
3433 case SSSE3:
3434 Features["ssse3"] = false;
3435 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003436 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003437 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003438 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003439 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003440 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3441 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003442 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003443 case AVX2:
3444 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003445 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003446 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003447 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003448 Features["avx512vl"] = Features["avx512vbmi"] =
3449 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003450 }
3451}
3452
3453void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003454 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003455 if (Enabled) {
3456 switch (Level) {
3457 case AMD3DNowAthlon:
3458 Features["3dnowa"] = true;
3459 case AMD3DNow:
3460 Features["3dnow"] = true;
3461 case MMX:
3462 Features["mmx"] = true;
3463 case NoMMX3DNow:
3464 break;
3465 }
3466 return;
3467 }
3468
3469 switch (Level) {
3470 case NoMMX3DNow:
3471 case MMX:
3472 Features["mmx"] = false;
3473 case AMD3DNow:
3474 Features["3dnow"] = false;
3475 case AMD3DNowAthlon:
3476 Features["3dnowa"] = false;
3477 }
3478}
3479
3480void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003481 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003482 if (Enabled) {
3483 switch (Level) {
3484 case XOP:
3485 Features["xop"] = true;
3486 case FMA4:
3487 Features["fma4"] = true;
3488 setSSELevel(Features, AVX, true);
3489 case SSE4A:
3490 Features["sse4a"] = true;
3491 setSSELevel(Features, SSE3, true);
3492 case NoXOP:
3493 break;
3494 }
3495 return;
3496 }
3497
3498 switch (Level) {
3499 case NoXOP:
3500 case SSE4A:
3501 Features["sse4a"] = false;
3502 case FMA4:
3503 Features["fma4"] = false;
3504 case XOP:
3505 Features["xop"] = false;
3506 }
3507}
3508
Craig Topper86d79ef2013-09-17 04:51:29 +00003509void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3510 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003511 // This is a bit of a hack to deal with the sse4 target feature when used
3512 // as part of the target attribute. We handle sse4 correctly everywhere
3513 // else. See below for more information on how we handle the sse4 options.
3514 if (Name != "sse4")
3515 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003516
Craig Topper29561122013-09-19 01:13:07 +00003517 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003518 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003519 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003520 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003521 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003522 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003523 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003524 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003525 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003526 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003527 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003528 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003529 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003530 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003531 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003532 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003533 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003534 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003535 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003536 if (Enabled)
3537 setSSELevel(Features, SSE2, Enabled);
3538 } else if (Name == "pclmul") {
3539 if (Enabled)
3540 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003541 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003542 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003543 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003544 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003545 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003546 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003547 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3548 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3549 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003550 if (Enabled)
3551 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003552 // Enable BWI instruction if VBMI is being enabled.
3553 if (Name == "avx512vbmi" && Enabled)
3554 Features["avx512bw"] = true;
3555 // Also disable VBMI if BWI is being disabled.
3556 if (Name == "avx512bw" && !Enabled)
3557 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003558 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003559 if (Enabled)
3560 setSSELevel(Features, AVX, Enabled);
3561 } else if (Name == "fma4") {
3562 setXOPLevel(Features, FMA4, Enabled);
3563 } else if (Name == "xop") {
3564 setXOPLevel(Features, XOP, Enabled);
3565 } else if (Name == "sse4a") {
3566 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003567 } else if (Name == "f16c") {
3568 if (Enabled)
3569 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003570 } else if (Name == "sha") {
3571 if (Enabled)
3572 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003573 } else if (Name == "sse4") {
3574 // We can get here via the __target__ attribute since that's not controlled
3575 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3576 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3577 // disabled.
3578 if (Enabled)
3579 setSSELevel(Features, SSE42, Enabled);
3580 else
3581 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003582 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003583 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003584 Features["xsaveopt"] = false;
3585 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003586 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003587 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003588 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003589}
3590
Eric Christopher3ff21b32013-10-16 21:26:26 +00003591/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003592/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003593bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003594 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003595 for (const auto &Feature : Features) {
3596 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003597 continue;
3598
Eric Christopher610fe112015-08-26 08:21:55 +00003599 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003600 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003601 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003602 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003603 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003604 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003605 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003606 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003607 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003608 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003609 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003610 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003611 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003612 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003613 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003614 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003615 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003616 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003617 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003618 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003619 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003620 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003621 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003622 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003623 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003624 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003625 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003626 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003627 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003628 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003629 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003630 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003631 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003632 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003633 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003634 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003635 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003636 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003637 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003638 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003639 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003640 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003641 } else if (Feature == "+avx512vbmi") {
3642 HasAVX512VBMI = true;
3643 } else if (Feature == "+avx512ifma") {
3644 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003645 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003646 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003647 } else if (Feature == "+mpx") {
3648 HasMPX = true;
3649 } else if (Feature == "+movbe") {
3650 HasMOVBE = true;
3651 } else if (Feature == "+sgx") {
3652 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003653 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003654 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003655 } else if (Feature == "+fxsr") {
3656 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003657 } else if (Feature == "+xsave") {
3658 HasXSAVE = true;
3659 } else if (Feature == "+xsaveopt") {
3660 HasXSAVEOPT = true;
3661 } else if (Feature == "+xsavec") {
3662 HasXSAVEC = true;
3663 } else if (Feature == "+xsaves") {
3664 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003665 } else if (Feature == "+mwaitx") {
3666 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003667 } else if (Feature == "+pku") {
3668 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003669 } else if (Feature == "+clflushopt") {
3670 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003671 } else if (Feature == "+clwb") {
3672 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003673 } else if (Feature == "+prefetchwt1") {
3674 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003675 } else if (Feature == "+clzero") {
3676 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003677 }
3678
Benjamin Kramer27402c62012-03-05 15:10:44 +00003679 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003680 .Case("+avx512f", AVX512F)
3681 .Case("+avx2", AVX2)
3682 .Case("+avx", AVX)
3683 .Case("+sse4.2", SSE42)
3684 .Case("+sse4.1", SSE41)
3685 .Case("+ssse3", SSSE3)
3686 .Case("+sse3", SSE3)
3687 .Case("+sse2", SSE2)
3688 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003689 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003690 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003691
Eli Friedman33465822011-07-08 23:31:17 +00003692 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003693 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003694 .Case("+3dnowa", AMD3DNowAthlon)
3695 .Case("+3dnow", AMD3DNow)
3696 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003697 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003698 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003699
3700 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003701 .Case("+xop", XOP)
3702 .Case("+fma4", FMA4)
3703 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003704 .Default(NoXOP);
3705 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003706 }
Eli Friedman33465822011-07-08 23:31:17 +00003707
Rafael Espindolaeb265472013-08-21 21:59:03 +00003708 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3709 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003710 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3711 (FPMath == FP_387 && SSELevel >= SSE1)) {
3712 Diags.Report(diag::err_target_unsupported_fpmath) <<
3713 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003714 return false;
3715 }
3716
Alexey Bataev00396512015-07-02 03:40:19 +00003717 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003718 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003719 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003720}
Chris Lattnerecd49032009-03-02 22:27:17 +00003721
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003722/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3723/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003724void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003725 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003726 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003727 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003728 Builder.defineMacro("__amd64__");
3729 Builder.defineMacro("__amd64");
3730 Builder.defineMacro("__x86_64");
3731 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003732 if (getTriple().getArchName() == "x86_64h") {
3733 Builder.defineMacro("__x86_64h");
3734 Builder.defineMacro("__x86_64h__");
3735 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003736 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003737 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003738 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003739
Chris Lattnerecd49032009-03-02 22:27:17 +00003740 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003741 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3742 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003743 switch (CPU) {
3744 case CK_Generic:
3745 break;
3746 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003747 // The rest are coming from the i386 define above.
3748 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003749 break;
3750 case CK_i486:
3751 case CK_WinChipC6:
3752 case CK_WinChip2:
3753 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003754 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003755 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003756 case CK_PentiumMMX:
3757 Builder.defineMacro("__pentium_mmx__");
3758 Builder.defineMacro("__tune_pentium_mmx__");
3759 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003760 case CK_i586:
3761 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003762 defineCPUMacros(Builder, "i586");
3763 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003764 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003765 case CK_Pentium3:
3766 case CK_Pentium3M:
3767 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003768 Builder.defineMacro("__tune_pentium3__");
3769 // Fallthrough
3770 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003771 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003772 Builder.defineMacro("__tune_pentium2__");
3773 // Fallthrough
3774 case CK_PentiumPro:
3775 Builder.defineMacro("__tune_i686__");
3776 Builder.defineMacro("__tune_pentiumpro__");
3777 // Fallthrough
3778 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003779 Builder.defineMacro("__i686");
3780 Builder.defineMacro("__i686__");
3781 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3782 Builder.defineMacro("__pentiumpro");
3783 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003784 break;
3785 case CK_Pentium4:
3786 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003787 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003788 break;
3789 case CK_Yonah:
3790 case CK_Prescott:
3791 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003792 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003793 break;
3794 case CK_Core2:
3795 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003796 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003797 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003798 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003799 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003800 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003801 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003802 defineCPUMacros(Builder, "slm");
3803 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003804 case CK_Nehalem:
3805 case CK_Westmere:
3806 case CK_SandyBridge:
3807 case CK_IvyBridge:
3808 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003809 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003810 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003811 // FIXME: Historically, we defined this legacy name, it would be nice to
3812 // remove it at some point. We've never exposed fine-grained names for
3813 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003814 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003815 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003816 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003817 defineCPUMacros(Builder, "skx");
3818 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003819 case CK_Cannonlake:
3820 break;
Craig Topper449314e2013-08-20 07:09:39 +00003821 case CK_KNL:
3822 defineCPUMacros(Builder, "knl");
3823 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003824 case CK_Lakemont:
3825 Builder.defineMacro("__tune_lakemont__");
3826 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003827 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003828 Builder.defineMacro("__k6_2__");
3829 Builder.defineMacro("__tune_k6_2__");
3830 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003831 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003832 if (CPU != CK_K6_2) { // In case of fallthrough
3833 // FIXME: GCC may be enabling these in cases where some other k6
3834 // architecture is specified but -m3dnow is explicitly provided. The
3835 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003836 Builder.defineMacro("__k6_3__");
3837 Builder.defineMacro("__tune_k6_3__");
3838 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003839 // Fallthrough
3840 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003841 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003842 break;
3843 case CK_Athlon:
3844 case CK_AthlonThunderbird:
3845 case CK_Athlon4:
3846 case CK_AthlonXP:
3847 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003848 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003849 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003850 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003851 Builder.defineMacro("__tune_athlon_sse__");
3852 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003853 break;
3854 case CK_K8:
3855 case CK_K8SSE3:
3856 case CK_x86_64:
3857 case CK_Opteron:
3858 case CK_OpteronSSE3:
3859 case CK_Athlon64:
3860 case CK_Athlon64SSE3:
3861 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003862 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003863 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003864 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003865 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003866 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003867 case CK_BTVER1:
3868 defineCPUMacros(Builder, "btver1");
3869 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003870 case CK_BTVER2:
3871 defineCPUMacros(Builder, "btver2");
3872 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003873 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003874 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003875 break;
3876 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003877 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003878 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003879 case CK_BDVER3:
3880 defineCPUMacros(Builder, "bdver3");
3881 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003882 case CK_BDVER4:
3883 defineCPUMacros(Builder, "bdver4");
3884 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003885 case CK_ZNVER1:
3886 defineCPUMacros(Builder, "znver1");
3887 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003888 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003889 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003890 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003891 }
Chris Lattner96e43572009-03-02 22:40:39 +00003892
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003893 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003894 Builder.defineMacro("__REGISTER_PREFIX__", "");
3895
Chris Lattner6df41af2009-04-19 17:32:33 +00003896 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3897 // functions in glibc header files that use FP Stack inline asm which the
3898 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003899 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003900
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003901 if (HasAES)
3902 Builder.defineMacro("__AES__");
3903
Craig Topper3f122a72012-05-31 05:18:48 +00003904 if (HasPCLMUL)
3905 Builder.defineMacro("__PCLMUL__");
3906
Craig Topper22967d42011-12-25 05:06:45 +00003907 if (HasLZCNT)
3908 Builder.defineMacro("__LZCNT__");
3909
Benjamin Kramer1e250392012-07-07 09:39:18 +00003910 if (HasRDRND)
3911 Builder.defineMacro("__RDRND__");
3912
Craig Topper8c7f2512014-11-03 06:51:41 +00003913 if (HasFSGSBASE)
3914 Builder.defineMacro("__FSGSBASE__");
3915
Craig Topper22967d42011-12-25 05:06:45 +00003916 if (HasBMI)
3917 Builder.defineMacro("__BMI__");
3918
3919 if (HasBMI2)
3920 Builder.defineMacro("__BMI2__");
3921
Craig Topper1de83482011-12-29 16:10:46 +00003922 if (HasPOPCNT)
3923 Builder.defineMacro("__POPCNT__");
3924
Michael Liao625a8752012-11-10 05:17:46 +00003925 if (HasRTM)
3926 Builder.defineMacro("__RTM__");
3927
Michael Liao74f4eaf2013-03-26 17:52:08 +00003928 if (HasPRFCHW)
3929 Builder.defineMacro("__PRFCHW__");
3930
Michael Liaoffaae352013-03-29 05:17:55 +00003931 if (HasRDSEED)
3932 Builder.defineMacro("__RDSEED__");
3933
Robert Khasanov50e6f582014-09-19 09:53:48 +00003934 if (HasADX)
3935 Builder.defineMacro("__ADX__");
3936
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003937 if (HasTBM)
3938 Builder.defineMacro("__TBM__");
3939
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003940 if (HasMWAITX)
3941 Builder.defineMacro("__MWAITX__");
3942
Rafael Espindolae62e2792013-08-20 13:44:29 +00003943 switch (XOPLevel) {
3944 case XOP:
3945 Builder.defineMacro("__XOP__");
3946 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003947 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003948 case SSE4A:
3949 Builder.defineMacro("__SSE4A__");
3950 case NoXOP:
3951 break;
3952 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003953
Craig Topperbba778b2012-06-03 21:46:30 +00003954 if (HasFMA)
3955 Builder.defineMacro("__FMA__");
3956
Manman Rena45358c2012-10-11 00:59:55 +00003957 if (HasF16C)
3958 Builder.defineMacro("__F16C__");
3959
Craig Topper679b53a2013-08-21 05:29:10 +00003960 if (HasAVX512CD)
3961 Builder.defineMacro("__AVX512CD__");
3962 if (HasAVX512ER)
3963 Builder.defineMacro("__AVX512ER__");
3964 if (HasAVX512PF)
3965 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003966 if (HasAVX512DQ)
3967 Builder.defineMacro("__AVX512DQ__");
3968 if (HasAVX512BW)
3969 Builder.defineMacro("__AVX512BW__");
3970 if (HasAVX512VL)
3971 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003972 if (HasAVX512VBMI)
3973 Builder.defineMacro("__AVX512VBMI__");
3974 if (HasAVX512IFMA)
3975 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003976
Ben Langmuir58078d02013-09-19 13:22:04 +00003977 if (HasSHA)
3978 Builder.defineMacro("__SHA__");
3979
Craig Toppere33f51f2015-10-16 06:22:36 +00003980 if (HasFXSR)
3981 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003982 if (HasXSAVE)
3983 Builder.defineMacro("__XSAVE__");
3984 if (HasXSAVEOPT)
3985 Builder.defineMacro("__XSAVEOPT__");
3986 if (HasXSAVEC)
3987 Builder.defineMacro("__XSAVEC__");
3988 if (HasXSAVES)
3989 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003990 if (HasPKU)
3991 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003992 if (HasCX16)
3993 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003994 if (HasCLFLUSHOPT)
3995 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003996 if (HasCLWB)
3997 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003998 if (HasMPX)
3999 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00004000 if (HasSGX)
4001 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00004002 if (HasPREFETCHWT1)
4003 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00004004 if (HasCLZERO)
4005 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00004006
Chris Lattner96e43572009-03-02 22:40:39 +00004007 // Each case falls through to the previous one here.
4008 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004009 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00004010 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00004011 case AVX2:
4012 Builder.defineMacro("__AVX2__");
4013 case AVX:
4014 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00004015 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004016 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00004017 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004018 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00004019 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004020 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004021 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004022 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00004023 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004024 Builder.defineMacro("__SSE2__");
4025 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00004026 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004027 Builder.defineMacro("__SSE__");
4028 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00004029 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00004030 break;
4031 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004032
Derek Schuffc7dd7222012-10-11 15:52:22 +00004033 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004034 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00004035 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00004036 case AVX2:
4037 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004038 case SSE42:
4039 case SSE41:
4040 case SSSE3:
4041 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004042 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004043 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004044 break;
4045 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004046 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004047 break;
4048 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004049 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004050 }
4051 }
4052
Anders Carlssone437c682010-01-27 03:47:49 +00004053 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00004054 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00004055 case AMD3DNowAthlon:
4056 Builder.defineMacro("__3dNOW_A__");
4057 case AMD3DNow:
4058 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00004059 case MMX:
4060 Builder.defineMacro("__MMX__");
4061 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00004062 break;
4063 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00004064
4065 if (CPU >= CK_i486) {
4066 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4067 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4068 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4069 }
4070 if (CPU >= CK_i586)
4071 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004072}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004073
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004074bool X86TargetInfo::hasFeature(StringRef Feature) const {
4075 return llvm::StringSwitch<bool>(Feature)
4076 .Case("aes", HasAES)
4077 .Case("avx", SSELevel >= AVX)
4078 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004079 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004080 .Case("avx512cd", HasAVX512CD)
4081 .Case("avx512er", HasAVX512ER)
4082 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004083 .Case("avx512dq", HasAVX512DQ)
4084 .Case("avx512bw", HasAVX512BW)
4085 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004086 .Case("avx512vbmi", HasAVX512VBMI)
4087 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004088 .Case("bmi", HasBMI)
4089 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004090 .Case("clflushopt", HasCLFLUSHOPT)
4091 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004092 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004093 .Case("cx16", HasCX16)
4094 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004095 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004096 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004097 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004098 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004099 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004100 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4101 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4102 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004103 .Case("movbe", HasMOVBE)
4104 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004105 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004106 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004107 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004108 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004109 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004110 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004111 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004112 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004113 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004114 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004115 .Case("sse", SSELevel >= SSE1)
4116 .Case("sse2", SSELevel >= SSE2)
4117 .Case("sse3", SSELevel >= SSE3)
4118 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004119 .Case("sse4.1", SSELevel >= SSE41)
4120 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004121 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004122 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004123 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004124 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4125 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004126 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004127 .Case("xsave", HasXSAVE)
4128 .Case("xsavec", HasXSAVEC)
4129 .Case("xsaves", HasXSAVES)
4130 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004131 .Default(false);
4132}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004133
Eric Christopherd9832702015-06-29 21:00:05 +00004134// We can't use a generic validation scheme for the features accepted here
4135// versus subtarget features accepted in the target attribute because the
4136// bitfield structure that's initialized in the runtime only supports the
4137// below currently rather than the full range of subtarget features. (See
4138// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4139bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4140 return llvm::StringSwitch<bool>(FeatureStr)
4141 .Case("cmov", true)
4142 .Case("mmx", true)
4143 .Case("popcnt", true)
4144 .Case("sse", true)
4145 .Case("sse2", true)
4146 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004147 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004148 .Case("sse4.1", true)
4149 .Case("sse4.2", true)
4150 .Case("avx", true)
4151 .Case("avx2", true)
4152 .Case("sse4a", true)
4153 .Case("fma4", true)
4154 .Case("xop", true)
4155 .Case("fma", true)
4156 .Case("avx512f", true)
4157 .Case("bmi", true)
4158 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004159 .Case("aes", true)
4160 .Case("pclmul", true)
4161 .Case("avx512vl", true)
4162 .Case("avx512bw", true)
4163 .Case("avx512dq", true)
4164 .Case("avx512cd", true)
4165 .Case("avx512er", true)
4166 .Case("avx512pf", true)
4167 .Case("avx512vbmi", true)
4168 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004169 .Default(false);
4170}
4171
Eli Friedman3fd920a2008-08-20 02:34:37 +00004172bool
Anders Carlsson58436352009-02-28 17:11:49 +00004173X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004174 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004175 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004176 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004177 // Constant constraints.
4178 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4179 // instructions.
4180 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4181 // x86_64 instructions.
4182 case 's':
4183 Info.setRequiresImmediate();
4184 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004185 case 'I':
4186 Info.setRequiresImmediate(0, 31);
4187 return true;
4188 case 'J':
4189 Info.setRequiresImmediate(0, 63);
4190 return true;
4191 case 'K':
4192 Info.setRequiresImmediate(-128, 127);
4193 return true;
4194 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004195 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004196 return true;
4197 case 'M':
4198 Info.setRequiresImmediate(0, 3);
4199 return true;
4200 case 'N':
4201 Info.setRequiresImmediate(0, 255);
4202 return true;
4203 case 'O':
4204 Info.setRequiresImmediate(0, 127);
4205 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004206 // Register constraints.
4207 case 'Y': // 'Y' is the first character for several 2-character constraints.
4208 // Shift the pointer to the second character of the constraint.
4209 Name++;
4210 switch (*Name) {
4211 default:
4212 return false;
4213 case '0': // First SSE register.
4214 case 't': // Any SSE register, when SSE2 is enabled.
4215 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4216 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004217 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004218 Info.setAllowsRegister();
4219 return true;
4220 }
4221 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004222 // Constraint 'f' cannot be used for output operands.
4223 if (Info.ConstraintStr[0] == '=')
4224 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004225 Info.setAllowsRegister();
4226 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004227 case 'a': // eax.
4228 case 'b': // ebx.
4229 case 'c': // ecx.
4230 case 'd': // edx.
4231 case 'S': // esi.
4232 case 'D': // edi.
4233 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004234 case 't': // Top of floating point stack.
4235 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004236 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004237 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004238 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004239 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004240 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4241 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004242 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004243 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4244 case 'l': // "Index" registers: any general register that can be used as an
4245 // index in a base+index memory access.
4246 Info.setAllowsRegister();
4247 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004248 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004249 case 'C': // SSE floating point constant.
4250 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004251 return true;
4252 }
4253}
4254
Akira Hatanaka974131e2014-09-18 18:17:18 +00004255bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4256 unsigned Size) const {
4257 // Strip off constraint modifiers.
4258 while (Constraint[0] == '=' ||
4259 Constraint[0] == '+' ||
4260 Constraint[0] == '&')
4261 Constraint = Constraint.substr(1);
4262
4263 return validateOperandSize(Constraint, Size);
4264}
4265
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004266bool X86TargetInfo::validateInputSize(StringRef Constraint,
4267 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004268 return validateOperandSize(Constraint, Size);
4269}
4270
4271bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4272 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004273 switch (Constraint[0]) {
4274 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004275 case 'k':
4276 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004277 case 'y':
4278 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004279 case 'f':
4280 case 't':
4281 case 'u':
4282 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004283 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004284 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004285 if (SSELevel >= AVX512F)
4286 // 512-bit zmm registers can be used if target supports AVX512F.
4287 return Size <= 512U;
4288 else if (SSELevel >= AVX)
4289 // 256-bit ymm registers can be used if target supports AVX.
4290 return Size <= 256U;
4291 return Size <= 128U;
4292 case 'Y':
4293 // 'Y' is the first character for several 2-character constraints.
4294 switch (Constraint[1]) {
4295 default: break;
4296 case 'm':
4297 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004298 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004299 return Size <= 64;
4300 case 'i':
4301 case 't':
4302 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4303 if (SSELevel >= AVX512F)
4304 return Size <= 512U;
4305 else if (SSELevel >= AVX)
4306 return Size <= 256U;
4307 return SSELevel >= SSE2 && Size <= 128U;
4308 }
4309
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004310 }
4311
4312 return true;
4313}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004314
Eli Friedman3fd920a2008-08-20 02:34:37 +00004315std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004316X86TargetInfo::convertConstraint(const char *&Constraint) const {
4317 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004318 case 'a': return std::string("{ax}");
4319 case 'b': return std::string("{bx}");
4320 case 'c': return std::string("{cx}");
4321 case 'd': return std::string("{dx}");
4322 case 'S': return std::string("{si}");
4323 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004324 case 'p': // address
4325 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004326 case 't': // top of floating point stack.
4327 return std::string("{st}");
4328 case 'u': // second from top of floating point stack.
4329 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004330 case 'Y':
4331 switch (Constraint[1]) {
4332 default:
4333 // Break from inner switch and fall through (copy single char),
4334 // continue parsing after copying the current constraint into
4335 // the return string.
4336 break;
4337 case 'k':
4338 // "^" hints llvm that this is a 2 letter constraint.
4339 // "Constraint++" is used to promote the string iterator
4340 // to the next constraint.
4341 return std::string("^") + std::string(Constraint++, 2);
4342 }
4343 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004344 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004345 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004346 }
4347}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004348
Eli Friedman3fd920a2008-08-20 02:34:37 +00004349// X86-32 generic target
4350class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004351public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004352 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4353 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004354 DoubleAlign = LongLongAlign = 32;
4355 LongDoubleWidth = 96;
4356 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004357 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004358 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004359 SizeType = UnsignedInt;
4360 PtrDiffType = SignedInt;
4361 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004362 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004363
4364 // Use fpret for all types.
4365 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4366 (1 << TargetInfo::Double) |
4367 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004368
4369 // x86-32 has atomics up to 8 bytes
4370 // FIXME: Check that we actually have cmpxchg8b before setting
4371 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4372 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004373 }
Craig Topper3164f332014-03-11 03:39:26 +00004374 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004375 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004376 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004377
Craig Topper3164f332014-03-11 03:39:26 +00004378 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004379 if (RegNo == 0) return 0;
4380 if (RegNo == 1) return 2;
4381 return -1;
4382 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004383 bool validateOperandSize(StringRef Constraint,
4384 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004385 switch (Constraint[0]) {
4386 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004387 case 'R':
4388 case 'q':
4389 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004390 case 'a':
4391 case 'b':
4392 case 'c':
4393 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004394 case 'S':
4395 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004396 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004397 case 'A':
4398 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004399 }
4400
Akira Hatanaka974131e2014-09-18 18:17:18 +00004401 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004402 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004403 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4404 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4405 Builtin::FirstTSBuiltin + 1);
4406 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004407};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004408
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004409class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4410public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004411 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4412 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004413
Craig Topper3164f332014-03-11 03:39:26 +00004414 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004415 unsigned Major, Minor, Micro;
4416 getTriple().getOSVersion(Major, Minor, Micro);
4417 // New NetBSD uses the default rounding mode.
4418 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4419 return X86_32TargetInfo::getFloatEvalMethod();
4420 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004421 return 1;
4422 }
4423};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004424
Eli Friedmane3aa4542009-07-05 18:47:56 +00004425class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004427 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4428 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004429 SizeType = UnsignedLong;
4430 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004431 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004432 }
4433};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004434
Eli Friedman9fa28852012-08-08 23:57:20 +00004435class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4436public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004437 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4438 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004439 SizeType = UnsignedLong;
4440 IntPtrType = SignedLong;
4441 PtrDiffType = SignedLong;
4442 }
4443};
Eli Friedman9fa28852012-08-08 23:57:20 +00004444
Torok Edwinb2b37c62009-06-30 17:10:35 +00004445class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004447 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4448 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004449 LongDoubleWidth = 128;
4450 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004451 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004452 MaxVectorAlign = 256;
4453 // The watchOS simulator uses the builtin bool type for Objective-C.
4454 llvm::Triple T = llvm::Triple(Triple);
4455 if (T.isWatchOS())
4456 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004457 SizeType = UnsignedLong;
4458 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004459 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004460 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004461 }
4462
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004463 bool handleTargetFeatures(std::vector<std::string> &Features,
4464 DiagnosticsEngine &Diags) override {
4465 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4466 Diags))
4467 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004468 // We now know the features we have: we can decide how to align vectors.
4469 MaxVectorAlign =
4470 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004471 return true;
4472 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004473};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004474
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004475// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004476class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004477public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004478 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4479 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004480 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004481 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004482 bool IsWinCOFF =
4483 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004484 resetDataLayout(IsWinCOFF
4485 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4486 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004487 }
Craig Topper3164f332014-03-11 03:39:26 +00004488 void getTargetDefines(const LangOptions &Opts,
4489 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004490 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4491 }
4492};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004493
4494// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004495class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004496public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004497 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4498 const TargetOptions &Opts)
4499 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004500 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004501 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004502 }
Craig Topper3164f332014-03-11 03:39:26 +00004503 void getTargetDefines(const LangOptions &Opts,
4504 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004505 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4506 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4507 // The value of the following reflects processor type.
4508 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4509 // We lost the original triple, so we use the default.
4510 Builder.defineMacro("_M_IX86", "600");
4511 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004512};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004513
David Majnemerae1ed0e2015-05-28 04:36:18 +00004514static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004515 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4516 // supports __declspec natively under -fms-extensions, but we define a no-op
4517 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004518 if (Opts.MicrosoftExt)
4519 Builder.defineMacro("__declspec", "__declspec");
4520 else
4521 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4522
4523 if (!Opts.MicrosoftExt) {
4524 // Provide macros for all the calling convention keywords. Provide both
4525 // single and double underscore prefixed variants. These are available on
4526 // x64 as well as x86, even though they have no effect.
4527 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4528 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004529 std::string GCCSpelling = "__attribute__((__";
4530 GCCSpelling += CC;
4531 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004532 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4533 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4534 }
4535 }
4536}
4537
David Majnemerae1ed0e2015-05-28 04:36:18 +00004538static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4539 Builder.defineMacro("__MSVCRT__");
4540 Builder.defineMacro("__MINGW32__");
4541 addCygMingDefines(Opts, Builder);
4542}
4543
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004544// x86-32 MinGW target
4545class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4546public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004547 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4548 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004549 void getTargetDefines(const LangOptions &Opts,
4550 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004551 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004552 DefineStd(Builder, "WIN32", Opts);
4553 DefineStd(Builder, "WINNT", Opts);
4554 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004555 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004556 }
4557};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004558
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004559// x86-32 Cygwin target
4560class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004562 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4563 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004564 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004565 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004566 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 +00004567 }
Craig Topper3164f332014-03-11 03:39:26 +00004568 void getTargetDefines(const LangOptions &Opts,
4569 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004570 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004571 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004572 Builder.defineMacro("__CYGWIN__");
4573 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004574 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004575 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004576 if (Opts.CPlusPlus)
4577 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004578 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004579};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004580
Chris Lattnerb986aba2010-04-11 19:29:39 +00004581// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004582class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004583public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004584 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004585 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004586 }
Craig Topper3164f332014-03-11 03:39:26 +00004587 void getTargetDefines(const LangOptions &Opts,
4588 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004589 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004590 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004591 }
4592};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004593
Alexey Bataevc99b0492015-11-25 09:24:26 +00004594// X86-32 MCU target
4595class MCUX86_32TargetInfo : public X86_32TargetInfo {
4596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004597 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4598 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004599 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004600 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004601 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 +00004602 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004603 }
4604
4605 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4606 // On MCU we support only C calling convention.
4607 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4608 }
4609
4610 void getTargetDefines(const LangOptions &Opts,
4611 MacroBuilder &Builder) const override {
4612 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4613 Builder.defineMacro("__iamcu");
4614 Builder.defineMacro("__iamcu__");
4615 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004616
4617 bool allowsLargerPreferedTypeAlignment() const override {
4618 return false;
4619 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004620};
4621
Douglas Gregor9fabd852011-07-01 22:41:14 +00004622// RTEMS Target
4623template<typename Target>
4624class RTEMSTargetInfo : public OSTargetInfo<Target> {
4625protected:
Craig Topper3164f332014-03-11 03:39:26 +00004626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4627 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004628 // RTEMS defines; list based off of gcc output
4629
Douglas Gregor9fabd852011-07-01 22:41:14 +00004630 Builder.defineMacro("__rtems__");
4631 Builder.defineMacro("__ELF__");
4632 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004633
Douglas Gregor9fabd852011-07-01 22:41:14 +00004634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004635 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4636 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004637 switch (Triple.getArch()) {
4638 default:
4639 case llvm::Triple::x86:
4640 // this->MCountName = ".mcount";
4641 break;
4642 case llvm::Triple::mips:
4643 case llvm::Triple::mipsel:
4644 case llvm::Triple::ppc:
4645 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004646 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004647 // this->MCountName = "_mcount";
4648 break;
4649 case llvm::Triple::arm:
4650 // this->MCountName = "__mcount";
4651 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004652 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004653 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004654};
4655
Douglas Gregor9fabd852011-07-01 22:41:14 +00004656// x86-32 RTEMS target
4657class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4658public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004659 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4660 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004661 SizeType = UnsignedLong;
4662 IntPtrType = SignedLong;
4663 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004664 }
Craig Topper3164f332014-03-11 03:39:26 +00004665 void getTargetDefines(const LangOptions &Opts,
4666 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004667 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4668 Builder.defineMacro("__INTEL__");
4669 Builder.defineMacro("__rtems__");
4670 }
4671};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004672
Eli Friedman3fd920a2008-08-20 02:34:37 +00004673// x86-64 generic target
4674class X86_64TargetInfo : public X86TargetInfo {
4675public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004676 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4677 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004678 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004679 bool IsWinCOFF =
4680 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004681 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004682 LongDoubleWidth = 128;
4683 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004684 LargeArrayMinWidth = 128;
4685 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004686 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004687 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4688 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4689 IntPtrType = IsX32 ? SignedInt : SignedLong;
4690 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004691 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004692 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004693
Eric Christopher917e9522014-11-18 22:36:15 +00004694 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004695 resetDataLayout(IsX32
4696 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4697 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4698 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004699
4700 // Use fpret only for long double.
4701 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004702
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004703 // Use fp2ret for _Complex long double.
4704 ComplexLongDoubleUsesFP2Ret = true;
4705
Charles Davisc7d5c942015-09-17 20:55:33 +00004706 // Make __builtin_ms_va_list available.
4707 HasBuiltinMSVaList = true;
4708
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004709 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004710 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004711 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004712 }
Craig Topper3164f332014-03-11 03:39:26 +00004713 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004714 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004715 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004716
Craig Topper3164f332014-03-11 03:39:26 +00004717 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004718 if (RegNo == 0) return 0;
4719 if (RegNo == 1) return 1;
4720 return -1;
4721 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004722
Craig Topper3164f332014-03-11 03:39:26 +00004723 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004724 switch (CC) {
4725 case CC_C:
4726 case CC_Swift:
4727 case CC_X86VectorCall:
4728 case CC_IntelOclBicc:
4729 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004730 case CC_PreserveMost:
4731 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004732 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004733 return CCCR_OK;
4734 default:
4735 return CCCR_Warning;
4736 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004737 }
4738
Craig Topper3164f332014-03-11 03:39:26 +00004739 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004740 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004741 }
4742
Pavel Chupinfd223e12014-08-04 12:39:43 +00004743 // for x32 we need it here explicitly
4744 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004745 unsigned getUnwindWordWidth() const override { return 64; }
4746 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004747
4748 bool validateGlobalRegisterVariable(StringRef RegName,
4749 unsigned RegSize,
4750 bool &HasSizeMismatch) const override {
4751 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4752 // handle.
4753 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4754 // Check that the register size is 64-bit.
4755 HasSizeMismatch = RegSize != 64;
4756 return true;
4757 }
4758
4759 // Check if the register is a 32-bit register the backend can handle.
4760 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4761 HasSizeMismatch);
4762 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004763 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4764 return llvm::makeArrayRef(BuiltinInfoX86,
4765 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4766 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004767};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004768
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004769// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004770class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004771public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004772 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4773 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004774 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004775 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004776 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004777 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004778 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004779 SizeType = UnsignedLongLong;
4780 PtrDiffType = SignedLongLong;
4781 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004782 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004783
Craig Topper3164f332014-03-11 03:39:26 +00004784 void getTargetDefines(const LangOptions &Opts,
4785 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004786 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004787 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004788 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004789
Craig Topper3164f332014-03-11 03:39:26 +00004790 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004791 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004792 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004793
Craig Topper3164f332014-03-11 03:39:26 +00004794 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004795 switch (CC) {
4796 case CC_X86StdCall:
4797 case CC_X86ThisCall:
4798 case CC_X86FastCall:
4799 return CCCR_Ignore;
4800 case CC_C:
4801 case CC_X86VectorCall:
4802 case CC_IntelOclBicc:
4803 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004804 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004805 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004806 return CCCR_OK;
4807 default:
4808 return CCCR_Warning;
4809 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004810 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004811};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004812
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004813// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004814class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004815public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004816 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4817 const TargetOptions &Opts)
4818 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004819 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004820 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004821 }
Craig Topper3164f332014-03-11 03:39:26 +00004822 void getTargetDefines(const LangOptions &Opts,
4823 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004824 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4825 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004826 Builder.defineMacro("_M_X64", "100");
4827 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004828 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004829};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004830
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004831// x86-64 MinGW target
4832class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4833public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004834 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4835 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004836 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4837 // with x86 FP ops. Weird.
4838 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004839 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004840 }
4841
Craig Topper3164f332014-03-11 03:39:26 +00004842 void getTargetDefines(const LangOptions &Opts,
4843 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004844 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004845 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004846 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004847 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004848
4849 // GCC defines this macro when it is using __gxx_personality_seh0.
4850 if (!Opts.SjLjExceptions)
4851 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004852 }
4853};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004854
Yaron Kerend030d112015-07-22 17:38:19 +00004855// x86-64 Cygwin target
4856class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4857public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004858 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4859 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004860 TLSSupported = false;
4861 WCharType = UnsignedShort;
4862 }
4863 void getTargetDefines(const LangOptions &Opts,
4864 MacroBuilder &Builder) const override {
4865 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4866 Builder.defineMacro("__x86_64__");
4867 Builder.defineMacro("__CYGWIN__");
4868 Builder.defineMacro("__CYGWIN64__");
4869 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004870 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004871 if (Opts.CPlusPlus)
4872 Builder.defineMacro("_GNU_SOURCE");
4873
4874 // GCC defines this macro when it is using __gxx_personality_seh0.
4875 if (!Opts.SjLjExceptions)
4876 Builder.defineMacro("__SEH__");
4877 }
4878};
4879
Eli Friedman2857ccb2009-07-01 03:36:11 +00004880class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4881public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004882 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4883 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004884 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004885 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4886 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004887 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004888 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004889 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004890 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004891
4892 bool handleTargetFeatures(std::vector<std::string> &Features,
4893 DiagnosticsEngine &Diags) override {
4894 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4895 Diags))
4896 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004897 // We now know the features we have: we can decide how to align vectors.
4898 MaxVectorAlign =
4899 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004900 return true;
4901 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004902};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004903
Eli Friedman245f2292009-07-05 22:31:18 +00004904class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004906 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4907 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004908 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004909 Int64Type = SignedLongLong;
4910 }
4911};
Eli Friedman245f2292009-07-05 22:31:18 +00004912
Eli Friedman9fa28852012-08-08 23:57:20 +00004913class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4914public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004915 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4916 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004917 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004918 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004919 }
4920};
Tim Northover9bb857a2013-01-31 12:13:10 +00004921
Eli Friedmanf05b7722008-08-20 07:44:10 +00004922class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004923 // Possible FPU choices.
4924 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004925 VFP2FPU = (1 << 0),
4926 VFP3FPU = (1 << 1),
4927 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004928 NeonFPU = (1 << 3),
4929 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004930 };
4931
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004932 // Possible HWDiv features.
4933 enum HWDivMode {
4934 HWDivThumb = (1 << 0),
4935 HWDivARM = (1 << 1)
4936 };
4937
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004938 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004939 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004940 }
4941
4942 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4943 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004944
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004945 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004946
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004947 StringRef CPUProfile;
4948 StringRef CPUAttr;
4949
Rafael Espindolaeb265472013-08-21 21:59:03 +00004950 enum {
4951 FP_Default,
4952 FP_VFP,
4953 FP_Neon
4954 } FPMath;
4955
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004956 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004957 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004958 unsigned ArchProfile;
4959 unsigned ArchVersion;
4960
Bernard Ogdenda13af32013-10-24 18:32:51 +00004961 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004962
Logan Chien57086ce2012-10-10 06:56:20 +00004963 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004964 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004965
4966 // Initialized via features.
4967 unsigned SoftFloat : 1;
4968 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004969
Bernard Ogden18b57012013-10-29 09:47:51 +00004970 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004971 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004972 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004973 unsigned Unaligned : 1;
4974
4975 enum {
4976 LDREX_B = (1 << 0), /// byte (8-bit)
4977 LDREX_H = (1 << 1), /// half (16-bit)
4978 LDREX_W = (1 << 2), /// word (32-bit)
4979 LDREX_D = (1 << 3), /// double (64-bit)
4980 };
4981
4982 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004983
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004984 // ACLE 6.5.1 Hardware floating point
4985 enum {
4986 HW_FP_HP = (1 << 1), /// half (16-bit)
4987 HW_FP_SP = (1 << 2), /// single (32-bit)
4988 HW_FP_DP = (1 << 3), /// double (64-bit)
4989 };
4990 uint32_t HW_FP;
4991
Chris Lattner5cc15e02010-03-03 19:03:45 +00004992 static const Builtin::Info BuiltinInfo[];
4993
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004994 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004995 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004996
4997 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004998 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004999
Renato Golin0201a9e2016-09-22 19:28:20 +00005000 // size_t is unsigned long on MachO-derived environments, NetBSD,
5001 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00005002 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00005003 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00005004 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005005 SizeType = UnsignedLong;
5006 else
5007 SizeType = UnsignedInt;
5008
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005009 switch (T.getOS()) {
5010 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005011 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005012 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005013 break;
5014 case llvm::Triple::Win32:
5015 WCharType = UnsignedShort;
5016 break;
5017 case llvm::Triple::Linux:
5018 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005019 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
5020 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00005021 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005022 }
5023
5024 UseBitFieldTypeAlignment = true;
5025
5026 ZeroLengthBitfieldBoundary = 0;
5027
Tim Northover147cd2f2014-10-14 22:12:21 +00005028 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
5029 // so set preferred for small types to 32.
5030 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00005031 resetDataLayout(BigEndian
5032 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5033 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00005034 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00005035 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005036 resetDataLayout("e"
5037 "-m:w"
5038 "-p:32:32"
5039 "-i64:64"
5040 "-v128:64:128"
5041 "-a:0:32"
5042 "-n32"
5043 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00005044 } else if (T.isOSNaCl()) {
5045 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005046 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005047 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00005048 resetDataLayout(BigEndian
5049 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5050 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005051 }
5052
5053 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005054 }
5055
Tim Northover5627d392015-10-30 16:30:45 +00005056 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00005057 const llvm::Triple &T = getTriple();
5058
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005059 IsAAPCS = false;
5060
Tim Northover5627d392015-10-30 16:30:45 +00005061 if (IsAAPCS16)
5062 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
5063 else
5064 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005065
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005066 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00005067 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00005068 SizeType = UnsignedInt;
5069 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005070 SizeType = UnsignedLong;
5071
5072 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5073 WCharType = SignedInt;
5074
5075 // Do not respect the alignment of bit-field types when laying out
5076 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5077 UseBitFieldTypeAlignment = false;
5078
5079 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5080 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5081 /// gcc.
5082 ZeroLengthBitfieldBoundary = 32;
5083
Tim Northover5627d392015-10-30 16:30:45 +00005084 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5085 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005086 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005087 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005088 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005089 BigEndian
5090 ? "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 +00005091 : "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 +00005092 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005093 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005094 BigEndian
5095 ? "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 +00005096 : "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 +00005097
5098 // FIXME: Override "preferred align" for double and long long.
5099 }
5100
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005101 void setArchInfo() {
5102 StringRef ArchName = getTriple().getArchName();
5103
Renato Goline84b0002015-10-08 16:43:26 +00005104 ArchISA = llvm::ARM::parseArchISA(ArchName);
5105 CPU = llvm::ARM::getDefaultCPU(ArchName);
5106 unsigned AK = llvm::ARM::parseArch(ArchName);
5107 if (AK != llvm::ARM::AK_INVALID)
5108 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005109 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005110 }
5111
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005112 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 StringRef SubArch;
5114
5115 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005116 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005117 SubArch = llvm::ARM::getSubArch(ArchKind);
5118 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5119 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005120
5121 // cache CPU related strings
5122 CPUAttr = getCPUAttr();
5123 CPUProfile = getCPUProfile();
5124 }
5125
5126 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005127 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005128 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005129 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005130 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5131 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005132 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005133 if (ArchProfile == llvm::ARM::PK_M) {
5134 MaxAtomicPromoteWidth = 32;
5135 if (ShouldUseInlineAtomic)
5136 MaxAtomicInlineWidth = 32;
5137 }
5138 else {
5139 MaxAtomicPromoteWidth = 64;
5140 if (ShouldUseInlineAtomic)
5141 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005142 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005143 }
5144
5145 bool isThumb() const {
5146 return (ArchISA == llvm::ARM::IK_THUMB);
5147 }
5148
5149 bool supportsThumb() const {
5150 return CPUAttr.count('T') || ArchVersion >= 6;
5151 }
5152
5153 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005154 return CPUAttr.equals("6T2") ||
5155 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005156 }
5157
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005158 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005159 // For most sub-arches, the build attribute CPU name is enough.
5160 // For Cortex variants, it's slightly different.
5161 switch(ArchKind) {
5162 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005163 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005164 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005165 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005166 case llvm::ARM::AK_ARMV7S:
5167 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005168 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005169 return "7A";
5170 case llvm::ARM::AK_ARMV7R:
5171 return "7R";
5172 case llvm::ARM::AK_ARMV7M:
5173 return "7M";
5174 case llvm::ARM::AK_ARMV7EM:
5175 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005176 case llvm::ARM::AK_ARMV7VE:
5177 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005178 case llvm::ARM::AK_ARMV8A:
5179 return "8A";
5180 case llvm::ARM::AK_ARMV8_1A:
5181 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005182 case llvm::ARM::AK_ARMV8_2A:
5183 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005184 case llvm::ARM::AK_ARMV8MBaseline:
5185 return "8M_BASE";
5186 case llvm::ARM::AK_ARMV8MMainline:
5187 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005188 case llvm::ARM::AK_ARMV8R:
5189 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005190 }
5191 }
5192
5193 StringRef getCPUProfile() const {
5194 switch(ArchProfile) {
5195 case llvm::ARM::PK_A:
5196 return "A";
5197 case llvm::ARM::PK_R:
5198 return "R";
5199 case llvm::ARM::PK_M:
5200 return "M";
5201 default:
5202 return "";
5203 }
5204 }
5205
Chris Lattner17df24e2008-04-21 18:56:49 +00005206public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005207 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005208 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5209 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005210
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005211 switch (getTriple().getOS()) {
5212 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005213 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005214 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005215 break;
5216 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005217 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005218 break;
5219 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005220
Renato Goline84b0002015-10-08 16:43:26 +00005221 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005222 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005223
Chris Lattner1a8f3942010-04-23 16:29:58 +00005224 // {} in inline assembly are neon specifiers, not assembly variant
5225 // specifiers.
5226 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005227
Eric Christopher0e261882014-12-05 01:06:59 +00005228 // FIXME: This duplicates code from the driver that sets the -target-abi
5229 // option - this code is used if -target-abi isn't passed and should
5230 // be unified in some way.
5231 if (Triple.isOSBinFormatMachO()) {
5232 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5233 // the frontend matches that.
5234 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5235 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005236 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005237 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005238 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005239 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005240 } else {
5241 setABI("apcs-gnu");
5242 }
5243 } else if (Triple.isOSWindows()) {
5244 // FIXME: this is invalid for WindowsCE
5245 setABI("aapcs");
5246 } else {
5247 // Select the default based on the platform.
5248 switch (Triple.getEnvironment()) {
5249 case llvm::Triple::Android:
5250 case llvm::Triple::GNUEABI:
5251 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005252 case llvm::Triple::MuslEABI:
5253 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005254 setABI("aapcs-linux");
5255 break;
5256 case llvm::Triple::EABIHF:
5257 case llvm::Triple::EABI:
5258 setABI("aapcs");
5259 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005260 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005261 setABI("apcs-gnu");
5262 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005263 default:
5264 if (Triple.getOS() == llvm::Triple::NetBSD)
5265 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005266 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5267 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005268 else
5269 setABI("aapcs");
5270 break;
5271 }
5272 }
John McCall86353412010-08-21 22:46:04 +00005273
5274 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005275 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005276
Renato Golin15b86152015-07-03 16:41:13 +00005277 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005278 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005279
James Molloya7139222012-03-12 09:14:10 +00005280 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005281 // the alignment of the zero-length bitfield is greater than the member
5282 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005283 // zero length bitfield.
5284 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005285
5286 if (Triple.getOS() == llvm::Triple::Linux ||
5287 Triple.getOS() == llvm::Triple::UnknownOS)
5288 this->MCountName =
5289 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005290 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005291
Alp Toker4925ba72014-06-07 23:30:42 +00005292 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005293
Craig Topper3164f332014-03-11 03:39:26 +00005294 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005295 ABI = Name;
5296
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005297 // The defaults (above) are for AAPCS, check if we need to change them.
5298 //
5299 // FIXME: We need support for -meabi... we could just mangle it into the
5300 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005301 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005302 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005303 return true;
5304 }
5305 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5306 setABIAAPCS();
5307 return true;
5308 }
5309 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005310 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005311
Renato Golinf5c4dec2015-05-27 13:33:00 +00005312 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005313 bool
5314 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5315 StringRef CPU,
5316 const std::vector<std::string> &FeaturesVec) const override {
5317
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005318 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005319 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005320
5321 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005322 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005323 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5324
5325 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005326 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005327 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5328
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005329 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005330 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005331 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005332
Eric Christopher007b0a02015-08-28 22:32:01 +00005333 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005334 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005335
Craig Topper3164f332014-03-11 03:39:26 +00005336 bool handleTargetFeatures(std::vector<std::string> &Features,
5337 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005338 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005339 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005340 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005341 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005342 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005343 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005344 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005345
Ranjeet Singhac08e532015-06-24 23:39:25 +00005346 // This does not diagnose illegal cases like having both
5347 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5348 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005349 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005350 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005351 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005352 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005353 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005354 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005355 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005356 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005357 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005358 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005359 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005360 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005361 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005362 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005363 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005364 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005365 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005366 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005367 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005368 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005369 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005370 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005371 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005372 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005373 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005374 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005375 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005376 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005377 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005378 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005379 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005380 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005381 } else if (Feature == "+strict-align") {
5382 Unaligned = 0;
5383 } else if (Feature == "+fp16") {
5384 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005385 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005386 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005387 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005388
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005389 switch (ArchVersion) {
5390 case 6:
5391 if (ArchProfile == llvm::ARM::PK_M)
5392 LDREX = 0;
5393 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5394 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5395 else
5396 LDREX = LDREX_W;
5397 break;
5398 case 7:
5399 if (ArchProfile == llvm::ARM::PK_M)
5400 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5401 else
5402 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5403 break;
5404 case 8:
5405 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5406 }
5407
Rafael Espindolaeb265472013-08-21 21:59:03 +00005408 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5409 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5410 return false;
5411 }
5412
5413 if (FPMath == FP_Neon)
5414 Features.push_back("+neonfp");
5415 else if (FPMath == FP_VFP)
5416 Features.push_back("-neonfp");
5417
Daniel Dunbar893d4752009-12-19 04:15:38 +00005418 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005419 auto Feature =
5420 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5421 if (Feature != Features.end())
5422 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005423
Rafael Espindolaeb265472013-08-21 21:59:03 +00005424 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005425 }
5426
Craig Topper3164f332014-03-11 03:39:26 +00005427 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005428 return llvm::StringSwitch<bool>(Feature)
5429 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005430 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005431 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005432 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005433 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005434 .Case("hwdiv", HWDiv & HWDivThumb)
5435 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005436 .Default(false);
5437 }
Renato Golin15b86152015-07-03 16:41:13 +00005438
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005439 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005440 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005441 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005442
Renato Golin15b86152015-07-03 16:41:13 +00005443 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005444 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005445 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005446 CPU = Name;
5447 return true;
5448 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005449
Craig Topper3164f332014-03-11 03:39:26 +00005450 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005451
Craig Topper3164f332014-03-11 03:39:26 +00005452 void getTargetDefines(const LangOptions &Opts,
5453 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005454 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005455 Builder.defineMacro("__arm");
5456 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005457 // For bare-metal none-eabi.
5458 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5459 getTriple().getEnvironment() == llvm::Triple::EABI)
5460 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005461
Chris Lattnerecd49032009-03-02 22:27:17 +00005462 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005463 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005464
5465 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5466 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005467 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005468 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5469
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005470 if (!CPUAttr.empty())
5471 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005472
5473 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005474 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005475 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005476
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005477 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005478 // ACLE 6.5.7 Crypto Extension
5479 if (Crypto)
5480 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5481 // ACLE 6.5.8 CRC32 Extension
5482 if (CRC)
5483 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5484 // ACLE 6.5.10 Numeric Maximum and Minimum
5485 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5486 // ACLE 6.5.9 Directed Rounding
5487 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005488 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005489
5490 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5491 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005492 // NOTE that the default profile is assumed to be 'A'
5493 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005494 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5495
Bradley Smithf4affc12016-03-03 13:52:22 +00005496 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5497 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5498 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5499 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005500 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005501 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005502 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005503 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5504
5505 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5506 // instruction set such as ARM or Thumb.
5507 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5508
5509 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5510
5511 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005512 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005513 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005514
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005515 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005516 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005517 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005518
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005519 // ACLE 6.4.4 LDREX/STREX
5520 if (LDREX)
5521 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5522
5523 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005524 if (ArchVersion == 5 ||
5525 (ArchVersion == 6 && CPUProfile != "M") ||
5526 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005527 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5528
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005529 // ACLE 6.5.1 Hardware Floating Point
5530 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005531 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005532
Yi Konga44c4d72014-06-27 21:25:42 +00005533 // ACLE predefines.
5534 Builder.defineMacro("__ARM_ACLE", "200");
5535
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005536 // FP16 support (we currently only support IEEE format).
5537 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5538 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5539
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005540 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005541 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005542 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5543
Mike Stump9d54bd72009-04-08 02:07:04 +00005544 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005545
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005546 // FIXME: It's more complicated than this and we don't really support
5547 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005548 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005549 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005550 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005551
David Tweed8f676532012-10-25 13:33:01 +00005552 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005553 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005554 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005555 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005556 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005557 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005558 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005559
Tim Northover28fc0e12016-04-28 13:59:55 +00005560 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5561 ABI == "aapcs16")
5562 Builder.defineMacro("__ARM_PCS_VFP", "1");
5563
Daniel Dunbar893d4752009-12-19 04:15:38 +00005564 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005565 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005566
Zijiao Ma56a83722016-08-17 02:13:33 +00005567 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005568 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005569
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005570 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005571 Builder.defineMacro("__THUMBEL__");
5572 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005573 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005574 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005575 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005576
5577 // ACLE 6.4.9 32-bit SIMD instructions
5578 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5579 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5580
5581 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005582 if (((HWDiv & HWDivThumb) && isThumb()) ||
5583 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005584 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005585 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005586 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005587
5588 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005589 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005590
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005591 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005592 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005593 if (FPU & VFP2FPU)
5594 Builder.defineMacro("__ARM_VFPV2__");
5595 if (FPU & VFP3FPU)
5596 Builder.defineMacro("__ARM_VFPV3__");
5597 if (FPU & VFP4FPU)
5598 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005599 if (FPU & FPARMV8)
5600 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005601 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005602
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005603 // This only gets set when Neon instructions are actually available, unlike
5604 // the VFP define, hence the soft float and arch check. This is subtly
5605 // different from gcc, we follow the intent which was that it should be set
5606 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005607 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005608 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005609 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005610 // current AArch32 NEON implementations do not support double-precision
5611 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005612 Builder.defineMacro("__ARM_NEON_FP",
5613 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005614 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005615
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005616 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5617 Opts.ShortWChar ? "2" : "4");
5618
5619 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5620 Opts.ShortEnums ? "1" : "4");
5621
Bradley Smithf4affc12016-03-03 13:52:22 +00005622 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005623 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5624 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5625 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5626 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5627 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005628
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005629 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005630 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005631 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005632 }
5633
5634 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005635 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005636 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5637 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005638 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005639 }
5640
5641 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005642 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005643 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005644
5645 if (Opts.UnsafeFPMath)
5646 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005647
5648 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5649 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005650 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005651
Craig Topper6c03a542015-10-19 04:51:35 +00005652 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5653 return llvm::makeArrayRef(BuiltinInfo,
5654 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005655 }
Craig Topper3164f332014-03-11 03:39:26 +00005656 bool isCLZForZeroUndef() const override { return false; }
5657 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005658 return IsAAPCS
5659 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005660 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5661 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005662 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005663 ArrayRef<const char *> getGCCRegNames() const override;
5664 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005665 bool validateAsmConstraint(const char *&Name,
5666 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005667 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005668 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005669 case 'l': // r0-r7
5670 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005671 case 't': // VFP Floating point register single precision
5672 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005673 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005674 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005675 case 'I':
5676 case 'J':
5677 case 'K':
5678 case 'L':
5679 case 'M':
5680 // FIXME
5681 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005682 case 'Q': // A memory address that is a single base register.
5683 Info.setAllowsMemory();
5684 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005685 case 'U': // a memory reference...
5686 switch (Name[1]) {
5687 case 'q': // ...ARMV4 ldrsb
5688 case 'v': // ...VFP load/store (reg+constant offset)
5689 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005690 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005691 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005692 case 'n': // valid address for Neon doubleword vector load/store
5693 case 'm': // valid address for Neon element and structure load/store
5694 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005695 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005696 Info.setAllowsMemory();
5697 Name++;
5698 return true;
5699 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005700 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005701 return false;
5702 }
Craig Topper3164f332014-03-11 03:39:26 +00005703 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005704 std::string R;
5705 switch (*Constraint) {
5706 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005707 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005708 Constraint++;
5709 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005710 case 'p': // 'p' should be translated to 'r' by default.
5711 R = std::string("r");
5712 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005713 default:
5714 return std::string(1, *Constraint);
5715 }
5716 return R;
5717 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005718 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005719 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005720 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005721 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005722 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005723
Bill Wendling9d1ee112012-10-25 23:28:48 +00005724 // Strip off constraint modifiers.
5725 while (Constraint[0] == '=' ||
5726 Constraint[0] == '+' ||
5727 Constraint[0] == '&')
5728 Constraint = Constraint.substr(1);
5729
5730 switch (Constraint[0]) {
5731 default: break;
5732 case 'r': {
5733 switch (Modifier) {
5734 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005735 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005736 case 'q':
5737 // A register of size 32 cannot fit a vector type.
5738 return false;
5739 }
5740 }
5741 }
5742
5743 return true;
5744 }
Craig Topper3164f332014-03-11 03:39:26 +00005745 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005746 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005747 return "";
5748 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005749
Craig Topper3164f332014-03-11 03:39:26 +00005750 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005751 switch (CC) {
5752 case CC_AAPCS:
5753 case CC_AAPCS_VFP:
5754 case CC_Swift:
5755 return CCCR_OK;
5756 default:
5757 return CCCR_Warning;
5758 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005759 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005760
Craig Topper3164f332014-03-11 03:39:26 +00005761 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005762 if (RegNo == 0) return 0;
5763 if (RegNo == 1) return 1;
5764 return -1;
5765 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005766
5767 bool hasSjLjLowering() const override {
5768 return true;
5769 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005770};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005771
Rafael Espindolaeb265472013-08-21 21:59:03 +00005772bool ARMTargetInfo::setFPMath(StringRef Name) {
5773 if (Name == "neon") {
5774 FPMath = FP_Neon;
5775 return true;
5776 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5777 Name == "vfp4") {
5778 FPMath = FP_VFP;
5779 return true;
5780 }
5781 return false;
5782}
5783
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005784const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005785 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005786 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005787 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5788
5789 // Float registers
5790 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5791 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5792 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005793 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005794
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005795 // Double registers
5796 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5797 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005798 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5799 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005800
5801 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005802 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5803 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005804};
5805
Craig Topperf054e3a2015-10-19 03:52:27 +00005806ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5807 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005808}
5809
5810const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005811 { { "a1" }, "r0" },
5812 { { "a2" }, "r1" },
5813 { { "a3" }, "r2" },
5814 { { "a4" }, "r3" },
5815 { { "v1" }, "r4" },
5816 { { "v2" }, "r5" },
5817 { { "v3" }, "r6" },
5818 { { "v4" }, "r7" },
5819 { { "v5" }, "r8" },
5820 { { "v6", "rfp" }, "r9" },
5821 { { "sl" }, "r10" },
5822 { { "fp" }, "r11" },
5823 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005824 { { "r13" }, "sp" },
5825 { { "r14" }, "lr" },
5826 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005827 // The S, D and Q registers overlap, but aren't really aliases; we
5828 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005829};
5830
Craig Topperf054e3a2015-10-19 03:52:27 +00005831ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5832 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005833}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005834
5835const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005836#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005837 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005838#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5839 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005840#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005841
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 LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005845 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005846#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5847 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005848#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5849 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005850#include "clang/Basic/BuiltinsARM.def"
5851};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005852
5853class ARMleTargetInfo : public ARMTargetInfo {
5854public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005855 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005856 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005857 void getTargetDefines(const LangOptions &Opts,
5858 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005859 Builder.defineMacro("__ARMEL__");
5860 ARMTargetInfo::getTargetDefines(Opts, Builder);
5861 }
5862};
5863
5864class ARMbeTargetInfo : public ARMTargetInfo {
5865public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005866 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005867 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005868 void getTargetDefines(const LangOptions &Opts,
5869 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005870 Builder.defineMacro("__ARMEB__");
5871 Builder.defineMacro("__ARM_BIG_ENDIAN");
5872 ARMTargetInfo::getTargetDefines(Opts, Builder);
5873 }
5874};
Chris Lattner17df24e2008-04-21 18:56:49 +00005875
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005876class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5877 const llvm::Triple Triple;
5878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005879 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5880 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005881 WCharType = UnsignedShort;
5882 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005883 }
5884 void getVisualStudioDefines(const LangOptions &Opts,
5885 MacroBuilder &Builder) const {
5886 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5887
5888 // FIXME: this is invalid for WindowsCE
5889 Builder.defineMacro("_M_ARM_NT", "1");
5890 Builder.defineMacro("_M_ARMT", "_M_ARM");
5891 Builder.defineMacro("_M_THUMB", "_M_ARM");
5892
5893 assert((Triple.getArch() == llvm::Triple::arm ||
5894 Triple.getArch() == llvm::Triple::thumb) &&
5895 "invalid architecture for Windows ARM target info");
5896 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5897 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5898
5899 // TODO map the complete set of values
5900 // 31: VFPv3 40: VFPv4
5901 Builder.defineMacro("_M_ARM_FP", "31");
5902 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005903 BuiltinVaListKind getBuiltinVaListKind() const override {
5904 return TargetInfo::CharPtrBuiltinVaList;
5905 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005906 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5907 switch (CC) {
5908 case CC_X86StdCall:
5909 case CC_X86ThisCall:
5910 case CC_X86FastCall:
5911 case CC_X86VectorCall:
5912 return CCCR_Ignore;
5913 case CC_C:
5914 return CCCR_OK;
5915 default:
5916 return CCCR_Warning;
5917 }
5918 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005919};
5920
5921// Windows ARM + Itanium C++ ABI Target
5922class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5923public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005924 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5925 const TargetOptions &Opts)
5926 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005927 TheCXXABI.set(TargetCXXABI::GenericARM);
5928 }
5929
5930 void getTargetDefines(const LangOptions &Opts,
5931 MacroBuilder &Builder) const override {
5932 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5933
5934 if (Opts.MSVCCompat)
5935 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5936 }
5937};
5938
5939// Windows ARM, MS (C++) ABI
5940class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5941public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005942 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5943 const TargetOptions &Opts)
5944 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005945 TheCXXABI.set(TargetCXXABI::Microsoft);
5946 }
5947
5948 void getTargetDefines(const LangOptions &Opts,
5949 MacroBuilder &Builder) const override {
5950 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5951 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5952 }
5953};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005954
Yaron Keren321249c2015-07-15 13:32:23 +00005955// ARM MinGW target
5956class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005958 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5959 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005960 TheCXXABI.set(TargetCXXABI::GenericARM);
5961 }
5962
5963 void getTargetDefines(const LangOptions &Opts,
5964 MacroBuilder &Builder) const override {
5965 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5966 DefineStd(Builder, "WIN32", Opts);
5967 DefineStd(Builder, "WINNT", Opts);
5968 Builder.defineMacro("_ARM_");
5969 addMinGWDefines(Opts, Builder);
5970 }
5971};
5972
5973// ARM Cygwin target
5974class CygwinARMTargetInfo : public ARMleTargetInfo {
5975public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005976 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5977 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005978 TLSSupported = false;
5979 WCharType = UnsignedShort;
5980 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005981 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005982 }
5983 void getTargetDefines(const LangOptions &Opts,
5984 MacroBuilder &Builder) const override {
5985 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5986 Builder.defineMacro("_ARM_");
5987 Builder.defineMacro("__CYGWIN__");
5988 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005989 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005990 if (Opts.CPlusPlus)
5991 Builder.defineMacro("_GNU_SOURCE");
5992 }
5993};
5994
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005995class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005996protected:
Craig Topper3164f332014-03-11 03:39:26 +00005997 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5998 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005999 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00006000 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006001
Torok Edwinb2b37c62009-06-30 17:10:35 +00006002public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006003 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6004 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006005 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006006 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00006007 // FIXME: This should be based off of the target features in
6008 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00006009 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00006010
Tim Northoverd88ecb32016-01-27 19:32:40 +00006011 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00006012 // Darwin on iOS uses a variant of the ARM C++ ABI.
6013 TheCXXABI.set(TargetCXXABI::WatchOS);
6014
6015 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
6016 // size_t is long, it's a bit weird for it to be int.
6017 PtrDiffType = SignedLong;
6018
6019 // BOOL should be a real boolean on the new ABI
6020 UseSignedCharForObjCBool = false;
6021 } else
6022 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00006023 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00006024};
Eli Friedmanf05b7722008-08-20 07:44:10 +00006025
Tim Northover573cbee2014-05-24 12:52:07 +00006026class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006027 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00006028 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6029 static const char *const GCCRegNames[];
6030
James Molloy75f5f9e2014-04-16 15:33:48 +00006031 enum FPUModeEnum {
6032 FPUMode,
6033 NeonMode
6034 };
6035
6036 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00006037 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00006038 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006039 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006040 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00006041
Tim Northovera2ee4332014-03-29 15:09:45 +00006042 static const Builtin::Info BuiltinInfo[];
6043
6044 std::string ABI;
6045
6046public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00006047 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00006048 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00006049 if (getTriple().getOS() == llvm::Triple::NetBSD ||
6050 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00006051 WCharType = SignedInt;
6052
6053 // NetBSD apparently prefers consistency across ARM targets to consistency
6054 // across 64-bit targets.
6055 Int64Type = SignedLongLong;
6056 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006057 } else {
6058 WCharType = UnsignedInt;
6059 Int64Type = SignedLong;
6060 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00006061 }
6062
Tim Northovera2ee4332014-03-29 15:09:45 +00006063 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006064 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00006065 MaxAtomicInlineWidth = 128;
6066 MaxAtomicPromoteWidth = 128;
6067
Tim Northovera6a19f12015-02-06 01:25:07 +00006068 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006069 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006070
Tim Northovera2ee4332014-03-29 15:09:45 +00006071 // {} in inline assembly are neon specifiers, not assembly variant
6072 // specifiers.
6073 NoAsmVariants = true;
6074
Tim Northover7ad87af2015-01-16 18:44:04 +00006075 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6076 // contributes to the alignment of the containing aggregate in the same way
6077 // a plain (non bit-field) member of that type would, without exception for
6078 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006079 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006080 UseZeroLengthBitfieldAlignment = true;
6081
Tim Northover573cbee2014-05-24 12:52:07 +00006082 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006083 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006084
Eric Christopherfb834a82017-02-28 17:22:05 +00006085 if (Triple.getOS() == llvm::Triple::Linux)
6086 this->MCountName = "\01_mcount";
6087 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006088 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006089 }
6090
Alp Toker4925ba72014-06-07 23:30:42 +00006091 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006092 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006093 if (Name != "aapcs" && Name != "darwinpcs")
6094 return false;
6095
6096 ABI = Name;
6097 return true;
6098 }
6099
David Blaikie1cbb9712014-11-14 19:09:44 +00006100 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006101 return Name == "generic" ||
6102 llvm::AArch64::parseCPUArch(Name) !=
6103 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006104 }
6105
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006106 void getTargetDefines(const LangOptions &Opts,
6107 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006108 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006109 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006110
6111 // Target properties.
6112 Builder.defineMacro("_LP64");
6113 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006114
6115 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6116 Builder.defineMacro("__ARM_ACLE", "200");
6117 Builder.defineMacro("__ARM_ARCH", "8");
6118 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6119
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006120 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006121 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006122 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006123
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006124 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6125 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6126 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6127 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006128 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006129 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6130 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006131
6132 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6133
6134 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006135 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006136
6137 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6138 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006139 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6140 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006141
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006142 if (Opts.UnsafeFPMath)
6143 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006144
6145 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6146
6147 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6148 Opts.ShortEnums ? "1" : "4");
6149
James Molloy75f5f9e2014-04-16 15:33:48 +00006150 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006151 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006152 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006153 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006154 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006155
Bradley Smith418c5932014-05-02 15:17:51 +00006156 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006157 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006158
James Molloy75f5f9e2014-04-16 15:33:48 +00006159 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006160 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6161
6162 if (Unaligned)
6163 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006164
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006165 if (V8_1A)
6166 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6167
Reid Klecknerd167d422015-05-06 15:31:46 +00006168 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6169 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6170 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6171 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6172 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006173 }
6174
Craig Topper6c03a542015-10-19 04:51:35 +00006175 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6176 return llvm::makeArrayRef(BuiltinInfo,
6177 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006178 }
6179
David Blaikie1cbb9712014-11-14 19:09:44 +00006180 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006181 return Feature == "aarch64" ||
6182 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006183 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006184 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006185 }
6186
James Molloy5e73df52014-04-16 15:06:20 +00006187 bool handleTargetFeatures(std::vector<std::string> &Features,
6188 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006189 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006190 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006191 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006192 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006193 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006194
Eric Christopher610fe112015-08-26 08:21:55 +00006195 for (const auto &Feature : Features) {
6196 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006197 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006198 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006199 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006200 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006201 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006202 if (Feature == "+strict-align")
6203 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006204 if (Feature == "+v8.1a")
6205 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006206 }
6207
James Y Knightb214cbc2016-03-04 19:00:41 +00006208 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006209
6210 return true;
6211 }
6212
John McCall477f2bb2016-03-03 06:39:32 +00006213 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6214 switch (CC) {
6215 case CC_C:
6216 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006217 case CC_PreserveMost:
6218 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006219 return CCCR_OK;
6220 default:
6221 return CCCR_Warning;
6222 }
6223 }
6224
David Blaikie1cbb9712014-11-14 19:09:44 +00006225 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006226
David Blaikie1cbb9712014-11-14 19:09:44 +00006227 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006228 return TargetInfo::AArch64ABIBuiltinVaList;
6229 }
6230
Craig Topperf054e3a2015-10-19 03:52:27 +00006231 ArrayRef<const char *> getGCCRegNames() const override;
6232 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006233
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006234 bool validateAsmConstraint(const char *&Name,
6235 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006236 switch (*Name) {
6237 default:
6238 return false;
6239 case 'w': // Floating point and SIMD registers (V0-V31)
6240 Info.setAllowsRegister();
6241 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006242 case 'I': // Constant that can be used with an ADD instruction
6243 case 'J': // Constant that can be used with a SUB instruction
6244 case 'K': // Constant that can be used with a 32-bit logical instruction
6245 case 'L': // Constant that can be used with a 64-bit logical instruction
6246 case 'M': // Constant that can be used as a 32-bit MOV immediate
6247 case 'N': // Constant that can be used as a 64-bit MOV immediate
6248 case 'Y': // Floating point constant zero
6249 case 'Z': // Integer constant zero
6250 return true;
6251 case 'Q': // A memory reference with base register and no offset
6252 Info.setAllowsMemory();
6253 return true;
6254 case 'S': // A symbolic address
6255 Info.setAllowsRegister();
6256 return true;
6257 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006258 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6259 // Utf: A memory address suitable for ldp/stp in TF mode.
6260 // Usa: An absolute symbolic address.
6261 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6262 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006263 case 'z': // Zero register, wzr or xzr
6264 Info.setAllowsRegister();
6265 return true;
6266 case 'x': // Floating point and SIMD registers (V0-V15)
6267 Info.setAllowsRegister();
6268 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006269 }
6270 return false;
6271 }
6272
Akira Hatanaka987f1862014-08-22 06:05:21 +00006273 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006274 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006275 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006276 // Strip off constraint modifiers.
6277 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6278 Constraint = Constraint.substr(1);
6279
6280 switch (Constraint[0]) {
6281 default:
6282 return true;
6283 case 'z':
6284 case 'r': {
6285 switch (Modifier) {
6286 case 'x':
6287 case 'w':
6288 // For now assume that the person knows what they're
6289 // doing with the modifier.
6290 return true;
6291 default:
6292 // By default an 'r' constraint will be in the 'x'
6293 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006294 if (Size == 64)
6295 return true;
6296
6297 SuggestedModifier = "w";
6298 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006299 }
6300 }
6301 }
6302 }
6303
David Blaikie1cbb9712014-11-14 19:09:44 +00006304 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006305
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006306 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006307 if (RegNo == 0)
6308 return 0;
6309 if (RegNo == 1)
6310 return 1;
6311 return -1;
6312 }
6313};
6314
Tim Northover573cbee2014-05-24 12:52:07 +00006315const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006316 // 32-bit Integer registers
6317 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6318 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6319 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6320
6321 // 64-bit Integer registers
6322 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6323 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6324 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6325
6326 // 32-bit floating point regsisters
6327 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6328 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6329 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6330
6331 // 64-bit floating point regsisters
6332 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6333 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6334 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6335
6336 // Vector registers
6337 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6338 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6339 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6340};
6341
Craig Topperf054e3a2015-10-19 03:52:27 +00006342ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6343 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006344}
6345
Tim Northover573cbee2014-05-24 12:52:07 +00006346const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006347 { { "w31" }, "wsp" },
6348 { { "x29" }, "fp" },
6349 { { "x30" }, "lr" },
6350 { { "x31" }, "sp" },
6351 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6352 // don't want to substitute one of these for a different-sized one.
6353};
6354
Craig Topperf054e3a2015-10-19 03:52:27 +00006355ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6356 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006357}
6358
Tim Northover573cbee2014-05-24 12:52:07 +00006359const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006360#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006361 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006362#include "clang/Basic/BuiltinsNEON.def"
6363
6364#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006365 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006366#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006367};
James Molloy5e73df52014-04-16 15:06:20 +00006368
Tim Northover573cbee2014-05-24 12:52:07 +00006369class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006370 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006371 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006372 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006373 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006374 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006375 }
6376
6377public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006378 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6379 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006380 }
James Molloy5e73df52014-04-16 15:06:20 +00006381 void getTargetDefines(const LangOptions &Opts,
6382 MacroBuilder &Builder) const override {
6383 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006384 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006385 }
6386};
6387
Tim Northover573cbee2014-05-24 12:52:07 +00006388class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006389 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006390 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006391 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006392 }
6393
6394public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006395 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6396 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006397 void getTargetDefines(const LangOptions &Opts,
6398 MacroBuilder &Builder) const override {
6399 Builder.defineMacro("__AARCH64EB__");
6400 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6401 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006402 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006403 }
6404};
Tim Northovera2ee4332014-03-29 15:09:45 +00006405
Tim Northover573cbee2014-05-24 12:52:07 +00006406class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006407protected:
6408 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6409 MacroBuilder &Builder) const override {
6410 Builder.defineMacro("__AARCH64_SIMD__");
6411 Builder.defineMacro("__ARM64_ARCH_8__");
6412 Builder.defineMacro("__ARM_NEON__");
6413 Builder.defineMacro("__LITTLE_ENDIAN__");
6414 Builder.defineMacro("__REGISTER_PREFIX__", "");
6415 Builder.defineMacro("__arm64", "1");
6416 Builder.defineMacro("__arm64__", "1");
6417
6418 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6419 }
6420
Tim Northovera2ee4332014-03-29 15:09:45 +00006421public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006422 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6423 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006424 Int64Type = SignedLongLong;
6425 WCharType = SignedInt;
6426 UseSignedCharForObjCBool = false;
6427
Tim Northovera6a19f12015-02-06 01:25:07 +00006428 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006429 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006430
6431 TheCXXABI.set(TargetCXXABI::iOS64);
6432 }
6433
David Blaikie1cbb9712014-11-14 19:09:44 +00006434 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006435 return TargetInfo::CharPtrBuiltinVaList;
6436 }
6437};
Tim Northovera2ee4332014-03-29 15:09:45 +00006438
Tony Linthicum76329bf2011-12-12 21:14:55 +00006439// Hexagon abstract base class
6440class HexagonTargetInfo : public TargetInfo {
6441 static const Builtin::Info BuiltinInfo[];
6442 static const char * const GCCRegNames[];
6443 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6444 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006445 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006446 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006447
Tony Linthicum76329bf2011-12-12 21:14:55 +00006448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006449 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6450 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006451 // Specify the vector alignment explicitly. For v512x1, the calculated
6452 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6453 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006454 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006455 "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 +00006456 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 SizeType = UnsignedInt;
6458 PtrDiffType = SignedInt;
6459 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006460
6461 // {} in inline assembly are packet specifiers, not assembly variant
6462 // specifiers.
6463 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006464
6465 LargeArrayMinWidth = 64;
6466 LargeArrayAlign = 64;
6467 UseBitFieldTypeAlignment = true;
6468 ZeroLengthBitfieldBoundary = 32;
6469 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006470 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006471 }
6472
Craig Topper6c03a542015-10-19 04:51:35 +00006473 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6474 return llvm::makeArrayRef(BuiltinInfo,
6475 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006476 }
6477
Craig Topper3164f332014-03-11 03:39:26 +00006478 bool validateAsmConstraint(const char *&Name,
6479 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006480 switch (*Name) {
6481 case 'v':
6482 case 'q':
6483 if (HasHVX) {
6484 Info.setAllowsRegister();
6485 return true;
6486 }
6487 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006488 case 's':
6489 // Relocatable constant.
6490 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006491 }
6492 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006493 }
6494
Craig Topper3164f332014-03-11 03:39:26 +00006495 void getTargetDefines(const LangOptions &Opts,
6496 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006497
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006498 bool isCLZForZeroUndef() const override { return false; }
6499
Craig Topper3164f332014-03-11 03:39:26 +00006500 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006501 return llvm::StringSwitch<bool>(Feature)
6502 .Case("hexagon", true)
6503 .Case("hvx", HasHVX)
6504 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006505 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006506 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006507 }
Craig Topper3164f332014-03-11 03:39:26 +00006508
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006509 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6510 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6511 const override;
6512
6513 bool handleTargetFeatures(std::vector<std::string> &Features,
6514 DiagnosticsEngine &Diags) override;
6515
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006516 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6517 bool Enabled) const override;
6518
Craig Topper3164f332014-03-11 03:39:26 +00006519 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006520 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006521 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006522 ArrayRef<const char *> getGCCRegNames() const override;
6523 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006524 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006525 return "";
6526 }
Sebastian Pop86500282012-01-13 20:37:10 +00006527
6528 static const char *getHexagonCPUSuffix(StringRef Name) {
6529 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006530 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006531 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006532 .Case("hexagonv55", "55")
6533 .Case("hexagonv60", "60")
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006534 .Case("hexagonv62", "62")
Craig Topperf1186c52014-05-08 06:41:40 +00006535 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006536 }
6537
Craig Topper3164f332014-03-11 03:39:26 +00006538 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006539 if (!getHexagonCPUSuffix(Name))
6540 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006541 CPU = Name;
6542 return true;
6543 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544
6545 int getEHDataRegisterNumber(unsigned RegNo) const override {
6546 return RegNo < 2 ? RegNo : -1;
6547 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006548};
6549
6550void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006551 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006552 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006553 Builder.defineMacro("__hexagon__", "1");
6554
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006555 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006556 Builder.defineMacro("__HEXAGON_V4__");
6557 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006559 Builder.defineMacro("__QDSP6_V4__");
6560 Builder.defineMacro("__QDSP6_ARCH__", "4");
6561 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006562 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006563 Builder.defineMacro("__HEXAGON_V5__");
6564 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6565 if(Opts.HexagonQdsp6Compat) {
6566 Builder.defineMacro("__QDSP6_V5__");
6567 Builder.defineMacro("__QDSP6_ARCH__", "5");
6568 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006569 } else if (CPU == "hexagonv55") {
6570 Builder.defineMacro("__HEXAGON_V55__");
6571 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6572 Builder.defineMacro("__QDSP6_V55__");
6573 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006574 } else if (CPU == "hexagonv60") {
6575 Builder.defineMacro("__HEXAGON_V60__");
6576 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6577 Builder.defineMacro("__QDSP6_V60__");
6578 Builder.defineMacro("__QDSP6_ARCH__", "60");
Krzysztof Parzyszekff7f6672017-03-14 20:29:23 +00006579 } else if (CPU == "hexagonv62") {
6580 Builder.defineMacro("__HEXAGON_V62__");
6581 Builder.defineMacro("__HEXAGON_ARCH__", "62");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006582 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006583
6584 if (hasFeature("hvx")) {
6585 Builder.defineMacro("__HVX__");
6586 if (hasFeature("hvx-double"))
6587 Builder.defineMacro("__HVXDBL__");
6588 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006589}
6590
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006591bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6592 DiagnosticsEngine &Diags, StringRef CPU,
6593 const std::vector<std::string> &FeaturesVec) const {
6594 // Default for v60: -hvx, -hvx-double.
6595 Features["hvx"] = false;
6596 Features["hvx-double"] = false;
6597 Features["long-calls"] = false;
6598
6599 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6600}
6601
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006602bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6603 DiagnosticsEngine &Diags) {
6604 for (auto &F : Features) {
6605 if (F == "+hvx")
6606 HasHVX = true;
6607 else if (F == "-hvx")
6608 HasHVX = HasHVXDouble = false;
6609 else if (F == "+hvx-double")
6610 HasHVX = HasHVXDouble = true;
6611 else if (F == "-hvx-double")
6612 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006613
6614 if (F == "+long-calls")
6615 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006616 else if (F == "-long-calls")
6617 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006618 }
6619 return true;
6620}
6621
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006622void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6623 StringRef Name, bool Enabled) const {
6624 if (Enabled) {
6625 if (Name == "hvx-double")
6626 Features["hvx"] = true;
6627 } else {
6628 if (Name == "hvx")
6629 Features["hvx-double"] = false;
6630 }
6631 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006632}
6633
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006634const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006635 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6636 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6637 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6638 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6639 "p0", "p1", "p2", "p3",
6640 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6641};
6642
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006643ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006644 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006645}
6646
Tony Linthicum76329bf2011-12-12 21:14:55 +00006647const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6648 { { "sp" }, "r29" },
6649 { { "fp" }, "r30" },
6650 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006651};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006652
Craig Topperf054e3a2015-10-19 03:52:27 +00006653ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6654 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006655}
6656
6657
6658const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006659#define BUILTIN(ID, TYPE, ATTRS) \
6660 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6661#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6662 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006663#include "clang/Basic/BuiltinsHexagon.def"
6664};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006665
Jacques Pienaard964cc22016-03-28 21:02:54 +00006666class LanaiTargetInfo : public TargetInfo {
6667 // Class for Lanai (32-bit).
6668 // The CPU profiles supported by the Lanai backend
6669 enum CPUKind {
6670 CK_NONE,
6671 CK_V11,
6672 } CPU;
6673
6674 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6675 static const char *const GCCRegNames[];
6676
6677public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006678 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6679 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006680 // Description string has to be kept in sync with backend.
6681 resetDataLayout("E" // Big endian
6682 "-m:e" // ELF name manging
6683 "-p:32:32" // 32 bit pointers, 32 bit aligned
6684 "-i64:64" // 64 bit integers, 64 bit aligned
6685 "-a:0:32" // 32 bit alignment of objects of aggregate type
6686 "-n32" // 32 bit native integer width
6687 "-S64" // 64 bit natural stack alignment
6688 );
6689
6690 // Setting RegParmMax equal to what mregparm was set to in the old
6691 // toolchain
6692 RegParmMax = 4;
6693
6694 // Set the default CPU to V11
6695 CPU = CK_V11;
6696
6697 // Temporary approach to make everything at least word-aligned and allow for
6698 // safely casting between pointers with different alignment requirements.
6699 // TODO: Remove this when there are no more cast align warnings on the
6700 // firmware.
6701 MinGlobalAlign = 32;
6702 }
6703
6704 void getTargetDefines(const LangOptions &Opts,
6705 MacroBuilder &Builder) const override {
6706 // Define __lanai__ when building for target lanai.
6707 Builder.defineMacro("__lanai__");
6708
6709 // Set define for the CPU specified.
6710 switch (CPU) {
6711 case CK_V11:
6712 Builder.defineMacro("__LANAI_V11__");
6713 break;
6714 case CK_NONE:
6715 llvm_unreachable("Unhandled target CPU");
6716 }
6717 }
6718
6719 bool setCPU(const std::string &Name) override {
6720 CPU = llvm::StringSwitch<CPUKind>(Name)
6721 .Case("v11", CK_V11)
6722 .Default(CK_NONE);
6723
6724 return CPU != CK_NONE;
6725 }
6726
6727 bool hasFeature(StringRef Feature) const override {
6728 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6729 }
6730
6731 ArrayRef<const char *> getGCCRegNames() const override;
6732
6733 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6734
6735 BuiltinVaListKind getBuiltinVaListKind() const override {
6736 return TargetInfo::VoidPtrBuiltinVaList;
6737 }
6738
6739 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6740
6741 bool validateAsmConstraint(const char *&Name,
6742 TargetInfo::ConstraintInfo &info) const override {
6743 return false;
6744 }
6745
6746 const char *getClobbers() const override { return ""; }
6747};
6748
6749const char *const LanaiTargetInfo::GCCRegNames[] = {
6750 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6751 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6752 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6753
6754ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6755 return llvm::makeArrayRef(GCCRegNames);
6756}
6757
6758const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6759 {{"pc"}, "r2"},
6760 {{"sp"}, "r4"},
6761 {{"fp"}, "r5"},
6762 {{"rv"}, "r8"},
6763 {{"rr1"}, "r10"},
6764 {{"rr2"}, "r11"},
6765 {{"rca"}, "r15"},
6766};
6767
6768ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6769 return llvm::makeArrayRef(GCCRegAliases);
6770}
6771
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006772// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6773class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006774 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6775 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006776 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006777public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006778 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006779 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006780
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006781 int getEHDataRegisterNumber(unsigned RegNo) const override {
6782 if (RegNo == 0) return 24;
6783 if (RegNo == 1) return 25;
6784 return -1;
6785 }
6786
Craig Topper3164f332014-03-11 03:39:26 +00006787 bool handleTargetFeatures(std::vector<std::string> &Features,
6788 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006789 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006790 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6791 if (Feature != Features.end()) {
6792 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006793 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006794 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006795 }
Craig Topper3164f332014-03-11 03:39:26 +00006796 void getTargetDefines(const LangOptions &Opts,
6797 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006798 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006799 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006800
6801 if (SoftFloat)
6802 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006803 }
Craig Topper3164f332014-03-11 03:39:26 +00006804
6805 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006806 return llvm::StringSwitch<bool>(Feature)
6807 .Case("softfloat", SoftFloat)
6808 .Case("sparc", true)
6809 .Default(false);
6810 }
Craig Topper3164f332014-03-11 03:39:26 +00006811
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006812 bool hasSjLjLowering() const override {
6813 return true;
6814 }
6815
Craig Topper6c03a542015-10-19 04:51:35 +00006816 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006817 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006818 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006819 }
Craig Topper3164f332014-03-11 03:39:26 +00006820 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006821 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006822 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006823 ArrayRef<const char *> getGCCRegNames() const override;
6824 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006825 bool validateAsmConstraint(const char *&Name,
6826 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006827 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006828 switch (*Name) {
6829 case 'I': // Signed 13-bit constant
6830 case 'J': // Zero
6831 case 'K': // 32-bit constant with the low 12 bits clear
6832 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6833 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6834 case 'N': // Same as 'K' but zext (required for SIMode)
6835 case 'O': // The constant 4096
6836 return true;
6837 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006838 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006839 }
Craig Topper3164f332014-03-11 03:39:26 +00006840 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006841 // FIXME: Implement!
6842 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006843 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006844
6845 // No Sparc V7 for now, the backend doesn't support it anyway.
6846 enum CPUKind {
6847 CK_GENERIC,
6848 CK_V8,
6849 CK_SUPERSPARC,
6850 CK_SPARCLITE,
6851 CK_F934,
6852 CK_HYPERSPARC,
6853 CK_SPARCLITE86X,
6854 CK_SPARCLET,
6855 CK_TSC701,
6856 CK_V9,
6857 CK_ULTRASPARC,
6858 CK_ULTRASPARC3,
6859 CK_NIAGARA,
6860 CK_NIAGARA2,
6861 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006862 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006863 CK_MYRIAD2100,
6864 CK_MYRIAD2150,
6865 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006866 CK_LEON2,
6867 CK_LEON2_AT697E,
6868 CK_LEON2_AT697F,
6869 CK_LEON3,
6870 CK_LEON3_UT699,
6871 CK_LEON3_GR712RC,
6872 CK_LEON4,
6873 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006874 } CPU = CK_GENERIC;
6875
6876 enum CPUGeneration {
6877 CG_V8,
6878 CG_V9,
6879 };
6880
6881 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6882 switch (Kind) {
6883 case CK_GENERIC:
6884 case CK_V8:
6885 case CK_SUPERSPARC:
6886 case CK_SPARCLITE:
6887 case CK_F934:
6888 case CK_HYPERSPARC:
6889 case CK_SPARCLITE86X:
6890 case CK_SPARCLET:
6891 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006892 case CK_MYRIAD2100:
6893 case CK_MYRIAD2150:
6894 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006895 case CK_LEON2:
6896 case CK_LEON2_AT697E:
6897 case CK_LEON2_AT697F:
6898 case CK_LEON3:
6899 case CK_LEON3_UT699:
6900 case CK_LEON3_GR712RC:
6901 case CK_LEON4:
6902 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006903 return CG_V8;
6904 case CK_V9:
6905 case CK_ULTRASPARC:
6906 case CK_ULTRASPARC3:
6907 case CK_NIAGARA:
6908 case CK_NIAGARA2:
6909 case CK_NIAGARA3:
6910 case CK_NIAGARA4:
6911 return CG_V9;
6912 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006913 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006914 }
6915
6916 CPUKind getCPUKind(StringRef Name) const {
6917 return llvm::StringSwitch<CPUKind>(Name)
6918 .Case("v8", CK_V8)
6919 .Case("supersparc", CK_SUPERSPARC)
6920 .Case("sparclite", CK_SPARCLITE)
6921 .Case("f934", CK_F934)
6922 .Case("hypersparc", CK_HYPERSPARC)
6923 .Case("sparclite86x", CK_SPARCLITE86X)
6924 .Case("sparclet", CK_SPARCLET)
6925 .Case("tsc701", CK_TSC701)
6926 .Case("v9", CK_V9)
6927 .Case("ultrasparc", CK_ULTRASPARC)
6928 .Case("ultrasparc3", CK_ULTRASPARC3)
6929 .Case("niagara", CK_NIAGARA)
6930 .Case("niagara2", CK_NIAGARA2)
6931 .Case("niagara3", CK_NIAGARA3)
6932 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006933 .Case("ma2100", CK_MYRIAD2100)
6934 .Case("ma2150", CK_MYRIAD2150)
6935 .Case("ma2450", CK_MYRIAD2450)
6936 // FIXME: the myriad2[.n] spellings are obsolete,
6937 // but a grace period is needed to allow updating dependent builds.
6938 .Case("myriad2", CK_MYRIAD2100)
6939 .Case("myriad2.1", CK_MYRIAD2100)
6940 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006941 .Case("leon2", CK_LEON2)
6942 .Case("at697e", CK_LEON2_AT697E)
6943 .Case("at697f", CK_LEON2_AT697F)
6944 .Case("leon3", CK_LEON3)
6945 .Case("ut699", CK_LEON3_UT699)
6946 .Case("gr712rc", CK_LEON3_GR712RC)
6947 .Case("leon4", CK_LEON4)
6948 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006949 .Default(CK_GENERIC);
6950 }
6951
6952 bool setCPU(const std::string &Name) override {
6953 CPU = getCPUKind(Name);
6954 return CPU != CK_GENERIC;
6955 }
Gabor Greif49991682008-02-21 16:29:08 +00006956};
6957
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006958const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006959 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6960 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6961 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6962 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6963};
6964
Craig Topperf054e3a2015-10-19 03:52:27 +00006965ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6966 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006967}
6968
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006969const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006970 { { "g0" }, "r0" },
6971 { { "g1" }, "r1" },
6972 { { "g2" }, "r2" },
6973 { { "g3" }, "r3" },
6974 { { "g4" }, "r4" },
6975 { { "g5" }, "r5" },
6976 { { "g6" }, "r6" },
6977 { { "g7" }, "r7" },
6978 { { "o0" }, "r8" },
6979 { { "o1" }, "r9" },
6980 { { "o2" }, "r10" },
6981 { { "o3" }, "r11" },
6982 { { "o4" }, "r12" },
6983 { { "o5" }, "r13" },
6984 { { "o6", "sp" }, "r14" },
6985 { { "o7" }, "r15" },
6986 { { "l0" }, "r16" },
6987 { { "l1" }, "r17" },
6988 { { "l2" }, "r18" },
6989 { { "l3" }, "r19" },
6990 { { "l4" }, "r20" },
6991 { { "l5" }, "r21" },
6992 { { "l6" }, "r22" },
6993 { { "l7" }, "r23" },
6994 { { "i0" }, "r24" },
6995 { { "i1" }, "r25" },
6996 { { "i2" }, "r26" },
6997 { { "i3" }, "r27" },
6998 { { "i4" }, "r28" },
6999 { { "i5" }, "r29" },
7000 { { "i6", "fp" }, "r30" },
7001 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00007002};
7003
Craig Topperf054e3a2015-10-19 03:52:27 +00007004ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
7005 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00007006}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007007
7008// SPARC v8 is the 32-bit mode selected by Triple::sparc.
7009class SparcV8TargetInfo : public SparcTargetInfo {
7010public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007011 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7012 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007013 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00007014 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
7015 switch (getTriple().getOS()) {
7016 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00007017 SizeType = UnsignedInt;
7018 IntPtrType = SignedInt;
7019 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00007020 break;
7021 case llvm::Triple::NetBSD:
7022 case llvm::Triple::OpenBSD:
7023 SizeType = UnsignedLong;
7024 IntPtrType = SignedLong;
7025 PtrDiffType = SignedLong;
7026 break;
Brad Smith56495d52015-08-13 22:00:53 +00007027 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00007028 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
7029 // on up to 64 bits.
7030 MaxAtomicPromoteWidth = 64;
7031 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007032 }
7033
Craig Topper3164f332014-03-11 03:39:26 +00007034 void getTargetDefines(const LangOptions &Opts,
7035 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007036 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007037 switch (getCPUGeneration(CPU)) {
7038 case CG_V8:
7039 Builder.defineMacro("__sparcv8");
7040 if (getTriple().getOS() != llvm::Triple::Solaris)
7041 Builder.defineMacro("__sparcv8__");
7042 break;
7043 case CG_V9:
7044 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007045 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007046 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00007047 Builder.defineMacro("__sparc_v9__");
7048 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007049 break;
7050 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00007051 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007052 std::string MyriadArchValue, Myriad2Value;
7053 Builder.defineMacro("__sparc_v8__");
7054 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00007055 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00007056 case CK_MYRIAD2150:
7057 MyriadArchValue = "__ma2150";
7058 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007059 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00007060 case CK_MYRIAD2450:
7061 MyriadArchValue = "__ma2450";
7062 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007063 break;
7064 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00007065 MyriadArchValue = "__ma2100";
7066 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00007067 break;
7068 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00007069 Builder.defineMacro(MyriadArchValue, "1");
7070 Builder.defineMacro(MyriadArchValue+"__", "1");
7071 Builder.defineMacro("__myriad2__", Myriad2Value);
7072 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00007073 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007074 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007075
7076 bool hasSjLjLowering() const override {
7077 return true;
7078 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007079};
7080
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007081// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7082class SparcV8elTargetInfo : public SparcV8TargetInfo {
7083 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007084 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7085 : SparcV8TargetInfo(Triple, Opts) {
7086 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007087 }
7088};
7089
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007090// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7091class SparcV9TargetInfo : public SparcTargetInfo {
7092public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007093 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7094 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007095 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007096 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007097 // This is an LP64 platform.
7098 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007099
7100 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007101 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007102 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007103 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007104 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007105 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007106
7107 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7108 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7109 LongDoubleWidth = 128;
7110 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007111 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007112 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007113 }
7114
Craig Topper3164f332014-03-11 03:39:26 +00007115 void getTargetDefines(const LangOptions &Opts,
7116 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007117 SparcTargetInfo::getTargetDefines(Opts, Builder);
7118 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007119 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007120 // Solaris doesn't need these variants, but the BSDs do.
7121 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007122 Builder.defineMacro("__sparc64__");
7123 Builder.defineMacro("__sparc_v9__");
7124 Builder.defineMacro("__sparcv9__");
7125 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007126 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007127
Craig Topper3164f332014-03-11 03:39:26 +00007128 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007129 if (!SparcTargetInfo::setCPU(Name))
7130 return false;
7131 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007132 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007133};
7134
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007135class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007136 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007137 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007138 std::string CPU;
7139 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007140 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007141
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007142public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007143 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007144 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7145 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007146 IntMaxType = SignedLong;
7147 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007148 TLSSupported = true;
7149 IntWidth = IntAlign = 32;
7150 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7151 PointerWidth = PointerAlign = 64;
7152 LongDoubleWidth = 128;
7153 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007154 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007155 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007156 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007157 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 +00007158 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7159 }
7160 void getTargetDefines(const LangOptions &Opts,
7161 MacroBuilder &Builder) const override {
7162 Builder.defineMacro("__s390__");
7163 Builder.defineMacro("__s390x__");
7164 Builder.defineMacro("__zarch__");
7165 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007166
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007167 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7168 .Cases("arch8", "z10", "8")
7169 .Cases("arch9", "z196", "9")
7170 .Cases("arch10", "zEC12", "10")
7171 .Cases("arch11", "z13", "11")
7172 .Default("");
7173 if (!ISARev.empty())
7174 Builder.defineMacro("__ARCH__", ISARev);
7175
Ulrich Weigandb038a522016-02-05 21:34:28 +00007176 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7177 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7178 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7179 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7180
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007181 if (HasTransactionalExecution)
7182 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007183 if (HasVector)
7184 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007185 if (Opts.ZVector)
7186 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007187 }
Craig Topper6c03a542015-10-19 04:51:35 +00007188 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7189 return llvm::makeArrayRef(BuiltinInfo,
7190 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007191 }
7192
Craig Topperf054e3a2015-10-19 03:52:27 +00007193 ArrayRef<const char *> getGCCRegNames() const override;
7194 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007195 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007196 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007197 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007198 bool validateAsmConstraint(const char *&Name,
7199 TargetInfo::ConstraintInfo &info) const override;
7200 const char *getClobbers() const override {
7201 // FIXME: Is this really right?
7202 return "";
7203 }
7204 BuiltinVaListKind getBuiltinVaListKind() const override {
7205 return TargetInfo::SystemZBuiltinVaList;
7206 }
7207 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007208 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007209 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7210 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007211 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007212 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007213 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007214 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007215 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007216 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007217 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007218 .Default(false);
7219
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007220 return CPUKnown;
7221 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007222 bool
7223 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7224 StringRef CPU,
7225 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007226 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007227 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007228 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007229 Features["transactional-execution"] = true;
7230 Features["vector"] = true;
7231 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007232 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007233 }
7234
7235 bool handleTargetFeatures(std::vector<std::string> &Features,
7236 DiagnosticsEngine &Diags) override {
7237 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007238 for (const auto &Feature : Features) {
7239 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007240 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007241 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007242 HasVector = true;
7243 }
7244 // If we use the vector ABI, vector types are 64-bit aligned.
7245 if (HasVector) {
7246 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007247 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7248 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007249 }
7250 return true;
7251 }
7252
7253 bool hasFeature(StringRef Feature) const override {
7254 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007255 .Case("systemz", true)
7256 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007257 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007258 .Default(false);
7259 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007260
Bryan Chane3f1ed52016-04-28 13:56:43 +00007261 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7262 switch (CC) {
7263 case CC_C:
7264 case CC_Swift:
7265 return CCCR_OK;
7266 default:
7267 return CCCR_Warning;
7268 }
7269 }
7270
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007271 StringRef getABI() const override {
7272 if (HasVector)
7273 return "vector";
7274 return "";
7275 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007276
7277 bool useFloat128ManglingForLongDouble() const override {
7278 return true;
7279 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007280};
7281
7282const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7283#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007284 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007285#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7286 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007287#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007288};
7289
7290const char *const SystemZTargetInfo::GCCRegNames[] = {
7291 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7292 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7293 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7294 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7295};
7296
Craig Topperf054e3a2015-10-19 03:52:27 +00007297ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7298 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007299}
7300
7301bool SystemZTargetInfo::
7302validateAsmConstraint(const char *&Name,
7303 TargetInfo::ConstraintInfo &Info) const {
7304 switch (*Name) {
7305 default:
7306 return false;
7307
7308 case 'a': // Address register
7309 case 'd': // Data register (equivalent to 'r')
7310 case 'f': // Floating-point register
7311 Info.setAllowsRegister();
7312 return true;
7313
7314 case 'I': // Unsigned 8-bit constant
7315 case 'J': // Unsigned 12-bit constant
7316 case 'K': // Signed 16-bit constant
7317 case 'L': // Signed 20-bit displacement (on all targets we support)
7318 case 'M': // 0x7fffffff
7319 return true;
7320
7321 case 'Q': // Memory with base and unsigned 12-bit displacement
7322 case 'R': // Likewise, plus an index
7323 case 'S': // Memory with base and signed 20-bit displacement
7324 case 'T': // Likewise, plus an index
7325 Info.setAllowsMemory();
7326 return true;
7327 }
7328}
Ulrich Weigand47445072013-05-06 16:26:41 +00007329
Eric Christopherc48497a2015-09-18 21:26:24 +00007330class MSP430TargetInfo : public TargetInfo {
7331 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007332
Eric Christopherc48497a2015-09-18 21:26:24 +00007333public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007334 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7335 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007336 TLSSupported = false;
7337 IntWidth = 16;
7338 IntAlign = 16;
7339 LongWidth = 32;
7340 LongLongWidth = 64;
7341 LongAlign = LongLongAlign = 16;
7342 PointerWidth = 16;
7343 PointerAlign = 16;
7344 SuitableAlign = 16;
7345 SizeType = UnsignedInt;
7346 IntMaxType = SignedLongLong;
7347 IntPtrType = SignedInt;
7348 PtrDiffType = SignedInt;
7349 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007350 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007351 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007352 void getTargetDefines(const LangOptions &Opts,
7353 MacroBuilder &Builder) const override {
7354 Builder.defineMacro("MSP430");
7355 Builder.defineMacro("__MSP430__");
7356 // FIXME: defines for different 'flavours' of MCU
7357 }
Craig Topper6c03a542015-10-19 04:51:35 +00007358 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007359 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007360 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007361 }
7362 bool hasFeature(StringRef Feature) const override {
7363 return Feature == "msp430";
7364 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007365 ArrayRef<const char *> getGCCRegNames() const override;
7366 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007367 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007368 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007369 }
7370 bool validateAsmConstraint(const char *&Name,
7371 TargetInfo::ConstraintInfo &info) const override {
7372 // FIXME: implement
7373 switch (*Name) {
7374 case 'K': // the constant 1
7375 case 'L': // constant -1^20 .. 1^19
7376 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007377 return true;
7378 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007379 // No target constraints for now.
7380 return false;
7381 }
7382 const char *getClobbers() const override {
7383 // FIXME: Is this really right?
7384 return "";
7385 }
7386 BuiltinVaListKind getBuiltinVaListKind() const override {
7387 // FIXME: implement
7388 return TargetInfo::CharPtrBuiltinVaList;
7389 }
7390};
7391
7392const char *const MSP430TargetInfo::GCCRegNames[] = {
7393 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7394 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7395
Craig Topperf054e3a2015-10-19 03:52:27 +00007396ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7397 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007398}
7399
7400// LLVM and Clang cannot be used directly to output native binaries for
7401// target, but is used to compile C code to llvm bitcode with correct
7402// type and alignment information.
7403//
7404// TCE uses the llvm bitcode as input and uses it for generating customized
7405// target processor and program binary. TCE co-design environment is
7406// publicly available in http://tce.cs.tut.fi
7407
7408static const unsigned TCEOpenCLAddrSpaceMap[] = {
7409 3, // opencl_global
7410 4, // opencl_local
7411 5, // opencl_constant
7412 // FIXME: generic has to be added to the target
7413 0, // opencl_generic
7414 0, // cuda_device
7415 0, // cuda_constant
7416 0 // cuda_shared
7417};
7418
7419class TCETargetInfo : public TargetInfo {
7420public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007421 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7422 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007423 TLSSupported = false;
7424 IntWidth = 32;
7425 LongWidth = LongLongWidth = 32;
7426 PointerWidth = 32;
7427 IntAlign = 32;
7428 LongAlign = LongLongAlign = 32;
7429 PointerAlign = 32;
7430 SuitableAlign = 32;
7431 SizeType = UnsignedInt;
7432 IntMaxType = SignedLong;
7433 IntPtrType = SignedInt;
7434 PtrDiffType = SignedInt;
7435 FloatWidth = 32;
7436 FloatAlign = 32;
7437 DoubleWidth = 32;
7438 DoubleAlign = 32;
7439 LongDoubleWidth = 32;
7440 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007441 FloatFormat = &llvm::APFloat::IEEEsingle();
7442 DoubleFormat = &llvm::APFloat::IEEEsingle();
7443 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007444 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7445 "i16:16:32-i32:32:32-i64:32:32-"
7446 "f32:32:32-f64:32:32-v64:32:32-"
7447 "v128:32:32-v256:32:32-v512:32:32-"
7448 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007449 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7450 UseAddrSpaceMapMangling = true;
7451 }
7452
7453 void getTargetDefines(const LangOptions &Opts,
7454 MacroBuilder &Builder) const override {
7455 DefineStd(Builder, "tce", Opts);
7456 Builder.defineMacro("__TCE__");
7457 Builder.defineMacro("__TCE_V1__");
7458 }
7459 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7460
Craig Topper6c03a542015-10-19 04:51:35 +00007461 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007462 const char *getClobbers() const override { return ""; }
7463 BuiltinVaListKind getBuiltinVaListKind() const override {
7464 return TargetInfo::VoidPtrBuiltinVaList;
7465 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007466 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007467 bool validateAsmConstraint(const char *&Name,
7468 TargetInfo::ConstraintInfo &info) const override {
7469 return true;
7470 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007471 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7472 return None;
7473 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007474};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007475
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007476class TCELETargetInfo : public TCETargetInfo {
7477public:
7478 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7479 : TCETargetInfo(Triple, Opts) {
7480 BigEndian = false;
7481
7482 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7483 "i16:16:32-i32:32:32-i64:32:32-"
7484 "f32:32:32-f64:32:32-v64:32:32-"
7485 "v128:32:32-v256:32:32-v512:32:32-"
7486 "v1024:32:32-a0:0:32-n32");
7487
7488 }
7489
7490 virtual void getTargetDefines(const LangOptions &Opts,
7491 MacroBuilder &Builder) const {
7492 DefineStd(Builder, "tcele", Opts);
7493 Builder.defineMacro("__TCE__");
7494 Builder.defineMacro("__TCE_V1__");
7495 Builder.defineMacro("__TCELE__");
7496 Builder.defineMacro("__TCELE_V1__");
7497 }
7498
7499};
7500
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007501class BPFTargetInfo : public TargetInfo {
7502public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007503 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7504 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007505 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7506 SizeType = UnsignedLong;
7507 PtrDiffType = SignedLong;
7508 IntPtrType = SignedLong;
7509 IntMaxType = SignedLong;
7510 Int64Type = SignedLong;
7511 RegParmMax = 5;
7512 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007513 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007514 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007515 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007516 }
7517 MaxAtomicPromoteWidth = 64;
7518 MaxAtomicInlineWidth = 64;
7519 TLSSupported = false;
7520 }
7521 void getTargetDefines(const LangOptions &Opts,
7522 MacroBuilder &Builder) const override {
7523 DefineStd(Builder, "bpf", Opts);
7524 Builder.defineMacro("__BPF__");
7525 }
7526 bool hasFeature(StringRef Feature) const override {
7527 return Feature == "bpf";
7528 }
7529
Craig Topper6c03a542015-10-19 04:51:35 +00007530 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007531 const char *getClobbers() const override {
7532 return "";
7533 }
7534 BuiltinVaListKind getBuiltinVaListKind() const override {
7535 return TargetInfo::VoidPtrBuiltinVaList;
7536 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007537 ArrayRef<const char *> getGCCRegNames() const override {
7538 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007539 }
7540 bool validateAsmConstraint(const char *&Name,
7541 TargetInfo::ConstraintInfo &info) const override {
7542 return true;
7543 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007544 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7545 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007546 }
7547};
7548
Daniel Sanders4672af62016-05-27 11:51:02 +00007549class MipsTargetInfo : public TargetInfo {
7550 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007551 StringRef Layout;
7552
7553 if (ABI == "o32")
7554 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7555 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007556 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007557 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007558 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007559 else
7560 llvm_unreachable("Invalid ABI");
7561
7562 if (BigEndian)
7563 resetDataLayout(("E-" + Layout).str());
7564 else
7565 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007566 }
7567
Akira Hatanaka9064e362013-10-29 18:30:33 +00007568
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007569 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007570 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007571 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007572 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007573 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007574 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007575 bool IsNoABICalls;
7576 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007577 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007578 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007579 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007580 enum DspRevEnum {
7581 NoDSP, DSP1, DSP2
7582 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007583 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007584
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007585protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007586 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007587 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007588
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007589public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007590 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007591 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007592 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7593 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7594 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007595 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007596
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007597 setABI((getTriple().getArch() == llvm::Triple::mips ||
7598 getTriple().getArch() == llvm::Triple::mipsel)
7599 ? "o32"
7600 : "n64");
7601
7602 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007603
7604 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7605 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007606 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007607
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007608 bool isNaN2008Default() const {
7609 return CPU == "mips32r6" || CPU == "mips64r6";
7610 }
7611
7612 bool isFP64Default() const {
7613 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7614 }
7615
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007616 bool isNan2008() const override {
7617 return IsNan2008;
7618 }
7619
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007620 bool processorSupportsGPR64() const {
7621 return llvm::StringSwitch<bool>(CPU)
7622 .Case("mips3", true)
7623 .Case("mips4", true)
7624 .Case("mips5", true)
7625 .Case("mips64", true)
7626 .Case("mips64r2", true)
7627 .Case("mips64r3", true)
7628 .Case("mips64r5", true)
7629 .Case("mips64r6", true)
7630 .Case("octeon", true)
7631 .Default(false);
7632 return false;
7633 }
7634
Alp Toker4925ba72014-06-07 23:30:42 +00007635 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007636 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007637 if (Name == "o32") {
7638 setO32ABITypes();
7639 ABI = Name;
7640 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007641 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007642
7643 if (Name == "n32") {
7644 setN32ABITypes();
7645 ABI = Name;
7646 return true;
7647 }
7648 if (Name == "n64") {
7649 setN64ABITypes();
7650 ABI = Name;
7651 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007652 }
7653 return false;
7654 }
7655
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007656 void setO32ABITypes() {
7657 Int64Type = SignedLongLong;
7658 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007659 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007660 LongDoubleWidth = LongDoubleAlign = 64;
7661 LongWidth = LongAlign = 32;
7662 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7663 PointerWidth = PointerAlign = 32;
7664 PtrDiffType = SignedInt;
7665 SizeType = UnsignedInt;
7666 SuitableAlign = 64;
7667 }
7668
7669 void setN32N64ABITypes() {
7670 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007671 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007672 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7673 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007674 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007675 }
7676 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7677 SuitableAlign = 128;
7678 }
7679
Daniel Sanders4672af62016-05-27 11:51:02 +00007680 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007681 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007682 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7683 Int64Type = SignedLongLong;
7684 } else {
7685 Int64Type = SignedLong;
7686 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007687 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007688 LongWidth = LongAlign = 64;
7689 PointerWidth = PointerAlign = 64;
7690 PtrDiffType = SignedLong;
7691 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007692 }
7693
7694 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007695 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007696 Int64Type = SignedLongLong;
7697 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007698 LongWidth = LongAlign = 32;
7699 PointerWidth = PointerAlign = 32;
7700 PtrDiffType = SignedInt;
7701 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007702 }
7703
Craig Topper3164f332014-03-11 03:39:26 +00007704 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007705 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007706 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007707 .Case("mips1", true)
7708 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007709 .Case("mips3", true)
7710 .Case("mips4", true)
7711 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007712 .Case("mips32", true)
7713 .Case("mips32r2", true)
7714 .Case("mips32r3", true)
7715 .Case("mips32r5", true)
7716 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007717 .Case("mips64", true)
7718 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007719 .Case("mips64r3", true)
7720 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007721 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007722 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007723 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007724 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007725 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007726 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007727 bool
7728 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7729 StringRef CPU,
7730 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007731 if (CPU.empty())
7732 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007733 if (CPU == "octeon")
7734 Features["mips64r2"] = Features["cnmips"] = true;
7735 else
7736 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007737 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007738 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007739
Craig Topper3164f332014-03-11 03:39:26 +00007740 void getTargetDefines(const LangOptions &Opts,
7741 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007742 if (BigEndian) {
7743 DefineStd(Builder, "MIPSEB", Opts);
7744 Builder.defineMacro("_MIPSEB");
7745 } else {
7746 DefineStd(Builder, "MIPSEL", Opts);
7747 Builder.defineMacro("_MIPSEL");
7748 }
7749
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007750 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007751 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007752 if (Opts.GNUMode)
7753 Builder.defineMacro("mips");
7754
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007755 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007756 Builder.defineMacro("__mips", "32");
7757 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7758 } else {
7759 Builder.defineMacro("__mips", "64");
7760 Builder.defineMacro("__mips64");
7761 Builder.defineMacro("__mips64__");
7762 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7763 }
7764
7765 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7766 .Cases("mips32", "mips64", "1")
7767 .Cases("mips32r2", "mips64r2", "2")
7768 .Cases("mips32r3", "mips64r3", "3")
7769 .Cases("mips32r5", "mips64r5", "5")
7770 .Cases("mips32r6", "mips64r6", "6")
7771 .Default("");
7772 if (!ISARev.empty())
7773 Builder.defineMacro("__mips_isa_rev", ISARev);
7774
7775 if (ABI == "o32") {
7776 Builder.defineMacro("__mips_o32");
7777 Builder.defineMacro("_ABIO32", "1");
7778 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007779 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007780 Builder.defineMacro("__mips_n32");
7781 Builder.defineMacro("_ABIN32", "2");
7782 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7783 } else if (ABI == "n64") {
7784 Builder.defineMacro("__mips_n64");
7785 Builder.defineMacro("_ABI64", "3");
7786 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7787 } else
7788 llvm_unreachable("Invalid ABI.");
7789
Simon Dardisdf827a72017-02-21 16:01:00 +00007790 if (!IsNoABICalls) {
7791 Builder.defineMacro("__mips_abicalls");
7792 if (CanUseBSDABICalls)
7793 Builder.defineMacro("__ABICALLS__");
7794 }
7795
Simon Atanasyan683535b2012-08-29 19:14:58 +00007796 Builder.defineMacro("__REGISTER_PREFIX__", "");
7797
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007798 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007799 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007800 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007801 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007802 case SoftFloat:
7803 Builder.defineMacro("__mips_soft_float", Twine(1));
7804 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007805 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007806
Simon Atanasyan16071912013-04-14 14:07:30 +00007807 if (IsSingleFloat)
7808 Builder.defineMacro("__mips_single_float", Twine(1));
7809
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007810 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7811 Builder.defineMacro("_MIPS_FPSET",
7812 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7813
Simon Atanasyan72244b62012-07-05 16:06:06 +00007814 if (IsMips16)
7815 Builder.defineMacro("__mips16", Twine(1));
7816
Simon Atanasyan60777612013-04-14 14:07:51 +00007817 if (IsMicromips)
7818 Builder.defineMacro("__mips_micromips", Twine(1));
7819
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007820 if (IsNan2008)
7821 Builder.defineMacro("__mips_nan2008", Twine(1));
7822
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007823 switch (DspRev) {
7824 default:
7825 break;
7826 case DSP1:
7827 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7828 Builder.defineMacro("__mips_dsp", Twine(1));
7829 break;
7830 case DSP2:
7831 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7832 Builder.defineMacro("__mips_dspr2", Twine(1));
7833 Builder.defineMacro("__mips_dsp", Twine(1));
7834 break;
7835 }
7836
Jack Carter44ff1e52013-08-12 17:20:29 +00007837 if (HasMSA)
7838 Builder.defineMacro("__mips_msa", Twine(1));
7839
Simon Atanasyan26f19672012-04-05 19:28:31 +00007840 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7841 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7842 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007843
7844 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7845 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007846
7847 // These shouldn't be defined for MIPS-I but there's no need to check
7848 // for that since MIPS-I isn't supported.
7849 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7850 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7851 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007852
7853 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7854 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7855 // the instructions exist but using them violates the ABI since they
7856 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7857 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007858 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007859 }
7860
Craig Topper6c03a542015-10-19 04:51:35 +00007861 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7862 return llvm::makeArrayRef(BuiltinInfo,
7863 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007864 }
Craig Topper3164f332014-03-11 03:39:26 +00007865 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007866 return llvm::StringSwitch<bool>(Feature)
7867 .Case("mips", true)
7868 .Case("fp64", HasFP64)
7869 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007870 }
Craig Topper3164f332014-03-11 03:39:26 +00007871 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007872 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007873 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007874 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007875 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007876 // CPU register names
7877 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007878 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7879 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7880 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007881 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7882 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007883 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7884 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7885 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7886 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007887 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007888 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007889 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7890 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007891 // MSA register names
7892 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7893 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7894 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7895 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7896 // MSA control register names
7897 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7898 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007899 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007900 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007901 }
Craig Topper3164f332014-03-11 03:39:26 +00007902 bool validateAsmConstraint(const char *&Name,
7903 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007904 switch (*Name) {
7905 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007906 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007907 case 'r': // CPU registers.
7908 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007909 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007910 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007911 case 'c': // $25 for indirect jumps
7912 case 'l': // lo register
7913 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007914 Info.setAllowsRegister();
7915 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007916 case 'I': // Signed 16-bit constant
7917 case 'J': // Integer 0
7918 case 'K': // Unsigned 16-bit constant
7919 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7920 case 'M': // Constants not loadable via lui, addiu, or ori
7921 case 'N': // Constant -1 to -65535
7922 case 'O': // A signed 15-bit constant
7923 case 'P': // A constant between 1 go 65535
7924 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007925 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007926 Info.setAllowsMemory();
7927 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007928 case 'Z':
7929 if (Name[1] == 'C') { // An address usable by ll, and sc.
7930 Info.setAllowsMemory();
7931 Name++; // Skip over 'Z'.
7932 return true;
7933 }
7934 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007935 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007936 }
7937
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007938 std::string convertConstraint(const char *&Constraint) const override {
7939 std::string R;
7940 switch (*Constraint) {
7941 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7942 if (Constraint[1] == 'C') {
7943 R = std::string("^") + std::string(Constraint, 2);
7944 Constraint++;
7945 return R;
7946 }
7947 break;
7948 }
7949 return TargetInfo::convertConstraint(Constraint);
7950 }
7951
Craig Topper3164f332014-03-11 03:39:26 +00007952 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007953 // In GCC, $1 is not widely used in generated code (it's used only in a few
7954 // specific situations), so there is no real need for users to add it to
7955 // the clobbers list if they want to use it in their inline assembly code.
7956 //
7957 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7958 // code generation, so using it in inline assembly without adding it to the
7959 // clobbers list can cause conflicts between the inline assembly code and
7960 // the surrounding generated code.
7961 //
7962 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7963 // operands, which will conflict with the ".set at" assembler option (which
7964 // we use only for inline assembly, in order to maintain compatibility with
7965 // GCC) and will also conflict with the user's usage of $1.
7966 //
7967 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7968 // register for generated code is to automatically clobber $1 for all inline
7969 // assembly code.
7970 //
7971 // FIXME: We should automatically clobber $1 only for inline assembly code
7972 // which actually uses it. This would allow LLVM to use $1 for inline
7973 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007974 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007975 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007976
Craig Topper3164f332014-03-11 03:39:26 +00007977 bool handleTargetFeatures(std::vector<std::string> &Features,
7978 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007979 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007980 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007981 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007982 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007983 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007984 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007985 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007986
Eric Christopher610fe112015-08-26 08:21:55 +00007987 for (const auto &Feature : Features) {
7988 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007989 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007990 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007991 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007992 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007993 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007994 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007995 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007996 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007997 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007998 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007999 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00008000 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00008001 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008002 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008003 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008004 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00008005 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00008006 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008007 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00008008 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00008009 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00008010 else if (Feature == "+noabicalls")
8011 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008012 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00008013
James Y Knightb214cbc2016-03-04 19:00:41 +00008014 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00008015
Rafael Espindolaeb265472013-08-21 21:59:03 +00008016 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00008017 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00008018
Craig Topper3164f332014-03-11 03:39:26 +00008019 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00008020 if (RegNo == 0) return 4;
8021 if (RegNo == 1) return 5;
8022 return -1;
8023 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00008024
8025 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00008026
8027 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8028 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
8029 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8030 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8031 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
8032 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
8033 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
8034 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8035 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8036 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8037 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8038 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8039 {{"ra"}, "$31"}};
8040 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
8041 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
8042 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
8043 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
8044 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
8045 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
8046 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
8047 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
8048 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
8049 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
8050 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
8051 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008052 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00008053 return llvm::makeArrayRef(O32RegAliases);
8054 return llvm::makeArrayRef(NewABIRegAliases);
8055 }
8056
8057 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00008058 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00008059 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008060
8061 bool validateTarget(DiagnosticsEngine &Diags) const override {
8062 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
8063 // this yet. It's better to fail here than on the backend assertion.
8064 if (processorSupportsGPR64() && ABI == "o32") {
8065 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8066 return false;
8067 }
8068
8069 // 64-bit ABI's require 64-bit CPU's.
8070 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
8071 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
8072 return false;
8073 }
8074
8075 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8076 // can't handle this yet. It's better to fail here than on the
8077 // backend assertion.
8078 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8079 getTriple().getArch() == llvm::Triple::mips64el) &&
8080 ABI == "o32") {
8081 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8082 << ABI << getTriple().str();
8083 return false;
8084 }
8085
8086 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8087 // can't handle this yet. It's better to fail here than on the
8088 // backend assertion.
8089 if ((getTriple().getArch() == llvm::Triple::mips ||
8090 getTriple().getArch() == llvm::Triple::mipsel) &&
8091 (ABI == "n32" || ABI == "n64")) {
8092 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8093 << ABI << getTriple().str();
8094 return false;
8095 }
8096
8097 return true;
8098 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008099};
8100
Daniel Sanders4672af62016-05-27 11:51:02 +00008101const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008102#define BUILTIN(ID, TYPE, ATTRS) \
8103 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8104#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8105 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008106#include "clang/Basic/BuiltinsMips.def"
8107};
8108
Ivan Krasindd7403e2011-08-24 20:22:22 +00008109class PNaClTargetInfo : public TargetInfo {
8110public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8112 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008113 this->LongAlign = 32;
8114 this->LongWidth = 32;
8115 this->PointerAlign = 32;
8116 this->PointerWidth = 32;
8117 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008118 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008119 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008120 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008121 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008122 this->SizeType = TargetInfo::UnsignedInt;
8123 this->PtrDiffType = TargetInfo::SignedInt;
8124 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008125 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008126 }
8127
Craig Toppere6f17d02014-03-11 04:07:52 +00008128 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008129 Builder.defineMacro("__le32__");
8130 Builder.defineMacro("__pnacl__");
8131 }
Craig Topper3164f332014-03-11 03:39:26 +00008132 void getTargetDefines(const LangOptions &Opts,
8133 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008134 getArchDefines(Opts, Builder);
8135 }
Craig Topper3164f332014-03-11 03:39:26 +00008136 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008137 return Feature == "pnacl";
8138 }
Craig Topper6c03a542015-10-19 04:51:35 +00008139 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008140 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008141 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008142 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008143 ArrayRef<const char *> getGCCRegNames() const override;
8144 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008145 bool validateAsmConstraint(const char *&Name,
8146 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008147 return false;
8148 }
8149
Craig Topper3164f332014-03-11 03:39:26 +00008150 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008151 return "";
8152 }
8153};
8154
Craig Topperf054e3a2015-10-19 03:52:27 +00008155ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8156 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008157}
8158
Craig Topperf054e3a2015-10-19 03:52:27 +00008159ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8160 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008161}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008162
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008163// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008164class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008165public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008166 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8167 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008168
8169 BuiltinVaListKind getBuiltinVaListKind() const override {
8170 return TargetInfo::PNaClABIBuiltinVaList;
8171 }
8172};
8173
JF Bastien643817d2014-09-12 17:52:47 +00008174class Le64TargetInfo : public TargetInfo {
8175 static const Builtin::Info BuiltinInfo[];
8176
8177public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8179 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008180 NoAsmVariants = true;
8181 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8182 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008183 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008184 }
8185
8186 void getTargetDefines(const LangOptions &Opts,
8187 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008188 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008189 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8190 Builder.defineMacro("__ELF__");
8191 }
Craig Topper6c03a542015-10-19 04:51:35 +00008192 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8193 return llvm::makeArrayRef(BuiltinInfo,
8194 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008195 }
8196 BuiltinVaListKind getBuiltinVaListKind() const override {
8197 return TargetInfo::PNaClABIBuiltinVaList;
8198 }
8199 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008200 ArrayRef<const char *> getGCCRegNames() const override {
8201 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008202 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008203 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8204 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008205 }
8206 bool validateAsmConstraint(const char *&Name,
8207 TargetInfo::ConstraintInfo &Info) const override {
8208 return false;
8209 }
8210
8211 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008212};
Dan Gohmanc2853072015-09-03 22:51:53 +00008213
8214class WebAssemblyTargetInfo : public TargetInfo {
8215 static const Builtin::Info BuiltinInfo[];
8216
8217 enum SIMDEnum {
8218 NoSIMD,
8219 SIMD128,
8220 } SIMDLevel;
8221
8222public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008224 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008225 NoAsmVariants = true;
8226 SuitableAlign = 128;
8227 LargeArrayMinWidth = 128;
8228 LargeArrayAlign = 128;
8229 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008230 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008231 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008232 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008233 SizeType = UnsignedInt;
8234 PtrDiffType = SignedInt;
8235 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008236 }
8237
8238protected:
8239 void getTargetDefines(const LangOptions &Opts,
8240 MacroBuilder &Builder) const override {
8241 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8242 if (SIMDLevel >= SIMD128)
8243 Builder.defineMacro("__wasm_simd128__");
8244 }
8245
8246private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008247 bool
8248 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8249 StringRef CPU,
8250 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008251 if (CPU == "bleeding-edge")
8252 Features["simd128"] = true;
8253 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8254 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008255 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008256 return llvm::StringSwitch<bool>(Feature)
8257 .Case("simd128", SIMDLevel >= SIMD128)
8258 .Default(false);
8259 }
8260 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008261 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008262 for (const auto &Feature : Features) {
8263 if (Feature == "+simd128") {
8264 SIMDLevel = std::max(SIMDLevel, SIMD128);
8265 continue;
8266 }
8267 if (Feature == "-simd128") {
8268 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8269 continue;
8270 }
8271
8272 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8273 << "-target-feature";
8274 return false;
8275 }
8276 return true;
8277 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008278 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008279 return llvm::StringSwitch<bool>(Name)
8280 .Case("mvp", true)
8281 .Case("bleeding-edge", true)
8282 .Case("generic", true)
8283 .Default(false);
8284 }
Craig Topper6c03a542015-10-19 04:51:35 +00008285 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8286 return llvm::makeArrayRef(BuiltinInfo,
8287 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008288 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008289 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008290 return VoidPtrBuiltinVaList;
8291 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008292 ArrayRef<const char *> getGCCRegNames() const final {
8293 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008294 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008295 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8296 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008297 }
8298 bool
8299 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008300 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008301 return false;
8302 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008303 const char *getClobbers() const final { return ""; }
8304 bool isCLZForZeroUndef() const final { return false; }
8305 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008306 IntType getIntTypeByWidth(unsigned BitWidth,
8307 bool IsSigned) const final {
8308 // WebAssembly prefers long long for explicitly 64-bit integers.
8309 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8310 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8311 }
8312 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8313 bool IsSigned) const final {
8314 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8315 return BitWidth == 64
8316 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8317 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8318 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008319};
8320
8321const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8322#define BUILTIN(ID, TYPE, ATTRS) \
8323 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8324#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8325 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8326#include "clang/Basic/BuiltinsWebAssembly.def"
8327};
8328
8329class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8330public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8332 const TargetOptions &Opts)
8333 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008334 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008335 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008336 }
8337
8338protected:
8339 void getTargetDefines(const LangOptions &Opts,
8340 MacroBuilder &Builder) const override {
8341 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8342 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8343 }
8344};
8345
8346class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008348 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8349 const TargetOptions &Opts)
8350 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008351 LongAlign = LongWidth = 64;
8352 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008353 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008354 SizeType = UnsignedLong;
8355 PtrDiffType = SignedLong;
8356 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008357 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008358 }
8359
8360protected:
8361 void getTargetDefines(const LangOptions &Opts,
8362 MacroBuilder &Builder) const override {
8363 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8364 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8365 }
8366};
8367
JF Bastien643817d2014-09-12 17:52:47 +00008368const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8369#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008370 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008371#include "clang/Basic/BuiltinsLe64.def"
8372};
8373
Eric Christopherc48497a2015-09-18 21:26:24 +00008374static const unsigned SPIRAddrSpaceMap[] = {
8375 1, // opencl_global
8376 3, // opencl_local
8377 2, // opencl_constant
8378 4, // opencl_generic
8379 0, // cuda_device
8380 0, // cuda_constant
8381 0 // cuda_shared
8382};
8383class SPIRTargetInfo : public TargetInfo {
8384public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8386 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008387 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8388 "SPIR target must use unknown OS");
8389 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8390 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008391 TLSSupported = false;
8392 LongWidth = LongAlign = 64;
8393 AddrSpaceMap = &SPIRAddrSpaceMap;
8394 UseAddrSpaceMapMangling = true;
8395 // Define available target features
8396 // These must be defined in sorted order!
8397 NoAsmVariants = true;
8398 }
8399 void getTargetDefines(const LangOptions &Opts,
8400 MacroBuilder &Builder) const override {
8401 DefineStd(Builder, "SPIR", Opts);
8402 }
8403 bool hasFeature(StringRef Feature) const override {
8404 return Feature == "spir";
8405 }
Craig Topper3164f332014-03-11 03:39:26 +00008406
Craig Topper6c03a542015-10-19 04:51:35 +00008407 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008408 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008409 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008410 bool validateAsmConstraint(const char *&Name,
8411 TargetInfo::ConstraintInfo &info) const override {
8412 return true;
8413 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008414 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8415 return None;
8416 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008417 BuiltinVaListKind getBuiltinVaListKind() const override {
8418 return TargetInfo::VoidPtrBuiltinVaList;
8419 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008420
Eric Christopherc48497a2015-09-18 21:26:24 +00008421 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008422 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8423 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008424 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008425
Eric Christopherc48497a2015-09-18 21:26:24 +00008426 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8427 return CC_SpirFunction;
8428 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008429
8430 void setSupportedOpenCLOpts() override {
8431 // Assume all OpenCL extensions and optional core features are supported
8432 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008433 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008434 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008435};
Guy Benyeib798fc92012-12-11 21:38:14 +00008436
Eric Christopherc48497a2015-09-18 21:26:24 +00008437class SPIR32TargetInfo : public SPIRTargetInfo {
8438public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8440 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008441 PointerWidth = PointerAlign = 32;
8442 SizeType = TargetInfo::UnsignedInt;
8443 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008444 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8445 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008446 }
8447 void getTargetDefines(const LangOptions &Opts,
8448 MacroBuilder &Builder) const override {
8449 DefineStd(Builder, "SPIR32", Opts);
8450 }
8451};
Guy Benyeib798fc92012-12-11 21:38:14 +00008452
Eric Christopherc48497a2015-09-18 21:26:24 +00008453class SPIR64TargetInfo : public SPIRTargetInfo {
8454public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8456 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008457 PointerWidth = PointerAlign = 64;
8458 SizeType = TargetInfo::UnsignedLong;
8459 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008460 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8461 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008462 }
8463 void getTargetDefines(const LangOptions &Opts,
8464 MacroBuilder &Builder) const override {
8465 DefineStd(Builder, "SPIR64", Opts);
8466 }
8467};
Guy Benyeib798fc92012-12-11 21:38:14 +00008468
Robert Lytton0e076492013-08-13 09:43:10 +00008469class XCoreTargetInfo : public TargetInfo {
8470 static const Builtin::Info BuiltinInfo[];
8471public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8473 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008474 NoAsmVariants = true;
8475 LongLongAlign = 32;
8476 SuitableAlign = 32;
8477 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008478 SizeType = UnsignedInt;
8479 PtrDiffType = SignedInt;
8480 IntPtrType = SignedInt;
8481 WCharType = UnsignedChar;
8482 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008483 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008484 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8485 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008486 }
Craig Topper3164f332014-03-11 03:39:26 +00008487 void getTargetDefines(const LangOptions &Opts,
8488 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008489 Builder.defineMacro("__XS1B__");
8490 }
Craig Topper6c03a542015-10-19 04:51:35 +00008491 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8492 return llvm::makeArrayRef(BuiltinInfo,
8493 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008494 }
Craig Topper3164f332014-03-11 03:39:26 +00008495 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008496 return TargetInfo::VoidPtrBuiltinVaList;
8497 }
Craig Topper3164f332014-03-11 03:39:26 +00008498 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008499 return "";
8500 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008501 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008502 static const char * const GCCRegNames[] = {
8503 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8504 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8505 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008506 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008507 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008508 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8509 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008510 }
Craig Topper3164f332014-03-11 03:39:26 +00008511 bool validateAsmConstraint(const char *&Name,
8512 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008513 return false;
8514 }
Craig Topper3164f332014-03-11 03:39:26 +00008515 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008516 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8517 return (RegNo < 2)? RegNo : -1;
8518 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008519 bool allowsLargerPreferedTypeAlignment() const override {
8520 return false;
8521 }
Robert Lytton0e076492013-08-13 09:43:10 +00008522};
8523
8524const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008525#define BUILTIN(ID, TYPE, ATTRS) \
8526 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8527#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8528 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008529#include "clang/Basic/BuiltinsXCore.def"
8530};
Robert Lytton0e076492013-08-13 09:43:10 +00008531
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008532// x86_32 Android target
8533class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8536 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008537 SuitableAlign = 32;
8538 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008539 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008540 }
8541};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008542
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008543// x86_64 Android target
8544class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8545public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008546 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8547 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008548 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008549 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008550
8551 bool useFloat128ManglingForLongDouble() const override {
8552 return true;
8553 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008554};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008555
8556// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8557class RenderScript32TargetInfo : public ARMleTargetInfo {
8558public:
8559 RenderScript32TargetInfo(const llvm::Triple &Triple,
8560 const TargetOptions &Opts)
8561 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8562 Triple.getOSName(),
8563 Triple.getEnvironmentName()),
8564 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008565 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008566 LongWidth = LongAlign = 64;
8567 }
8568 void getTargetDefines(const LangOptions &Opts,
8569 MacroBuilder &Builder) const override {
8570 Builder.defineMacro("__RENDERSCRIPT__");
8571 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8572 }
8573};
8574
8575// 64-bit RenderScript is aarch64
8576class RenderScript64TargetInfo : public AArch64leTargetInfo {
8577public:
8578 RenderScript64TargetInfo(const llvm::Triple &Triple,
8579 const TargetOptions &Opts)
8580 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8581 Triple.getOSName(),
8582 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008583 Opts) {
8584 IsRenderScriptTarget = true;
8585 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008586
8587 void getTargetDefines(const LangOptions &Opts,
8588 MacroBuilder &Builder) const override {
8589 Builder.defineMacro("__RENDERSCRIPT__");
8590 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8591 }
8592};
8593
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008594/// Information about a specific microcontroller.
8595struct MCUInfo {
8596 const char *Name;
8597 const char *DefineName;
8598};
8599
8600// This list should be kept up-to-date with AVRDevices.td in LLVM.
8601static ArrayRef<MCUInfo> AVRMcus = {
8602 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008603 { "attiny11", "__AVR_ATtiny11__" },
8604 { "attiny12", "__AVR_ATtiny12__" },
8605 { "attiny15", "__AVR_ATtiny15__" },
8606 { "attiny28", "__AVR_ATtiny28__" },
8607 { "at90s2313", "__AVR_AT90S2313__" },
8608 { "at90s2323", "__AVR_AT90S2323__" },
8609 { "at90s2333", "__AVR_AT90S2333__" },
8610 { "at90s2343", "__AVR_AT90S2343__" },
8611 { "attiny22", "__AVR_ATtiny22__" },
8612 { "attiny26", "__AVR_ATtiny26__" },
8613 { "at86rf401", "__AVR_AT86RF401__" },
8614 { "at90s4414", "__AVR_AT90S4414__" },
8615 { "at90s4433", "__AVR_AT90S4433__" },
8616 { "at90s4434", "__AVR_AT90S4434__" },
8617 { "at90s8515", "__AVR_AT90S8515__" },
8618 { "at90c8534", "__AVR_AT90c8534__" },
8619 { "at90s8535", "__AVR_AT90S8535__" },
8620 { "ata5272", "__AVR_ATA5272__" },
8621 { "attiny13", "__AVR_ATtiny13__" },
8622 { "attiny13a", "__AVR_ATtiny13A__" },
8623 { "attiny2313", "__AVR_ATtiny2313__" },
8624 { "attiny2313a", "__AVR_ATtiny2313A__" },
8625 { "attiny24", "__AVR_ATtiny24__" },
8626 { "attiny24a", "__AVR_ATtiny24A__" },
8627 { "attiny4313", "__AVR_ATtiny4313__" },
8628 { "attiny44", "__AVR_ATtiny44__" },
8629 { "attiny44a", "__AVR_ATtiny44A__" },
8630 { "attiny84", "__AVR_ATtiny84__" },
8631 { "attiny84a", "__AVR_ATtiny84A__" },
8632 { "attiny25", "__AVR_ATtiny25__" },
8633 { "attiny45", "__AVR_ATtiny45__" },
8634 { "attiny85", "__AVR_ATtiny85__" },
8635 { "attiny261", "__AVR_ATtiny261__" },
8636 { "attiny261a", "__AVR_ATtiny261A__" },
8637 { "attiny461", "__AVR_ATtiny461__" },
8638 { "attiny461a", "__AVR_ATtiny461A__" },
8639 { "attiny861", "__AVR_ATtiny861__" },
8640 { "attiny861a", "__AVR_ATtiny861A__" },
8641 { "attiny87", "__AVR_ATtiny87__" },
8642 { "attiny43u", "__AVR_ATtiny43U__" },
8643 { "attiny48", "__AVR_ATtiny48__" },
8644 { "attiny88", "__AVR_ATtiny88__" },
8645 { "attiny828", "__AVR_ATtiny828__" },
8646 { "at43usb355", "__AVR_AT43USB355__" },
8647 { "at76c711", "__AVR_AT76C711__" },
8648 { "atmega103", "__AVR_ATmega103__" },
8649 { "at43usb320", "__AVR_AT43USB320__" },
8650 { "attiny167", "__AVR_ATtiny167__" },
8651 { "at90usb82", "__AVR_AT90USB82__" },
8652 { "at90usb162", "__AVR_AT90USB162__" },
8653 { "ata5505", "__AVR_ATA5505__" },
8654 { "atmega8u2", "__AVR_ATmega8U2__" },
8655 { "atmega16u2", "__AVR_ATmega16U2__" },
8656 { "atmega32u2", "__AVR_ATmega32U2__" },
8657 { "attiny1634", "__AVR_ATtiny1634__" },
8658 { "atmega8", "__AVR_ATmega8__" },
8659 { "ata6289", "__AVR_ATA6289__" },
8660 { "atmega8a", "__AVR_ATmega8A__" },
8661 { "ata6285", "__AVR_ATA6285__" },
8662 { "ata6286", "__AVR_ATA6286__" },
8663 { "atmega48", "__AVR_ATmega48__" },
8664 { "atmega48a", "__AVR_ATmega48A__" },
8665 { "atmega48pa", "__AVR_ATmega48PA__" },
8666 { "atmega48p", "__AVR_ATmega48P__" },
8667 { "atmega88", "__AVR_ATmega88__" },
8668 { "atmega88a", "__AVR_ATmega88A__" },
8669 { "atmega88p", "__AVR_ATmega88P__" },
8670 { "atmega88pa", "__AVR_ATmega88PA__" },
8671 { "atmega8515", "__AVR_ATmega8515__" },
8672 { "atmega8535", "__AVR_ATmega8535__" },
8673 { "atmega8hva", "__AVR_ATmega8HVA__" },
8674 { "at90pwm1", "__AVR_AT90PWM1__" },
8675 { "at90pwm2", "__AVR_AT90PWM2__" },
8676 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8677 { "at90pwm3", "__AVR_AT90PWM3__" },
8678 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8679 { "at90pwm81", "__AVR_AT90PWM81__" },
8680 { "ata5790", "__AVR_ATA5790__" },
8681 { "ata5795", "__AVR_ATA5795__" },
8682 { "atmega16", "__AVR_ATmega16__" },
8683 { "atmega16a", "__AVR_ATmega16A__" },
8684 { "atmega161", "__AVR_ATmega161__" },
8685 { "atmega162", "__AVR_ATmega162__" },
8686 { "atmega163", "__AVR_ATmega163__" },
8687 { "atmega164a", "__AVR_ATmega164A__" },
8688 { "atmega164p", "__AVR_ATmega164P__" },
8689 { "atmega164pa", "__AVR_ATmega164PA__" },
8690 { "atmega165", "__AVR_ATmega165__" },
8691 { "atmega165a", "__AVR_ATmega165A__" },
8692 { "atmega165p", "__AVR_ATmega165P__" },
8693 { "atmega165pa", "__AVR_ATmega165PA__" },
8694 { "atmega168", "__AVR_ATmega168__" },
8695 { "atmega168a", "__AVR_ATmega168A__" },
8696 { "atmega168p", "__AVR_ATmega168P__" },
8697 { "atmega168pa", "__AVR_ATmega168PA__" },
8698 { "atmega169", "__AVR_ATmega169__" },
8699 { "atmega169a", "__AVR_ATmega169A__" },
8700 { "atmega169p", "__AVR_ATmega169P__" },
8701 { "atmega169pa", "__AVR_ATmega169PA__" },
8702 { "atmega32", "__AVR_ATmega32__" },
8703 { "atmega32a", "__AVR_ATmega32A__" },
8704 { "atmega323", "__AVR_ATmega323__" },
8705 { "atmega324a", "__AVR_ATmega324A__" },
8706 { "atmega324p", "__AVR_ATmega324P__" },
8707 { "atmega324pa", "__AVR_ATmega324PA__" },
8708 { "atmega325", "__AVR_ATmega325__" },
8709 { "atmega325a", "__AVR_ATmega325A__" },
8710 { "atmega325p", "__AVR_ATmega325P__" },
8711 { "atmega325pa", "__AVR_ATmega325PA__" },
8712 { "atmega3250", "__AVR_ATmega3250__" },
8713 { "atmega3250a", "__AVR_ATmega3250A__" },
8714 { "atmega3250p", "__AVR_ATmega3250P__" },
8715 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8716 { "atmega328", "__AVR_ATmega328__" },
8717 { "atmega328p", "__AVR_ATmega328P__" },
8718 { "atmega329", "__AVR_ATmega329__" },
8719 { "atmega329a", "__AVR_ATmega329A__" },
8720 { "atmega329p", "__AVR_ATmega329P__" },
8721 { "atmega329pa", "__AVR_ATmega329PA__" },
8722 { "atmega3290", "__AVR_ATmega3290__" },
8723 { "atmega3290a", "__AVR_ATmega3290A__" },
8724 { "atmega3290p", "__AVR_ATmega3290P__" },
8725 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8726 { "atmega406", "__AVR_ATmega406__" },
8727 { "atmega64", "__AVR_ATmega64__" },
8728 { "atmega64a", "__AVR_ATmega64A__" },
8729 { "atmega640", "__AVR_ATmega640__" },
8730 { "atmega644", "__AVR_ATmega644__" },
8731 { "atmega644a", "__AVR_ATmega644A__" },
8732 { "atmega644p", "__AVR_ATmega644P__" },
8733 { "atmega644pa", "__AVR_ATmega644PA__" },
8734 { "atmega645", "__AVR_ATmega645__" },
8735 { "atmega645a", "__AVR_ATmega645A__" },
8736 { "atmega645p", "__AVR_ATmega645P__" },
8737 { "atmega649", "__AVR_ATmega649__" },
8738 { "atmega649a", "__AVR_ATmega649A__" },
8739 { "atmega649p", "__AVR_ATmega649P__" },
8740 { "atmega6450", "__AVR_ATmega6450__" },
8741 { "atmega6450a", "__AVR_ATmega6450A__" },
8742 { "atmega6450p", "__AVR_ATmega6450P__" },
8743 { "atmega6490", "__AVR_ATmega6490__" },
8744 { "atmega6490a", "__AVR_ATmega6490A__" },
8745 { "atmega6490p", "__AVR_ATmega6490P__" },
8746 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8747 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8748 { "atmega16hva", "__AVR_ATmega16HVA__" },
8749 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8750 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8751 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8752 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8753 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8754 { "atmega64hve", "__AVR_ATmega64HVE__" },
8755 { "at90can32", "__AVR_AT90CAN32__" },
8756 { "at90can64", "__AVR_AT90CAN64__" },
8757 { "at90pwm161", "__AVR_AT90PWM161__" },
8758 { "at90pwm216", "__AVR_AT90PWM216__" },
8759 { "at90pwm316", "__AVR_AT90PWM316__" },
8760 { "atmega32c1", "__AVR_ATmega32C1__" },
8761 { "atmega64c1", "__AVR_ATmega64C1__" },
8762 { "atmega16m1", "__AVR_ATmega16M1__" },
8763 { "atmega32m1", "__AVR_ATmega32M1__" },
8764 { "atmega64m1", "__AVR_ATmega64M1__" },
8765 { "atmega16u4", "__AVR_ATmega16U4__" },
8766 { "atmega32u4", "__AVR_ATmega32U4__" },
8767 { "atmega32u6", "__AVR_ATmega32U6__" },
8768 { "at90usb646", "__AVR_AT90USB646__" },
8769 { "at90usb647", "__AVR_AT90USB647__" },
8770 { "at90scr100", "__AVR_AT90SCR100__" },
8771 { "at94k", "__AVR_AT94K__" },
8772 { "m3000", "__AVR_AT000__" },
8773 { "atmega128", "__AVR_ATmega128__" },
8774 { "atmega128a", "__AVR_ATmega128A__" },
8775 { "atmega1280", "__AVR_ATmega1280__" },
8776 { "atmega1281", "__AVR_ATmega1281__" },
8777 { "atmega1284", "__AVR_ATmega1284__" },
8778 { "atmega1284p", "__AVR_ATmega1284P__" },
8779 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8780 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8781 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8782 { "at90can128", "__AVR_AT90CAN128__" },
8783 { "at90usb1286", "__AVR_AT90USB1286__" },
8784 { "at90usb1287", "__AVR_AT90USB1287__" },
8785 { "atmega2560", "__AVR_ATmega2560__" },
8786 { "atmega2561", "__AVR_ATmega2561__" },
8787 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8788 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8789 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8790 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8791 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8792 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8793 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8794 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8795 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8796 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8797 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8798 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8799 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8800 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8801 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8802 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8803 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8804 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8805 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8806 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8807 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8808 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8809 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8810 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8811 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8812 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8813 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8814 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8815 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8816 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8817 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8818 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8819 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8820 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8821 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8822 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8823 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8824 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8825 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8826 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8827 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8828 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8829 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8830 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8831 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8832 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8833 { "attiny4", "__AVR_ATtiny4__" },
8834 { "attiny5", "__AVR_ATtiny5__" },
8835 { "attiny9", "__AVR_ATtiny9__" },
8836 { "attiny10", "__AVR_ATtiny10__" },
8837 { "attiny20", "__AVR_ATtiny20__" },
8838 { "attiny40", "__AVR_ATtiny40__" },
8839 { "attiny102", "__AVR_ATtiny102__" },
8840 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008841};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008842
8843// AVR Target
8844class AVRTargetInfo : public TargetInfo {
8845public:
8846 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8847 : TargetInfo(Triple) {
8848 TLSSupported = false;
8849 PointerWidth = 16;
8850 PointerAlign = 8;
8851 IntWidth = 16;
8852 IntAlign = 8;
8853 LongWidth = 32;
8854 LongAlign = 8;
8855 LongLongWidth = 64;
8856 LongLongAlign = 8;
8857 SuitableAlign = 8;
8858 DefaultAlignForAttributeAligned = 8;
8859 HalfWidth = 16;
8860 HalfAlign = 8;
8861 FloatWidth = 32;
8862 FloatAlign = 8;
8863 DoubleWidth = 32;
8864 DoubleAlign = 8;
8865 DoubleFormat = &llvm::APFloat::IEEEsingle();
8866 LongDoubleWidth = 32;
8867 LongDoubleAlign = 8;
8868 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8869 SizeType = UnsignedInt;
8870 PtrDiffType = SignedInt;
8871 IntPtrType = SignedInt;
8872 Char16Type = UnsignedInt;
8873 WCharType = SignedInt;
8874 WIntType = SignedInt;
8875 Char32Type = UnsignedLong;
8876 SigAtomicType = SignedChar;
8877 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8878 "-f32:32:32-f64:64:64-n8");
8879 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008880
Dylan McKay924fa3a2017-01-05 05:20:27 +00008881 void getTargetDefines(const LangOptions &Opts,
8882 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008883 Builder.defineMacro("AVR");
8884 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008885 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008886
8887 if (!this->CPU.empty()) {
8888 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8889 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8890
8891 if (It != AVRMcus.end())
8892 Builder.defineMacro(It->DefineName);
8893 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008894 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008895
Dylan McKay924fa3a2017-01-05 05:20:27 +00008896 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8897 return None;
8898 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008899
Dylan McKay924fa3a2017-01-05 05:20:27 +00008900 BuiltinVaListKind getBuiltinVaListKind() const override {
8901 return TargetInfo::VoidPtrBuiltinVaList;
8902 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008903
Dylan McKay924fa3a2017-01-05 05:20:27 +00008904 const char *getClobbers() const override {
8905 return "";
8906 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008907
Dylan McKay924fa3a2017-01-05 05:20:27 +00008908 ArrayRef<const char *> getGCCRegNames() const override {
8909 static const char * const GCCRegNames[] = {
8910 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8911 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8912 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008913 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008914 };
8915 return llvm::makeArrayRef(GCCRegNames);
8916 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008917
Dylan McKay924fa3a2017-01-05 05:20:27 +00008918 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8919 return None;
8920 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008921
Dylan McKay924fa3a2017-01-05 05:20:27 +00008922 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8923 static const TargetInfo::AddlRegName AddlRegNames[] = {
8924 { { "r26", "r27"}, 26 },
8925 { { "r28", "r29"}, 27 },
8926 { { "r30", "r31"}, 28 },
8927 { { "SPL", "SPH"}, 29 },
8928 };
8929 return llvm::makeArrayRef(AddlRegNames);
8930 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008931
Dylan McKay924fa3a2017-01-05 05:20:27 +00008932 bool validateAsmConstraint(const char *&Name,
8933 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008934 // There aren't any multi-character AVR specific constraints.
8935 if (StringRef(Name).size() > 1) return false;
8936
8937 switch (*Name) {
8938 default: return false;
8939 case 'a': // Simple upper registers
8940 case 'b': // Base pointer registers pairs
8941 case 'd': // Upper register
8942 case 'l': // Lower registers
8943 case 'e': // Pointer register pairs
8944 case 'q': // Stack pointer register
8945 case 'r': // Any register
8946 case 'w': // Special upper register pairs
8947 case 't': // Temporary register
8948 case 'x': case 'X': // Pointer register pair X
8949 case 'y': case 'Y': // Pointer register pair Y
8950 case 'z': case 'Z': // Pointer register pair Z
8951 Info.setAllowsRegister();
8952 return true;
8953 case 'I': // 6-bit positive integer constant
8954 Info.setRequiresImmediate(0, 63);
8955 return true;
8956 case 'J': // 6-bit negative integer constant
8957 Info.setRequiresImmediate(-63, 0);
8958 return true;
8959 case 'K': // Integer constant (Range: 2)
8960 Info.setRequiresImmediate(2);
8961 return true;
8962 case 'L': // Integer constant (Range: 0)
8963 Info.setRequiresImmediate(0);
8964 return true;
8965 case 'M': // 8-bit integer constant
8966 Info.setRequiresImmediate(0, 0xff);
8967 return true;
8968 case 'N': // Integer constant (Range: -1)
8969 Info.setRequiresImmediate(-1);
8970 return true;
8971 case 'O': // Integer constant (Range: 8, 16, 24)
8972 Info.setRequiresImmediate({8, 16, 24});
8973 return true;
8974 case 'P': // Integer constant (Range: 1)
8975 Info.setRequiresImmediate(1);
8976 return true;
8977 case 'R': // Integer constant (Range: -6 to 5)
8978 Info.setRequiresImmediate(-6, 5);
8979 return true;
8980 case 'G': // Floating point constant
8981 case 'Q': // A memory address based on Y or Z pointer with displacement.
8982 return true;
8983 }
8984
Dylan McKay924fa3a2017-01-05 05:20:27 +00008985 return false;
8986 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008987
Dylan McKay924fa3a2017-01-05 05:20:27 +00008988 IntType getIntTypeByWidth(unsigned BitWidth,
8989 bool IsSigned) const final {
8990 // AVR prefers int for 16-bit integers.
8991 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8992 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8993 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008994
Dylan McKay924fa3a2017-01-05 05:20:27 +00008995 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8996 bool IsSigned) const final {
8997 // AVR uses int for int_least16_t and int_fast16_t.
8998 return BitWidth == 16
8999 ? (IsSigned ? SignedInt : UnsignedInt)
9000 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
9001 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00009002
9003 bool setCPU(const std::string &Name) override {
9004 bool IsFamily = llvm::StringSwitch<bool>(Name)
9005 .Case("avr1", true)
9006 .Case("avr2", true)
9007 .Case("avr25", true)
9008 .Case("avr3", true)
9009 .Case("avr31", true)
9010 .Case("avr35", true)
9011 .Case("avr4", true)
9012 .Case("avr5", true)
9013 .Case("avr51", true)
9014 .Case("avr6", true)
9015 .Case("avrxmega1", true)
9016 .Case("avrxmega2", true)
9017 .Case("avrxmega3", true)
9018 .Case("avrxmega4", true)
9019 .Case("avrxmega5", true)
9020 .Case("avrxmega6", true)
9021 .Case("avrxmega7", true)
9022 .Case("avrtiny", true)
9023 .Default(false);
9024
9025 if (IsFamily) this->CPU = Name;
9026
9027 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
9028 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
9029
9030 if (IsMCU) this->CPU = Name;
9031
9032 return IsFamily || IsMCU;
9033 }
9034
9035protected:
9036 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00009037};
9038
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009039} // end anonymous namespace
9040
Chris Lattner5ba61f02006-10-14 07:39:34 +00009041//===----------------------------------------------------------------------===//
9042// Driver code
9043//===----------------------------------------------------------------------===//
9044
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009045static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
9046 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00009047 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00009048
Daniel Dunbar52322032009-08-18 05:47:58 +00009049 switch (Triple.getArch()) {
9050 default:
Craig Topperf1186c52014-05-08 06:41:40 +00009051 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00009052
Tim Northover2a0783d2014-05-30 14:14:07 +00009053 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009054 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009055
9056 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009057 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00009058
Jacques Pienaard964cc22016-03-28 21:02:54 +00009059 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009060 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00009061
Tim Northover2a0783d2014-05-30 14:14:07 +00009062 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00009063 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009064 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009065
9066 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00009067 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009068 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00009069 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009070 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009071 case llvm::Triple::Fuchsia:
9072 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009073 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009074 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009075 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009076 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009077 case llvm::Triple::OpenBSD:
9078 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009079 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009080 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009081 }
9082
Christian Pirker9b019ae2014-02-25 13:51:00 +00009083 case llvm::Triple::aarch64_be:
9084 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009085 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009086 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009087 case llvm::Triple::Fuchsia:
9088 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009089 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009090 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009091 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009092 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009093 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009094 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009095 }
9096
Daniel Dunbar52322032009-08-18 05:47:58 +00009097 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009098 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009099 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009100 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009101
Daniel Dunbar52322032009-08-18 05:47:58 +00009102 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009103 case llvm::Triple::CloudABI:
9104 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009105 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009106 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009107 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009108 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009109 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009110 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009111 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009112 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009113 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009115 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009116 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009117 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009119 case llvm::Triple::Win32:
9120 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009121 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009122 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009123 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009124 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009125 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009127 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009128 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009129 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009130 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009131 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009132 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009133 }
9134
9135 case llvm::Triple::armeb:
9136 case llvm::Triple::thumbeb:
9137 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009138 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009139
9140 switch (os) {
9141 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009143 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009145 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009147 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009148 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009149 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009151 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009153 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009155 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009156 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009157 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009158
Dylan McKay924fa3a2017-01-05 05:20:27 +00009159 case llvm::Triple::avr:
9160 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009161 case llvm::Triple::bpfeb:
9162 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009163 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009164
Daniel Dunbar52322032009-08-18 05:47:58 +00009165 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009166 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009167
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009168 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009169 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009170 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009171 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009172 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009173 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009174 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009175 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009176 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009177 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009178 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009179 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009180 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009181
9182 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009183 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009184 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009185 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009186 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009187 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009188 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009189 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009190 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009191 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009192 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009193 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009194 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009195 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009196 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009197
Akira Hatanakabef17452011-09-20 19:21:49 +00009198 case llvm::Triple::mips64:
9199 switch (os) {
9200 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009201 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009202 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009203 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009204 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009205 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009206 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009207 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009208 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009209 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009210 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009211 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009212 }
9213
9214 case llvm::Triple::mips64el:
9215 switch (os) {
9216 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009217 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009218 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009219 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009220 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009221 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009222 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009223 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009224 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009225 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009226 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009227 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009228 }
9229
Ivan Krasindd7403e2011-08-24 20:22:22 +00009230 case llvm::Triple::le32:
9231 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009232 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009233 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009234 default:
9235 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009236 }
9237
JF Bastien643817d2014-09-12 17:52:47 +00009238 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009239 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009240
Daniel Dunbar52322032009-08-18 05:47:58 +00009241 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009242 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009244 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009245 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009246 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009247 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009248 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009249 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009250 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009251 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009253 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009255 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009257 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009258
9259 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009260 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009261 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009262 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009263 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009264 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009265 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009266 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009267 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009268 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009269 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009271 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009273 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009274
Bill Schmidt778d3872013-07-26 01:36:11 +00009275 case llvm::Triple::ppc64le:
9276 switch (os) {
9277 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009278 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009279 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009280 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009281 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009283 }
9284
Peter Collingbournec947aae2012-05-20 23:28:41 +00009285 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009286 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009287 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009288 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009289
Tom Stellardd8e38a32015-01-06 20:34:47 +00009290 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009291 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009292 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009293
Daniel Dunbar52322032009-08-18 05:47:58 +00009294 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009295 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009296 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009297 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009298 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009300 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009301 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009302 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009303 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009304 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009306 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009307 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009308 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009309
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009310 // The 'sparcel' architecture copies all the above cases except for Solaris.
9311 case llvm::Triple::sparcel:
9312 switch (os) {
9313 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009314 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009315 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009316 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009317 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009319 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009321 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009322 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009323 }
9324
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009325 case llvm::Triple::sparcv9:
9326 switch (os) {
9327 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009329 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009331 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009332 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009333 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009335 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009336 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009337 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009339 }
9340
Ulrich Weigand47445072013-05-06 16:26:41 +00009341 case llvm::Triple::systemz:
9342 switch (os) {
9343 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009344 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009345 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009346 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009347 }
9348
Eli Friedmana9c3d712009-08-19 20:47:07 +00009349 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009350 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009351
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009352 case llvm::Triple::tcele:
9353 return new TCELETargetInfo(Triple, Opts);
9354
Daniel Dunbar52322032009-08-18 05:47:58 +00009355 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009356 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009357 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009358
Daniel Dunbar52322032009-08-18 05:47:58 +00009359 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009360 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009361 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009362 case llvm::Triple::Linux: {
9363 switch (Triple.getEnvironment()) {
9364 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009366 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009367 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009368 }
9369 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009370 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009372 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009373 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009374 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009376 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009377 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009378 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009379 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009380 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009382 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009384 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009386 case llvm::Triple::Win32: {
9387 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009388 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009389 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009390 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009391 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009392 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009393 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009394 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009395 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009396 }
9397 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009398 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009399 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009400 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009401 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009402 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009403 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009404 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009405 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009406 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009407 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009408 }
9409
9410 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009411 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009412 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009413
Daniel Dunbar52322032009-08-18 05:47:58 +00009414 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009415 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009416 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009417 case llvm::Triple::Linux: {
9418 switch (Triple.getEnvironment()) {
9419 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009420 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009421 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009422 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009423 }
9424 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009425 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009426 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009427 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009428 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009429 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009430 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009431 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009432 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009433 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009434 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009435 case llvm::Triple::Fuchsia:
9436 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009437 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009438 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009439 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009440 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009441 case llvm::Triple::Win32: {
9442 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009443 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009444 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009445 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009446 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009447 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009448 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009449 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009450 }
9451 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009452 case llvm::Triple::Haiku:
9453 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009454 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009455 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009456 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009457 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009458 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009459 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009460 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009461
Douglas Katzman78d7c542015-05-12 21:18:10 +00009462 case llvm::Triple::spir: {
9463 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9464 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9465 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009466 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009467 }
9468 case llvm::Triple::spir64: {
9469 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9470 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9471 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009472 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009473 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009474 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009475 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9476 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9477 Triple.getOS() != llvm::Triple::UnknownOS ||
9478 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9479 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009480 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009481 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009482 case llvm::Triple::wasm64:
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<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009490
9491 case llvm::Triple::renderscript32:
9492 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9493 case llvm::Triple::renderscript64:
9494 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009495 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009496}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009497
9498/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009499/// options.
Alp Toker80758082014-07-06 05:26:44 +00009500TargetInfo *
9501TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009502 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009503 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009504
9505 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009506 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009507 if (!Target) {
9508 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009509 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009510 }
Alp Toker80758082014-07-06 05:26:44 +00009511 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009512
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009513 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009514 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9515 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009516 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009517 }
9518
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009519 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009520 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9521 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009522 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009523 }
9524
Rafael Espindolaeb265472013-08-21 21:59:03 +00009525 // Set the fp math unit.
9526 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9527 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009528 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009529 }
9530
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009531 // Compute the default target features, we need the target to handle this
9532 // because features may have dependencies on one another.
9533 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009534 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9535 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009536 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009537
9538 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009539 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009540 for (const auto &F : Features)
9541 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9542
Eric Christopher3ff21b32013-10-16 21:26:26 +00009543 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009544 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009545
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009546 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009547 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009548
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009549 if (!Target->validateTarget(Diags))
9550 return nullptr;
9551
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009552 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009553}