blob: 95321ec381320dd03f8c82fa9aa67a53edc3b191 [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.
891 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000892 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000893 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000894 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000895 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000896 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000897 bool HasBPERMD;
898 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000899 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000900
Ulrich Weigand8afad612014-07-28 13:17:52 +0000901protected:
902 std::string ABI;
903
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000905 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000906 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
907 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000908 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000909 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000910 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000911 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000912 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000913
Hal Finkel6b984f02012-07-03 16:51:04 +0000914 /// \brief Flags for architecture specific defines.
915 typedef enum {
916 ArchDefineNone = 0,
917 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
918 ArchDefinePpcgr = 1 << 1,
919 ArchDefinePpcsq = 1 << 2,
920 ArchDefine440 = 1 << 3,
921 ArchDefine603 = 1 << 4,
922 ArchDefine604 = 1 << 5,
923 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000924 ArchDefinePwr5 = 1 << 7,
925 ArchDefinePwr5x = 1 << 8,
926 ArchDefinePwr6 = 1 << 9,
927 ArchDefinePwr6x = 1 << 10,
928 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000929 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000930 ArchDefinePwr9 = 1 << 13,
931 ArchDefineA2 = 1 << 14,
932 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000933 } ArchDefineTypes;
934
Bill Schmidt38378a02013-02-01 20:23:10 +0000935 // Note: GCC recognizes the following additional cpus:
936 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
937 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
938 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000939 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 bool CPUKnown = llvm::StringSwitch<bool>(Name)
941 .Case("generic", true)
942 .Case("440", true)
943 .Case("450", true)
944 .Case("601", true)
945 .Case("602", true)
946 .Case("603", true)
947 .Case("603e", true)
948 .Case("603ev", true)
949 .Case("604", true)
950 .Case("604e", true)
951 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000952 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000953 .Case("g3", true)
954 .Case("7400", true)
955 .Case("g4", true)
956 .Case("7450", true)
957 .Case("g4+", true)
958 .Case("750", true)
959 .Case("970", true)
960 .Case("g5", true)
961 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000962 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000963 .Case("e500mc", true)
964 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000965 .Case("power3", true)
966 .Case("pwr3", true)
967 .Case("power4", true)
968 .Case("pwr4", true)
969 .Case("power5", true)
970 .Case("pwr5", true)
971 .Case("power5x", true)
972 .Case("pwr5x", true)
973 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000974 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000975 .Case("power6x", true)
976 .Case("pwr6x", true)
977 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000978 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000979 .Case("power8", true)
980 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000981 .Case("power9", true)
982 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000985 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000986 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000987 .Case("powerpc64le", true)
988 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000989 .Default(false);
990
991 if (CPUKnown)
992 CPU = Name;
993
994 return CPUKnown;
995 }
996
Ulrich Weigand8afad612014-07-28 13:17:52 +0000997
998 StringRef getABI() const override { return ABI; }
999
Craig Topper6c03a542015-10-19 04:51:35 +00001000 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1001 return llvm::makeArrayRef(BuiltinInfo,
1002 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001003 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001006
Craig Topper3164f332014-03-11 03:39:26 +00001007 void getTargetDefines(const LangOptions &Opts,
1008 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001009
Eric Christopher8c47b422015-10-09 18:39:55 +00001010 bool
1011 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1012 StringRef CPU,
1013 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001014
Craig Topper3164f332014-03-11 03:39:26 +00001015 bool handleTargetFeatures(std::vector<std::string> &Features,
1016 DiagnosticsEngine &Diags) override;
1017 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001018 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1019 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001020
Craig Topperf054e3a2015-10-19 03:52:27 +00001021 ArrayRef<const char *> getGCCRegNames() const override;
1022 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001023 bool validateAsmConstraint(const char *&Name,
1024 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001025 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001026 default: return false;
1027 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001029 case 'b': // Base register
1030 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001031 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001032 break;
1033 // FIXME: The following are added to allow parsing.
1034 // I just took a guess at what the actions should be.
1035 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 'v': // Altivec vector register
1038 Info.setAllowsRegister();
1039 break;
1040 case 'w':
1041 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001042 case 'd':// VSX vector register to hold vector double data
1043 case 'f':// VSX vector register to hold vector float data
1044 case 's':// VSX vector register to hold scalar float data
1045 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001046 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001047 break;
1048 default:
1049 return false;
1050 }
1051 Info.setAllowsRegister();
1052 Name++; // Skip over 'w'.
1053 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 case 'h': // `MQ', `CTR', or `LINK' register
1055 case 'q': // `MQ' register
1056 case 'c': // `CTR' register
1057 case 'l': // `LINK' register
1058 case 'x': // `CR' register (condition register) number 0
1059 case 'y': // `CR' register (condition register)
1060 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001061 Info.setAllowsRegister();
1062 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001064 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001065 // (use `L' instead for SImode constants)
1066 case 'K': // Unsigned 16-bit constant
1067 case 'L': // Signed 16-bit constant shifted left 16 bits
1068 case 'M': // Constant larger than 31
1069 case 'N': // Exact power of 2
1070 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001073 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001075 break;
1076 case 'm': // Memory operand. Note that on PowerPC targets, m can
1077 // include addresses that update the base register. It
1078 // is therefore only safe to use `m' in an asm statement
1079 // if that asm statement accesses the operand exactly once.
1080 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001081 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001084 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001085 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1086 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001087 // register to be updated.
1088 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001089 if (Name[1] != 's')
1090 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001091 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001092 // include any automodification of the base register. Unlike
1093 // `m', this constraint can be used in asm statements that
1094 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001095 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001096 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001097 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001098 break;
1099 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001100 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001101 case 'Z': // Memory operand that is an indexed or indirect from a
1102 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001104 Info.setAllowsMemory();
1105 Info.setAllowsRegister();
1106 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001108 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109 // register (`p' is preferable for asm statements)
1110 case 'S': // Constant suitable as a 64-bit mask operand
1111 case 'T': // Constant suitable as a 32-bit mask operand
1112 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001113 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001114 // instructions
1115 case 'W': // Vector constant that does not require memory
1116 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001117 break;
1118 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
John Thompson07a61a42010-06-24 22:44:13 +00001120 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001121 }
Craig Topper3164f332014-03-11 03:39:26 +00001122 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001123 std::string R;
1124 switch (*Constraint) {
1125 case 'e':
1126 case 'w':
1127 // Two-character constraint; add "^" hint for later parsing.
1128 R = std::string("^") + std::string(Constraint, 2);
1129 Constraint++;
1130 break;
1131 default:
1132 return TargetInfo::convertConstraint(Constraint);
1133 }
1134 return R;
1135 }
Craig Topper3164f332014-03-11 03:39:26 +00001136 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001137 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001138 }
Craig Topper3164f332014-03-11 03:39:26 +00001139 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001140 if (RegNo == 0) return 3;
1141 if (RegNo == 1) return 4;
1142 return -1;
1143 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001144
1145 bool hasSjLjLowering() const override {
1146 return true;
1147 }
David Majnemer2617ea62015-06-09 18:05:33 +00001148
1149 bool useFloat128ManglingForLongDouble() const override {
1150 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001151 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001152 getTriple().isOSBinFormatELF();
1153 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154};
Anders Carlssonf511f642007-11-27 04:11:28 +00001155
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001156const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001157#define BUILTIN(ID, TYPE, ATTRS) \
1158 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1159#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1160 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001161#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001162};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001163
Eric Christopher917e9522014-11-18 22:36:15 +00001164/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001166bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001167 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001168 for (const auto &Feature : Features) {
1169 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001170 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001174 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001176 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001178 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001180 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001182 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001183 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001184 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001185 } else if (Feature == "+float128") {
1186 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001187 } else if (Feature == "+power9-vector") {
1188 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001189 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001190 // TODO: Finish this list and add an assert that we've handled them
1191 // all.
1192 }
Eric Christopher02c33352015-08-25 00:59:11 +00001193
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001194 return true;
1195}
1196
Chris Lattnerecd49032009-03-02 22:27:17 +00001197/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1198/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001199void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001201 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001203 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001205 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001207 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001209 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001211 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001213
Chris Lattnerecd49032009-03-02 22:27:17 +00001214 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1216 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 } else {
1218 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1219 getTriple().getOS() != llvm::Triple::OpenBSD)
1220 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001221 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001222
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001224 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001225 Builder.defineMacro("_CALL_ELF", "1");
1226 if (ABI == "elfv2")
1227 Builder.defineMacro("_CALL_ELF", "2");
1228
Chris Lattnerecd49032009-03-02 22:27:17 +00001229 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001230 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1231 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001232
Chris Lattnerecd49032009-03-02 22:27:17 +00001233 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001234 if (LongDoubleWidth == 128)
1235 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001236
Eric Christopher32ac5e42017-02-15 07:50:11 +00001237 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1238 if (ABI == "elfv2" ||
1239 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1240 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1241
John Thompsone467e192009-11-19 17:18:50 +00001242 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001243 Builder.defineMacro("__VEC__", "10206");
1244 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001245 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001246
1247 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001248 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1249 .Case("440", ArchDefineName)
1250 .Case("450", ArchDefineName | ArchDefine440)
1251 .Case("601", ArchDefineName)
1252 .Case("602", ArchDefineName | ArchDefinePpcgr)
1253 .Case("603", ArchDefineName | ArchDefinePpcgr)
1254 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1255 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1256 .Case("604", ArchDefineName | ArchDefinePpcgr)
1257 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1258 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001259 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001260 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1261 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1262 .Case("750", ArchDefineName | ArchDefinePpcgr)
1263 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1264 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001265 .Case("a2", ArchDefineA2)
1266 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001267 .Case("pwr3", ArchDefinePpcgr)
1268 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1269 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1272 | ArchDefinePpcgr | ArchDefinePpcsq)
1273 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1274 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1275 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1276 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1277 | ArchDefinePpcsq)
1278 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1279 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001280 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1282 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1283 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001284 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1285 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1286 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1287 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001288 .Case("power3", ArchDefinePpcgr)
1289 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1290 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1293 | ArchDefinePpcgr | ArchDefinePpcsq)
1294 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1295 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1296 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1297 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1298 | ArchDefinePpcsq)
1299 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1300 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001301 | ArchDefinePpcgr | ArchDefinePpcsq)
1302 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1303 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1304 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001305 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1306 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1307 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1308 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001309 .Default(ArchDefineNone);
1310
1311 if (defs & ArchDefineName)
1312 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1313 if (defs & ArchDefinePpcgr)
1314 Builder.defineMacro("_ARCH_PPCGR");
1315 if (defs & ArchDefinePpcsq)
1316 Builder.defineMacro("_ARCH_PPCSQ");
1317 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001318 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 if (defs & ArchDefine603)
1320 Builder.defineMacro("_ARCH_603");
1321 if (defs & ArchDefine604)
1322 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001324 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001325 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001326 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001327 if (defs & ArchDefinePwr5x)
1328 Builder.defineMacro("_ARCH_PWR5X");
1329 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001330 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001331 if (defs & ArchDefinePwr6x)
1332 Builder.defineMacro("_ARCH_PWR6X");
1333 if (defs & ArchDefinePwr7)
1334 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001335 if (defs & ArchDefinePwr8)
1336 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001337 if (defs & ArchDefinePwr9)
1338 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001339 if (defs & ArchDefineA2)
1340 Builder.defineMacro("_ARCH_A2");
1341 if (defs & ArchDefineA2q) {
1342 Builder.defineMacro("_ARCH_A2Q");
1343 Builder.defineMacro("_ARCH_QP");
1344 }
1345
1346 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1347 Builder.defineMacro("__bg__");
1348 Builder.defineMacro("__THW_BLUEGENE__");
1349 Builder.defineMacro("__bgq__");
1350 Builder.defineMacro("__TOS_BGQ__");
1351 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001352
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001353 if (HasVSX)
1354 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001355 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001356 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001357 if (HasP8Crypto)
1358 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001359 if (HasHTM)
1360 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001361 if (HasFloat128)
1362 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001363 if (HasP9Vector)
1364 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001365
1366 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1367 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1369 if (PointerWidth == 64)
1370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001371
Bill Schmidt38378a02013-02-01 20:23:10 +00001372 // FIXME: The following are not yet generated here by Clang, but are
1373 // generated by GCC:
1374 //
1375 // _SOFT_FLOAT_
1376 // __RECIP_PRECISION__
1377 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001378 // __RECIP__
1379 // __RECIPF__
1380 // __RSQRTE__
1381 // __RSQRTEF__
1382 // _SOFT_DOUBLE_
1383 // __NO_LWSYNC__
1384 // __HAVE_BSWAP__
1385 // __LONGDOUBLE128
1386 // __CMODEL_MEDIUM__
1387 // __CMODEL_LARGE__
1388 // _CALL_SYSV
1389 // _CALL_DARWIN
1390 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001391}
1392
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001394// explicitly turned off vsx and turned on any of:
1395// - power8-vector
1396// - direct-move
1397// - float128
1398// - power9-vector
1399// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001400// set of options.
1401static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001402 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001403
1404 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1405 FeaturesVec.end()) {
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1409 << "-mno-vsx";
1410 return false;
1411 }
1412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1423 << "-mno-vsx";
1424 return false;
1425 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001426
1427 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1428 FeaturesVec.end()) {
1429 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1430 << "-mno-vsx";
1431 return false;
1432 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001433 }
1434
1435 return true;
1436}
1437
Eric Christopher8c47b422015-10-09 18:39:55 +00001438bool PPCTargetInfo::initFeatureMap(
1439 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1440 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001441 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1442 .Case("7400", true)
1443 .Case("g4", true)
1444 .Case("7450", true)
1445 .Case("g4+", true)
1446 .Case("970", true)
1447 .Case("g5", true)
1448 .Case("pwr6", true)
1449 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001450 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001452 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001453 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001454 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001455
1456 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001457 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001458 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1459 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001460 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001461 .Case("pwr8", true)
1462 .Default(false);
1463 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1464 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001465 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001466 .Case("pwr8", true)
1467 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001468 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1469 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001470 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001471 .Case("pwr8", true)
1472 .Case("pwr7", true)
1473 .Default(false);
1474 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1475 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001476 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001477 .Case("pwr8", true)
1478 .Case("pwr7", true)
1479 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001480 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1481 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001482 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001483 .Case("pwr8", true)
1484 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001485 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1486 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001487 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001488 .Case("pwr8", true)
1489 .Case("pwr7", true)
1490 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001491
Eric Christophera8a14c32015-08-31 18:39:16 +00001492 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1493 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001494
Eric Christopher007b0a02015-08-28 22:32:01 +00001495 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001496}
1497
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001498bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001499 return llvm::StringSwitch<bool>(Feature)
1500 .Case("powerpc", true)
1501 .Case("vsx", HasVSX)
1502 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001503 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001504 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001505 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001506 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001507 .Case("bpermd", HasBPERMD)
1508 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001509 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001510 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001511 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001512}
Chris Lattner17df24e2008-04-21 18:56:49 +00001513
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001514void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1515 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001516 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1517 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1518 // incompatible options.
1519 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001520 if (Name == "direct-move" ||
1521 Name == "power8-vector" ||
1522 Name == "float128" ||
1523 Name == "power9-vector") {
1524 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001525 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001526 if (Name == "power9-vector")
1527 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = true;
1530 }
1531 } else {
1532 if (Name == "vsx") {
1533 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001534 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001535 } else {
1536 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001537 }
1538 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001539}
1540
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001541const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001542 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1543 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1544 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1545 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1546 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1547 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1548 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1549 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001551 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001552 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001553 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1554 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1555 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1556 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557 "vrsave", "vscr",
1558 "spe_acc", "spefscr",
1559 "sfp"
1560};
Chris Lattner10a5b382007-01-29 05:24:35 +00001561
Craig Topperf054e3a2015-10-19 03:52:27 +00001562ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1563 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001564}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001565
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001566const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1567 // While some of these aliases do map to different registers
1568 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001569 { { "0" }, "r0" },
1570 { { "1"}, "r1" },
1571 { { "2" }, "r2" },
1572 { { "3" }, "r3" },
1573 { { "4" }, "r4" },
1574 { { "5" }, "r5" },
1575 { { "6" }, "r6" },
1576 { { "7" }, "r7" },
1577 { { "8" }, "r8" },
1578 { { "9" }, "r9" },
1579 { { "10" }, "r10" },
1580 { { "11" }, "r11" },
1581 { { "12" }, "r12" },
1582 { { "13" }, "r13" },
1583 { { "14" }, "r14" },
1584 { { "15" }, "r15" },
1585 { { "16" }, "r16" },
1586 { { "17" }, "r17" },
1587 { { "18" }, "r18" },
1588 { { "19" }, "r19" },
1589 { { "20" }, "r20" },
1590 { { "21" }, "r21" },
1591 { { "22" }, "r22" },
1592 { { "23" }, "r23" },
1593 { { "24" }, "r24" },
1594 { { "25" }, "r25" },
1595 { { "26" }, "r26" },
1596 { { "27" }, "r27" },
1597 { { "28" }, "r28" },
1598 { { "29" }, "r29" },
1599 { { "30" }, "r30" },
1600 { { "31" }, "r31" },
1601 { { "fr0" }, "f0" },
1602 { { "fr1" }, "f1" },
1603 { { "fr2" }, "f2" },
1604 { { "fr3" }, "f3" },
1605 { { "fr4" }, "f4" },
1606 { { "fr5" }, "f5" },
1607 { { "fr6" }, "f6" },
1608 { { "fr7" }, "f7" },
1609 { { "fr8" }, "f8" },
1610 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001611 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001612 { { "fr11" }, "f11" },
1613 { { "fr12" }, "f12" },
1614 { { "fr13" }, "f13" },
1615 { { "fr14" }, "f14" },
1616 { { "fr15" }, "f15" },
1617 { { "fr16" }, "f16" },
1618 { { "fr17" }, "f17" },
1619 { { "fr18" }, "f18" },
1620 { { "fr19" }, "f19" },
1621 { { "fr20" }, "f20" },
1622 { { "fr21" }, "f21" },
1623 { { "fr22" }, "f22" },
1624 { { "fr23" }, "f23" },
1625 { { "fr24" }, "f24" },
1626 { { "fr25" }, "f25" },
1627 { { "fr26" }, "f26" },
1628 { { "fr27" }, "f27" },
1629 { { "fr28" }, "f28" },
1630 { { "fr29" }, "f29" },
1631 { { "fr30" }, "f30" },
1632 { { "fr31" }, "f31" },
1633 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001634};
1635
Craig Topperf054e3a2015-10-19 03:52:27 +00001636ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1637 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001638}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001639
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001640class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001641public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001642 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1643 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001644 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001645
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001646 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001647 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001648 case llvm::Triple::FreeBSD:
1649 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001650 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001651 PtrDiffType = SignedInt;
1652 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001653 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001654 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001655 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001656 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001657
Roman Divacky3ffe7462012-03-13 19:20:17 +00001658 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1659 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001660 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001661 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001662
1663 // PPC32 supports atomics up to 4 bytes.
1664 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001665 }
1666
Craig Topper3164f332014-03-11 03:39:26 +00001667 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001668 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001669 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001670 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001671};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001672
Bill Schmidt778d3872013-07-26 01:36:11 +00001673// Note: ABI differences may eventually require us to have a separate
1674// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001675class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001677 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1678 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001679 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001680 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001681 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001682
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001683 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1684 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001685 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001686 } else {
1687 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001688 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001689 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001690
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001691 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001692 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001693 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001694 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001695 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001696 case llvm::Triple::NetBSD:
1697 IntMaxType = SignedLongLong;
1698 Int64Type = SignedLongLong;
1699 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001700 default:
1701 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001702 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001703
1704 // PPC64 supports atomics up to 8 bytes.
1705 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001706 }
Craig Topper3164f332014-03-11 03:39:26 +00001707 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001708 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001709 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001710 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001711 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001712 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001713 ABI = Name;
1714 return true;
1715 }
1716 return false;
1717 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001718};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001719
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001720class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001721public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001722 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1723 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001724 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001725 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001726 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001727 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001728 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001729 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001730 }
Craig Topper3164f332014-03-11 03:39:26 +00001731 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001732 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 }
1734};
1735
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001736class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001737public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001738 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1739 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001740 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001741 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001742 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001743 }
1744};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001745
Eric Christopherc48497a2015-09-18 21:26:24 +00001746static const unsigned NVPTXAddrSpaceMap[] = {
1747 1, // opencl_global
1748 3, // opencl_local
1749 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001750 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001751 0, // opencl_generic
1752 1, // cuda_device
1753 4, // cuda_constant
1754 3, // cuda_shared
1755};
1756
1757class NVPTXTargetInfo : public TargetInfo {
1758 static const char *const GCCRegNames[];
1759 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001760 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001761 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001762
Eric Christopherc48497a2015-09-18 21:26:24 +00001763public:
Justin Lebarb6626592017-01-05 16:53:21 +00001764 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1765 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001766 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001767 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1768 "NVPTX only supports 32- and 64-bit modes.");
1769
Eric Christopherc48497a2015-09-18 21:26:24 +00001770 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001771 AddrSpaceMap = &NVPTXAddrSpaceMap;
1772 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001773
Eric Christopherc48497a2015-09-18 21:26:24 +00001774 // Define available target features
1775 // These must be defined in sorted order!
1776 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001777 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001778
Justin Lebarb6626592017-01-05 16:53:21 +00001779 if (TargetPointerWidth == 32)
1780 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1781 else
1782 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1783
Justin Lebar76945b22016-04-29 23:05:19 +00001784 // If possible, get a TargetInfo for our host triple, so we can match its
1785 // types.
1786 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001787 if (!HostTriple.isNVPTX())
1788 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1789
1790 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001791 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001792 LongWidth = LongAlign = TargetPointerWidth;
1793 PointerWidth = PointerAlign = TargetPointerWidth;
1794 switch (TargetPointerWidth) {
1795 case 32:
1796 SizeType = TargetInfo::UnsignedInt;
1797 PtrDiffType = TargetInfo::SignedInt;
1798 IntPtrType = TargetInfo::SignedInt;
1799 break;
1800 case 64:
1801 SizeType = TargetInfo::UnsignedLong;
1802 PtrDiffType = TargetInfo::SignedLong;
1803 IntPtrType = TargetInfo::SignedLong;
1804 break;
1805 default:
1806 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1807 }
Justin Lebar76945b22016-04-29 23:05:19 +00001808 return;
1809 }
1810
Justin Lebarb6626592017-01-05 16:53:21 +00001811 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001812 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1813 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1814 BoolWidth = HostTarget->getBoolWidth();
1815 BoolAlign = HostTarget->getBoolAlign();
1816 IntWidth = HostTarget->getIntWidth();
1817 IntAlign = HostTarget->getIntAlign();
1818 HalfWidth = HostTarget->getHalfWidth();
1819 HalfAlign = HostTarget->getHalfAlign();
1820 FloatWidth = HostTarget->getFloatWidth();
1821 FloatAlign = HostTarget->getFloatAlign();
1822 DoubleWidth = HostTarget->getDoubleWidth();
1823 DoubleAlign = HostTarget->getDoubleAlign();
1824 LongWidth = HostTarget->getLongWidth();
1825 LongAlign = HostTarget->getLongAlign();
1826 LongLongWidth = HostTarget->getLongLongWidth();
1827 LongLongAlign = HostTarget->getLongLongAlign();
1828 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001829 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001830 DefaultAlignForAttributeAligned =
1831 HostTarget->getDefaultAlignForAttributeAligned();
1832 SizeType = HostTarget->getSizeType();
1833 IntMaxType = HostTarget->getIntMaxType();
1834 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1835 IntPtrType = HostTarget->getIntPtrType();
1836 WCharType = HostTarget->getWCharType();
1837 WIntType = HostTarget->getWIntType();
1838 Char16Type = HostTarget->getChar16Type();
1839 Char32Type = HostTarget->getChar32Type();
1840 Int64Type = HostTarget->getInt64Type();
1841 SigAtomicType = HostTarget->getSigAtomicType();
1842 ProcessIDType = HostTarget->getProcessIDType();
1843
1844 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1845 UseZeroLengthBitfieldAlignment =
1846 HostTarget->useZeroLengthBitfieldAlignment();
1847 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1848 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1849
Justin Lebar5057f172016-09-09 20:35:43 +00001850 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1851 // we need those macros to be identical on host and device, because (among
1852 // other things) they affect which standard library classes are defined, and
1853 // we need all classes to be defined on both the host and device.
1854 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1855
Justin Lebar76945b22016-04-29 23:05:19 +00001856 // Properties intentionally not copied from host:
1857 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1858 // host/device boundary.
1859 // - SuitableAlign: Not visible across the host/device boundary, and may
1860 // correctly be different on host/device, e.g. if host has wider vector
1861 // types than device.
1862 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1863 // as its double type, but that's not necessarily true on the host.
1864 // TODO: nvcc emits a warning when using long double on device; we should
1865 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001866 }
1867 void getTargetDefines(const LangOptions &Opts,
1868 MacroBuilder &Builder) const override {
1869 Builder.defineMacro("__PTX__");
1870 Builder.defineMacro("__NVPTX__");
1871 if (Opts.CUDAIsDevice) {
1872 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001873 std::string CUDAArchCode = [this] {
1874 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001875 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001876 assert(false && "No GPU arch when compiling CUDA device code.");
1877 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001878 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001879 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001880 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001881 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001882 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001883 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001884 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001885 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001886 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001887 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001888 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001889 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001890 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001891 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001892 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001893 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001894 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001895 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001896 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001898 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001899 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001900 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001901 return "620";
1902 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001903 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001904 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001905 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001906 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001907 }
Craig Topper6c03a542015-10-19 04:51:35 +00001908 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1909 return llvm::makeArrayRef(BuiltinInfo,
1910 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 }
Artem Belevichfda99052016-09-28 17:47:35 +00001912 bool
1913 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1914 StringRef CPU,
1915 const std::vector<std::string> &FeaturesVec) const override {
1916 Features["satom"] = GPU >= CudaArch::SM_60;
1917 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1918 }
1919
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001921 return llvm::StringSwitch<bool>(Feature)
1922 .Cases("ptx", "nvptx", true)
1923 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1924 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001925 }
1926
Craig Topperf054e3a2015-10-19 03:52:27 +00001927 ArrayRef<const char *> getGCCRegNames() const override;
1928 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001929 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001930 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001931 }
1932 bool validateAsmConstraint(const char *&Name,
1933 TargetInfo::ConstraintInfo &Info) const override {
1934 switch (*Name) {
1935 default:
1936 return false;
1937 case 'c':
1938 case 'h':
1939 case 'r':
1940 case 'l':
1941 case 'f':
1942 case 'd':
1943 Info.setAllowsRegister();
1944 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001945 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001946 }
1947 const char *getClobbers() const override {
1948 // FIXME: Is this really right?
1949 return "";
1950 }
1951 BuiltinVaListKind getBuiltinVaListKind() const override {
1952 // FIXME: implement
1953 return TargetInfo::CharPtrBuiltinVaList;
1954 }
1955 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001956 GPU = StringToCudaArch(Name);
1957 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001958 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001959 void setSupportedOpenCLOpts() override {
1960 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001961 Opts.support("cl_clang_storage_class_specifiers");
1962 Opts.support("cl_khr_gl_sharing");
1963 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001964
Yaxun Liu5b746652016-12-18 05:18:55 +00001965 Opts.support("cl_khr_fp64");
1966 Opts.support("cl_khr_byte_addressable_store");
1967 Opts.support("cl_khr_global_int32_base_atomics");
1968 Opts.support("cl_khr_global_int32_extended_atomics");
1969 Opts.support("cl_khr_local_int32_base_atomics");
1970 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001971 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001972
1973 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1974 // CUDA compilations support all of the host's calling conventions.
1975 //
1976 // TODO: We should warn if you apply a non-default CC to anything other than
1977 // a host function.
1978 if (HostTarget)
1979 return HostTarget->checkCallingConvention(CC);
1980 return CCCR_Warning;
1981 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001982};
1983
1984const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1985#define BUILTIN(ID, TYPE, ATTRS) \
1986 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1987#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1988 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001989#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1990 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001991#include "clang/Basic/BuiltinsNVPTX.def"
1992};
1993
1994const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1995
Craig Topperf054e3a2015-10-19 03:52:27 +00001996ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1997 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001998}
1999
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002000static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002001 1, // opencl_global
2002 3, // opencl_local
2003 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00002004 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00002005 1, // cuda_device
2006 2, // cuda_constant
2007 3 // cuda_shared
2008};
2009
Tom Stellarda96344b2014-08-21 13:58:40 +00002010// If you edit the description strings, make sure you update
2011// getPointerWidthV().
2012
Craig Topper273dbc62015-10-18 05:29:26 +00002013static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002014 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2015 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002016
Craig Topper273dbc62015-10-18 05:29:26 +00002017static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002018 "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 +00002019 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2020 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002021
Matt Arsenault250024f2016-06-08 01:56:42 +00002022class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002023 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002024 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002025
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002026 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002027 enum GPUKind {
2028 GK_NONE,
2029 GK_R600,
2030 GK_R600_DOUBLE_OPS,
2031 GK_R700,
2032 GK_R700_DOUBLE_OPS,
2033 GK_EVERGREEN,
2034 GK_EVERGREEN_DOUBLE_OPS,
2035 GK_NORTHERN_ISLANDS,
2036 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002037 GK_GFX6,
2038 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002039 GK_GFX8,
2040 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002041 } GPU;
2042
Jan Veselyeebeaea2015-05-04 19:53:36 +00002043 bool hasFP64:1;
2044 bool hasFMAF:1;
2045 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002046 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002047
Matt Arsenault250024f2016-06-08 01:56:42 +00002048 static bool isAMDGCN(const llvm::Triple &TT) {
2049 return TT.getArch() == llvm::Triple::amdgcn;
2050 }
2051
Eli Friedmand13b41e2012-10-12 23:32:00 +00002052public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002053 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002054 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002055 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002056 hasFP64(false),
2057 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002058 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002059 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002060 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002061 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002062 hasFMAF = true;
2063 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002064 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002065
2066 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2067 DataLayoutStringSI : DataLayoutStringR600);
2068
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002069 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002070 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002071 }
2072
Tom Stellarda96344b2014-08-21 13:58:40 +00002073 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2074 if (GPU <= GK_CAYMAN)
2075 return 32;
2076
2077 switch(AddrSpace) {
2078 default:
2079 return 64;
2080 case 0:
2081 case 3:
2082 case 5:
2083 return 32;
2084 }
2085 }
2086
Yaxun Liu26f75662016-08-19 05:17:25 +00002087 uint64_t getMaxPointerWidth() const override {
2088 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2089 }
2090
Craig Topper3164f332014-03-11 03:39:26 +00002091 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002092 return "";
2093 }
2094
Craig Topperf054e3a2015-10-19 03:52:27 +00002095 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002096
Craig Topperf054e3a2015-10-19 03:52:27 +00002097 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2098 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002099 }
2100
Craig Topper3164f332014-03-11 03:39:26 +00002101 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002102 TargetInfo::ConstraintInfo &Info) const override {
2103 switch (*Name) {
2104 default: break;
2105 case 'v': // vgpr
2106 case 's': // sgpr
2107 Info.setAllowsRegister();
2108 return true;
2109 }
2110 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002111 }
2112
Matt Arsenault250024f2016-06-08 01:56:42 +00002113 bool initFeatureMap(llvm::StringMap<bool> &Features,
2114 DiagnosticsEngine &Diags, StringRef CPU,
2115 const std::vector<std::string> &FeatureVec) const override;
2116
Yaxun Liu2c17e822016-08-09 19:43:38 +00002117 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2118 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002119 bool hasFP32Denormals = false;
2120 bool hasFP64Denormals = false;
2121 for (auto &I : TargetOpts.FeaturesAsWritten) {
2122 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2123 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002124 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 hasFP64Denormals = true;
2126 }
2127 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002128 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2129 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002130 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002131 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002132 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002133 }
2134
Craig Topper6c03a542015-10-19 04:51:35 +00002135 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2136 return llvm::makeArrayRef(BuiltinInfo,
2137 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002138 }
2139
Craig Topper3164f332014-03-11 03:39:26 +00002140 void getTargetDefines(const LangOptions &Opts,
2141 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002142 if (getTriple().getArch() == llvm::Triple::amdgcn)
2143 Builder.defineMacro("__AMDGCN__");
2144 else
2145 Builder.defineMacro("__R600__");
2146
Jan Veselyeebeaea2015-05-04 19:53:36 +00002147 if (hasFMAF)
2148 Builder.defineMacro("__HAS_FMAF__");
2149 if (hasLDEXPF)
2150 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002151 if (hasFP64)
2152 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002153 }
2154
Craig Topper3164f332014-03-11 03:39:26 +00002155 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002156 return TargetInfo::CharPtrBuiltinVaList;
2157 }
2158
Matt Arsenault250024f2016-06-08 01:56:42 +00002159 static GPUKind parseR600Name(StringRef Name) {
2160 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002161 .Case("r600" , GK_R600)
2162 .Case("rv610", GK_R600)
2163 .Case("rv620", GK_R600)
2164 .Case("rv630", GK_R600)
2165 .Case("rv635", GK_R600)
2166 .Case("rs780", GK_R600)
2167 .Case("rs880", GK_R600)
2168 .Case("rv670", GK_R600_DOUBLE_OPS)
2169 .Case("rv710", GK_R700)
2170 .Case("rv730", GK_R700)
2171 .Case("rv740", GK_R700_DOUBLE_OPS)
2172 .Case("rv770", GK_R700_DOUBLE_OPS)
2173 .Case("palm", GK_EVERGREEN)
2174 .Case("cedar", GK_EVERGREEN)
2175 .Case("sumo", GK_EVERGREEN)
2176 .Case("sumo2", GK_EVERGREEN)
2177 .Case("redwood", GK_EVERGREEN)
2178 .Case("juniper", GK_EVERGREEN)
2179 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2180 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2181 .Case("barts", GK_NORTHERN_ISLANDS)
2182 .Case("turks", GK_NORTHERN_ISLANDS)
2183 .Case("caicos", GK_NORTHERN_ISLANDS)
2184 .Case("cayman", GK_CAYMAN)
2185 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002186 .Default(GK_NONE);
2187 }
2188
2189 static GPUKind parseAMDGCNName(StringRef Name) {
2190 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002191 .Case("tahiti", GK_GFX6)
2192 .Case("pitcairn", GK_GFX6)
2193 .Case("verde", GK_GFX6)
2194 .Case("oland", GK_GFX6)
2195 .Case("hainan", GK_GFX6)
2196 .Case("bonaire", GK_GFX7)
2197 .Case("kabini", GK_GFX7)
2198 .Case("kaveri", GK_GFX7)
2199 .Case("hawaii", GK_GFX7)
2200 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002201 .Case("gfx700", GK_GFX7)
2202 .Case("gfx701", GK_GFX7)
2203 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002204 .Case("tonga", GK_GFX8)
2205 .Case("iceland", GK_GFX8)
2206 .Case("carrizo", GK_GFX8)
2207 .Case("fiji", GK_GFX8)
2208 .Case("stoney", GK_GFX8)
2209 .Case("polaris10", GK_GFX8)
2210 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002211 .Case("gfx800", GK_GFX8)
2212 .Case("gfx801", GK_GFX8)
2213 .Case("gfx802", GK_GFX8)
2214 .Case("gfx803", GK_GFX8)
2215 .Case("gfx804", GK_GFX8)
2216 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002217 .Case("gfx900", GK_GFX9)
2218 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002219 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002220 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002221
Matt Arsenault250024f2016-06-08 01:56:42 +00002222 bool setCPU(const std::string &Name) override {
2223 if (getTriple().getArch() == llvm::Triple::amdgcn)
2224 GPU = parseAMDGCNName(Name);
2225 else
2226 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002227
Matt Arsenault250024f2016-06-08 01:56:42 +00002228 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002229 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002230
Jan Vesely211ba782016-06-17 02:25:03 +00002231 void setSupportedOpenCLOpts() override {
2232 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002233 Opts.support("cl_clang_storage_class_specifiers");
2234 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002235
Jan Vesely211ba782016-06-17 02:25:03 +00002236 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002237 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002238 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002239 Opts.support("cl_khr_byte_addressable_store");
2240 Opts.support("cl_khr_global_int32_base_atomics");
2241 Opts.support("cl_khr_global_int32_extended_atomics");
2242 Opts.support("cl_khr_local_int32_base_atomics");
2243 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002244 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002245 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002246 Opts.support("cl_khr_fp16");
2247 Opts.support("cl_khr_int64_base_atomics");
2248 Opts.support("cl_khr_int64_extended_atomics");
2249 Opts.support("cl_khr_mipmap_image");
2250 Opts.support("cl_khr_subgroups");
2251 Opts.support("cl_khr_3d_image_writes");
2252 Opts.support("cl_amd_media_ops");
2253 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002254 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002255 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002256
Yaxun Liu99444cb2016-08-03 20:38:06 +00002257 LangAS::ID getOpenCLImageAddrSpace() const override {
2258 return LangAS::opencl_constant;
2259 }
2260
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002261 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2262 switch (CC) {
2263 default:
2264 return CCCR_Warning;
2265 case CC_C:
2266 case CC_OpenCLKernel:
2267 return CCCR_OK;
2268 }
2269 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002270
2271 // In amdgcn target the null pointer in global, constant, and generic
2272 // address space has value 0 but in private and local address space has
2273 // value ~0.
2274 uint64_t getNullPointerValue(unsigned AS) const override {
2275 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2276 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002277};
2278
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002279const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002280#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002281 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002282#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2283 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002284#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002285};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002286const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002287 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2288 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2289 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2290 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2291 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2292 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2293 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2294 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2295 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2296 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2297 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2298 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2299 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2300 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2301 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2302 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2303 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2304 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2305 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2306 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2307 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2308 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2309 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2310 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2311 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2312 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2313 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2314 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2315 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2316 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2317 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2318 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2319 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2320 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2321 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2322 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2323 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2324 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2325 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2326 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2327 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2328 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2329 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2330 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2331 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2332 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2333 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002334 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002335 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2336 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002337};
2338
Craig Topperf054e3a2015-10-19 03:52:27 +00002339ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2340 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002341}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002342
Matt Arsenault250024f2016-06-08 01:56:42 +00002343bool AMDGPUTargetInfo::initFeatureMap(
2344 llvm::StringMap<bool> &Features,
2345 DiagnosticsEngine &Diags, StringRef CPU,
2346 const std::vector<std::string> &FeatureVec) const {
2347
2348 // XXX - What does the member GPU mean if device name string passed here?
2349 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2350 if (CPU.empty())
2351 CPU = "tahiti";
2352
2353 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002354 case GK_GFX6:
2355 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002356 break;
2357
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002358 case GK_GFX9:
2359 Features["gfx9-insts"] = true;
2360 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002361 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002362 Features["s-memrealtime"] = true;
2363 Features["16-bit-insts"] = true;
2364 break;
2365
2366 case GK_NONE:
2367 return false;
2368 default:
2369 llvm_unreachable("unhandled subtarget");
2370 }
2371 } else {
2372 if (CPU.empty())
2373 CPU = "r600";
2374
2375 switch (parseR600Name(CPU)) {
2376 case GK_R600:
2377 case GK_R700:
2378 case GK_EVERGREEN:
2379 case GK_NORTHERN_ISLANDS:
2380 break;
2381 case GK_R600_DOUBLE_OPS:
2382 case GK_R700_DOUBLE_OPS:
2383 case GK_EVERGREEN_DOUBLE_OPS:
2384 case GK_CAYMAN:
2385 Features["fp64"] = true;
2386 break;
2387 case GK_NONE:
2388 return false;
2389 default:
2390 llvm_unreachable("unhandled subtarget");
2391 }
2392 }
2393
2394 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2395}
2396
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002397const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002398#define BUILTIN(ID, TYPE, ATTRS) \
2399 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002400#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002401 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002402#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2403 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002404#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002405
2406#define BUILTIN(ID, TYPE, ATTRS) \
2407 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002408#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2409 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002410#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2411 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2412#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002413};
Eli Friedmanb5366062008-05-20 14:21:01 +00002414
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002415
Nuno Lopescfca1f02009-12-23 17:49:57 +00002416static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002417 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2418 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002419 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002420 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2421 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2422 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002423 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002424 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2425 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002426 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2427 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2428 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2429 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2430 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2431 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2432 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2433 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002434 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002435};
2436
Eric Christophercdd36352011-06-21 00:05:20 +00002437const TargetInfo::AddlRegName AddlRegNames[] = {
2438 { { "al", "ah", "eax", "rax" }, 0 },
2439 { { "bl", "bh", "ebx", "rbx" }, 3 },
2440 { { "cl", "ch", "ecx", "rcx" }, 2 },
2441 { { "dl", "dh", "edx", "rdx" }, 1 },
2442 { { "esi", "rsi" }, 4 },
2443 { { "edi", "rdi" }, 5 },
2444 { { "esp", "rsp" }, 7 },
2445 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002446 { { "r8d", "r8w", "r8b" }, 38 },
2447 { { "r9d", "r9w", "r9b" }, 39 },
2448 { { "r10d", "r10w", "r10b" }, 40 },
2449 { { "r11d", "r11w", "r11b" }, 41 },
2450 { { "r12d", "r12w", "r12b" }, 42 },
2451 { { "r13d", "r13w", "r13b" }, 43 },
2452 { { "r14d", "r14w", "r14b" }, 44 },
2453 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002454};
2455
2456// X86 target abstract base class; x86-32 and x86-64 are very close, so
2457// most of the implementation can be shared.
2458class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002459 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002460 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002461 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002462 enum MMX3DNowEnum {
2463 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002464 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002465 enum XOPEnum {
2466 NoXOP,
2467 SSE4A,
2468 FMA4,
2469 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002470 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002471
Craig Topper543f3bd2015-10-14 23:47:57 +00002472 bool HasAES = false;
2473 bool HasPCLMUL = false;
2474 bool HasLZCNT = false;
2475 bool HasRDRND = false;
2476 bool HasFSGSBASE = false;
2477 bool HasBMI = false;
2478 bool HasBMI2 = false;
2479 bool HasPOPCNT = false;
2480 bool HasRTM = false;
2481 bool HasPRFCHW = false;
2482 bool HasRDSEED = false;
2483 bool HasADX = false;
2484 bool HasTBM = false;
2485 bool HasFMA = false;
2486 bool HasF16C = false;
2487 bool HasAVX512CD = false;
2488 bool HasAVX512ER = false;
2489 bool HasAVX512PF = false;
2490 bool HasAVX512DQ = false;
2491 bool HasAVX512BW = false;
2492 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002493 bool HasAVX512VBMI = false;
2494 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002495 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002496 bool HasMPX = false;
2497 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002498 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002499 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002500 bool HasXSAVE = false;
2501 bool HasXSAVEOPT = false;
2502 bool HasXSAVEC = false;
2503 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002504 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002505 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002506 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002507 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002508 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002509 bool HasMOVBE = false;
2510 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002511
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002512 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2513 ///
2514 /// Each enumeration represents a particular CPU supported by Clang. These
2515 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2516 enum CPUKind {
2517 CK_Generic,
2518
2519 /// \name i386
2520 /// i386-generation processors.
2521 //@{
2522 CK_i386,
2523 //@}
2524
2525 /// \name i486
2526 /// i486-generation processors.
2527 //@{
2528 CK_i486,
2529 CK_WinChipC6,
2530 CK_WinChip2,
2531 CK_C3,
2532 //@}
2533
2534 /// \name i586
2535 /// i586-generation processors, P5 microarchitecture based.
2536 //@{
2537 CK_i586,
2538 CK_Pentium,
2539 CK_PentiumMMX,
2540 //@}
2541
2542 /// \name i686
2543 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2544 //@{
2545 CK_i686,
2546 CK_PentiumPro,
2547 CK_Pentium2,
2548 CK_Pentium3,
2549 CK_Pentium3M,
2550 CK_PentiumM,
2551 CK_C3_2,
2552
2553 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2554 /// Clang however has some logic to suport this.
2555 // FIXME: Warn, deprecate, and potentially remove this.
2556 CK_Yonah,
2557 //@}
2558
2559 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002560 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002561 //@{
2562 CK_Pentium4,
2563 CK_Pentium4M,
2564 CK_Prescott,
2565 CK_Nocona,
2566 //@}
2567
2568 /// \name Core
2569 /// Core microarchitecture based processors.
2570 //@{
2571 CK_Core2,
2572
2573 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2574 /// codename which GCC no longer accepts as an option to -march, but Clang
2575 /// has some logic for recognizing it.
2576 // FIXME: Warn, deprecate, and potentially remove this.
2577 CK_Penryn,
2578 //@}
2579
2580 /// \name Atom
2581 /// Atom processors
2582 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002583 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002584 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002585 //@}
2586
2587 /// \name Nehalem
2588 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002589 CK_Nehalem,
2590
2591 /// \name Westmere
2592 /// Westmere microarchitecture based processors.
2593 CK_Westmere,
2594
2595 /// \name Sandy Bridge
2596 /// Sandy Bridge microarchitecture based processors.
2597 CK_SandyBridge,
2598
2599 /// \name Ivy Bridge
2600 /// Ivy Bridge microarchitecture based processors.
2601 CK_IvyBridge,
2602
2603 /// \name Haswell
2604 /// Haswell microarchitecture based processors.
2605 CK_Haswell,
2606
2607 /// \name Broadwell
2608 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002609 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002610
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002611 /// \name Skylake Client
2612 /// Skylake client microarchitecture based processors.
2613 CK_SkylakeClient,
2614
2615 /// \name Skylake Server
2616 /// Skylake server microarchitecture based processors.
2617 CK_SkylakeServer,
2618
2619 /// \name Cannonlake Client
2620 /// Cannonlake client microarchitecture based processors.
2621 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002622
Craig Topper449314e2013-08-20 07:09:39 +00002623 /// \name Knights Landing
2624 /// Knights Landing processor.
2625 CK_KNL,
2626
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002627 /// \name Lakemont
2628 /// Lakemont microarchitecture based processors.
2629 CK_Lakemont,
2630
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002631 /// \name K6
2632 /// K6 architecture processors.
2633 //@{
2634 CK_K6,
2635 CK_K6_2,
2636 CK_K6_3,
2637 //@}
2638
2639 /// \name K7
2640 /// K7 architecture processors.
2641 //@{
2642 CK_Athlon,
2643 CK_AthlonThunderbird,
2644 CK_Athlon4,
2645 CK_AthlonXP,
2646 CK_AthlonMP,
2647 //@}
2648
2649 /// \name K8
2650 /// K8 architecture processors.
2651 //@{
2652 CK_Athlon64,
2653 CK_Athlon64SSE3,
2654 CK_AthlonFX,
2655 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002656 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002657 CK_Opteron,
2658 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002659 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002660 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002661
Benjamin Kramer569f2152012-01-10 11:50:18 +00002662 /// \name Bobcat
2663 /// Bobcat architecture processors.
2664 //@{
2665 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002666 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002667 //@}
2668
2669 /// \name Bulldozer
2670 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002671 //@{
2672 CK_BDVER1,
2673 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002674 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002675 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002676 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002677
Craig Topperc45744a2017-01-10 06:02:12 +00002678 /// \name zen
2679 /// Zen architecture processors.
2680 //@{
2681 CK_ZNVER1,
2682 //@}
2683
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002684 /// This specification is deprecated and will be removed in the future.
2685 /// Users should prefer \see CK_K8.
2686 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002687 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002688 CK_x86_64,
2689 //@}
2690
2691 /// \name Geode
2692 /// Geode processors.
2693 //@{
2694 CK_Geode
2695 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002696 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002697
Eric Christopherc50738f2015-08-27 00:05:50 +00002698 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002699 return llvm::StringSwitch<CPUKind>(CPU)
2700 .Case("i386", CK_i386)
2701 .Case("i486", CK_i486)
2702 .Case("winchip-c6", CK_WinChipC6)
2703 .Case("winchip2", CK_WinChip2)
2704 .Case("c3", CK_C3)
2705 .Case("i586", CK_i586)
2706 .Case("pentium", CK_Pentium)
2707 .Case("pentium-mmx", CK_PentiumMMX)
2708 .Case("i686", CK_i686)
2709 .Case("pentiumpro", CK_PentiumPro)
2710 .Case("pentium2", CK_Pentium2)
2711 .Case("pentium3", CK_Pentium3)
2712 .Case("pentium3m", CK_Pentium3M)
2713 .Case("pentium-m", CK_PentiumM)
2714 .Case("c3-2", CK_C3_2)
2715 .Case("yonah", CK_Yonah)
2716 .Case("pentium4", CK_Pentium4)
2717 .Case("pentium4m", CK_Pentium4M)
2718 .Case("prescott", CK_Prescott)
2719 .Case("nocona", CK_Nocona)
2720 .Case("core2", CK_Core2)
2721 .Case("penryn", CK_Penryn)
2722 .Case("bonnell", CK_Bonnell)
2723 .Case("atom", CK_Bonnell) // Legacy name.
2724 .Case("silvermont", CK_Silvermont)
2725 .Case("slm", CK_Silvermont) // Legacy name.
2726 .Case("nehalem", CK_Nehalem)
2727 .Case("corei7", CK_Nehalem) // Legacy name.
2728 .Case("westmere", CK_Westmere)
2729 .Case("sandybridge", CK_SandyBridge)
2730 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2731 .Case("ivybridge", CK_IvyBridge)
2732 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2733 .Case("haswell", CK_Haswell)
2734 .Case("core-avx2", CK_Haswell) // Legacy name.
2735 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002736 .Case("skylake", CK_SkylakeClient)
2737 .Case("skylake-avx512", CK_SkylakeServer)
2738 .Case("skx", CK_SkylakeServer) // Legacy name.
2739 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002740 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002741 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002742 .Case("k6", CK_K6)
2743 .Case("k6-2", CK_K6_2)
2744 .Case("k6-3", CK_K6_3)
2745 .Case("athlon", CK_Athlon)
2746 .Case("athlon-tbird", CK_AthlonThunderbird)
2747 .Case("athlon-4", CK_Athlon4)
2748 .Case("athlon-xp", CK_AthlonXP)
2749 .Case("athlon-mp", CK_AthlonMP)
2750 .Case("athlon64", CK_Athlon64)
2751 .Case("athlon64-sse3", CK_Athlon64SSE3)
2752 .Case("athlon-fx", CK_AthlonFX)
2753 .Case("k8", CK_K8)
2754 .Case("k8-sse3", CK_K8SSE3)
2755 .Case("opteron", CK_Opteron)
2756 .Case("opteron-sse3", CK_OpteronSSE3)
2757 .Case("barcelona", CK_AMDFAM10)
2758 .Case("amdfam10", CK_AMDFAM10)
2759 .Case("btver1", CK_BTVER1)
2760 .Case("btver2", CK_BTVER2)
2761 .Case("bdver1", CK_BDVER1)
2762 .Case("bdver2", CK_BDVER2)
2763 .Case("bdver3", CK_BDVER3)
2764 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002765 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002766 .Case("x86-64", CK_x86_64)
2767 .Case("geode", CK_Geode)
2768 .Default(CK_Generic);
2769 }
2770
Rafael Espindolaeb265472013-08-21 21:59:03 +00002771 enum FPMathKind {
2772 FP_Default,
2773 FP_SSE,
2774 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002775 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002776
Eli Friedman3fd920a2008-08-20 02:34:37 +00002777public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002778 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2779 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002780 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002781 }
Craig Topper3164f332014-03-11 03:39:26 +00002782 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002783 // X87 evaluates with 80 bits "long double" precision.
2784 return SSELevel == NoSSE ? 2 : 0;
2785 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002786 ArrayRef<const char *> getGCCRegNames() const override {
2787 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002788 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002789 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2790 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002791 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002792 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2793 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002794 }
Eric Christopherd9832702015-06-29 21:00:05 +00002795 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002796 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002797 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002798
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002799 bool validateGlobalRegisterVariable(StringRef RegName,
2800 unsigned RegSize,
2801 bool &HasSizeMismatch) const override {
2802 // esp and ebp are the only 32-bit registers the x86 backend can currently
2803 // handle.
2804 if (RegName.equals("esp") || RegName.equals("ebp")) {
2805 // Check that the register size is 32-bit.
2806 HasSizeMismatch = RegSize != 32;
2807 return true;
2808 }
2809
2810 return false;
2811 }
2812
Akira Hatanaka974131e2014-09-18 18:17:18 +00002813 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2814
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002815 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2816
Akira Hatanaka974131e2014-09-18 18:17:18 +00002817 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2818
Craig Topper3164f332014-03-11 03:39:26 +00002819 std::string convertConstraint(const char *&Constraint) const override;
2820 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002821 return "~{dirflag},~{fpsr},~{flags}";
2822 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002823
2824 StringRef getConstraintRegister(const StringRef &Constraint,
2825 const StringRef &Expression) const override {
2826 StringRef::iterator I, E;
2827 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2828 if (isalpha(*I))
2829 break;
2830 }
2831 if (I == E)
2832 return "";
2833 switch (*I) {
2834 // For the register constraints, return the matching register name
2835 case 'a':
2836 return "ax";
2837 case 'b':
2838 return "bx";
2839 case 'c':
2840 return "cx";
2841 case 'd':
2842 return "dx";
2843 case 'S':
2844 return "si";
2845 case 'D':
2846 return "di";
2847 // In case the constraint is 'r' we need to return Expression
2848 case 'r':
2849 return Expression;
2850 default:
2851 // Default value if there is no constraint for the register
2852 return "";
2853 }
2854 return "";
2855 }
2856
Craig Topper3164f332014-03-11 03:39:26 +00002857 void getTargetDefines(const LangOptions &Opts,
2858 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002859 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2860 bool Enabled);
2861 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2862 bool Enabled);
2863 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2864 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002865 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2866 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002867 setFeatureEnabledImpl(Features, Name, Enabled);
2868 }
2869 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002870 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002871 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2872 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002873 bool
2874 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2875 StringRef CPU,
2876 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002877 bool hasFeature(StringRef Feature) const override;
2878 bool handleTargetFeatures(std::vector<std::string> &Features,
2879 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002880 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002881 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2882 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002883 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002884 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002885 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002886 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002887 return "no-mmx";
2888 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002889 }
Craig Topper3164f332014-03-11 03:39:26 +00002890 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002891 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002892
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002893 // Perform any per-CPU checks necessary to determine if this CPU is
2894 // acceptable.
2895 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2896 // invalid without explaining *why*.
2897 switch (CPU) {
2898 case CK_Generic:
2899 // No processor selected!
2900 return false;
2901
2902 case CK_i386:
2903 case CK_i486:
2904 case CK_WinChipC6:
2905 case CK_WinChip2:
2906 case CK_C3:
2907 case CK_i586:
2908 case CK_Pentium:
2909 case CK_PentiumMMX:
2910 case CK_i686:
2911 case CK_PentiumPro:
2912 case CK_Pentium2:
2913 case CK_Pentium3:
2914 case CK_Pentium3M:
2915 case CK_PentiumM:
2916 case CK_Yonah:
2917 case CK_C3_2:
2918 case CK_Pentium4:
2919 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002920 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002921 case CK_Prescott:
2922 case CK_K6:
2923 case CK_K6_2:
2924 case CK_K6_3:
2925 case CK_Athlon:
2926 case CK_AthlonThunderbird:
2927 case CK_Athlon4:
2928 case CK_AthlonXP:
2929 case CK_AthlonMP:
2930 case CK_Geode:
2931 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002932 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002933 return false;
2934
2935 // Fallthrough
2936 case CK_Nocona:
2937 case CK_Core2:
2938 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002939 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002940 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002941 case CK_Nehalem:
2942 case CK_Westmere:
2943 case CK_SandyBridge:
2944 case CK_IvyBridge:
2945 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002946 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002947 case CK_SkylakeClient:
2948 case CK_SkylakeServer:
2949 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002950 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002951 case CK_Athlon64:
2952 case CK_Athlon64SSE3:
2953 case CK_AthlonFX:
2954 case CK_K8:
2955 case CK_K8SSE3:
2956 case CK_Opteron:
2957 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002958 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002959 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002960 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002961 case CK_BDVER1:
2962 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002963 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002964 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002965 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002966 case CK_x86_64:
2967 return true;
2968 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002969 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002970 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002971
Craig Topper3164f332014-03-11 03:39:26 +00002972 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002973
Craig Topper3164f332014-03-11 03:39:26 +00002974 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002975 // Most of the non-ARM calling conventions are i386 conventions.
2976 switch (CC) {
2977 case CC_X86ThisCall:
2978 case CC_X86FastCall:
2979 case CC_X86StdCall:
2980 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002981 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002982 case CC_C:
2983 case CC_Swift:
2984 case CC_X86Pascal:
2985 case CC_IntelOclBicc:
2986 return CCCR_OK;
2987 default:
2988 return CCCR_Warning;
2989 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002990 }
2991
Craig Topper3164f332014-03-11 03:39:26 +00002992 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002993 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002994 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002995
2996 bool hasSjLjLowering() const override {
2997 return true;
2998 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002999
3000 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003001 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003002 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003003};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003004
Rafael Espindolaeb265472013-08-21 21:59:03 +00003005bool X86TargetInfo::setFPMath(StringRef Name) {
3006 if (Name == "387") {
3007 FPMath = FP_387;
3008 return true;
3009 }
3010 if (Name == "sse") {
3011 FPMath = FP_SSE;
3012 return true;
3013 }
3014 return false;
3015}
3016
Eric Christopher007b0a02015-08-28 22:32:01 +00003017bool X86TargetInfo::initFeatureMap(
3018 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003019 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003020 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003021 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003022 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003023 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003024
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003025 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003026
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003027 // Enable X87 for all X86 processors but Lakemont.
3028 if (Kind != CK_Lakemont)
3029 setFeatureEnabledImpl(Features, "x87", true);
3030
3031 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003032 case CK_Generic:
3033 case CK_i386:
3034 case CK_i486:
3035 case CK_i586:
3036 case CK_Pentium:
3037 case CK_i686:
3038 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003039 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003040 break;
3041 case CK_PentiumMMX:
3042 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003043 case CK_K6:
3044 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003045 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003046 break;
3047 case CK_Pentium3:
3048 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003049 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003050 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003051 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003052 break;
3053 case CK_PentiumM:
3054 case CK_Pentium4:
3055 case CK_Pentium4M:
3056 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003057 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003058 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
3060 case CK_Yonah:
3061 case CK_Prescott:
3062 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003063 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003064 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003065 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003066 break;
3067 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003068 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003069 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003070 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003071 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003072 break;
3073 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003074 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003075 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003076 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003077 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003078 case CK_Cannonlake:
3079 setFeatureEnabledImpl(Features, "avx512ifma", true);
3080 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3081 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003082 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003083 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003084 setFeatureEnabledImpl(Features, "avx512f", true);
3085 setFeatureEnabledImpl(Features, "avx512cd", true);
3086 setFeatureEnabledImpl(Features, "avx512dq", true);
3087 setFeatureEnabledImpl(Features, "avx512bw", true);
3088 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003089 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003090 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003091 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003092 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003093 setFeatureEnabledImpl(Features, "xsavec", true);
3094 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003095 setFeatureEnabledImpl(Features, "mpx", true);
3096 setFeatureEnabledImpl(Features, "sgx", true);
3097 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003098 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003099 case CK_Broadwell:
3100 setFeatureEnabledImpl(Features, "rdseed", true);
3101 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003102 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003103 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003104 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003105 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003106 setFeatureEnabledImpl(Features, "bmi", true);
3107 setFeatureEnabledImpl(Features, "bmi2", true);
3108 setFeatureEnabledImpl(Features, "rtm", true);
3109 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003110 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003111 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003112 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003113 setFeatureEnabledImpl(Features, "rdrnd", true);
3114 setFeatureEnabledImpl(Features, "f16c", true);
3115 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003116 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003117 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003118 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003119 setFeatureEnabledImpl(Features, "xsave", true);
3120 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003121 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003122 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003123 case CK_Silvermont:
3124 setFeatureEnabledImpl(Features, "aes", true);
3125 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003126 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003127 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003128 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003129 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003130 setFeatureEnabledImpl(Features, "cx16", true);
3131 break;
3132 case CK_KNL:
3133 setFeatureEnabledImpl(Features, "avx512f", true);
3134 setFeatureEnabledImpl(Features, "avx512cd", true);
3135 setFeatureEnabledImpl(Features, "avx512er", true);
3136 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003137 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003138 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003139 setFeatureEnabledImpl(Features, "rdseed", true);
3140 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003141 setFeatureEnabledImpl(Features, "lzcnt", true);
3142 setFeatureEnabledImpl(Features, "bmi", true);
3143 setFeatureEnabledImpl(Features, "bmi2", true);
3144 setFeatureEnabledImpl(Features, "rtm", true);
3145 setFeatureEnabledImpl(Features, "fma", true);
3146 setFeatureEnabledImpl(Features, "rdrnd", true);
3147 setFeatureEnabledImpl(Features, "f16c", true);
3148 setFeatureEnabledImpl(Features, "fsgsbase", true);
3149 setFeatureEnabledImpl(Features, "aes", true);
3150 setFeatureEnabledImpl(Features, "pclmul", true);
3151 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003152 setFeatureEnabledImpl(Features, "xsaveopt", true);
3153 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003154 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 break;
3156 case CK_K6_2:
3157 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003158 case CK_WinChip2:
3159 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003160 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003161 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003162 case CK_Athlon:
3163 case CK_AthlonThunderbird:
3164 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003165 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003166 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003167 case CK_Athlon4:
3168 case CK_AthlonXP:
3169 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003170 setFeatureEnabledImpl(Features, "sse", true);
3171 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003172 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003173 break;
3174 case CK_K8:
3175 case CK_Opteron:
3176 case CK_Athlon64:
3177 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003178 setFeatureEnabledImpl(Features, "sse2", true);
3179 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003180 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003182 case CK_AMDFAM10:
3183 setFeatureEnabledImpl(Features, "sse4a", true);
3184 setFeatureEnabledImpl(Features, "lzcnt", true);
3185 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003186 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 case CK_K8SSE3:
3188 case CK_OpteronSSE3:
3189 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003190 setFeatureEnabledImpl(Features, "sse3", true);
3191 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003192 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003193 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003194 case CK_BTVER2:
3195 setFeatureEnabledImpl(Features, "avx", true);
3196 setFeatureEnabledImpl(Features, "aes", true);
3197 setFeatureEnabledImpl(Features, "pclmul", true);
3198 setFeatureEnabledImpl(Features, "bmi", true);
3199 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003200 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003201 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003202 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003203 setFeatureEnabledImpl(Features, "ssse3", true);
3204 setFeatureEnabledImpl(Features, "sse4a", true);
3205 setFeatureEnabledImpl(Features, "lzcnt", true);
3206 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003207 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003208 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003209 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003210 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003211 case CK_ZNVER1:
3212 setFeatureEnabledImpl(Features, "adx", true);
3213 setFeatureEnabledImpl(Features, "aes", true);
3214 setFeatureEnabledImpl(Features, "avx2", true);
3215 setFeatureEnabledImpl(Features, "bmi", true);
3216 setFeatureEnabledImpl(Features, "bmi2", true);
3217 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003218 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003219 setFeatureEnabledImpl(Features, "cx16", true);
3220 setFeatureEnabledImpl(Features, "f16c", true);
3221 setFeatureEnabledImpl(Features, "fma", true);
3222 setFeatureEnabledImpl(Features, "fsgsbase", true);
3223 setFeatureEnabledImpl(Features, "fxsr", true);
3224 setFeatureEnabledImpl(Features, "lzcnt", true);
3225 setFeatureEnabledImpl(Features, "mwaitx", true);
3226 setFeatureEnabledImpl(Features, "movbe", true);
3227 setFeatureEnabledImpl(Features, "pclmul", true);
3228 setFeatureEnabledImpl(Features, "popcnt", true);
3229 setFeatureEnabledImpl(Features, "prfchw", true);
3230 setFeatureEnabledImpl(Features, "rdrnd", true);
3231 setFeatureEnabledImpl(Features, "rdseed", true);
3232 setFeatureEnabledImpl(Features, "sha", true);
3233 setFeatureEnabledImpl(Features, "sse4a", true);
3234 setFeatureEnabledImpl(Features, "xsave", true);
3235 setFeatureEnabledImpl(Features, "xsavec", true);
3236 setFeatureEnabledImpl(Features, "xsaveopt", true);
3237 setFeatureEnabledImpl(Features, "xsaves", true);
3238 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003239 case CK_BDVER4:
3240 setFeatureEnabledImpl(Features, "avx2", true);
3241 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003242 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003243 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003244 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003245 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003246 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003247 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003248 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003249 setFeatureEnabledImpl(Features, "bmi", true);
3250 setFeatureEnabledImpl(Features, "fma", true);
3251 setFeatureEnabledImpl(Features, "f16c", true);
3252 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003253 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003254 case CK_BDVER1:
3255 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003256 setFeatureEnabledImpl(Features, "xop", true);
3257 setFeatureEnabledImpl(Features, "lzcnt", true);
3258 setFeatureEnabledImpl(Features, "aes", true);
3259 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003260 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003261 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003262 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003263 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003264 break;
Eli Friedman33465822011-07-08 23:31:17 +00003265 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003266 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3267 return false;
3268
3269 // Can't do this earlier because we need to be able to explicitly enable
3270 // or disable these features and the things that they depend upon.
3271
3272 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3273 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003274 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003275 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3276 FeaturesVec.end())
3277 Features["popcnt"] = true;
3278
3279 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3280 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003281 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003282 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3283 FeaturesVec.end())
3284 Features["prfchw"] = true;
3285
Eric Christophera7260af2015-10-08 20:10:18 +00003286 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3287 // then enable MMX.
3288 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003289 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003290 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3291 FeaturesVec.end())
3292 Features["mmx"] = true;
3293
Eric Christopherbbd746d2015-10-08 20:10:14 +00003294 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003295}
3296
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003298 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003299 if (Enabled) {
3300 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003301 case AVX512F:
3302 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003303 case AVX2:
3304 Features["avx2"] = true;
3305 case AVX:
3306 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003307 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003308 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003309 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003310 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003311 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003312 case SSSE3:
3313 Features["ssse3"] = true;
3314 case SSE3:
3315 Features["sse3"] = true;
3316 case SSE2:
3317 Features["sse2"] = true;
3318 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003319 Features["sse"] = true;
3320 case NoSSE:
3321 break;
3322 }
3323 return;
3324 }
3325
3326 switch (Level) {
3327 case NoSSE:
3328 case SSE1:
3329 Features["sse"] = false;
3330 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003331 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3332 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003333 case SSE3:
3334 Features["sse3"] = false;
3335 setXOPLevel(Features, NoXOP, false);
3336 case SSSE3:
3337 Features["ssse3"] = false;
3338 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003339 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003340 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003341 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003342 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003343 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3344 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003345 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003346 case AVX2:
3347 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003348 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003349 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003350 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003351 Features["avx512vl"] = Features["avx512vbmi"] =
3352 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003353 }
3354}
3355
3356void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003357 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003358 if (Enabled) {
3359 switch (Level) {
3360 case AMD3DNowAthlon:
3361 Features["3dnowa"] = true;
3362 case AMD3DNow:
3363 Features["3dnow"] = true;
3364 case MMX:
3365 Features["mmx"] = true;
3366 case NoMMX3DNow:
3367 break;
3368 }
3369 return;
3370 }
3371
3372 switch (Level) {
3373 case NoMMX3DNow:
3374 case MMX:
3375 Features["mmx"] = false;
3376 case AMD3DNow:
3377 Features["3dnow"] = false;
3378 case AMD3DNowAthlon:
3379 Features["3dnowa"] = false;
3380 }
3381}
3382
3383void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003384 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003385 if (Enabled) {
3386 switch (Level) {
3387 case XOP:
3388 Features["xop"] = true;
3389 case FMA4:
3390 Features["fma4"] = true;
3391 setSSELevel(Features, AVX, true);
3392 case SSE4A:
3393 Features["sse4a"] = true;
3394 setSSELevel(Features, SSE3, true);
3395 case NoXOP:
3396 break;
3397 }
3398 return;
3399 }
3400
3401 switch (Level) {
3402 case NoXOP:
3403 case SSE4A:
3404 Features["sse4a"] = false;
3405 case FMA4:
3406 Features["fma4"] = false;
3407 case XOP:
3408 Features["xop"] = false;
3409 }
3410}
3411
Craig Topper86d79ef2013-09-17 04:51:29 +00003412void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3413 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003414 // This is a bit of a hack to deal with the sse4 target feature when used
3415 // as part of the target attribute. We handle sse4 correctly everywhere
3416 // else. See below for more information on how we handle the sse4 options.
3417 if (Name != "sse4")
3418 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003419
Craig Topper29561122013-09-19 01:13:07 +00003420 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003421 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003422 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003423 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003424 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003425 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003426 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003427 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003428 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003429 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003430 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003431 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003432 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003433 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003434 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003435 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003436 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003437 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003438 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003439 if (Enabled)
3440 setSSELevel(Features, SSE2, Enabled);
3441 } else if (Name == "pclmul") {
3442 if (Enabled)
3443 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003444 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003445 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003446 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003447 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003448 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003449 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003450 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3451 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3452 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003453 if (Enabled)
3454 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003455 // Enable BWI instruction if VBMI is being enabled.
3456 if (Name == "avx512vbmi" && Enabled)
3457 Features["avx512bw"] = true;
3458 // Also disable VBMI if BWI is being disabled.
3459 if (Name == "avx512bw" && !Enabled)
3460 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003461 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003462 if (Enabled)
3463 setSSELevel(Features, AVX, Enabled);
3464 } else if (Name == "fma4") {
3465 setXOPLevel(Features, FMA4, Enabled);
3466 } else if (Name == "xop") {
3467 setXOPLevel(Features, XOP, Enabled);
3468 } else if (Name == "sse4a") {
3469 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003470 } else if (Name == "f16c") {
3471 if (Enabled)
3472 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003473 } else if (Name == "sha") {
3474 if (Enabled)
3475 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003476 } else if (Name == "sse4") {
3477 // We can get here via the __target__ attribute since that's not controlled
3478 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3479 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3480 // disabled.
3481 if (Enabled)
3482 setSSELevel(Features, SSE42, Enabled);
3483 else
3484 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003485 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003486 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003487 Features["xsaveopt"] = false;
3488 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003489 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003490 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003491 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003492}
3493
Eric Christopher3ff21b32013-10-16 21:26:26 +00003494/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003495/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003496bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003497 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003498 for (const auto &Feature : Features) {
3499 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003500 continue;
3501
Eric Christopher610fe112015-08-26 08:21:55 +00003502 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003503 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003504 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003505 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003506 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003507 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003508 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003509 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003510 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003511 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003512 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003513 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003514 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003515 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003516 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003517 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003518 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003519 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003520 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003521 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003522 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003523 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003524 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003525 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003526 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003527 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003528 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003529 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003530 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003531 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003532 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003533 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003534 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003535 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003536 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003537 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003538 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003539 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003540 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003541 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003542 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003543 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003544 } else if (Feature == "+avx512vbmi") {
3545 HasAVX512VBMI = true;
3546 } else if (Feature == "+avx512ifma") {
3547 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003548 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003549 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003550 } else if (Feature == "+mpx") {
3551 HasMPX = true;
3552 } else if (Feature == "+movbe") {
3553 HasMOVBE = true;
3554 } else if (Feature == "+sgx") {
3555 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003556 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003557 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003558 } else if (Feature == "+fxsr") {
3559 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003560 } else if (Feature == "+xsave") {
3561 HasXSAVE = true;
3562 } else if (Feature == "+xsaveopt") {
3563 HasXSAVEOPT = true;
3564 } else if (Feature == "+xsavec") {
3565 HasXSAVEC = true;
3566 } else if (Feature == "+xsaves") {
3567 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003568 } else if (Feature == "+mwaitx") {
3569 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003570 } else if (Feature == "+pku") {
3571 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003572 } else if (Feature == "+clflushopt") {
3573 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003574 } else if (Feature == "+clwb") {
3575 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003576 } else if (Feature == "+prefetchwt1") {
3577 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003578 } else if (Feature == "+clzero") {
3579 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003580 }
3581
Benjamin Kramer27402c62012-03-05 15:10:44 +00003582 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003583 .Case("+avx512f", AVX512F)
3584 .Case("+avx2", AVX2)
3585 .Case("+avx", AVX)
3586 .Case("+sse4.2", SSE42)
3587 .Case("+sse4.1", SSE41)
3588 .Case("+ssse3", SSSE3)
3589 .Case("+sse3", SSE3)
3590 .Case("+sse2", SSE2)
3591 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003592 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003593 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003594
Eli Friedman33465822011-07-08 23:31:17 +00003595 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003596 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003597 .Case("+3dnowa", AMD3DNowAthlon)
3598 .Case("+3dnow", AMD3DNow)
3599 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003600 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003601 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003602
3603 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003604 .Case("+xop", XOP)
3605 .Case("+fma4", FMA4)
3606 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003607 .Default(NoXOP);
3608 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003609 }
Eli Friedman33465822011-07-08 23:31:17 +00003610
Rafael Espindolaeb265472013-08-21 21:59:03 +00003611 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3612 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003613 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3614 (FPMath == FP_387 && SSELevel >= SSE1)) {
3615 Diags.Report(diag::err_target_unsupported_fpmath) <<
3616 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003617 return false;
3618 }
3619
Alexey Bataev00396512015-07-02 03:40:19 +00003620 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003621 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003622 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003623}
Chris Lattnerecd49032009-03-02 22:27:17 +00003624
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003625/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3626/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003627void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003628 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003629 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003630 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003631 Builder.defineMacro("__amd64__");
3632 Builder.defineMacro("__amd64");
3633 Builder.defineMacro("__x86_64");
3634 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003635 if (getTriple().getArchName() == "x86_64h") {
3636 Builder.defineMacro("__x86_64h");
3637 Builder.defineMacro("__x86_64h__");
3638 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003639 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003640 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003641 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003642
Chris Lattnerecd49032009-03-02 22:27:17 +00003643 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003644 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3645 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003646 switch (CPU) {
3647 case CK_Generic:
3648 break;
3649 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003650 // The rest are coming from the i386 define above.
3651 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003652 break;
3653 case CK_i486:
3654 case CK_WinChipC6:
3655 case CK_WinChip2:
3656 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003657 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003658 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003659 case CK_PentiumMMX:
3660 Builder.defineMacro("__pentium_mmx__");
3661 Builder.defineMacro("__tune_pentium_mmx__");
3662 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003663 case CK_i586:
3664 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003665 defineCPUMacros(Builder, "i586");
3666 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003667 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003668 case CK_Pentium3:
3669 case CK_Pentium3M:
3670 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003671 Builder.defineMacro("__tune_pentium3__");
3672 // Fallthrough
3673 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003674 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003675 Builder.defineMacro("__tune_pentium2__");
3676 // Fallthrough
3677 case CK_PentiumPro:
3678 Builder.defineMacro("__tune_i686__");
3679 Builder.defineMacro("__tune_pentiumpro__");
3680 // Fallthrough
3681 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003682 Builder.defineMacro("__i686");
3683 Builder.defineMacro("__i686__");
3684 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3685 Builder.defineMacro("__pentiumpro");
3686 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003687 break;
3688 case CK_Pentium4:
3689 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003690 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003691 break;
3692 case CK_Yonah:
3693 case CK_Prescott:
3694 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003695 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003696 break;
3697 case CK_Core2:
3698 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003699 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003700 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003701 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003702 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003703 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003704 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003705 defineCPUMacros(Builder, "slm");
3706 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003707 case CK_Nehalem:
3708 case CK_Westmere:
3709 case CK_SandyBridge:
3710 case CK_IvyBridge:
3711 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003712 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003713 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003714 // FIXME: Historically, we defined this legacy name, it would be nice to
3715 // remove it at some point. We've never exposed fine-grained names for
3716 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003717 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003718 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003719 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003720 defineCPUMacros(Builder, "skx");
3721 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003722 case CK_Cannonlake:
3723 break;
Craig Topper449314e2013-08-20 07:09:39 +00003724 case CK_KNL:
3725 defineCPUMacros(Builder, "knl");
3726 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003727 case CK_Lakemont:
3728 Builder.defineMacro("__tune_lakemont__");
3729 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003730 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003731 Builder.defineMacro("__k6_2__");
3732 Builder.defineMacro("__tune_k6_2__");
3733 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003734 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003735 if (CPU != CK_K6_2) { // In case of fallthrough
3736 // FIXME: GCC may be enabling these in cases where some other k6
3737 // architecture is specified but -m3dnow is explicitly provided. The
3738 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003739 Builder.defineMacro("__k6_3__");
3740 Builder.defineMacro("__tune_k6_3__");
3741 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003742 // Fallthrough
3743 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003744 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003745 break;
3746 case CK_Athlon:
3747 case CK_AthlonThunderbird:
3748 case CK_Athlon4:
3749 case CK_AthlonXP:
3750 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003751 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003752 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003753 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003754 Builder.defineMacro("__tune_athlon_sse__");
3755 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003756 break;
3757 case CK_K8:
3758 case CK_K8SSE3:
3759 case CK_x86_64:
3760 case CK_Opteron:
3761 case CK_OpteronSSE3:
3762 case CK_Athlon64:
3763 case CK_Athlon64SSE3:
3764 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003765 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003766 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003767 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003768 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003769 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003770 case CK_BTVER1:
3771 defineCPUMacros(Builder, "btver1");
3772 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003773 case CK_BTVER2:
3774 defineCPUMacros(Builder, "btver2");
3775 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003776 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003777 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003778 break;
3779 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003780 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003781 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003782 case CK_BDVER3:
3783 defineCPUMacros(Builder, "bdver3");
3784 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003785 case CK_BDVER4:
3786 defineCPUMacros(Builder, "bdver4");
3787 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003788 case CK_ZNVER1:
3789 defineCPUMacros(Builder, "znver1");
3790 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003791 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003792 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003793 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003794 }
Chris Lattner96e43572009-03-02 22:40:39 +00003795
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003796 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003797 Builder.defineMacro("__REGISTER_PREFIX__", "");
3798
Chris Lattner6df41af2009-04-19 17:32:33 +00003799 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3800 // functions in glibc header files that use FP Stack inline asm which the
3801 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003802 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003803
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003804 if (HasAES)
3805 Builder.defineMacro("__AES__");
3806
Craig Topper3f122a72012-05-31 05:18:48 +00003807 if (HasPCLMUL)
3808 Builder.defineMacro("__PCLMUL__");
3809
Craig Topper22967d42011-12-25 05:06:45 +00003810 if (HasLZCNT)
3811 Builder.defineMacro("__LZCNT__");
3812
Benjamin Kramer1e250392012-07-07 09:39:18 +00003813 if (HasRDRND)
3814 Builder.defineMacro("__RDRND__");
3815
Craig Topper8c7f2512014-11-03 06:51:41 +00003816 if (HasFSGSBASE)
3817 Builder.defineMacro("__FSGSBASE__");
3818
Craig Topper22967d42011-12-25 05:06:45 +00003819 if (HasBMI)
3820 Builder.defineMacro("__BMI__");
3821
3822 if (HasBMI2)
3823 Builder.defineMacro("__BMI2__");
3824
Craig Topper1de83482011-12-29 16:10:46 +00003825 if (HasPOPCNT)
3826 Builder.defineMacro("__POPCNT__");
3827
Michael Liao625a8752012-11-10 05:17:46 +00003828 if (HasRTM)
3829 Builder.defineMacro("__RTM__");
3830
Michael Liao74f4eaf2013-03-26 17:52:08 +00003831 if (HasPRFCHW)
3832 Builder.defineMacro("__PRFCHW__");
3833
Michael Liaoffaae352013-03-29 05:17:55 +00003834 if (HasRDSEED)
3835 Builder.defineMacro("__RDSEED__");
3836
Robert Khasanov50e6f582014-09-19 09:53:48 +00003837 if (HasADX)
3838 Builder.defineMacro("__ADX__");
3839
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003840 if (HasTBM)
3841 Builder.defineMacro("__TBM__");
3842
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003843 if (HasMWAITX)
3844 Builder.defineMacro("__MWAITX__");
3845
Rafael Espindolae62e2792013-08-20 13:44:29 +00003846 switch (XOPLevel) {
3847 case XOP:
3848 Builder.defineMacro("__XOP__");
3849 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003850 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003851 case SSE4A:
3852 Builder.defineMacro("__SSE4A__");
3853 case NoXOP:
3854 break;
3855 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003856
Craig Topperbba778b2012-06-03 21:46:30 +00003857 if (HasFMA)
3858 Builder.defineMacro("__FMA__");
3859
Manman Rena45358c2012-10-11 00:59:55 +00003860 if (HasF16C)
3861 Builder.defineMacro("__F16C__");
3862
Craig Topper679b53a2013-08-21 05:29:10 +00003863 if (HasAVX512CD)
3864 Builder.defineMacro("__AVX512CD__");
3865 if (HasAVX512ER)
3866 Builder.defineMacro("__AVX512ER__");
3867 if (HasAVX512PF)
3868 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003869 if (HasAVX512DQ)
3870 Builder.defineMacro("__AVX512DQ__");
3871 if (HasAVX512BW)
3872 Builder.defineMacro("__AVX512BW__");
3873 if (HasAVX512VL)
3874 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003875 if (HasAVX512VBMI)
3876 Builder.defineMacro("__AVX512VBMI__");
3877 if (HasAVX512IFMA)
3878 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003879
Ben Langmuir58078d02013-09-19 13:22:04 +00003880 if (HasSHA)
3881 Builder.defineMacro("__SHA__");
3882
Craig Toppere33f51f2015-10-16 06:22:36 +00003883 if (HasFXSR)
3884 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003885 if (HasXSAVE)
3886 Builder.defineMacro("__XSAVE__");
3887 if (HasXSAVEOPT)
3888 Builder.defineMacro("__XSAVEOPT__");
3889 if (HasXSAVEC)
3890 Builder.defineMacro("__XSAVEC__");
3891 if (HasXSAVES)
3892 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003893 if (HasPKU)
3894 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003895 if (HasCX16)
3896 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003897 if (HasCLFLUSHOPT)
3898 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003899 if (HasCLWB)
3900 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003901 if (HasMPX)
3902 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003903 if (HasSGX)
3904 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003905 if (HasPREFETCHWT1)
3906 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003907 if (HasCLZERO)
3908 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003909
Chris Lattner96e43572009-03-02 22:40:39 +00003910 // Each case falls through to the previous one here.
3911 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003912 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003913 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003914 case AVX2:
3915 Builder.defineMacro("__AVX2__");
3916 case AVX:
3917 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003918 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003919 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003920 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003921 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003922 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003923 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003924 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003925 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003926 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003927 Builder.defineMacro("__SSE2__");
3928 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003929 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003930 Builder.defineMacro("__SSE__");
3931 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003932 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003933 break;
3934 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003935
Derek Schuffc7dd7222012-10-11 15:52:22 +00003936 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003937 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003938 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003939 case AVX2:
3940 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003941 case SSE42:
3942 case SSE41:
3943 case SSSE3:
3944 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003945 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003946 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003947 break;
3948 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003949 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003950 break;
3951 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003952 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003953 }
3954 }
3955
Anders Carlssone437c682010-01-27 03:47:49 +00003956 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003957 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003958 case AMD3DNowAthlon:
3959 Builder.defineMacro("__3dNOW_A__");
3960 case AMD3DNow:
3961 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003962 case MMX:
3963 Builder.defineMacro("__MMX__");
3964 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003965 break;
3966 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003967
3968 if (CPU >= CK_i486) {
3969 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3970 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3971 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3972 }
3973 if (CPU >= CK_i586)
3974 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003975}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003976
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003977bool X86TargetInfo::hasFeature(StringRef Feature) const {
3978 return llvm::StringSwitch<bool>(Feature)
3979 .Case("aes", HasAES)
3980 .Case("avx", SSELevel >= AVX)
3981 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003982 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003983 .Case("avx512cd", HasAVX512CD)
3984 .Case("avx512er", HasAVX512ER)
3985 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003986 .Case("avx512dq", HasAVX512DQ)
3987 .Case("avx512bw", HasAVX512BW)
3988 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003989 .Case("avx512vbmi", HasAVX512VBMI)
3990 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003991 .Case("bmi", HasBMI)
3992 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003993 .Case("clflushopt", HasCLFLUSHOPT)
3994 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00003995 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003996 .Case("cx16", HasCX16)
3997 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003998 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003999 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004000 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004001 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004002 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004003 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4004 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4005 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004006 .Case("movbe", HasMOVBE)
4007 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004008 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004009 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004010 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004011 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004012 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004013 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004014 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004015 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004016 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004017 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004018 .Case("sse", SSELevel >= SSE1)
4019 .Case("sse2", SSELevel >= SSE2)
4020 .Case("sse3", SSELevel >= SSE3)
4021 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004022 .Case("sse4.1", SSELevel >= SSE41)
4023 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004024 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004025 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004026 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004027 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4028 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004029 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004030 .Case("xsave", HasXSAVE)
4031 .Case("xsavec", HasXSAVEC)
4032 .Case("xsaves", HasXSAVES)
4033 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004034 .Default(false);
4035}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004036
Eric Christopherd9832702015-06-29 21:00:05 +00004037// We can't use a generic validation scheme for the features accepted here
4038// versus subtarget features accepted in the target attribute because the
4039// bitfield structure that's initialized in the runtime only supports the
4040// below currently rather than the full range of subtarget features. (See
4041// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4042bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4043 return llvm::StringSwitch<bool>(FeatureStr)
4044 .Case("cmov", true)
4045 .Case("mmx", true)
4046 .Case("popcnt", true)
4047 .Case("sse", true)
4048 .Case("sse2", true)
4049 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004050 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004051 .Case("sse4.1", true)
4052 .Case("sse4.2", true)
4053 .Case("avx", true)
4054 .Case("avx2", true)
4055 .Case("sse4a", true)
4056 .Case("fma4", true)
4057 .Case("xop", true)
4058 .Case("fma", true)
4059 .Case("avx512f", true)
4060 .Case("bmi", true)
4061 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004062 .Case("aes", true)
4063 .Case("pclmul", true)
4064 .Case("avx512vl", true)
4065 .Case("avx512bw", true)
4066 .Case("avx512dq", true)
4067 .Case("avx512cd", true)
4068 .Case("avx512er", true)
4069 .Case("avx512pf", true)
4070 .Case("avx512vbmi", true)
4071 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004072 .Default(false);
4073}
4074
Eli Friedman3fd920a2008-08-20 02:34:37 +00004075bool
Anders Carlsson58436352009-02-28 17:11:49 +00004076X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004077 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004078 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004079 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004080 // Constant constraints.
4081 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4082 // instructions.
4083 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4084 // x86_64 instructions.
4085 case 's':
4086 Info.setRequiresImmediate();
4087 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004088 case 'I':
4089 Info.setRequiresImmediate(0, 31);
4090 return true;
4091 case 'J':
4092 Info.setRequiresImmediate(0, 63);
4093 return true;
4094 case 'K':
4095 Info.setRequiresImmediate(-128, 127);
4096 return true;
4097 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004098 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004099 return true;
4100 case 'M':
4101 Info.setRequiresImmediate(0, 3);
4102 return true;
4103 case 'N':
4104 Info.setRequiresImmediate(0, 255);
4105 return true;
4106 case 'O':
4107 Info.setRequiresImmediate(0, 127);
4108 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004109 // Register constraints.
4110 case 'Y': // 'Y' is the first character for several 2-character constraints.
4111 // Shift the pointer to the second character of the constraint.
4112 Name++;
4113 switch (*Name) {
4114 default:
4115 return false;
4116 case '0': // First SSE register.
4117 case 't': // Any SSE register, when SSE2 is enabled.
4118 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4119 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004120 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004121 Info.setAllowsRegister();
4122 return true;
4123 }
4124 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004125 // Constraint 'f' cannot be used for output operands.
4126 if (Info.ConstraintStr[0] == '=')
4127 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004128 Info.setAllowsRegister();
4129 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130 case 'a': // eax.
4131 case 'b': // ebx.
4132 case 'c': // ecx.
4133 case 'd': // edx.
4134 case 'S': // esi.
4135 case 'D': // edi.
4136 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004137 case 't': // Top of floating point stack.
4138 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004139 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004140 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004141 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004142 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004143 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4144 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004145 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004146 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4147 case 'l': // "Index" registers: any general register that can be used as an
4148 // index in a base+index memory access.
4149 Info.setAllowsRegister();
4150 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004151 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004152 case 'C': // SSE floating point constant.
4153 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004154 return true;
4155 }
4156}
4157
Akira Hatanaka974131e2014-09-18 18:17:18 +00004158bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4159 unsigned Size) const {
4160 // Strip off constraint modifiers.
4161 while (Constraint[0] == '=' ||
4162 Constraint[0] == '+' ||
4163 Constraint[0] == '&')
4164 Constraint = Constraint.substr(1);
4165
4166 return validateOperandSize(Constraint, Size);
4167}
4168
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004169bool X86TargetInfo::validateInputSize(StringRef Constraint,
4170 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004171 return validateOperandSize(Constraint, Size);
4172}
4173
4174bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4175 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004176 switch (Constraint[0]) {
4177 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004178 case 'k':
4179 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004180 case 'y':
4181 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004182 case 'f':
4183 case 't':
4184 case 'u':
4185 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004186 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004187 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004188 if (SSELevel >= AVX512F)
4189 // 512-bit zmm registers can be used if target supports AVX512F.
4190 return Size <= 512U;
4191 else if (SSELevel >= AVX)
4192 // 256-bit ymm registers can be used if target supports AVX.
4193 return Size <= 256U;
4194 return Size <= 128U;
4195 case 'Y':
4196 // 'Y' is the first character for several 2-character constraints.
4197 switch (Constraint[1]) {
4198 default: break;
4199 case 'm':
4200 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004201 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004202 return Size <= 64;
4203 case 'i':
4204 case 't':
4205 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4206 if (SSELevel >= AVX512F)
4207 return Size <= 512U;
4208 else if (SSELevel >= AVX)
4209 return Size <= 256U;
4210 return SSELevel >= SSE2 && Size <= 128U;
4211 }
4212
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004213 }
4214
4215 return true;
4216}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004217
Eli Friedman3fd920a2008-08-20 02:34:37 +00004218std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004219X86TargetInfo::convertConstraint(const char *&Constraint) const {
4220 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004221 case 'a': return std::string("{ax}");
4222 case 'b': return std::string("{bx}");
4223 case 'c': return std::string("{cx}");
4224 case 'd': return std::string("{dx}");
4225 case 'S': return std::string("{si}");
4226 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004227 case 'p': // address
4228 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004229 case 't': // top of floating point stack.
4230 return std::string("{st}");
4231 case 'u': // second from top of floating point stack.
4232 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004233 case 'Y':
4234 switch (Constraint[1]) {
4235 default:
4236 // Break from inner switch and fall through (copy single char),
4237 // continue parsing after copying the current constraint into
4238 // the return string.
4239 break;
4240 case 'k':
4241 // "^" hints llvm that this is a 2 letter constraint.
4242 // "Constraint++" is used to promote the string iterator
4243 // to the next constraint.
4244 return std::string("^") + std::string(Constraint++, 2);
4245 }
4246 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004247 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004248 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004249 }
4250}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004251
Eli Friedman3fd920a2008-08-20 02:34:37 +00004252// X86-32 generic target
4253class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004254public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004255 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4256 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004257 DoubleAlign = LongLongAlign = 32;
4258 LongDoubleWidth = 96;
4259 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004260 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004261 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004262 SizeType = UnsignedInt;
4263 PtrDiffType = SignedInt;
4264 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004265 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004266
4267 // Use fpret for all types.
4268 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4269 (1 << TargetInfo::Double) |
4270 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004271
4272 // x86-32 has atomics up to 8 bytes
4273 // FIXME: Check that we actually have cmpxchg8b before setting
4274 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4275 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004276 }
Craig Topper3164f332014-03-11 03:39:26 +00004277 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004278 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004280
Craig Topper3164f332014-03-11 03:39:26 +00004281 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004282 if (RegNo == 0) return 0;
4283 if (RegNo == 1) return 2;
4284 return -1;
4285 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004286 bool validateOperandSize(StringRef Constraint,
4287 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004288 switch (Constraint[0]) {
4289 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004290 case 'R':
4291 case 'q':
4292 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004293 case 'a':
4294 case 'b':
4295 case 'c':
4296 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004297 case 'S':
4298 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004299 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004300 case 'A':
4301 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004302 }
4303
Akira Hatanaka974131e2014-09-18 18:17:18 +00004304 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004305 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004306 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4307 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4308 Builtin::FirstTSBuiltin + 1);
4309 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004310};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004311
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004312class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4313public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004314 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4315 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004316
Craig Topper3164f332014-03-11 03:39:26 +00004317 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004318 unsigned Major, Minor, Micro;
4319 getTriple().getOSVersion(Major, Minor, Micro);
4320 // New NetBSD uses the default rounding mode.
4321 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4322 return X86_32TargetInfo::getFloatEvalMethod();
4323 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004324 return 1;
4325 }
4326};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004327
Eli Friedmane3aa4542009-07-05 18:47:56 +00004328class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4329public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004330 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4331 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004332 SizeType = UnsignedLong;
4333 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004334 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004335 }
4336};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004337
Eli Friedman9fa28852012-08-08 23:57:20 +00004338class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004340 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4341 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004342 SizeType = UnsignedLong;
4343 IntPtrType = SignedLong;
4344 PtrDiffType = SignedLong;
4345 }
4346};
Eli Friedman9fa28852012-08-08 23:57:20 +00004347
Torok Edwinb2b37c62009-06-30 17:10:35 +00004348class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004349public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004350 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4351 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004352 LongDoubleWidth = 128;
4353 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004354 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004355 MaxVectorAlign = 256;
4356 // The watchOS simulator uses the builtin bool type for Objective-C.
4357 llvm::Triple T = llvm::Triple(Triple);
4358 if (T.isWatchOS())
4359 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004360 SizeType = UnsignedLong;
4361 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004362 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004363 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004364 }
4365
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004366 bool handleTargetFeatures(std::vector<std::string> &Features,
4367 DiagnosticsEngine &Diags) override {
4368 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4369 Diags))
4370 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004371 // We now know the features we have: we can decide how to align vectors.
4372 MaxVectorAlign =
4373 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004374 return true;
4375 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004376};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004377
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004378// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004379class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004381 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4382 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004383 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004384 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004385 bool IsWinCOFF =
4386 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004387 resetDataLayout(IsWinCOFF
4388 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4389 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004390 }
Craig Topper3164f332014-03-11 03:39:26 +00004391 void getTargetDefines(const LangOptions &Opts,
4392 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004393 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4394 }
4395};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004396
4397// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004398class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004399public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004400 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4401 const TargetOptions &Opts)
4402 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004403 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004404 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004405 }
Craig Topper3164f332014-03-11 03:39:26 +00004406 void getTargetDefines(const LangOptions &Opts,
4407 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004408 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4409 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4410 // The value of the following reflects processor type.
4411 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4412 // We lost the original triple, so we use the default.
4413 Builder.defineMacro("_M_IX86", "600");
4414 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004415};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004416
David Majnemerae1ed0e2015-05-28 04:36:18 +00004417static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004418 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4419 // supports __declspec natively under -fms-extensions, but we define a no-op
4420 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004421 if (Opts.MicrosoftExt)
4422 Builder.defineMacro("__declspec", "__declspec");
4423 else
4424 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4425
4426 if (!Opts.MicrosoftExt) {
4427 // Provide macros for all the calling convention keywords. Provide both
4428 // single and double underscore prefixed variants. These are available on
4429 // x64 as well as x86, even though they have no effect.
4430 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4431 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004432 std::string GCCSpelling = "__attribute__((__";
4433 GCCSpelling += CC;
4434 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004435 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4436 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4437 }
4438 }
4439}
4440
David Majnemerae1ed0e2015-05-28 04:36:18 +00004441static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4442 Builder.defineMacro("__MSVCRT__");
4443 Builder.defineMacro("__MINGW32__");
4444 addCygMingDefines(Opts, Builder);
4445}
4446
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004447// x86-32 MinGW target
4448class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4449public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004450 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4451 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004452 void getTargetDefines(const LangOptions &Opts,
4453 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004454 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004455 DefineStd(Builder, "WIN32", Opts);
4456 DefineStd(Builder, "WINNT", Opts);
4457 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004458 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004459 }
4460};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004461
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004462// x86-32 Cygwin target
4463class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4464public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004465 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4466 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004467 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004468 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004469 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 +00004470 }
Craig Topper3164f332014-03-11 03:39:26 +00004471 void getTargetDefines(const LangOptions &Opts,
4472 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004473 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004474 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004475 Builder.defineMacro("__CYGWIN__");
4476 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004477 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004478 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004479 if (Opts.CPlusPlus)
4480 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004481 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004482};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004483
Chris Lattnerb986aba2010-04-11 19:29:39 +00004484// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004485class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004486public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004487 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004488 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004489 }
Craig Topper3164f332014-03-11 03:39:26 +00004490 void getTargetDefines(const LangOptions &Opts,
4491 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004492 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004493 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004494 }
4495};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004496
Alexey Bataevc99b0492015-11-25 09:24:26 +00004497// X86-32 MCU target
4498class MCUX86_32TargetInfo : public X86_32TargetInfo {
4499public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004500 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4501 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004502 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004503 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004504 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 +00004505 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004506 }
4507
4508 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4509 // On MCU we support only C calling convention.
4510 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4511 }
4512
4513 void getTargetDefines(const LangOptions &Opts,
4514 MacroBuilder &Builder) const override {
4515 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4516 Builder.defineMacro("__iamcu");
4517 Builder.defineMacro("__iamcu__");
4518 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004519
4520 bool allowsLargerPreferedTypeAlignment() const override {
4521 return false;
4522 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004523};
4524
Douglas Gregor9fabd852011-07-01 22:41:14 +00004525// RTEMS Target
4526template<typename Target>
4527class RTEMSTargetInfo : public OSTargetInfo<Target> {
4528protected:
Craig Topper3164f332014-03-11 03:39:26 +00004529 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4530 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004531 // RTEMS defines; list based off of gcc output
4532
Douglas Gregor9fabd852011-07-01 22:41:14 +00004533 Builder.defineMacro("__rtems__");
4534 Builder.defineMacro("__ELF__");
4535 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004536
Douglas Gregor9fabd852011-07-01 22:41:14 +00004537public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004538 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4539 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004540 switch (Triple.getArch()) {
4541 default:
4542 case llvm::Triple::x86:
4543 // this->MCountName = ".mcount";
4544 break;
4545 case llvm::Triple::mips:
4546 case llvm::Triple::mipsel:
4547 case llvm::Triple::ppc:
4548 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004549 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004550 // this->MCountName = "_mcount";
4551 break;
4552 case llvm::Triple::arm:
4553 // this->MCountName = "__mcount";
4554 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004555 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004556 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004557};
4558
Douglas Gregor9fabd852011-07-01 22:41:14 +00004559// x86-32 RTEMS target
4560class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004562 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4563 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004564 SizeType = UnsignedLong;
4565 IntPtrType = SignedLong;
4566 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004567 }
Craig Topper3164f332014-03-11 03:39:26 +00004568 void getTargetDefines(const LangOptions &Opts,
4569 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004570 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4571 Builder.defineMacro("__INTEL__");
4572 Builder.defineMacro("__rtems__");
4573 }
4574};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004575
Eli Friedman3fd920a2008-08-20 02:34:37 +00004576// x86-64 generic target
4577class X86_64TargetInfo : public X86TargetInfo {
4578public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004579 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4580 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004581 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004582 bool IsWinCOFF =
4583 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004584 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004585 LongDoubleWidth = 128;
4586 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004587 LargeArrayMinWidth = 128;
4588 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004589 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004590 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4591 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4592 IntPtrType = IsX32 ? SignedInt : SignedLong;
4593 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004594 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004595 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004596
Eric Christopher917e9522014-11-18 22:36:15 +00004597 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004598 resetDataLayout(IsX32
4599 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4600 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4601 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004602
4603 // Use fpret only for long double.
4604 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004605
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004606 // Use fp2ret for _Complex long double.
4607 ComplexLongDoubleUsesFP2Ret = true;
4608
Charles Davisc7d5c942015-09-17 20:55:33 +00004609 // Make __builtin_ms_va_list available.
4610 HasBuiltinMSVaList = true;
4611
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004612 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004613 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004614 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004615 }
Craig Topper3164f332014-03-11 03:39:26 +00004616 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004617 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004618 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004619
Craig Topper3164f332014-03-11 03:39:26 +00004620 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004621 if (RegNo == 0) return 0;
4622 if (RegNo == 1) return 1;
4623 return -1;
4624 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004625
Craig Topper3164f332014-03-11 03:39:26 +00004626 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004627 switch (CC) {
4628 case CC_C:
4629 case CC_Swift:
4630 case CC_X86VectorCall:
4631 case CC_IntelOclBicc:
4632 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004633 case CC_PreserveMost:
4634 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004635 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004636 return CCCR_OK;
4637 default:
4638 return CCCR_Warning;
4639 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004640 }
4641
Craig Topper3164f332014-03-11 03:39:26 +00004642 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004643 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004644 }
4645
Pavel Chupinfd223e12014-08-04 12:39:43 +00004646 // for x32 we need it here explicitly
4647 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004648 unsigned getUnwindWordWidth() const override { return 64; }
4649 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004650
4651 bool validateGlobalRegisterVariable(StringRef RegName,
4652 unsigned RegSize,
4653 bool &HasSizeMismatch) const override {
4654 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4655 // handle.
4656 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4657 // Check that the register size is 64-bit.
4658 HasSizeMismatch = RegSize != 64;
4659 return true;
4660 }
4661
4662 // Check if the register is a 32-bit register the backend can handle.
4663 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4664 HasSizeMismatch);
4665 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004666 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4667 return llvm::makeArrayRef(BuiltinInfoX86,
4668 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4669 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004670};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004671
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004672// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004673class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004674public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004675 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4676 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004677 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004678 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004679 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004680 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004681 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004682 SizeType = UnsignedLongLong;
4683 PtrDiffType = SignedLongLong;
4684 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004685 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004686
Craig Topper3164f332014-03-11 03:39:26 +00004687 void getTargetDefines(const LangOptions &Opts,
4688 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004689 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004690 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004691 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004692
Craig Topper3164f332014-03-11 03:39:26 +00004693 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004694 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004695 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004696
Craig Topper3164f332014-03-11 03:39:26 +00004697 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004698 switch (CC) {
4699 case CC_X86StdCall:
4700 case CC_X86ThisCall:
4701 case CC_X86FastCall:
4702 return CCCR_Ignore;
4703 case CC_C:
4704 case CC_X86VectorCall:
4705 case CC_IntelOclBicc:
4706 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004707 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004708 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004709 return CCCR_OK;
4710 default:
4711 return CCCR_Warning;
4712 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004713 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004714};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004715
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004716// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004717class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004718public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004719 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4720 const TargetOptions &Opts)
4721 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004722 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004723 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004724 }
Craig Topper3164f332014-03-11 03:39:26 +00004725 void getTargetDefines(const LangOptions &Opts,
4726 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004727 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4728 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004729 Builder.defineMacro("_M_X64", "100");
4730 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004731 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004732};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004733
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004734// x86-64 MinGW target
4735class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4736public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004737 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4738 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004739 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4740 // with x86 FP ops. Weird.
4741 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004742 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004743 }
4744
Craig Topper3164f332014-03-11 03:39:26 +00004745 void getTargetDefines(const LangOptions &Opts,
4746 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004747 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004748 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004749 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004750 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004751
4752 // GCC defines this macro when it is using __gxx_personality_seh0.
4753 if (!Opts.SjLjExceptions)
4754 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004755 }
4756};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004757
Yaron Kerend030d112015-07-22 17:38:19 +00004758// x86-64 Cygwin target
4759class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4760public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004761 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4762 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004763 TLSSupported = false;
4764 WCharType = UnsignedShort;
4765 }
4766 void getTargetDefines(const LangOptions &Opts,
4767 MacroBuilder &Builder) const override {
4768 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4769 Builder.defineMacro("__x86_64__");
4770 Builder.defineMacro("__CYGWIN__");
4771 Builder.defineMacro("__CYGWIN64__");
4772 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004773 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004774 if (Opts.CPlusPlus)
4775 Builder.defineMacro("_GNU_SOURCE");
4776
4777 // GCC defines this macro when it is using __gxx_personality_seh0.
4778 if (!Opts.SjLjExceptions)
4779 Builder.defineMacro("__SEH__");
4780 }
4781};
4782
Eli Friedman2857ccb2009-07-01 03:36:11 +00004783class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004785 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4786 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004787 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004788 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4789 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004790 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004791 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004792 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004793 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004794
4795 bool handleTargetFeatures(std::vector<std::string> &Features,
4796 DiagnosticsEngine &Diags) override {
4797 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4798 Diags))
4799 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004800 // We now know the features we have: we can decide how to align vectors.
4801 MaxVectorAlign =
4802 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004803 return true;
4804 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004805};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004806
Eli Friedman245f2292009-07-05 22:31:18 +00004807class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4808public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004809 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4810 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004811 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004812 Int64Type = SignedLongLong;
4813 }
4814};
Eli Friedman245f2292009-07-05 22:31:18 +00004815
Eli Friedman9fa28852012-08-08 23:57:20 +00004816class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4817public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004818 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4819 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004820 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004821 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004822 }
4823};
Tim Northover9bb857a2013-01-31 12:13:10 +00004824
Eli Friedmanf05b7722008-08-20 07:44:10 +00004825class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004826 // Possible FPU choices.
4827 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004828 VFP2FPU = (1 << 0),
4829 VFP3FPU = (1 << 1),
4830 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004831 NeonFPU = (1 << 3),
4832 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004833 };
4834
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004835 // Possible HWDiv features.
4836 enum HWDivMode {
4837 HWDivThumb = (1 << 0),
4838 HWDivARM = (1 << 1)
4839 };
4840
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004841 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004842 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004843 }
4844
4845 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4846 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004847
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004848 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004849
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004850 StringRef CPUProfile;
4851 StringRef CPUAttr;
4852
Rafael Espindolaeb265472013-08-21 21:59:03 +00004853 enum {
4854 FP_Default,
4855 FP_VFP,
4856 FP_Neon
4857 } FPMath;
4858
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004859 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004860 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004861 unsigned ArchProfile;
4862 unsigned ArchVersion;
4863
Bernard Ogdenda13af32013-10-24 18:32:51 +00004864 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004865
Logan Chien57086ce2012-10-10 06:56:20 +00004866 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004867 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004868
4869 // Initialized via features.
4870 unsigned SoftFloat : 1;
4871 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004872
Bernard Ogden18b57012013-10-29 09:47:51 +00004873 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004874 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004875 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004876 unsigned Unaligned : 1;
4877
4878 enum {
4879 LDREX_B = (1 << 0), /// byte (8-bit)
4880 LDREX_H = (1 << 1), /// half (16-bit)
4881 LDREX_W = (1 << 2), /// word (32-bit)
4882 LDREX_D = (1 << 3), /// double (64-bit)
4883 };
4884
4885 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004886
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004887 // ACLE 6.5.1 Hardware floating point
4888 enum {
4889 HW_FP_HP = (1 << 1), /// half (16-bit)
4890 HW_FP_SP = (1 << 2), /// single (32-bit)
4891 HW_FP_DP = (1 << 3), /// double (64-bit)
4892 };
4893 uint32_t HW_FP;
4894
Chris Lattner5cc15e02010-03-03 19:03:45 +00004895 static const Builtin::Info BuiltinInfo[];
4896
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004897 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004898 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004899
4900 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004901 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004902
Renato Golin0201a9e2016-09-22 19:28:20 +00004903 // size_t is unsigned long on MachO-derived environments, NetBSD,
4904 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004905 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004906 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004907 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004908 SizeType = UnsignedLong;
4909 else
4910 SizeType = UnsignedInt;
4911
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004912 switch (T.getOS()) {
4913 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004914 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004915 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004916 break;
4917 case llvm::Triple::Win32:
4918 WCharType = UnsignedShort;
4919 break;
4920 case llvm::Triple::Linux:
4921 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004922 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4923 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004924 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004925 }
4926
4927 UseBitFieldTypeAlignment = true;
4928
4929 ZeroLengthBitfieldBoundary = 0;
4930
Tim Northover147cd2f2014-10-14 22:12:21 +00004931 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4932 // so set preferred for small types to 32.
4933 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004934 resetDataLayout(BigEndian
4935 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4936 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004937 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004938 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004939 resetDataLayout("e"
4940 "-m:w"
4941 "-p:32:32"
4942 "-i64:64"
4943 "-v128:64:128"
4944 "-a:0:32"
4945 "-n32"
4946 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004947 } else if (T.isOSNaCl()) {
4948 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004949 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004950 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004951 resetDataLayout(BigEndian
4952 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4953 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004954 }
4955
4956 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004957 }
4958
Tim Northover5627d392015-10-30 16:30:45 +00004959 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004960 const llvm::Triple &T = getTriple();
4961
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004962 IsAAPCS = false;
4963
Tim Northover5627d392015-10-30 16:30:45 +00004964 if (IsAAPCS16)
4965 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4966 else
4967 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004968
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004969 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004970 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004971 SizeType = UnsignedInt;
4972 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004973 SizeType = UnsignedLong;
4974
4975 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4976 WCharType = SignedInt;
4977
4978 // Do not respect the alignment of bit-field types when laying out
4979 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4980 UseBitFieldTypeAlignment = false;
4981
4982 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4983 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4984 /// gcc.
4985 ZeroLengthBitfieldBoundary = 32;
4986
Tim Northover5627d392015-10-30 16:30:45 +00004987 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4988 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004989 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004990 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004991 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004992 BigEndian
4993 ? "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 +00004994 : "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 +00004995 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004996 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004997 BigEndian
4998 ? "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 +00004999 : "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 +00005000
5001 // FIXME: Override "preferred align" for double and long long.
5002 }
5003
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005004 void setArchInfo() {
5005 StringRef ArchName = getTriple().getArchName();
5006
Renato Goline84b0002015-10-08 16:43:26 +00005007 ArchISA = llvm::ARM::parseArchISA(ArchName);
5008 CPU = llvm::ARM::getDefaultCPU(ArchName);
5009 unsigned AK = llvm::ARM::parseArch(ArchName);
5010 if (AK != llvm::ARM::AK_INVALID)
5011 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005012 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005013 }
5014
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005015 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005016 StringRef SubArch;
5017
5018 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005019 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005020 SubArch = llvm::ARM::getSubArch(ArchKind);
5021 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5022 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005023
5024 // cache CPU related strings
5025 CPUAttr = getCPUAttr();
5026 CPUProfile = getCPUProfile();
5027 }
5028
5029 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005030 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005031 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005032 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005033 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5034 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005035 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005036 if (ArchProfile == llvm::ARM::PK_M) {
5037 MaxAtomicPromoteWidth = 32;
5038 if (ShouldUseInlineAtomic)
5039 MaxAtomicInlineWidth = 32;
5040 }
5041 else {
5042 MaxAtomicPromoteWidth = 64;
5043 if (ShouldUseInlineAtomic)
5044 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005045 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005046 }
5047
5048 bool isThumb() const {
5049 return (ArchISA == llvm::ARM::IK_THUMB);
5050 }
5051
5052 bool supportsThumb() const {
5053 return CPUAttr.count('T') || ArchVersion >= 6;
5054 }
5055
5056 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005057 return CPUAttr.equals("6T2") ||
5058 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005059 }
5060
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005061 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005062 // For most sub-arches, the build attribute CPU name is enough.
5063 // For Cortex variants, it's slightly different.
5064 switch(ArchKind) {
5065 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005066 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005067 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005069 case llvm::ARM::AK_ARMV7S:
5070 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005071 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005072 return "7A";
5073 case llvm::ARM::AK_ARMV7R:
5074 return "7R";
5075 case llvm::ARM::AK_ARMV7M:
5076 return "7M";
5077 case llvm::ARM::AK_ARMV7EM:
5078 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005079 case llvm::ARM::AK_ARMV7VE:
5080 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005081 case llvm::ARM::AK_ARMV8A:
5082 return "8A";
5083 case llvm::ARM::AK_ARMV8_1A:
5084 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005085 case llvm::ARM::AK_ARMV8_2A:
5086 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005087 case llvm::ARM::AK_ARMV8MBaseline:
5088 return "8M_BASE";
5089 case llvm::ARM::AK_ARMV8MMainline:
5090 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005091 case llvm::ARM::AK_ARMV8R:
5092 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005093 }
5094 }
5095
5096 StringRef getCPUProfile() const {
5097 switch(ArchProfile) {
5098 case llvm::ARM::PK_A:
5099 return "A";
5100 case llvm::ARM::PK_R:
5101 return "R";
5102 case llvm::ARM::PK_M:
5103 return "M";
5104 default:
5105 return "";
5106 }
5107 }
5108
Chris Lattner17df24e2008-04-21 18:56:49 +00005109public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005110 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005111 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5112 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005113
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005114 switch (getTriple().getOS()) {
5115 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005116 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005117 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005118 break;
5119 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005120 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005121 break;
5122 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005123
Renato Goline84b0002015-10-08 16:43:26 +00005124 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005126
Chris Lattner1a8f3942010-04-23 16:29:58 +00005127 // {} in inline assembly are neon specifiers, not assembly variant
5128 // specifiers.
5129 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005130
Eric Christopher0e261882014-12-05 01:06:59 +00005131 // FIXME: This duplicates code from the driver that sets the -target-abi
5132 // option - this code is used if -target-abi isn't passed and should
5133 // be unified in some way.
5134 if (Triple.isOSBinFormatMachO()) {
5135 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5136 // the frontend matches that.
5137 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5138 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005139 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005140 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005141 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005142 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005143 } else {
5144 setABI("apcs-gnu");
5145 }
5146 } else if (Triple.isOSWindows()) {
5147 // FIXME: this is invalid for WindowsCE
5148 setABI("aapcs");
5149 } else {
5150 // Select the default based on the platform.
5151 switch (Triple.getEnvironment()) {
5152 case llvm::Triple::Android:
5153 case llvm::Triple::GNUEABI:
5154 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005155 case llvm::Triple::MuslEABI:
5156 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005157 setABI("aapcs-linux");
5158 break;
5159 case llvm::Triple::EABIHF:
5160 case llvm::Triple::EABI:
5161 setABI("aapcs");
5162 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005163 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005164 setABI("apcs-gnu");
5165 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005166 default:
5167 if (Triple.getOS() == llvm::Triple::NetBSD)
5168 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005169 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5170 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005171 else
5172 setABI("aapcs");
5173 break;
5174 }
5175 }
John McCall86353412010-08-21 22:46:04 +00005176
5177 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005178 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005179
Renato Golin15b86152015-07-03 16:41:13 +00005180 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005181 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005182
James Molloya7139222012-03-12 09:14:10 +00005183 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005184 // the alignment of the zero-length bitfield is greater than the member
5185 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005186 // zero length bitfield.
5187 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005188
5189 if (Triple.getOS() == llvm::Triple::Linux ||
5190 Triple.getOS() == llvm::Triple::UnknownOS)
5191 this->MCountName =
5192 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005193 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005194
Alp Toker4925ba72014-06-07 23:30:42 +00005195 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005196
Craig Topper3164f332014-03-11 03:39:26 +00005197 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005198 ABI = Name;
5199
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005200 // The defaults (above) are for AAPCS, check if we need to change them.
5201 //
5202 // FIXME: We need support for -meabi... we could just mangle it into the
5203 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005204 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005205 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005206 return true;
5207 }
5208 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5209 setABIAAPCS();
5210 return true;
5211 }
5212 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005213 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005214
Renato Golinf5c4dec2015-05-27 13:33:00 +00005215 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005216 bool
5217 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5218 StringRef CPU,
5219 const std::vector<std::string> &FeaturesVec) const override {
5220
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005221 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005222 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005223
5224 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005225 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005226 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5227
5228 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005229 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005230 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5231
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005232 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005233 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005234 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005235
Eric Christopher007b0a02015-08-28 22:32:01 +00005236 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005237 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005238
Craig Topper3164f332014-03-11 03:39:26 +00005239 bool handleTargetFeatures(std::vector<std::string> &Features,
5240 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005241 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005242 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005243 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005244 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005245 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005246 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005247 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005248
Ranjeet Singhac08e532015-06-24 23:39:25 +00005249 // This does not diagnose illegal cases like having both
5250 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5251 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005252 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005253 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005254 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005255 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005256 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005257 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005258 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005259 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005260 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005261 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005262 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005263 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005264 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005265 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005266 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005267 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005268 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005269 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005270 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005271 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005272 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005273 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005274 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005275 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005276 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005277 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005278 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005279 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005280 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005281 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005282 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005283 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005284 } else if (Feature == "+strict-align") {
5285 Unaligned = 0;
5286 } else if (Feature == "+fp16") {
5287 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005288 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005289 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005290 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005291
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005292 switch (ArchVersion) {
5293 case 6:
5294 if (ArchProfile == llvm::ARM::PK_M)
5295 LDREX = 0;
5296 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5297 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5298 else
5299 LDREX = LDREX_W;
5300 break;
5301 case 7:
5302 if (ArchProfile == llvm::ARM::PK_M)
5303 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5304 else
5305 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5306 break;
5307 case 8:
5308 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5309 }
5310
Rafael Espindolaeb265472013-08-21 21:59:03 +00005311 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5312 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5313 return false;
5314 }
5315
5316 if (FPMath == FP_Neon)
5317 Features.push_back("+neonfp");
5318 else if (FPMath == FP_VFP)
5319 Features.push_back("-neonfp");
5320
Daniel Dunbar893d4752009-12-19 04:15:38 +00005321 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005322 auto Feature =
5323 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5324 if (Feature != Features.end())
5325 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005326
Rafael Espindolaeb265472013-08-21 21:59:03 +00005327 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005328 }
5329
Craig Topper3164f332014-03-11 03:39:26 +00005330 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005331 return llvm::StringSwitch<bool>(Feature)
5332 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005333 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005334 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005335 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005336 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005337 .Case("hwdiv", HWDiv & HWDivThumb)
5338 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005339 .Default(false);
5340 }
Renato Golin15b86152015-07-03 16:41:13 +00005341
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005342 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005343 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005344 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005345
Renato Golin15b86152015-07-03 16:41:13 +00005346 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005347 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005348 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005349 CPU = Name;
5350 return true;
5351 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005352
Craig Topper3164f332014-03-11 03:39:26 +00005353 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005354
Craig Topper3164f332014-03-11 03:39:26 +00005355 void getTargetDefines(const LangOptions &Opts,
5356 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005357 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005358 Builder.defineMacro("__arm");
5359 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005360 // For bare-metal none-eabi.
5361 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5362 getTriple().getEnvironment() == llvm::Triple::EABI)
5363 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005364
Chris Lattnerecd49032009-03-02 22:27:17 +00005365 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005366 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005367
5368 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5369 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005370 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005371 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5372
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005373 if (!CPUAttr.empty())
5374 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005375
5376 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005377 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005378 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005379
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005380 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005381 // ACLE 6.5.7 Crypto Extension
5382 if (Crypto)
5383 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5384 // ACLE 6.5.8 CRC32 Extension
5385 if (CRC)
5386 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5387 // ACLE 6.5.10 Numeric Maximum and Minimum
5388 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5389 // ACLE 6.5.9 Directed Rounding
5390 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005391 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005392
5393 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5394 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005395 // NOTE that the default profile is assumed to be 'A'
5396 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005397 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5398
Bradley Smithf4affc12016-03-03 13:52:22 +00005399 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5400 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5401 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5402 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005403 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005404 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005405 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005406 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5407
5408 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5409 // instruction set such as ARM or Thumb.
5410 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5411
5412 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5413
5414 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005415 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005416 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005417
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005418 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005419 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005420 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005421
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005422 // ACLE 6.4.4 LDREX/STREX
5423 if (LDREX)
5424 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5425
5426 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005427 if (ArchVersion == 5 ||
5428 (ArchVersion == 6 && CPUProfile != "M") ||
5429 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005430 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5431
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005432 // ACLE 6.5.1 Hardware Floating Point
5433 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005434 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005435
Yi Konga44c4d72014-06-27 21:25:42 +00005436 // ACLE predefines.
5437 Builder.defineMacro("__ARM_ACLE", "200");
5438
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005439 // FP16 support (we currently only support IEEE format).
5440 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5441 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5442
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005443 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005444 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005445 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5446
Mike Stump9d54bd72009-04-08 02:07:04 +00005447 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005448
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005449 // FIXME: It's more complicated than this and we don't really support
5450 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005451 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005452 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005453 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005454
David Tweed8f676532012-10-25 13:33:01 +00005455 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005456 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005457 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005458 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005459 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005460 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005461 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005462
Tim Northover28fc0e12016-04-28 13:59:55 +00005463 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5464 ABI == "aapcs16")
5465 Builder.defineMacro("__ARM_PCS_VFP", "1");
5466
Daniel Dunbar893d4752009-12-19 04:15:38 +00005467 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005468 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005469
Zijiao Ma56a83722016-08-17 02:13:33 +00005470 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005471 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005472
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005473 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005474 Builder.defineMacro("__THUMBEL__");
5475 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005476 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005477 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005478 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005479
5480 // ACLE 6.4.9 32-bit SIMD instructions
5481 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5482 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5483
5484 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005485 if (((HWDiv & HWDivThumb) && isThumb()) ||
5486 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005487 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005488 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005489 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005490
5491 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005492 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005493
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005494 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005495 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005496 if (FPU & VFP2FPU)
5497 Builder.defineMacro("__ARM_VFPV2__");
5498 if (FPU & VFP3FPU)
5499 Builder.defineMacro("__ARM_VFPV3__");
5500 if (FPU & VFP4FPU)
5501 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005502 if (FPU & FPARMV8)
5503 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005504 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005505
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005506 // This only gets set when Neon instructions are actually available, unlike
5507 // the VFP define, hence the soft float and arch check. This is subtly
5508 // different from gcc, we follow the intent which was that it should be set
5509 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005510 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005511 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005512 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005513 // current AArch32 NEON implementations do not support double-precision
5514 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005515 Builder.defineMacro("__ARM_NEON_FP",
5516 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005517 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005518
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005519 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5520 Opts.ShortWChar ? "2" : "4");
5521
5522 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5523 Opts.ShortEnums ? "1" : "4");
5524
Bradley Smithf4affc12016-03-03 13:52:22 +00005525 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005526 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5527 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5528 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5529 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5530 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005531
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005532 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005533 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005534 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005535 }
5536
5537 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005538 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005539 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5540 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005541 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005542 }
5543
5544 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005545 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005546 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005547
5548 if (Opts.UnsafeFPMath)
5549 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005550
5551 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5552 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005553 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005554
Craig Topper6c03a542015-10-19 04:51:35 +00005555 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5556 return llvm::makeArrayRef(BuiltinInfo,
5557 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005558 }
Craig Topper3164f332014-03-11 03:39:26 +00005559 bool isCLZForZeroUndef() const override { return false; }
5560 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005561 return IsAAPCS
5562 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005563 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5564 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005565 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005566 ArrayRef<const char *> getGCCRegNames() const override;
5567 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005568 bool validateAsmConstraint(const char *&Name,
5569 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005570 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005571 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005572 case 'l': // r0-r7
5573 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005574 case 't': // VFP Floating point register single precision
5575 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005576 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005577 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005578 case 'I':
5579 case 'J':
5580 case 'K':
5581 case 'L':
5582 case 'M':
5583 // FIXME
5584 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005585 case 'Q': // A memory address that is a single base register.
5586 Info.setAllowsMemory();
5587 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005588 case 'U': // a memory reference...
5589 switch (Name[1]) {
5590 case 'q': // ...ARMV4 ldrsb
5591 case 'v': // ...VFP load/store (reg+constant offset)
5592 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005593 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005594 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005595 case 'n': // valid address for Neon doubleword vector load/store
5596 case 'm': // valid address for Neon element and structure load/store
5597 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005598 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005599 Info.setAllowsMemory();
5600 Name++;
5601 return true;
5602 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005603 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005604 return false;
5605 }
Craig Topper3164f332014-03-11 03:39:26 +00005606 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005607 std::string R;
5608 switch (*Constraint) {
5609 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005610 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005611 Constraint++;
5612 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005613 case 'p': // 'p' should be translated to 'r' by default.
5614 R = std::string("r");
5615 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005616 default:
5617 return std::string(1, *Constraint);
5618 }
5619 return R;
5620 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005621 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005622 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005623 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005624 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005625 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005626
Bill Wendling9d1ee112012-10-25 23:28:48 +00005627 // Strip off constraint modifiers.
5628 while (Constraint[0] == '=' ||
5629 Constraint[0] == '+' ||
5630 Constraint[0] == '&')
5631 Constraint = Constraint.substr(1);
5632
5633 switch (Constraint[0]) {
5634 default: break;
5635 case 'r': {
5636 switch (Modifier) {
5637 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005638 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005639 case 'q':
5640 // A register of size 32 cannot fit a vector type.
5641 return false;
5642 }
5643 }
5644 }
5645
5646 return true;
5647 }
Craig Topper3164f332014-03-11 03:39:26 +00005648 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005649 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005650 return "";
5651 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005652
Craig Topper3164f332014-03-11 03:39:26 +00005653 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005654 switch (CC) {
5655 case CC_AAPCS:
5656 case CC_AAPCS_VFP:
5657 case CC_Swift:
5658 return CCCR_OK;
5659 default:
5660 return CCCR_Warning;
5661 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005662 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005663
Craig Topper3164f332014-03-11 03:39:26 +00005664 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005665 if (RegNo == 0) return 0;
5666 if (RegNo == 1) return 1;
5667 return -1;
5668 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005669
5670 bool hasSjLjLowering() const override {
5671 return true;
5672 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005673};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005674
Rafael Espindolaeb265472013-08-21 21:59:03 +00005675bool ARMTargetInfo::setFPMath(StringRef Name) {
5676 if (Name == "neon") {
5677 FPMath = FP_Neon;
5678 return true;
5679 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5680 Name == "vfp4") {
5681 FPMath = FP_VFP;
5682 return true;
5683 }
5684 return false;
5685}
5686
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005687const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005688 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005689 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005690 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5691
5692 // Float registers
5693 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5694 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5695 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005696 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005697
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005698 // Double registers
5699 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5700 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005701 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5702 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005703
5704 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005705 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5706 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005707};
5708
Craig Topperf054e3a2015-10-19 03:52:27 +00005709ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5710 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005711}
5712
5713const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005714 { { "a1" }, "r0" },
5715 { { "a2" }, "r1" },
5716 { { "a3" }, "r2" },
5717 { { "a4" }, "r3" },
5718 { { "v1" }, "r4" },
5719 { { "v2" }, "r5" },
5720 { { "v3" }, "r6" },
5721 { { "v4" }, "r7" },
5722 { { "v5" }, "r8" },
5723 { { "v6", "rfp" }, "r9" },
5724 { { "sl" }, "r10" },
5725 { { "fp" }, "r11" },
5726 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005727 { { "r13" }, "sp" },
5728 { { "r14" }, "lr" },
5729 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005730 // The S, D and Q registers overlap, but aren't really aliases; we
5731 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005732};
5733
Craig Topperf054e3a2015-10-19 03:52:27 +00005734ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5735 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005736}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005737
5738const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005739#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005740 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005741#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5742 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005743#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005744
Craig Topper07d3b622015-08-07 05:14:44 +00005745#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005746 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005747#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005748 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005749#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5750 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005751#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5752 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005753#include "clang/Basic/BuiltinsARM.def"
5754};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005755
5756class ARMleTargetInfo : public ARMTargetInfo {
5757public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005758 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005759 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005760 void getTargetDefines(const LangOptions &Opts,
5761 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005762 Builder.defineMacro("__ARMEL__");
5763 ARMTargetInfo::getTargetDefines(Opts, Builder);
5764 }
5765};
5766
5767class ARMbeTargetInfo : public ARMTargetInfo {
5768public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005769 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005770 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005771 void getTargetDefines(const LangOptions &Opts,
5772 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005773 Builder.defineMacro("__ARMEB__");
5774 Builder.defineMacro("__ARM_BIG_ENDIAN");
5775 ARMTargetInfo::getTargetDefines(Opts, Builder);
5776 }
5777};
Chris Lattner17df24e2008-04-21 18:56:49 +00005778
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005779class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5780 const llvm::Triple Triple;
5781public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005782 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5783 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005784 WCharType = UnsignedShort;
5785 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005786 }
5787 void getVisualStudioDefines(const LangOptions &Opts,
5788 MacroBuilder &Builder) const {
5789 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5790
5791 // FIXME: this is invalid for WindowsCE
5792 Builder.defineMacro("_M_ARM_NT", "1");
5793 Builder.defineMacro("_M_ARMT", "_M_ARM");
5794 Builder.defineMacro("_M_THUMB", "_M_ARM");
5795
5796 assert((Triple.getArch() == llvm::Triple::arm ||
5797 Triple.getArch() == llvm::Triple::thumb) &&
5798 "invalid architecture for Windows ARM target info");
5799 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5800 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5801
5802 // TODO map the complete set of values
5803 // 31: VFPv3 40: VFPv4
5804 Builder.defineMacro("_M_ARM_FP", "31");
5805 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005806 BuiltinVaListKind getBuiltinVaListKind() const override {
5807 return TargetInfo::CharPtrBuiltinVaList;
5808 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005809 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5810 switch (CC) {
5811 case CC_X86StdCall:
5812 case CC_X86ThisCall:
5813 case CC_X86FastCall:
5814 case CC_X86VectorCall:
5815 return CCCR_Ignore;
5816 case CC_C:
5817 return CCCR_OK;
5818 default:
5819 return CCCR_Warning;
5820 }
5821 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005822};
5823
5824// Windows ARM + Itanium C++ ABI Target
5825class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5826public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005827 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5828 const TargetOptions &Opts)
5829 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005830 TheCXXABI.set(TargetCXXABI::GenericARM);
5831 }
5832
5833 void getTargetDefines(const LangOptions &Opts,
5834 MacroBuilder &Builder) const override {
5835 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5836
5837 if (Opts.MSVCCompat)
5838 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5839 }
5840};
5841
5842// Windows ARM, MS (C++) ABI
5843class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005845 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5846 const TargetOptions &Opts)
5847 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005848 TheCXXABI.set(TargetCXXABI::Microsoft);
5849 }
5850
5851 void getTargetDefines(const LangOptions &Opts,
5852 MacroBuilder &Builder) const override {
5853 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5854 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5855 }
5856};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005857
Yaron Keren321249c2015-07-15 13:32:23 +00005858// ARM MinGW target
5859class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5860public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005861 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5862 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005863 TheCXXABI.set(TargetCXXABI::GenericARM);
5864 }
5865
5866 void getTargetDefines(const LangOptions &Opts,
5867 MacroBuilder &Builder) const override {
5868 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5869 DefineStd(Builder, "WIN32", Opts);
5870 DefineStd(Builder, "WINNT", Opts);
5871 Builder.defineMacro("_ARM_");
5872 addMinGWDefines(Opts, Builder);
5873 }
5874};
5875
5876// ARM Cygwin target
5877class CygwinARMTargetInfo : public ARMleTargetInfo {
5878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005879 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5880 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005881 TLSSupported = false;
5882 WCharType = UnsignedShort;
5883 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005884 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005885 }
5886 void getTargetDefines(const LangOptions &Opts,
5887 MacroBuilder &Builder) const override {
5888 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5889 Builder.defineMacro("_ARM_");
5890 Builder.defineMacro("__CYGWIN__");
5891 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005892 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005893 if (Opts.CPlusPlus)
5894 Builder.defineMacro("_GNU_SOURCE");
5895 }
5896};
5897
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005898class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005899protected:
Craig Topper3164f332014-03-11 03:39:26 +00005900 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5901 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005902 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005903 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005904
Torok Edwinb2b37c62009-06-30 17:10:35 +00005905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005906 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5907 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005908 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005909 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005910 // FIXME: This should be based off of the target features in
5911 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005912 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005913
Tim Northoverd88ecb32016-01-27 19:32:40 +00005914 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005915 // Darwin on iOS uses a variant of the ARM C++ ABI.
5916 TheCXXABI.set(TargetCXXABI::WatchOS);
5917
5918 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5919 // size_t is long, it's a bit weird for it to be int.
5920 PtrDiffType = SignedLong;
5921
5922 // BOOL should be a real boolean on the new ABI
5923 UseSignedCharForObjCBool = false;
5924 } else
5925 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005926 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005927};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005928
Tim Northover573cbee2014-05-24 12:52:07 +00005929class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005930 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005931 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5932 static const char *const GCCRegNames[];
5933
James Molloy75f5f9e2014-04-16 15:33:48 +00005934 enum FPUModeEnum {
5935 FPUMode,
5936 NeonMode
5937 };
5938
5939 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005940 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005941 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005942 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005943 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005944
Tim Northovera2ee4332014-03-29 15:09:45 +00005945 static const Builtin::Info BuiltinInfo[];
5946
5947 std::string ABI;
5948
5949public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005950 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005951 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00005952 if (getTriple().getOS() == llvm::Triple::NetBSD ||
5953 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00005954 WCharType = SignedInt;
5955
5956 // NetBSD apparently prefers consistency across ARM targets to consistency
5957 // across 64-bit targets.
5958 Int64Type = SignedLongLong;
5959 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005960 } else {
5961 WCharType = UnsignedInt;
5962 Int64Type = SignedLong;
5963 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005964 }
5965
Tim Northovera2ee4332014-03-29 15:09:45 +00005966 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005967 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005968 MaxAtomicInlineWidth = 128;
5969 MaxAtomicPromoteWidth = 128;
5970
Tim Northovera6a19f12015-02-06 01:25:07 +00005971 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005972 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005973
Tim Northovera2ee4332014-03-29 15:09:45 +00005974 // {} in inline assembly are neon specifiers, not assembly variant
5975 // specifiers.
5976 NoAsmVariants = true;
5977
Tim Northover7ad87af2015-01-16 18:44:04 +00005978 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5979 // contributes to the alignment of the containing aggregate in the same way
5980 // a plain (non bit-field) member of that type would, without exception for
5981 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005982 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005983 UseZeroLengthBitfieldAlignment = true;
5984
Tim Northover573cbee2014-05-24 12:52:07 +00005985 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005986 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005987
Eric Christopherfb834a82017-02-28 17:22:05 +00005988 if (Triple.getOS() == llvm::Triple::Linux)
5989 this->MCountName = "\01_mcount";
5990 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005991 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005992 }
5993
Alp Toker4925ba72014-06-07 23:30:42 +00005994 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005995 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005996 if (Name != "aapcs" && Name != "darwinpcs")
5997 return false;
5998
5999 ABI = Name;
6000 return true;
6001 }
6002
David Blaikie1cbb9712014-11-14 19:09:44 +00006003 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006004 return Name == "generic" ||
6005 llvm::AArch64::parseCPUArch(Name) !=
6006 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006007 }
6008
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006009 void getTargetDefines(const LangOptions &Opts,
6010 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006011 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006012 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006013
6014 // Target properties.
6015 Builder.defineMacro("_LP64");
6016 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006017
6018 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6019 Builder.defineMacro("__ARM_ACLE", "200");
6020 Builder.defineMacro("__ARM_ARCH", "8");
6021 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6022
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006023 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006024 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006025 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006026
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006027 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6028 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6029 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6030 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006031 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006032 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6033 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006034
6035 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6036
6037 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006038 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006039
6040 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6041 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006042 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6043 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006044
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006045 if (Opts.UnsafeFPMath)
6046 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006047
6048 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6049
6050 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6051 Opts.ShortEnums ? "1" : "4");
6052
James Molloy75f5f9e2014-04-16 15:33:48 +00006053 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006054 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006055 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006056 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006057 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006058
Bradley Smith418c5932014-05-02 15:17:51 +00006059 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006060 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006061
James Molloy75f5f9e2014-04-16 15:33:48 +00006062 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006063 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6064
6065 if (Unaligned)
6066 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006067
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006068 if (V8_1A)
6069 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6070
Reid Klecknerd167d422015-05-06 15:31:46 +00006071 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6072 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6073 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6074 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6075 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006076 }
6077
Craig Topper6c03a542015-10-19 04:51:35 +00006078 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6079 return llvm::makeArrayRef(BuiltinInfo,
6080 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006081 }
6082
David Blaikie1cbb9712014-11-14 19:09:44 +00006083 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006084 return Feature == "aarch64" ||
6085 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006086 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006087 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006088 }
6089
James Molloy5e73df52014-04-16 15:06:20 +00006090 bool handleTargetFeatures(std::vector<std::string> &Features,
6091 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006092 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006093 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006094 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006095 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006096 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006097
Eric Christopher610fe112015-08-26 08:21:55 +00006098 for (const auto &Feature : Features) {
6099 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006100 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006101 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006102 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006103 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006104 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006105 if (Feature == "+strict-align")
6106 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006107 if (Feature == "+v8.1a")
6108 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006109 }
6110
James Y Knightb214cbc2016-03-04 19:00:41 +00006111 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006112
6113 return true;
6114 }
6115
John McCall477f2bb2016-03-03 06:39:32 +00006116 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6117 switch (CC) {
6118 case CC_C:
6119 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006120 case CC_PreserveMost:
6121 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006122 return CCCR_OK;
6123 default:
6124 return CCCR_Warning;
6125 }
6126 }
6127
David Blaikie1cbb9712014-11-14 19:09:44 +00006128 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006129
David Blaikie1cbb9712014-11-14 19:09:44 +00006130 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006131 return TargetInfo::AArch64ABIBuiltinVaList;
6132 }
6133
Craig Topperf054e3a2015-10-19 03:52:27 +00006134 ArrayRef<const char *> getGCCRegNames() const override;
6135 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006136
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006137 bool validateAsmConstraint(const char *&Name,
6138 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006139 switch (*Name) {
6140 default:
6141 return false;
6142 case 'w': // Floating point and SIMD registers (V0-V31)
6143 Info.setAllowsRegister();
6144 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006145 case 'I': // Constant that can be used with an ADD instruction
6146 case 'J': // Constant that can be used with a SUB instruction
6147 case 'K': // Constant that can be used with a 32-bit logical instruction
6148 case 'L': // Constant that can be used with a 64-bit logical instruction
6149 case 'M': // Constant that can be used as a 32-bit MOV immediate
6150 case 'N': // Constant that can be used as a 64-bit MOV immediate
6151 case 'Y': // Floating point constant zero
6152 case 'Z': // Integer constant zero
6153 return true;
6154 case 'Q': // A memory reference with base register and no offset
6155 Info.setAllowsMemory();
6156 return true;
6157 case 'S': // A symbolic address
6158 Info.setAllowsRegister();
6159 return true;
6160 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006161 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6162 // Utf: A memory address suitable for ldp/stp in TF mode.
6163 // Usa: An absolute symbolic address.
6164 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6165 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006166 case 'z': // Zero register, wzr or xzr
6167 Info.setAllowsRegister();
6168 return true;
6169 case 'x': // Floating point and SIMD registers (V0-V15)
6170 Info.setAllowsRegister();
6171 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006172 }
6173 return false;
6174 }
6175
Akira Hatanaka987f1862014-08-22 06:05:21 +00006176 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006177 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006178 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006179 // Strip off constraint modifiers.
6180 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6181 Constraint = Constraint.substr(1);
6182
6183 switch (Constraint[0]) {
6184 default:
6185 return true;
6186 case 'z':
6187 case 'r': {
6188 switch (Modifier) {
6189 case 'x':
6190 case 'w':
6191 // For now assume that the person knows what they're
6192 // doing with the modifier.
6193 return true;
6194 default:
6195 // By default an 'r' constraint will be in the 'x'
6196 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006197 if (Size == 64)
6198 return true;
6199
6200 SuggestedModifier = "w";
6201 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006202 }
6203 }
6204 }
6205 }
6206
David Blaikie1cbb9712014-11-14 19:09:44 +00006207 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006208
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006209 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006210 if (RegNo == 0)
6211 return 0;
6212 if (RegNo == 1)
6213 return 1;
6214 return -1;
6215 }
6216};
6217
Tim Northover573cbee2014-05-24 12:52:07 +00006218const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006219 // 32-bit Integer registers
6220 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6221 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6222 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6223
6224 // 64-bit Integer registers
6225 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6226 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6227 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6228
6229 // 32-bit floating point regsisters
6230 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6231 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6232 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6233
6234 // 64-bit floating point regsisters
6235 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6236 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6237 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6238
6239 // Vector registers
6240 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6241 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6242 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6243};
6244
Craig Topperf054e3a2015-10-19 03:52:27 +00006245ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6246 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006247}
6248
Tim Northover573cbee2014-05-24 12:52:07 +00006249const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006250 { { "w31" }, "wsp" },
6251 { { "x29" }, "fp" },
6252 { { "x30" }, "lr" },
6253 { { "x31" }, "sp" },
6254 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6255 // don't want to substitute one of these for a different-sized one.
6256};
6257
Craig Topperf054e3a2015-10-19 03:52:27 +00006258ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6259 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006260}
6261
Tim Northover573cbee2014-05-24 12:52:07 +00006262const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006263#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006264 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006265#include "clang/Basic/BuiltinsNEON.def"
6266
6267#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006268 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006269#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006270};
James Molloy5e73df52014-04-16 15:06:20 +00006271
Tim Northover573cbee2014-05-24 12:52:07 +00006272class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006273 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006274 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006275 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006276 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006277 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006278 }
6279
6280public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006281 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6282 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006283 }
James Molloy5e73df52014-04-16 15:06:20 +00006284 void getTargetDefines(const LangOptions &Opts,
6285 MacroBuilder &Builder) const override {
6286 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006287 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006288 }
6289};
6290
Tim Northover573cbee2014-05-24 12:52:07 +00006291class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006292 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006293 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006294 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006295 }
6296
6297public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006298 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6299 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006300 void getTargetDefines(const LangOptions &Opts,
6301 MacroBuilder &Builder) const override {
6302 Builder.defineMacro("__AARCH64EB__");
6303 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6304 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006305 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006306 }
6307};
Tim Northovera2ee4332014-03-29 15:09:45 +00006308
Tim Northover573cbee2014-05-24 12:52:07 +00006309class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006310protected:
6311 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6312 MacroBuilder &Builder) const override {
6313 Builder.defineMacro("__AARCH64_SIMD__");
6314 Builder.defineMacro("__ARM64_ARCH_8__");
6315 Builder.defineMacro("__ARM_NEON__");
6316 Builder.defineMacro("__LITTLE_ENDIAN__");
6317 Builder.defineMacro("__REGISTER_PREFIX__", "");
6318 Builder.defineMacro("__arm64", "1");
6319 Builder.defineMacro("__arm64__", "1");
6320
6321 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6322 }
6323
Tim Northovera2ee4332014-03-29 15:09:45 +00006324public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006325 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6326 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006327 Int64Type = SignedLongLong;
6328 WCharType = SignedInt;
6329 UseSignedCharForObjCBool = false;
6330
Tim Northovera6a19f12015-02-06 01:25:07 +00006331 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006332 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006333
6334 TheCXXABI.set(TargetCXXABI::iOS64);
6335 }
6336
David Blaikie1cbb9712014-11-14 19:09:44 +00006337 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006338 return TargetInfo::CharPtrBuiltinVaList;
6339 }
6340};
Tim Northovera2ee4332014-03-29 15:09:45 +00006341
Tony Linthicum76329bf2011-12-12 21:14:55 +00006342// Hexagon abstract base class
6343class HexagonTargetInfo : public TargetInfo {
6344 static const Builtin::Info BuiltinInfo[];
6345 static const char * const GCCRegNames[];
6346 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6347 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006348 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006349 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350
Tony Linthicum76329bf2011-12-12 21:14:55 +00006351public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006352 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6353 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006354 // Specify the vector alignment explicitly. For v512x1, the calculated
6355 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6356 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006357 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006358 "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 +00006359 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006360 SizeType = UnsignedInt;
6361 PtrDiffType = SignedInt;
6362 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006363
6364 // {} in inline assembly are packet specifiers, not assembly variant
6365 // specifiers.
6366 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006367
6368 LargeArrayMinWidth = 64;
6369 LargeArrayAlign = 64;
6370 UseBitFieldTypeAlignment = true;
6371 ZeroLengthBitfieldBoundary = 32;
6372 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006373 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006374 }
6375
Craig Topper6c03a542015-10-19 04:51:35 +00006376 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6377 return llvm::makeArrayRef(BuiltinInfo,
6378 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006379 }
6380
Craig Topper3164f332014-03-11 03:39:26 +00006381 bool validateAsmConstraint(const char *&Name,
6382 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006383 switch (*Name) {
6384 case 'v':
6385 case 'q':
6386 if (HasHVX) {
6387 Info.setAllowsRegister();
6388 return true;
6389 }
6390 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006391 case 's':
6392 // Relocatable constant.
6393 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006394 }
6395 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006396 }
6397
Craig Topper3164f332014-03-11 03:39:26 +00006398 void getTargetDefines(const LangOptions &Opts,
6399 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006400
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006401 bool isCLZForZeroUndef() const override { return false; }
6402
Craig Topper3164f332014-03-11 03:39:26 +00006403 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006404 return llvm::StringSwitch<bool>(Feature)
6405 .Case("hexagon", true)
6406 .Case("hvx", HasHVX)
6407 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006408 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006409 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006410 }
Craig Topper3164f332014-03-11 03:39:26 +00006411
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6413 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6414 const override;
6415
6416 bool handleTargetFeatures(std::vector<std::string> &Features,
6417 DiagnosticsEngine &Diags) override;
6418
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006419 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6420 bool Enabled) const override;
6421
Craig Topper3164f332014-03-11 03:39:26 +00006422 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006423 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006424 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006425 ArrayRef<const char *> getGCCRegNames() const override;
6426 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006427 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006428 return "";
6429 }
Sebastian Pop86500282012-01-13 20:37:10 +00006430
6431 static const char *getHexagonCPUSuffix(StringRef Name) {
6432 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006433 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006434 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006435 .Case("hexagonv55", "55")
6436 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006437 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006438 }
6439
Craig Topper3164f332014-03-11 03:39:26 +00006440 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006441 if (!getHexagonCPUSuffix(Name))
6442 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006443 CPU = Name;
6444 return true;
6445 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446
6447 int getEHDataRegisterNumber(unsigned RegNo) const override {
6448 return RegNo < 2 ? RegNo : -1;
6449 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006450};
6451
6452void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006455 Builder.defineMacro("__hexagon__", "1");
6456
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006458 Builder.defineMacro("__HEXAGON_V4__");
6459 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006460 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006461 Builder.defineMacro("__QDSP6_V4__");
6462 Builder.defineMacro("__QDSP6_ARCH__", "4");
6463 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006464 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006465 Builder.defineMacro("__HEXAGON_V5__");
6466 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6467 if(Opts.HexagonQdsp6Compat) {
6468 Builder.defineMacro("__QDSP6_V5__");
6469 Builder.defineMacro("__QDSP6_ARCH__", "5");
6470 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006471 } else if (CPU == "hexagonv55") {
6472 Builder.defineMacro("__HEXAGON_V55__");
6473 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6474 Builder.defineMacro("__QDSP6_V55__");
6475 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476 } else if (CPU == "hexagonv60") {
6477 Builder.defineMacro("__HEXAGON_V60__");
6478 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6479 Builder.defineMacro("__QDSP6_V60__");
6480 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006481 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006482
6483 if (hasFeature("hvx")) {
6484 Builder.defineMacro("__HVX__");
6485 if (hasFeature("hvx-double"))
6486 Builder.defineMacro("__HVXDBL__");
6487 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006488}
6489
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006490bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6491 DiagnosticsEngine &Diags, StringRef CPU,
6492 const std::vector<std::string> &FeaturesVec) const {
6493 // Default for v60: -hvx, -hvx-double.
6494 Features["hvx"] = false;
6495 Features["hvx-double"] = false;
6496 Features["long-calls"] = false;
6497
6498 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6499}
6500
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006501bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6502 DiagnosticsEngine &Diags) {
6503 for (auto &F : Features) {
6504 if (F == "+hvx")
6505 HasHVX = true;
6506 else if (F == "-hvx")
6507 HasHVX = HasHVXDouble = false;
6508 else if (F == "+hvx-double")
6509 HasHVX = HasHVXDouble = true;
6510 else if (F == "-hvx-double")
6511 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006512
6513 if (F == "+long-calls")
6514 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006515 else if (F == "-long-calls")
6516 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006517 }
6518 return true;
6519}
6520
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006521void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6522 StringRef Name, bool Enabled) const {
6523 if (Enabled) {
6524 if (Name == "hvx-double")
6525 Features["hvx"] = true;
6526 } else {
6527 if (Name == "hvx")
6528 Features["hvx-double"] = false;
6529 }
6530 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006531}
6532
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006533const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006534 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6535 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6536 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6537 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6538 "p0", "p1", "p2", "p3",
6539 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6540};
6541
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006542ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006543 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006544}
6545
Tony Linthicum76329bf2011-12-12 21:14:55 +00006546const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6547 { { "sp" }, "r29" },
6548 { { "fp" }, "r30" },
6549 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006550};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006551
Craig Topperf054e3a2015-10-19 03:52:27 +00006552ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6553 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006554}
6555
6556
6557const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006558#define BUILTIN(ID, TYPE, ATTRS) \
6559 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6560#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6561 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006562#include "clang/Basic/BuiltinsHexagon.def"
6563};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006564
Jacques Pienaard964cc22016-03-28 21:02:54 +00006565class LanaiTargetInfo : public TargetInfo {
6566 // Class for Lanai (32-bit).
6567 // The CPU profiles supported by the Lanai backend
6568 enum CPUKind {
6569 CK_NONE,
6570 CK_V11,
6571 } CPU;
6572
6573 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6574 static const char *const GCCRegNames[];
6575
6576public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006577 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6578 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006579 // Description string has to be kept in sync with backend.
6580 resetDataLayout("E" // Big endian
6581 "-m:e" // ELF name manging
6582 "-p:32:32" // 32 bit pointers, 32 bit aligned
6583 "-i64:64" // 64 bit integers, 64 bit aligned
6584 "-a:0:32" // 32 bit alignment of objects of aggregate type
6585 "-n32" // 32 bit native integer width
6586 "-S64" // 64 bit natural stack alignment
6587 );
6588
6589 // Setting RegParmMax equal to what mregparm was set to in the old
6590 // toolchain
6591 RegParmMax = 4;
6592
6593 // Set the default CPU to V11
6594 CPU = CK_V11;
6595
6596 // Temporary approach to make everything at least word-aligned and allow for
6597 // safely casting between pointers with different alignment requirements.
6598 // TODO: Remove this when there are no more cast align warnings on the
6599 // firmware.
6600 MinGlobalAlign = 32;
6601 }
6602
6603 void getTargetDefines(const LangOptions &Opts,
6604 MacroBuilder &Builder) const override {
6605 // Define __lanai__ when building for target lanai.
6606 Builder.defineMacro("__lanai__");
6607
6608 // Set define for the CPU specified.
6609 switch (CPU) {
6610 case CK_V11:
6611 Builder.defineMacro("__LANAI_V11__");
6612 break;
6613 case CK_NONE:
6614 llvm_unreachable("Unhandled target CPU");
6615 }
6616 }
6617
6618 bool setCPU(const std::string &Name) override {
6619 CPU = llvm::StringSwitch<CPUKind>(Name)
6620 .Case("v11", CK_V11)
6621 .Default(CK_NONE);
6622
6623 return CPU != CK_NONE;
6624 }
6625
6626 bool hasFeature(StringRef Feature) const override {
6627 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6628 }
6629
6630 ArrayRef<const char *> getGCCRegNames() const override;
6631
6632 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6633
6634 BuiltinVaListKind getBuiltinVaListKind() const override {
6635 return TargetInfo::VoidPtrBuiltinVaList;
6636 }
6637
6638 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6639
6640 bool validateAsmConstraint(const char *&Name,
6641 TargetInfo::ConstraintInfo &info) const override {
6642 return false;
6643 }
6644
6645 const char *getClobbers() const override { return ""; }
6646};
6647
6648const char *const LanaiTargetInfo::GCCRegNames[] = {
6649 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6650 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6651 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6652
6653ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6654 return llvm::makeArrayRef(GCCRegNames);
6655}
6656
6657const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6658 {{"pc"}, "r2"},
6659 {{"sp"}, "r4"},
6660 {{"fp"}, "r5"},
6661 {{"rv"}, "r8"},
6662 {{"rr1"}, "r10"},
6663 {{"rr2"}, "r11"},
6664 {{"rca"}, "r15"},
6665};
6666
6667ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6668 return llvm::makeArrayRef(GCCRegAliases);
6669}
6670
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006671// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6672class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006673 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6674 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006675 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006677 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006678 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006679
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006680 int getEHDataRegisterNumber(unsigned RegNo) const override {
6681 if (RegNo == 0) return 24;
6682 if (RegNo == 1) return 25;
6683 return -1;
6684 }
6685
Craig Topper3164f332014-03-11 03:39:26 +00006686 bool handleTargetFeatures(std::vector<std::string> &Features,
6687 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006688 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006689 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6690 if (Feature != Features.end()) {
6691 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006692 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006693 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006694 }
Craig Topper3164f332014-03-11 03:39:26 +00006695 void getTargetDefines(const LangOptions &Opts,
6696 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006697 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006698 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006699
6700 if (SoftFloat)
6701 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006702 }
Craig Topper3164f332014-03-11 03:39:26 +00006703
6704 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006705 return llvm::StringSwitch<bool>(Feature)
6706 .Case("softfloat", SoftFloat)
6707 .Case("sparc", true)
6708 .Default(false);
6709 }
Craig Topper3164f332014-03-11 03:39:26 +00006710
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006711 bool hasSjLjLowering() const override {
6712 return true;
6713 }
6714
Craig Topper6c03a542015-10-19 04:51:35 +00006715 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006716 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006717 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006718 }
Craig Topper3164f332014-03-11 03:39:26 +00006719 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006720 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006721 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006722 ArrayRef<const char *> getGCCRegNames() const override;
6723 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006724 bool validateAsmConstraint(const char *&Name,
6725 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006726 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006727 switch (*Name) {
6728 case 'I': // Signed 13-bit constant
6729 case 'J': // Zero
6730 case 'K': // 32-bit constant with the low 12 bits clear
6731 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6732 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6733 case 'N': // Same as 'K' but zext (required for SIMode)
6734 case 'O': // The constant 4096
6735 return true;
6736 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006737 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006738 }
Craig Topper3164f332014-03-11 03:39:26 +00006739 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006740 // FIXME: Implement!
6741 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006742 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006743
6744 // No Sparc V7 for now, the backend doesn't support it anyway.
6745 enum CPUKind {
6746 CK_GENERIC,
6747 CK_V8,
6748 CK_SUPERSPARC,
6749 CK_SPARCLITE,
6750 CK_F934,
6751 CK_HYPERSPARC,
6752 CK_SPARCLITE86X,
6753 CK_SPARCLET,
6754 CK_TSC701,
6755 CK_V9,
6756 CK_ULTRASPARC,
6757 CK_ULTRASPARC3,
6758 CK_NIAGARA,
6759 CK_NIAGARA2,
6760 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006761 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006762 CK_MYRIAD2100,
6763 CK_MYRIAD2150,
6764 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006765 CK_LEON2,
6766 CK_LEON2_AT697E,
6767 CK_LEON2_AT697F,
6768 CK_LEON3,
6769 CK_LEON3_UT699,
6770 CK_LEON3_GR712RC,
6771 CK_LEON4,
6772 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006773 } CPU = CK_GENERIC;
6774
6775 enum CPUGeneration {
6776 CG_V8,
6777 CG_V9,
6778 };
6779
6780 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6781 switch (Kind) {
6782 case CK_GENERIC:
6783 case CK_V8:
6784 case CK_SUPERSPARC:
6785 case CK_SPARCLITE:
6786 case CK_F934:
6787 case CK_HYPERSPARC:
6788 case CK_SPARCLITE86X:
6789 case CK_SPARCLET:
6790 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006791 case CK_MYRIAD2100:
6792 case CK_MYRIAD2150:
6793 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006794 case CK_LEON2:
6795 case CK_LEON2_AT697E:
6796 case CK_LEON2_AT697F:
6797 case CK_LEON3:
6798 case CK_LEON3_UT699:
6799 case CK_LEON3_GR712RC:
6800 case CK_LEON4:
6801 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006802 return CG_V8;
6803 case CK_V9:
6804 case CK_ULTRASPARC:
6805 case CK_ULTRASPARC3:
6806 case CK_NIAGARA:
6807 case CK_NIAGARA2:
6808 case CK_NIAGARA3:
6809 case CK_NIAGARA4:
6810 return CG_V9;
6811 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006812 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006813 }
6814
6815 CPUKind getCPUKind(StringRef Name) const {
6816 return llvm::StringSwitch<CPUKind>(Name)
6817 .Case("v8", CK_V8)
6818 .Case("supersparc", CK_SUPERSPARC)
6819 .Case("sparclite", CK_SPARCLITE)
6820 .Case("f934", CK_F934)
6821 .Case("hypersparc", CK_HYPERSPARC)
6822 .Case("sparclite86x", CK_SPARCLITE86X)
6823 .Case("sparclet", CK_SPARCLET)
6824 .Case("tsc701", CK_TSC701)
6825 .Case("v9", CK_V9)
6826 .Case("ultrasparc", CK_ULTRASPARC)
6827 .Case("ultrasparc3", CK_ULTRASPARC3)
6828 .Case("niagara", CK_NIAGARA)
6829 .Case("niagara2", CK_NIAGARA2)
6830 .Case("niagara3", CK_NIAGARA3)
6831 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006832 .Case("ma2100", CK_MYRIAD2100)
6833 .Case("ma2150", CK_MYRIAD2150)
6834 .Case("ma2450", CK_MYRIAD2450)
6835 // FIXME: the myriad2[.n] spellings are obsolete,
6836 // but a grace period is needed to allow updating dependent builds.
6837 .Case("myriad2", CK_MYRIAD2100)
6838 .Case("myriad2.1", CK_MYRIAD2100)
6839 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006840 .Case("leon2", CK_LEON2)
6841 .Case("at697e", CK_LEON2_AT697E)
6842 .Case("at697f", CK_LEON2_AT697F)
6843 .Case("leon3", CK_LEON3)
6844 .Case("ut699", CK_LEON3_UT699)
6845 .Case("gr712rc", CK_LEON3_GR712RC)
6846 .Case("leon4", CK_LEON4)
6847 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006848 .Default(CK_GENERIC);
6849 }
6850
6851 bool setCPU(const std::string &Name) override {
6852 CPU = getCPUKind(Name);
6853 return CPU != CK_GENERIC;
6854 }
Gabor Greif49991682008-02-21 16:29:08 +00006855};
6856
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006857const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006858 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6859 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6860 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6861 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6862};
6863
Craig Topperf054e3a2015-10-19 03:52:27 +00006864ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6865 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006866}
6867
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006868const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006869 { { "g0" }, "r0" },
6870 { { "g1" }, "r1" },
6871 { { "g2" }, "r2" },
6872 { { "g3" }, "r3" },
6873 { { "g4" }, "r4" },
6874 { { "g5" }, "r5" },
6875 { { "g6" }, "r6" },
6876 { { "g7" }, "r7" },
6877 { { "o0" }, "r8" },
6878 { { "o1" }, "r9" },
6879 { { "o2" }, "r10" },
6880 { { "o3" }, "r11" },
6881 { { "o4" }, "r12" },
6882 { { "o5" }, "r13" },
6883 { { "o6", "sp" }, "r14" },
6884 { { "o7" }, "r15" },
6885 { { "l0" }, "r16" },
6886 { { "l1" }, "r17" },
6887 { { "l2" }, "r18" },
6888 { { "l3" }, "r19" },
6889 { { "l4" }, "r20" },
6890 { { "l5" }, "r21" },
6891 { { "l6" }, "r22" },
6892 { { "l7" }, "r23" },
6893 { { "i0" }, "r24" },
6894 { { "i1" }, "r25" },
6895 { { "i2" }, "r26" },
6896 { { "i3" }, "r27" },
6897 { { "i4" }, "r28" },
6898 { { "i5" }, "r29" },
6899 { { "i6", "fp" }, "r30" },
6900 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006901};
6902
Craig Topperf054e3a2015-10-19 03:52:27 +00006903ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6904 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006905}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006906
6907// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6908class SparcV8TargetInfo : public SparcTargetInfo {
6909public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006910 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6911 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006912 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006913 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6914 switch (getTriple().getOS()) {
6915 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006916 SizeType = UnsignedInt;
6917 IntPtrType = SignedInt;
6918 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006919 break;
6920 case llvm::Triple::NetBSD:
6921 case llvm::Triple::OpenBSD:
6922 SizeType = UnsignedLong;
6923 IntPtrType = SignedLong;
6924 PtrDiffType = SignedLong;
6925 break;
Brad Smith56495d52015-08-13 22:00:53 +00006926 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006927 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6928 // on up to 64 bits.
6929 MaxAtomicPromoteWidth = 64;
6930 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006931 }
6932
Craig Topper3164f332014-03-11 03:39:26 +00006933 void getTargetDefines(const LangOptions &Opts,
6934 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006935 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006936 switch (getCPUGeneration(CPU)) {
6937 case CG_V8:
6938 Builder.defineMacro("__sparcv8");
6939 if (getTriple().getOS() != llvm::Triple::Solaris)
6940 Builder.defineMacro("__sparcv8__");
6941 break;
6942 case CG_V9:
6943 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006944 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006945 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006946 Builder.defineMacro("__sparc_v9__");
6947 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006948 break;
6949 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006950 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006951 std::string MyriadArchValue, Myriad2Value;
6952 Builder.defineMacro("__sparc_v8__");
6953 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006954 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006955 case CK_MYRIAD2150:
6956 MyriadArchValue = "__ma2150";
6957 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006958 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006959 case CK_MYRIAD2450:
6960 MyriadArchValue = "__ma2450";
6961 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006962 break;
6963 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006964 MyriadArchValue = "__ma2100";
6965 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006966 break;
6967 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006968 Builder.defineMacro(MyriadArchValue, "1");
6969 Builder.defineMacro(MyriadArchValue+"__", "1");
6970 Builder.defineMacro("__myriad2__", Myriad2Value);
6971 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006972 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006973 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006974
6975 bool hasSjLjLowering() const override {
6976 return true;
6977 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006978};
6979
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006980// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6981class SparcV8elTargetInfo : public SparcV8TargetInfo {
6982 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006983 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6984 : SparcV8TargetInfo(Triple, Opts) {
6985 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006986 }
6987};
6988
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006989// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6990class SparcV9TargetInfo : public SparcTargetInfo {
6991public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006992 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6993 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006994 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006995 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006996 // This is an LP64 platform.
6997 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006998
6999 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007000 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007001 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007002 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007003 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007004 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007005
7006 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7007 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7008 LongDoubleWidth = 128;
7009 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007010 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007011 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007012 }
7013
Craig Topper3164f332014-03-11 03:39:26 +00007014 void getTargetDefines(const LangOptions &Opts,
7015 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007016 SparcTargetInfo::getTargetDefines(Opts, Builder);
7017 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007018 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007019 // Solaris doesn't need these variants, but the BSDs do.
7020 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007021 Builder.defineMacro("__sparc64__");
7022 Builder.defineMacro("__sparc_v9__");
7023 Builder.defineMacro("__sparcv9__");
7024 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007025 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007026
Craig Topper3164f332014-03-11 03:39:26 +00007027 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007028 if (!SparcTargetInfo::setCPU(Name))
7029 return false;
7030 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007031 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007032};
7033
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007034class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007035 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007036 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007037 std::string CPU;
7038 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007039 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007040
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007041public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007042 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007043 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7044 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007045 IntMaxType = SignedLong;
7046 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007047 TLSSupported = true;
7048 IntWidth = IntAlign = 32;
7049 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7050 PointerWidth = PointerAlign = 64;
7051 LongDoubleWidth = 128;
7052 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007053 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007054 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007055 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007056 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 +00007057 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7058 }
7059 void getTargetDefines(const LangOptions &Opts,
7060 MacroBuilder &Builder) const override {
7061 Builder.defineMacro("__s390__");
7062 Builder.defineMacro("__s390x__");
7063 Builder.defineMacro("__zarch__");
7064 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007065
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007066 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7067 .Cases("arch8", "z10", "8")
7068 .Cases("arch9", "z196", "9")
7069 .Cases("arch10", "zEC12", "10")
7070 .Cases("arch11", "z13", "11")
7071 .Default("");
7072 if (!ISARev.empty())
7073 Builder.defineMacro("__ARCH__", ISARev);
7074
Ulrich Weigandb038a522016-02-05 21:34:28 +00007075 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7076 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7077 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7078 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7079
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007080 if (HasTransactionalExecution)
7081 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007082 if (HasVector)
7083 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007084 if (Opts.ZVector)
7085 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007086 }
Craig Topper6c03a542015-10-19 04:51:35 +00007087 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7088 return llvm::makeArrayRef(BuiltinInfo,
7089 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007090 }
7091
Craig Topperf054e3a2015-10-19 03:52:27 +00007092 ArrayRef<const char *> getGCCRegNames() const override;
7093 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007094 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007095 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007096 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007097 bool validateAsmConstraint(const char *&Name,
7098 TargetInfo::ConstraintInfo &info) const override;
7099 const char *getClobbers() const override {
7100 // FIXME: Is this really right?
7101 return "";
7102 }
7103 BuiltinVaListKind getBuiltinVaListKind() const override {
7104 return TargetInfo::SystemZBuiltinVaList;
7105 }
7106 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007107 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007108 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7109 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007110 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007111 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007112 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007113 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007114 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007115 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007116 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007117 .Default(false);
7118
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007119 return CPUKnown;
7120 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007121 bool
7122 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7123 StringRef CPU,
7124 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007125 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007126 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007127 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007128 Features["transactional-execution"] = true;
7129 Features["vector"] = true;
7130 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007131 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007132 }
7133
7134 bool handleTargetFeatures(std::vector<std::string> &Features,
7135 DiagnosticsEngine &Diags) override {
7136 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007137 for (const auto &Feature : Features) {
7138 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007139 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007140 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007141 HasVector = true;
7142 }
7143 // If we use the vector ABI, vector types are 64-bit aligned.
7144 if (HasVector) {
7145 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007146 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7147 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007148 }
7149 return true;
7150 }
7151
7152 bool hasFeature(StringRef Feature) const override {
7153 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007154 .Case("systemz", true)
7155 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007156 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007157 .Default(false);
7158 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007159
Bryan Chane3f1ed52016-04-28 13:56:43 +00007160 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7161 switch (CC) {
7162 case CC_C:
7163 case CC_Swift:
7164 return CCCR_OK;
7165 default:
7166 return CCCR_Warning;
7167 }
7168 }
7169
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007170 StringRef getABI() const override {
7171 if (HasVector)
7172 return "vector";
7173 return "";
7174 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007175
7176 bool useFloat128ManglingForLongDouble() const override {
7177 return true;
7178 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007179};
7180
7181const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7182#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007183 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007184#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007186#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007187};
7188
7189const char *const SystemZTargetInfo::GCCRegNames[] = {
7190 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7191 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7192 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7193 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7194};
7195
Craig Topperf054e3a2015-10-19 03:52:27 +00007196ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7197 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007198}
7199
7200bool SystemZTargetInfo::
7201validateAsmConstraint(const char *&Name,
7202 TargetInfo::ConstraintInfo &Info) const {
7203 switch (*Name) {
7204 default:
7205 return false;
7206
7207 case 'a': // Address register
7208 case 'd': // Data register (equivalent to 'r')
7209 case 'f': // Floating-point register
7210 Info.setAllowsRegister();
7211 return true;
7212
7213 case 'I': // Unsigned 8-bit constant
7214 case 'J': // Unsigned 12-bit constant
7215 case 'K': // Signed 16-bit constant
7216 case 'L': // Signed 20-bit displacement (on all targets we support)
7217 case 'M': // 0x7fffffff
7218 return true;
7219
7220 case 'Q': // Memory with base and unsigned 12-bit displacement
7221 case 'R': // Likewise, plus an index
7222 case 'S': // Memory with base and signed 20-bit displacement
7223 case 'T': // Likewise, plus an index
7224 Info.setAllowsMemory();
7225 return true;
7226 }
7227}
Ulrich Weigand47445072013-05-06 16:26:41 +00007228
Eric Christopherc48497a2015-09-18 21:26:24 +00007229class MSP430TargetInfo : public TargetInfo {
7230 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007231
Eric Christopherc48497a2015-09-18 21:26:24 +00007232public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007233 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7234 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007235 TLSSupported = false;
7236 IntWidth = 16;
7237 IntAlign = 16;
7238 LongWidth = 32;
7239 LongLongWidth = 64;
7240 LongAlign = LongLongAlign = 16;
7241 PointerWidth = 16;
7242 PointerAlign = 16;
7243 SuitableAlign = 16;
7244 SizeType = UnsignedInt;
7245 IntMaxType = SignedLongLong;
7246 IntPtrType = SignedInt;
7247 PtrDiffType = SignedInt;
7248 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007249 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007250 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007251 void getTargetDefines(const LangOptions &Opts,
7252 MacroBuilder &Builder) const override {
7253 Builder.defineMacro("MSP430");
7254 Builder.defineMacro("__MSP430__");
7255 // FIXME: defines for different 'flavours' of MCU
7256 }
Craig Topper6c03a542015-10-19 04:51:35 +00007257 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007258 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007259 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007260 }
7261 bool hasFeature(StringRef Feature) const override {
7262 return Feature == "msp430";
7263 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007264 ArrayRef<const char *> getGCCRegNames() const override;
7265 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007266 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007267 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007268 }
7269 bool validateAsmConstraint(const char *&Name,
7270 TargetInfo::ConstraintInfo &info) const override {
7271 // FIXME: implement
7272 switch (*Name) {
7273 case 'K': // the constant 1
7274 case 'L': // constant -1^20 .. 1^19
7275 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007276 return true;
7277 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007278 // No target constraints for now.
7279 return false;
7280 }
7281 const char *getClobbers() const override {
7282 // FIXME: Is this really right?
7283 return "";
7284 }
7285 BuiltinVaListKind getBuiltinVaListKind() const override {
7286 // FIXME: implement
7287 return TargetInfo::CharPtrBuiltinVaList;
7288 }
7289};
7290
7291const char *const MSP430TargetInfo::GCCRegNames[] = {
7292 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7293 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7294
Craig Topperf054e3a2015-10-19 03:52:27 +00007295ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7296 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007297}
7298
7299// LLVM and Clang cannot be used directly to output native binaries for
7300// target, but is used to compile C code to llvm bitcode with correct
7301// type and alignment information.
7302//
7303// TCE uses the llvm bitcode as input and uses it for generating customized
7304// target processor and program binary. TCE co-design environment is
7305// publicly available in http://tce.cs.tut.fi
7306
7307static const unsigned TCEOpenCLAddrSpaceMap[] = {
7308 3, // opencl_global
7309 4, // opencl_local
7310 5, // opencl_constant
7311 // FIXME: generic has to be added to the target
7312 0, // opencl_generic
7313 0, // cuda_device
7314 0, // cuda_constant
7315 0 // cuda_shared
7316};
7317
7318class TCETargetInfo : public TargetInfo {
7319public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007320 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7321 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007322 TLSSupported = false;
7323 IntWidth = 32;
7324 LongWidth = LongLongWidth = 32;
7325 PointerWidth = 32;
7326 IntAlign = 32;
7327 LongAlign = LongLongAlign = 32;
7328 PointerAlign = 32;
7329 SuitableAlign = 32;
7330 SizeType = UnsignedInt;
7331 IntMaxType = SignedLong;
7332 IntPtrType = SignedInt;
7333 PtrDiffType = SignedInt;
7334 FloatWidth = 32;
7335 FloatAlign = 32;
7336 DoubleWidth = 32;
7337 DoubleAlign = 32;
7338 LongDoubleWidth = 32;
7339 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007340 FloatFormat = &llvm::APFloat::IEEEsingle();
7341 DoubleFormat = &llvm::APFloat::IEEEsingle();
7342 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007343 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7344 "i16:16:32-i32:32:32-i64:32:32-"
7345 "f32:32:32-f64:32:32-v64:32:32-"
7346 "v128:32:32-v256:32:32-v512:32:32-"
7347 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007348 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7349 UseAddrSpaceMapMangling = true;
7350 }
7351
7352 void getTargetDefines(const LangOptions &Opts,
7353 MacroBuilder &Builder) const override {
7354 DefineStd(Builder, "tce", Opts);
7355 Builder.defineMacro("__TCE__");
7356 Builder.defineMacro("__TCE_V1__");
7357 }
7358 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7359
Craig Topper6c03a542015-10-19 04:51:35 +00007360 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007361 const char *getClobbers() const override { return ""; }
7362 BuiltinVaListKind getBuiltinVaListKind() const override {
7363 return TargetInfo::VoidPtrBuiltinVaList;
7364 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007365 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007366 bool validateAsmConstraint(const char *&Name,
7367 TargetInfo::ConstraintInfo &info) const override {
7368 return true;
7369 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007370 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7371 return None;
7372 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007373};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007374
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007375class TCELETargetInfo : public TCETargetInfo {
7376public:
7377 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7378 : TCETargetInfo(Triple, Opts) {
7379 BigEndian = false;
7380
7381 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7382 "i16:16:32-i32:32:32-i64:32:32-"
7383 "f32:32:32-f64:32:32-v64:32:32-"
7384 "v128:32:32-v256:32:32-v512:32:32-"
7385 "v1024:32:32-a0:0:32-n32");
7386
7387 }
7388
7389 virtual void getTargetDefines(const LangOptions &Opts,
7390 MacroBuilder &Builder) const {
7391 DefineStd(Builder, "tcele", Opts);
7392 Builder.defineMacro("__TCE__");
7393 Builder.defineMacro("__TCE_V1__");
7394 Builder.defineMacro("__TCELE__");
7395 Builder.defineMacro("__TCELE_V1__");
7396 }
7397
7398};
7399
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007400class BPFTargetInfo : public TargetInfo {
7401public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007402 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7403 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007404 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7405 SizeType = UnsignedLong;
7406 PtrDiffType = SignedLong;
7407 IntPtrType = SignedLong;
7408 IntMaxType = SignedLong;
7409 Int64Type = SignedLong;
7410 RegParmMax = 5;
7411 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007412 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007413 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007414 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007415 }
7416 MaxAtomicPromoteWidth = 64;
7417 MaxAtomicInlineWidth = 64;
7418 TLSSupported = false;
7419 }
7420 void getTargetDefines(const LangOptions &Opts,
7421 MacroBuilder &Builder) const override {
7422 DefineStd(Builder, "bpf", Opts);
7423 Builder.defineMacro("__BPF__");
7424 }
7425 bool hasFeature(StringRef Feature) const override {
7426 return Feature == "bpf";
7427 }
7428
Craig Topper6c03a542015-10-19 04:51:35 +00007429 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007430 const char *getClobbers() const override {
7431 return "";
7432 }
7433 BuiltinVaListKind getBuiltinVaListKind() const override {
7434 return TargetInfo::VoidPtrBuiltinVaList;
7435 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007436 ArrayRef<const char *> getGCCRegNames() const override {
7437 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007438 }
7439 bool validateAsmConstraint(const char *&Name,
7440 TargetInfo::ConstraintInfo &info) const override {
7441 return true;
7442 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007443 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7444 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007445 }
7446};
7447
Daniel Sanders4672af62016-05-27 11:51:02 +00007448class MipsTargetInfo : public TargetInfo {
7449 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007450 StringRef Layout;
7451
7452 if (ABI == "o32")
7453 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7454 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007455 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007456 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007457 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007458 else
7459 llvm_unreachable("Invalid ABI");
7460
7461 if (BigEndian)
7462 resetDataLayout(("E-" + Layout).str());
7463 else
7464 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007465 }
7466
Akira Hatanaka9064e362013-10-29 18:30:33 +00007467
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007468 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007469 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007470 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007471 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007472 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007473 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007474 bool IsNoABICalls;
7475 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007476 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007477 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007478 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007479 enum DspRevEnum {
7480 NoDSP, DSP1, DSP2
7481 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007482 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007483
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007484protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007485 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007486 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007487
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007488public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007489 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007490 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007491 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7492 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7493 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007494 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007495
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007496 setABI((getTriple().getArch() == llvm::Triple::mips ||
7497 getTriple().getArch() == llvm::Triple::mipsel)
7498 ? "o32"
7499 : "n64");
7500
7501 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007502
7503 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7504 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007505 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007506
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007507 bool isNaN2008Default() const {
7508 return CPU == "mips32r6" || CPU == "mips64r6";
7509 }
7510
7511 bool isFP64Default() const {
7512 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7513 }
7514
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007515 bool isNan2008() const override {
7516 return IsNan2008;
7517 }
7518
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007519 bool processorSupportsGPR64() const {
7520 return llvm::StringSwitch<bool>(CPU)
7521 .Case("mips3", true)
7522 .Case("mips4", true)
7523 .Case("mips5", true)
7524 .Case("mips64", true)
7525 .Case("mips64r2", true)
7526 .Case("mips64r3", true)
7527 .Case("mips64r5", true)
7528 .Case("mips64r6", true)
7529 .Case("octeon", true)
7530 .Default(false);
7531 return false;
7532 }
7533
Alp Toker4925ba72014-06-07 23:30:42 +00007534 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007535 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007536 if (Name == "o32") {
7537 setO32ABITypes();
7538 ABI = Name;
7539 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007540 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007541
7542 if (Name == "n32") {
7543 setN32ABITypes();
7544 ABI = Name;
7545 return true;
7546 }
7547 if (Name == "n64") {
7548 setN64ABITypes();
7549 ABI = Name;
7550 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007551 }
7552 return false;
7553 }
7554
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007555 void setO32ABITypes() {
7556 Int64Type = SignedLongLong;
7557 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007558 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007559 LongDoubleWidth = LongDoubleAlign = 64;
7560 LongWidth = LongAlign = 32;
7561 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7562 PointerWidth = PointerAlign = 32;
7563 PtrDiffType = SignedInt;
7564 SizeType = UnsignedInt;
7565 SuitableAlign = 64;
7566 }
7567
7568 void setN32N64ABITypes() {
7569 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007570 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007571 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7572 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007573 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007574 }
7575 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7576 SuitableAlign = 128;
7577 }
7578
Daniel Sanders4672af62016-05-27 11:51:02 +00007579 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007580 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007581 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7582 Int64Type = SignedLongLong;
7583 } else {
7584 Int64Type = SignedLong;
7585 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007586 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007587 LongWidth = LongAlign = 64;
7588 PointerWidth = PointerAlign = 64;
7589 PtrDiffType = SignedLong;
7590 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007591 }
7592
7593 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007594 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007595 Int64Type = SignedLongLong;
7596 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007597 LongWidth = LongAlign = 32;
7598 PointerWidth = PointerAlign = 32;
7599 PtrDiffType = SignedInt;
7600 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007601 }
7602
Craig Topper3164f332014-03-11 03:39:26 +00007603 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007604 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007605 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007606 .Case("mips1", true)
7607 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007608 .Case("mips3", true)
7609 .Case("mips4", true)
7610 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007611 .Case("mips32", true)
7612 .Case("mips32r2", true)
7613 .Case("mips32r3", true)
7614 .Case("mips32r5", true)
7615 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007616 .Case("mips64", true)
7617 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007618 .Case("mips64r3", true)
7619 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007620 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007621 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007622 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007623 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007624 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007625 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007626 bool
7627 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7628 StringRef CPU,
7629 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007630 if (CPU.empty())
7631 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007632 if (CPU == "octeon")
7633 Features["mips64r2"] = Features["cnmips"] = true;
7634 else
7635 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007636 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007637 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007638
Craig Topper3164f332014-03-11 03:39:26 +00007639 void getTargetDefines(const LangOptions &Opts,
7640 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007641 if (BigEndian) {
7642 DefineStd(Builder, "MIPSEB", Opts);
7643 Builder.defineMacro("_MIPSEB");
7644 } else {
7645 DefineStd(Builder, "MIPSEL", Opts);
7646 Builder.defineMacro("_MIPSEL");
7647 }
7648
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007649 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007650 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007651 if (Opts.GNUMode)
7652 Builder.defineMacro("mips");
7653
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007654 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007655 Builder.defineMacro("__mips", "32");
7656 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7657 } else {
7658 Builder.defineMacro("__mips", "64");
7659 Builder.defineMacro("__mips64");
7660 Builder.defineMacro("__mips64__");
7661 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7662 }
7663
7664 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7665 .Cases("mips32", "mips64", "1")
7666 .Cases("mips32r2", "mips64r2", "2")
7667 .Cases("mips32r3", "mips64r3", "3")
7668 .Cases("mips32r5", "mips64r5", "5")
7669 .Cases("mips32r6", "mips64r6", "6")
7670 .Default("");
7671 if (!ISARev.empty())
7672 Builder.defineMacro("__mips_isa_rev", ISARev);
7673
7674 if (ABI == "o32") {
7675 Builder.defineMacro("__mips_o32");
7676 Builder.defineMacro("_ABIO32", "1");
7677 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007678 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007679 Builder.defineMacro("__mips_n32");
7680 Builder.defineMacro("_ABIN32", "2");
7681 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7682 } else if (ABI == "n64") {
7683 Builder.defineMacro("__mips_n64");
7684 Builder.defineMacro("_ABI64", "3");
7685 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7686 } else
7687 llvm_unreachable("Invalid ABI.");
7688
Simon Dardisdf827a72017-02-21 16:01:00 +00007689 if (!IsNoABICalls) {
7690 Builder.defineMacro("__mips_abicalls");
7691 if (CanUseBSDABICalls)
7692 Builder.defineMacro("__ABICALLS__");
7693 }
7694
Simon Atanasyan683535b2012-08-29 19:14:58 +00007695 Builder.defineMacro("__REGISTER_PREFIX__", "");
7696
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007697 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007698 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007699 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007700 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007701 case SoftFloat:
7702 Builder.defineMacro("__mips_soft_float", Twine(1));
7703 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007704 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007705
Simon Atanasyan16071912013-04-14 14:07:30 +00007706 if (IsSingleFloat)
7707 Builder.defineMacro("__mips_single_float", Twine(1));
7708
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007709 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7710 Builder.defineMacro("_MIPS_FPSET",
7711 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7712
Simon Atanasyan72244b62012-07-05 16:06:06 +00007713 if (IsMips16)
7714 Builder.defineMacro("__mips16", Twine(1));
7715
Simon Atanasyan60777612013-04-14 14:07:51 +00007716 if (IsMicromips)
7717 Builder.defineMacro("__mips_micromips", Twine(1));
7718
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007719 if (IsNan2008)
7720 Builder.defineMacro("__mips_nan2008", Twine(1));
7721
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007722 switch (DspRev) {
7723 default:
7724 break;
7725 case DSP1:
7726 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7727 Builder.defineMacro("__mips_dsp", Twine(1));
7728 break;
7729 case DSP2:
7730 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7731 Builder.defineMacro("__mips_dspr2", Twine(1));
7732 Builder.defineMacro("__mips_dsp", Twine(1));
7733 break;
7734 }
7735
Jack Carter44ff1e52013-08-12 17:20:29 +00007736 if (HasMSA)
7737 Builder.defineMacro("__mips_msa", Twine(1));
7738
Simon Atanasyan26f19672012-04-05 19:28:31 +00007739 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7740 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7741 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007742
7743 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7744 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007745
7746 // These shouldn't be defined for MIPS-I but there's no need to check
7747 // for that since MIPS-I isn't supported.
7748 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7749 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7750 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007751
7752 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7753 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7754 // the instructions exist but using them violates the ABI since they
7755 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7756 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007757 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007758 }
7759
Craig Topper6c03a542015-10-19 04:51:35 +00007760 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7761 return llvm::makeArrayRef(BuiltinInfo,
7762 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007763 }
Craig Topper3164f332014-03-11 03:39:26 +00007764 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007765 return llvm::StringSwitch<bool>(Feature)
7766 .Case("mips", true)
7767 .Case("fp64", HasFP64)
7768 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007769 }
Craig Topper3164f332014-03-11 03:39:26 +00007770 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007771 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007772 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007773 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007774 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007775 // CPU register names
7776 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007777 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7778 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7779 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007780 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7781 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007782 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7783 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7784 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7785 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007786 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007787 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007788 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7789 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007790 // MSA register names
7791 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7792 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7793 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7794 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7795 // MSA control register names
7796 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7797 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007798 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007799 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007800 }
Craig Topper3164f332014-03-11 03:39:26 +00007801 bool validateAsmConstraint(const char *&Name,
7802 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007803 switch (*Name) {
7804 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007805 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007806 case 'r': // CPU registers.
7807 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007808 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007809 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007810 case 'c': // $25 for indirect jumps
7811 case 'l': // lo register
7812 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007813 Info.setAllowsRegister();
7814 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007815 case 'I': // Signed 16-bit constant
7816 case 'J': // Integer 0
7817 case 'K': // Unsigned 16-bit constant
7818 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7819 case 'M': // Constants not loadable via lui, addiu, or ori
7820 case 'N': // Constant -1 to -65535
7821 case 'O': // A signed 15-bit constant
7822 case 'P': // A constant between 1 go 65535
7823 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007824 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007825 Info.setAllowsMemory();
7826 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007827 case 'Z':
7828 if (Name[1] == 'C') { // An address usable by ll, and sc.
7829 Info.setAllowsMemory();
7830 Name++; // Skip over 'Z'.
7831 return true;
7832 }
7833 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007834 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007835 }
7836
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007837 std::string convertConstraint(const char *&Constraint) const override {
7838 std::string R;
7839 switch (*Constraint) {
7840 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7841 if (Constraint[1] == 'C') {
7842 R = std::string("^") + std::string(Constraint, 2);
7843 Constraint++;
7844 return R;
7845 }
7846 break;
7847 }
7848 return TargetInfo::convertConstraint(Constraint);
7849 }
7850
Craig Topper3164f332014-03-11 03:39:26 +00007851 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007852 // In GCC, $1 is not widely used in generated code (it's used only in a few
7853 // specific situations), so there is no real need for users to add it to
7854 // the clobbers list if they want to use it in their inline assembly code.
7855 //
7856 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7857 // code generation, so using it in inline assembly without adding it to the
7858 // clobbers list can cause conflicts between the inline assembly code and
7859 // the surrounding generated code.
7860 //
7861 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7862 // operands, which will conflict with the ".set at" assembler option (which
7863 // we use only for inline assembly, in order to maintain compatibility with
7864 // GCC) and will also conflict with the user's usage of $1.
7865 //
7866 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7867 // register for generated code is to automatically clobber $1 for all inline
7868 // assembly code.
7869 //
7870 // FIXME: We should automatically clobber $1 only for inline assembly code
7871 // which actually uses it. This would allow LLVM to use $1 for inline
7872 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007873 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007874 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007875
Craig Topper3164f332014-03-11 03:39:26 +00007876 bool handleTargetFeatures(std::vector<std::string> &Features,
7877 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007878 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007879 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007880 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007881 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007882 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007883 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007884 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007885
Eric Christopher610fe112015-08-26 08:21:55 +00007886 for (const auto &Feature : Features) {
7887 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007888 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007889 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007890 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007891 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007892 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007893 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007894 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007895 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007896 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007897 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007898 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007899 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007900 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007901 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007902 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007903 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007904 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007905 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007906 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007907 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007908 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00007909 else if (Feature == "+noabicalls")
7910 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007911 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007912
James Y Knightb214cbc2016-03-04 19:00:41 +00007913 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007914
Rafael Espindolaeb265472013-08-21 21:59:03 +00007915 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007916 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007917
Craig Topper3164f332014-03-11 03:39:26 +00007918 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007919 if (RegNo == 0) return 4;
7920 if (RegNo == 1) return 5;
7921 return -1;
7922 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007923
7924 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007925
7926 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7927 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7928 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7929 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7930 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7931 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7932 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7933 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7934 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7935 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7936 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7937 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7938 {{"ra"}, "$31"}};
7939 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7940 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7941 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7942 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7943 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7944 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7945 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7946 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7947 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7948 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7949 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7950 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007951 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007952 return llvm::makeArrayRef(O32RegAliases);
7953 return llvm::makeArrayRef(NewABIRegAliases);
7954 }
7955
7956 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007957 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007958 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007959
7960 bool validateTarget(DiagnosticsEngine &Diags) const override {
7961 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7962 // this yet. It's better to fail here than on the backend assertion.
7963 if (processorSupportsGPR64() && ABI == "o32") {
7964 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7965 return false;
7966 }
7967
7968 // 64-bit ABI's require 64-bit CPU's.
7969 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7970 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7971 return false;
7972 }
7973
7974 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7975 // can't handle this yet. It's better to fail here than on the
7976 // backend assertion.
7977 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7978 getTriple().getArch() == llvm::Triple::mips64el) &&
7979 ABI == "o32") {
7980 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7981 << ABI << getTriple().str();
7982 return false;
7983 }
7984
7985 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7986 // can't handle this yet. It's better to fail here than on the
7987 // backend assertion.
7988 if ((getTriple().getArch() == llvm::Triple::mips ||
7989 getTriple().getArch() == llvm::Triple::mipsel) &&
7990 (ABI == "n32" || ABI == "n64")) {
7991 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7992 << ABI << getTriple().str();
7993 return false;
7994 }
7995
7996 return true;
7997 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007998};
7999
Daniel Sanders4672af62016-05-27 11:51:02 +00008000const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008001#define BUILTIN(ID, TYPE, ATTRS) \
8002 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8003#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8004 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008005#include "clang/Basic/BuiltinsMips.def"
8006};
8007
Ivan Krasindd7403e2011-08-24 20:22:22 +00008008class PNaClTargetInfo : public TargetInfo {
8009public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008010 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8011 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008012 this->LongAlign = 32;
8013 this->LongWidth = 32;
8014 this->PointerAlign = 32;
8015 this->PointerWidth = 32;
8016 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008017 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008018 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008019 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008020 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008021 this->SizeType = TargetInfo::UnsignedInt;
8022 this->PtrDiffType = TargetInfo::SignedInt;
8023 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008024 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008025 }
8026
Craig Toppere6f17d02014-03-11 04:07:52 +00008027 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008028 Builder.defineMacro("__le32__");
8029 Builder.defineMacro("__pnacl__");
8030 }
Craig Topper3164f332014-03-11 03:39:26 +00008031 void getTargetDefines(const LangOptions &Opts,
8032 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008033 getArchDefines(Opts, Builder);
8034 }
Craig Topper3164f332014-03-11 03:39:26 +00008035 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008036 return Feature == "pnacl";
8037 }
Craig Topper6c03a542015-10-19 04:51:35 +00008038 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008039 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008040 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008041 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008042 ArrayRef<const char *> getGCCRegNames() const override;
8043 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008044 bool validateAsmConstraint(const char *&Name,
8045 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008046 return false;
8047 }
8048
Craig Topper3164f332014-03-11 03:39:26 +00008049 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008050 return "";
8051 }
8052};
8053
Craig Topperf054e3a2015-10-19 03:52:27 +00008054ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8055 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008056}
8057
Craig Topperf054e3a2015-10-19 03:52:27 +00008058ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8059 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008060}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008061
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008062// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008063class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008064public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008065 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8066 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008067
8068 BuiltinVaListKind getBuiltinVaListKind() const override {
8069 return TargetInfo::PNaClABIBuiltinVaList;
8070 }
8071};
8072
JF Bastien643817d2014-09-12 17:52:47 +00008073class Le64TargetInfo : public TargetInfo {
8074 static const Builtin::Info BuiltinInfo[];
8075
8076public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8078 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008079 NoAsmVariants = true;
8080 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8081 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008082 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008083 }
8084
8085 void getTargetDefines(const LangOptions &Opts,
8086 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008087 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008088 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8089 Builder.defineMacro("__ELF__");
8090 }
Craig Topper6c03a542015-10-19 04:51:35 +00008091 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8092 return llvm::makeArrayRef(BuiltinInfo,
8093 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008094 }
8095 BuiltinVaListKind getBuiltinVaListKind() const override {
8096 return TargetInfo::PNaClABIBuiltinVaList;
8097 }
8098 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008099 ArrayRef<const char *> getGCCRegNames() const override {
8100 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008101 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008102 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8103 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008104 }
8105 bool validateAsmConstraint(const char *&Name,
8106 TargetInfo::ConstraintInfo &Info) const override {
8107 return false;
8108 }
8109
8110 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008111};
Dan Gohmanc2853072015-09-03 22:51:53 +00008112
8113class WebAssemblyTargetInfo : public TargetInfo {
8114 static const Builtin::Info BuiltinInfo[];
8115
8116 enum SIMDEnum {
8117 NoSIMD,
8118 SIMD128,
8119 } SIMDLevel;
8120
8121public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008122 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008123 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008124 NoAsmVariants = true;
8125 SuitableAlign = 128;
8126 LargeArrayMinWidth = 128;
8127 LargeArrayAlign = 128;
8128 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008129 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008130 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008131 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008132 SizeType = UnsignedInt;
8133 PtrDiffType = SignedInt;
8134 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008135 }
8136
8137protected:
8138 void getTargetDefines(const LangOptions &Opts,
8139 MacroBuilder &Builder) const override {
8140 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8141 if (SIMDLevel >= SIMD128)
8142 Builder.defineMacro("__wasm_simd128__");
8143 }
8144
8145private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008146 bool
8147 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8148 StringRef CPU,
8149 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008150 if (CPU == "bleeding-edge")
8151 Features["simd128"] = true;
8152 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8153 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008154 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008155 return llvm::StringSwitch<bool>(Feature)
8156 .Case("simd128", SIMDLevel >= SIMD128)
8157 .Default(false);
8158 }
8159 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008160 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008161 for (const auto &Feature : Features) {
8162 if (Feature == "+simd128") {
8163 SIMDLevel = std::max(SIMDLevel, SIMD128);
8164 continue;
8165 }
8166 if (Feature == "-simd128") {
8167 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8168 continue;
8169 }
8170
8171 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8172 << "-target-feature";
8173 return false;
8174 }
8175 return true;
8176 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008177 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008178 return llvm::StringSwitch<bool>(Name)
8179 .Case("mvp", true)
8180 .Case("bleeding-edge", true)
8181 .Case("generic", true)
8182 .Default(false);
8183 }
Craig Topper6c03a542015-10-19 04:51:35 +00008184 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8185 return llvm::makeArrayRef(BuiltinInfo,
8186 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008187 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008188 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008189 return VoidPtrBuiltinVaList;
8190 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008191 ArrayRef<const char *> getGCCRegNames() const final {
8192 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008193 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008194 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8195 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008196 }
8197 bool
8198 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008199 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008200 return false;
8201 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008202 const char *getClobbers() const final { return ""; }
8203 bool isCLZForZeroUndef() const final { return false; }
8204 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008205 IntType getIntTypeByWidth(unsigned BitWidth,
8206 bool IsSigned) const final {
8207 // WebAssembly prefers long long for explicitly 64-bit integers.
8208 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8209 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8210 }
8211 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8212 bool IsSigned) const final {
8213 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8214 return BitWidth == 64
8215 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8216 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8217 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008218};
8219
8220const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8221#define BUILTIN(ID, TYPE, ATTRS) \
8222 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8223#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8224 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8225#include "clang/Basic/BuiltinsWebAssembly.def"
8226};
8227
8228class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8229public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8231 const TargetOptions &Opts)
8232 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008233 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008234 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008235 }
8236
8237protected:
8238 void getTargetDefines(const LangOptions &Opts,
8239 MacroBuilder &Builder) const override {
8240 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8241 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8242 }
8243};
8244
8245class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8246public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8248 const TargetOptions &Opts)
8249 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008250 LongAlign = LongWidth = 64;
8251 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008252 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008253 SizeType = UnsignedLong;
8254 PtrDiffType = SignedLong;
8255 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008256 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008257 }
8258
8259protected:
8260 void getTargetDefines(const LangOptions &Opts,
8261 MacroBuilder &Builder) const override {
8262 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8263 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8264 }
8265};
8266
JF Bastien643817d2014-09-12 17:52:47 +00008267const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8268#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008269 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008270#include "clang/Basic/BuiltinsLe64.def"
8271};
8272
Eric Christopherc48497a2015-09-18 21:26:24 +00008273static const unsigned SPIRAddrSpaceMap[] = {
8274 1, // opencl_global
8275 3, // opencl_local
8276 2, // opencl_constant
8277 4, // opencl_generic
8278 0, // cuda_device
8279 0, // cuda_constant
8280 0 // cuda_shared
8281};
8282class SPIRTargetInfo : public TargetInfo {
8283public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8285 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008286 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8287 "SPIR target must use unknown OS");
8288 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8289 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008290 TLSSupported = false;
8291 LongWidth = LongAlign = 64;
8292 AddrSpaceMap = &SPIRAddrSpaceMap;
8293 UseAddrSpaceMapMangling = true;
8294 // Define available target features
8295 // These must be defined in sorted order!
8296 NoAsmVariants = true;
8297 }
8298 void getTargetDefines(const LangOptions &Opts,
8299 MacroBuilder &Builder) const override {
8300 DefineStd(Builder, "SPIR", Opts);
8301 }
8302 bool hasFeature(StringRef Feature) const override {
8303 return Feature == "spir";
8304 }
Craig Topper3164f332014-03-11 03:39:26 +00008305
Craig Topper6c03a542015-10-19 04:51:35 +00008306 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008307 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008308 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008309 bool validateAsmConstraint(const char *&Name,
8310 TargetInfo::ConstraintInfo &info) const override {
8311 return true;
8312 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008313 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8314 return None;
8315 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008316 BuiltinVaListKind getBuiltinVaListKind() const override {
8317 return TargetInfo::VoidPtrBuiltinVaList;
8318 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008319
Eric Christopherc48497a2015-09-18 21:26:24 +00008320 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008321 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8322 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008323 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008324
Eric Christopherc48497a2015-09-18 21:26:24 +00008325 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8326 return CC_SpirFunction;
8327 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008328
8329 void setSupportedOpenCLOpts() override {
8330 // Assume all OpenCL extensions and optional core features are supported
8331 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008332 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008333 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008334};
Guy Benyeib798fc92012-12-11 21:38:14 +00008335
Eric Christopherc48497a2015-09-18 21:26:24 +00008336class SPIR32TargetInfo : public SPIRTargetInfo {
8337public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008338 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8339 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008340 PointerWidth = PointerAlign = 32;
8341 SizeType = TargetInfo::UnsignedInt;
8342 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008343 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8344 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008345 }
8346 void getTargetDefines(const LangOptions &Opts,
8347 MacroBuilder &Builder) const override {
8348 DefineStd(Builder, "SPIR32", Opts);
8349 }
8350};
Guy Benyeib798fc92012-12-11 21:38:14 +00008351
Eric Christopherc48497a2015-09-18 21:26:24 +00008352class SPIR64TargetInfo : public SPIRTargetInfo {
8353public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008354 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8355 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008356 PointerWidth = PointerAlign = 64;
8357 SizeType = TargetInfo::UnsignedLong;
8358 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008359 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8360 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008361 }
8362 void getTargetDefines(const LangOptions &Opts,
8363 MacroBuilder &Builder) const override {
8364 DefineStd(Builder, "SPIR64", Opts);
8365 }
8366};
Guy Benyeib798fc92012-12-11 21:38:14 +00008367
Robert Lytton0e076492013-08-13 09:43:10 +00008368class XCoreTargetInfo : public TargetInfo {
8369 static const Builtin::Info BuiltinInfo[];
8370public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8372 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008373 NoAsmVariants = true;
8374 LongLongAlign = 32;
8375 SuitableAlign = 32;
8376 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008377 SizeType = UnsignedInt;
8378 PtrDiffType = SignedInt;
8379 IntPtrType = SignedInt;
8380 WCharType = UnsignedChar;
8381 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008382 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008383 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8384 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008385 }
Craig Topper3164f332014-03-11 03:39:26 +00008386 void getTargetDefines(const LangOptions &Opts,
8387 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008388 Builder.defineMacro("__XS1B__");
8389 }
Craig Topper6c03a542015-10-19 04:51:35 +00008390 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8391 return llvm::makeArrayRef(BuiltinInfo,
8392 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008393 }
Craig Topper3164f332014-03-11 03:39:26 +00008394 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008395 return TargetInfo::VoidPtrBuiltinVaList;
8396 }
Craig Topper3164f332014-03-11 03:39:26 +00008397 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008398 return "";
8399 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008400 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008401 static const char * const GCCRegNames[] = {
8402 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8403 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8404 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008405 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008406 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008407 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8408 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008409 }
Craig Topper3164f332014-03-11 03:39:26 +00008410 bool validateAsmConstraint(const char *&Name,
8411 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008412 return false;
8413 }
Craig Topper3164f332014-03-11 03:39:26 +00008414 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008415 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8416 return (RegNo < 2)? RegNo : -1;
8417 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008418 bool allowsLargerPreferedTypeAlignment() const override {
8419 return false;
8420 }
Robert Lytton0e076492013-08-13 09:43:10 +00008421};
8422
8423const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008424#define BUILTIN(ID, TYPE, ATTRS) \
8425 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8426#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8427 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008428#include "clang/Basic/BuiltinsXCore.def"
8429};
Robert Lytton0e076492013-08-13 09:43:10 +00008430
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008431// x86_32 Android target
8432class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8435 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008436 SuitableAlign = 32;
8437 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008438 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008439 }
8440};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008441
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008442// x86_64 Android target
8443class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8444public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8446 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008447 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008448 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008449
8450 bool useFloat128ManglingForLongDouble() const override {
8451 return true;
8452 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008453};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008454
8455// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8456class RenderScript32TargetInfo : public ARMleTargetInfo {
8457public:
8458 RenderScript32TargetInfo(const llvm::Triple &Triple,
8459 const TargetOptions &Opts)
8460 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8461 Triple.getOSName(),
8462 Triple.getEnvironmentName()),
8463 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008464 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008465 LongWidth = LongAlign = 64;
8466 }
8467 void getTargetDefines(const LangOptions &Opts,
8468 MacroBuilder &Builder) const override {
8469 Builder.defineMacro("__RENDERSCRIPT__");
8470 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8471 }
8472};
8473
8474// 64-bit RenderScript is aarch64
8475class RenderScript64TargetInfo : public AArch64leTargetInfo {
8476public:
8477 RenderScript64TargetInfo(const llvm::Triple &Triple,
8478 const TargetOptions &Opts)
8479 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8480 Triple.getOSName(),
8481 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008482 Opts) {
8483 IsRenderScriptTarget = true;
8484 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008485
8486 void getTargetDefines(const LangOptions &Opts,
8487 MacroBuilder &Builder) const override {
8488 Builder.defineMacro("__RENDERSCRIPT__");
8489 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8490 }
8491};
8492
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008493/// Information about a specific microcontroller.
8494struct MCUInfo {
8495 const char *Name;
8496 const char *DefineName;
8497};
8498
8499// This list should be kept up-to-date with AVRDevices.td in LLVM.
8500static ArrayRef<MCUInfo> AVRMcus = {
8501 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008502 { "attiny11", "__AVR_ATtiny11__" },
8503 { "attiny12", "__AVR_ATtiny12__" },
8504 { "attiny15", "__AVR_ATtiny15__" },
8505 { "attiny28", "__AVR_ATtiny28__" },
8506 { "at90s2313", "__AVR_AT90S2313__" },
8507 { "at90s2323", "__AVR_AT90S2323__" },
8508 { "at90s2333", "__AVR_AT90S2333__" },
8509 { "at90s2343", "__AVR_AT90S2343__" },
8510 { "attiny22", "__AVR_ATtiny22__" },
8511 { "attiny26", "__AVR_ATtiny26__" },
8512 { "at86rf401", "__AVR_AT86RF401__" },
8513 { "at90s4414", "__AVR_AT90S4414__" },
8514 { "at90s4433", "__AVR_AT90S4433__" },
8515 { "at90s4434", "__AVR_AT90S4434__" },
8516 { "at90s8515", "__AVR_AT90S8515__" },
8517 { "at90c8534", "__AVR_AT90c8534__" },
8518 { "at90s8535", "__AVR_AT90S8535__" },
8519 { "ata5272", "__AVR_ATA5272__" },
8520 { "attiny13", "__AVR_ATtiny13__" },
8521 { "attiny13a", "__AVR_ATtiny13A__" },
8522 { "attiny2313", "__AVR_ATtiny2313__" },
8523 { "attiny2313a", "__AVR_ATtiny2313A__" },
8524 { "attiny24", "__AVR_ATtiny24__" },
8525 { "attiny24a", "__AVR_ATtiny24A__" },
8526 { "attiny4313", "__AVR_ATtiny4313__" },
8527 { "attiny44", "__AVR_ATtiny44__" },
8528 { "attiny44a", "__AVR_ATtiny44A__" },
8529 { "attiny84", "__AVR_ATtiny84__" },
8530 { "attiny84a", "__AVR_ATtiny84A__" },
8531 { "attiny25", "__AVR_ATtiny25__" },
8532 { "attiny45", "__AVR_ATtiny45__" },
8533 { "attiny85", "__AVR_ATtiny85__" },
8534 { "attiny261", "__AVR_ATtiny261__" },
8535 { "attiny261a", "__AVR_ATtiny261A__" },
8536 { "attiny461", "__AVR_ATtiny461__" },
8537 { "attiny461a", "__AVR_ATtiny461A__" },
8538 { "attiny861", "__AVR_ATtiny861__" },
8539 { "attiny861a", "__AVR_ATtiny861A__" },
8540 { "attiny87", "__AVR_ATtiny87__" },
8541 { "attiny43u", "__AVR_ATtiny43U__" },
8542 { "attiny48", "__AVR_ATtiny48__" },
8543 { "attiny88", "__AVR_ATtiny88__" },
8544 { "attiny828", "__AVR_ATtiny828__" },
8545 { "at43usb355", "__AVR_AT43USB355__" },
8546 { "at76c711", "__AVR_AT76C711__" },
8547 { "atmega103", "__AVR_ATmega103__" },
8548 { "at43usb320", "__AVR_AT43USB320__" },
8549 { "attiny167", "__AVR_ATtiny167__" },
8550 { "at90usb82", "__AVR_AT90USB82__" },
8551 { "at90usb162", "__AVR_AT90USB162__" },
8552 { "ata5505", "__AVR_ATA5505__" },
8553 { "atmega8u2", "__AVR_ATmega8U2__" },
8554 { "atmega16u2", "__AVR_ATmega16U2__" },
8555 { "atmega32u2", "__AVR_ATmega32U2__" },
8556 { "attiny1634", "__AVR_ATtiny1634__" },
8557 { "atmega8", "__AVR_ATmega8__" },
8558 { "ata6289", "__AVR_ATA6289__" },
8559 { "atmega8a", "__AVR_ATmega8A__" },
8560 { "ata6285", "__AVR_ATA6285__" },
8561 { "ata6286", "__AVR_ATA6286__" },
8562 { "atmega48", "__AVR_ATmega48__" },
8563 { "atmega48a", "__AVR_ATmega48A__" },
8564 { "atmega48pa", "__AVR_ATmega48PA__" },
8565 { "atmega48p", "__AVR_ATmega48P__" },
8566 { "atmega88", "__AVR_ATmega88__" },
8567 { "atmega88a", "__AVR_ATmega88A__" },
8568 { "atmega88p", "__AVR_ATmega88P__" },
8569 { "atmega88pa", "__AVR_ATmega88PA__" },
8570 { "atmega8515", "__AVR_ATmega8515__" },
8571 { "atmega8535", "__AVR_ATmega8535__" },
8572 { "atmega8hva", "__AVR_ATmega8HVA__" },
8573 { "at90pwm1", "__AVR_AT90PWM1__" },
8574 { "at90pwm2", "__AVR_AT90PWM2__" },
8575 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8576 { "at90pwm3", "__AVR_AT90PWM3__" },
8577 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8578 { "at90pwm81", "__AVR_AT90PWM81__" },
8579 { "ata5790", "__AVR_ATA5790__" },
8580 { "ata5795", "__AVR_ATA5795__" },
8581 { "atmega16", "__AVR_ATmega16__" },
8582 { "atmega16a", "__AVR_ATmega16A__" },
8583 { "atmega161", "__AVR_ATmega161__" },
8584 { "atmega162", "__AVR_ATmega162__" },
8585 { "atmega163", "__AVR_ATmega163__" },
8586 { "atmega164a", "__AVR_ATmega164A__" },
8587 { "atmega164p", "__AVR_ATmega164P__" },
8588 { "atmega164pa", "__AVR_ATmega164PA__" },
8589 { "atmega165", "__AVR_ATmega165__" },
8590 { "atmega165a", "__AVR_ATmega165A__" },
8591 { "atmega165p", "__AVR_ATmega165P__" },
8592 { "atmega165pa", "__AVR_ATmega165PA__" },
8593 { "atmega168", "__AVR_ATmega168__" },
8594 { "atmega168a", "__AVR_ATmega168A__" },
8595 { "atmega168p", "__AVR_ATmega168P__" },
8596 { "atmega168pa", "__AVR_ATmega168PA__" },
8597 { "atmega169", "__AVR_ATmega169__" },
8598 { "atmega169a", "__AVR_ATmega169A__" },
8599 { "atmega169p", "__AVR_ATmega169P__" },
8600 { "atmega169pa", "__AVR_ATmega169PA__" },
8601 { "atmega32", "__AVR_ATmega32__" },
8602 { "atmega32a", "__AVR_ATmega32A__" },
8603 { "atmega323", "__AVR_ATmega323__" },
8604 { "atmega324a", "__AVR_ATmega324A__" },
8605 { "atmega324p", "__AVR_ATmega324P__" },
8606 { "atmega324pa", "__AVR_ATmega324PA__" },
8607 { "atmega325", "__AVR_ATmega325__" },
8608 { "atmega325a", "__AVR_ATmega325A__" },
8609 { "atmega325p", "__AVR_ATmega325P__" },
8610 { "atmega325pa", "__AVR_ATmega325PA__" },
8611 { "atmega3250", "__AVR_ATmega3250__" },
8612 { "atmega3250a", "__AVR_ATmega3250A__" },
8613 { "atmega3250p", "__AVR_ATmega3250P__" },
8614 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8615 { "atmega328", "__AVR_ATmega328__" },
8616 { "atmega328p", "__AVR_ATmega328P__" },
8617 { "atmega329", "__AVR_ATmega329__" },
8618 { "atmega329a", "__AVR_ATmega329A__" },
8619 { "atmega329p", "__AVR_ATmega329P__" },
8620 { "atmega329pa", "__AVR_ATmega329PA__" },
8621 { "atmega3290", "__AVR_ATmega3290__" },
8622 { "atmega3290a", "__AVR_ATmega3290A__" },
8623 { "atmega3290p", "__AVR_ATmega3290P__" },
8624 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8625 { "atmega406", "__AVR_ATmega406__" },
8626 { "atmega64", "__AVR_ATmega64__" },
8627 { "atmega64a", "__AVR_ATmega64A__" },
8628 { "atmega640", "__AVR_ATmega640__" },
8629 { "atmega644", "__AVR_ATmega644__" },
8630 { "atmega644a", "__AVR_ATmega644A__" },
8631 { "atmega644p", "__AVR_ATmega644P__" },
8632 { "atmega644pa", "__AVR_ATmega644PA__" },
8633 { "atmega645", "__AVR_ATmega645__" },
8634 { "atmega645a", "__AVR_ATmega645A__" },
8635 { "atmega645p", "__AVR_ATmega645P__" },
8636 { "atmega649", "__AVR_ATmega649__" },
8637 { "atmega649a", "__AVR_ATmega649A__" },
8638 { "atmega649p", "__AVR_ATmega649P__" },
8639 { "atmega6450", "__AVR_ATmega6450__" },
8640 { "atmega6450a", "__AVR_ATmega6450A__" },
8641 { "atmega6450p", "__AVR_ATmega6450P__" },
8642 { "atmega6490", "__AVR_ATmega6490__" },
8643 { "atmega6490a", "__AVR_ATmega6490A__" },
8644 { "atmega6490p", "__AVR_ATmega6490P__" },
8645 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8646 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8647 { "atmega16hva", "__AVR_ATmega16HVA__" },
8648 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8649 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8650 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8651 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8652 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8653 { "atmega64hve", "__AVR_ATmega64HVE__" },
8654 { "at90can32", "__AVR_AT90CAN32__" },
8655 { "at90can64", "__AVR_AT90CAN64__" },
8656 { "at90pwm161", "__AVR_AT90PWM161__" },
8657 { "at90pwm216", "__AVR_AT90PWM216__" },
8658 { "at90pwm316", "__AVR_AT90PWM316__" },
8659 { "atmega32c1", "__AVR_ATmega32C1__" },
8660 { "atmega64c1", "__AVR_ATmega64C1__" },
8661 { "atmega16m1", "__AVR_ATmega16M1__" },
8662 { "atmega32m1", "__AVR_ATmega32M1__" },
8663 { "atmega64m1", "__AVR_ATmega64M1__" },
8664 { "atmega16u4", "__AVR_ATmega16U4__" },
8665 { "atmega32u4", "__AVR_ATmega32U4__" },
8666 { "atmega32u6", "__AVR_ATmega32U6__" },
8667 { "at90usb646", "__AVR_AT90USB646__" },
8668 { "at90usb647", "__AVR_AT90USB647__" },
8669 { "at90scr100", "__AVR_AT90SCR100__" },
8670 { "at94k", "__AVR_AT94K__" },
8671 { "m3000", "__AVR_AT000__" },
8672 { "atmega128", "__AVR_ATmega128__" },
8673 { "atmega128a", "__AVR_ATmega128A__" },
8674 { "atmega1280", "__AVR_ATmega1280__" },
8675 { "atmega1281", "__AVR_ATmega1281__" },
8676 { "atmega1284", "__AVR_ATmega1284__" },
8677 { "atmega1284p", "__AVR_ATmega1284P__" },
8678 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8679 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8680 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8681 { "at90can128", "__AVR_AT90CAN128__" },
8682 { "at90usb1286", "__AVR_AT90USB1286__" },
8683 { "at90usb1287", "__AVR_AT90USB1287__" },
8684 { "atmega2560", "__AVR_ATmega2560__" },
8685 { "atmega2561", "__AVR_ATmega2561__" },
8686 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8687 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8688 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8689 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8690 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8691 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8692 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8693 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8694 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8695 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8696 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8697 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8698 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8699 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8700 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8701 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8702 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8703 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8704 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8705 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8706 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8707 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8708 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8709 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8710 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8711 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8712 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8713 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8714 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8715 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8716 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8717 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8718 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8719 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8720 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8721 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8722 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8723 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8724 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8725 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8726 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8727 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8728 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8729 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8730 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8731 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8732 { "attiny4", "__AVR_ATtiny4__" },
8733 { "attiny5", "__AVR_ATtiny5__" },
8734 { "attiny9", "__AVR_ATtiny9__" },
8735 { "attiny10", "__AVR_ATtiny10__" },
8736 { "attiny20", "__AVR_ATtiny20__" },
8737 { "attiny40", "__AVR_ATtiny40__" },
8738 { "attiny102", "__AVR_ATtiny102__" },
8739 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008740};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008741
8742// AVR Target
8743class AVRTargetInfo : public TargetInfo {
8744public:
8745 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8746 : TargetInfo(Triple) {
8747 TLSSupported = false;
8748 PointerWidth = 16;
8749 PointerAlign = 8;
8750 IntWidth = 16;
8751 IntAlign = 8;
8752 LongWidth = 32;
8753 LongAlign = 8;
8754 LongLongWidth = 64;
8755 LongLongAlign = 8;
8756 SuitableAlign = 8;
8757 DefaultAlignForAttributeAligned = 8;
8758 HalfWidth = 16;
8759 HalfAlign = 8;
8760 FloatWidth = 32;
8761 FloatAlign = 8;
8762 DoubleWidth = 32;
8763 DoubleAlign = 8;
8764 DoubleFormat = &llvm::APFloat::IEEEsingle();
8765 LongDoubleWidth = 32;
8766 LongDoubleAlign = 8;
8767 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8768 SizeType = UnsignedInt;
8769 PtrDiffType = SignedInt;
8770 IntPtrType = SignedInt;
8771 Char16Type = UnsignedInt;
8772 WCharType = SignedInt;
8773 WIntType = SignedInt;
8774 Char32Type = UnsignedLong;
8775 SigAtomicType = SignedChar;
8776 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8777 "-f32:32:32-f64:64:64-n8");
8778 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008779
Dylan McKay924fa3a2017-01-05 05:20:27 +00008780 void getTargetDefines(const LangOptions &Opts,
8781 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008782 Builder.defineMacro("AVR");
8783 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008784 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008785
8786 if (!this->CPU.empty()) {
8787 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8788 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8789
8790 if (It != AVRMcus.end())
8791 Builder.defineMacro(It->DefineName);
8792 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008793 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008794
Dylan McKay924fa3a2017-01-05 05:20:27 +00008795 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8796 return None;
8797 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008798
Dylan McKay924fa3a2017-01-05 05:20:27 +00008799 BuiltinVaListKind getBuiltinVaListKind() const override {
8800 return TargetInfo::VoidPtrBuiltinVaList;
8801 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008802
Dylan McKay924fa3a2017-01-05 05:20:27 +00008803 const char *getClobbers() const override {
8804 return "";
8805 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008806
Dylan McKay924fa3a2017-01-05 05:20:27 +00008807 ArrayRef<const char *> getGCCRegNames() const override {
8808 static const char * const GCCRegNames[] = {
8809 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8810 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8811 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008812 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008813 };
8814 return llvm::makeArrayRef(GCCRegNames);
8815 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008816
Dylan McKay924fa3a2017-01-05 05:20:27 +00008817 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8818 return None;
8819 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008820
Dylan McKay924fa3a2017-01-05 05:20:27 +00008821 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8822 static const TargetInfo::AddlRegName AddlRegNames[] = {
8823 { { "r26", "r27"}, 26 },
8824 { { "r28", "r29"}, 27 },
8825 { { "r30", "r31"}, 28 },
8826 { { "SPL", "SPH"}, 29 },
8827 };
8828 return llvm::makeArrayRef(AddlRegNames);
8829 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008830
Dylan McKay924fa3a2017-01-05 05:20:27 +00008831 bool validateAsmConstraint(const char *&Name,
8832 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008833 // There aren't any multi-character AVR specific constraints.
8834 if (StringRef(Name).size() > 1) return false;
8835
8836 switch (*Name) {
8837 default: return false;
8838 case 'a': // Simple upper registers
8839 case 'b': // Base pointer registers pairs
8840 case 'd': // Upper register
8841 case 'l': // Lower registers
8842 case 'e': // Pointer register pairs
8843 case 'q': // Stack pointer register
8844 case 'r': // Any register
8845 case 'w': // Special upper register pairs
8846 case 't': // Temporary register
8847 case 'x': case 'X': // Pointer register pair X
8848 case 'y': case 'Y': // Pointer register pair Y
8849 case 'z': case 'Z': // Pointer register pair Z
8850 Info.setAllowsRegister();
8851 return true;
8852 case 'I': // 6-bit positive integer constant
8853 Info.setRequiresImmediate(0, 63);
8854 return true;
8855 case 'J': // 6-bit negative integer constant
8856 Info.setRequiresImmediate(-63, 0);
8857 return true;
8858 case 'K': // Integer constant (Range: 2)
8859 Info.setRequiresImmediate(2);
8860 return true;
8861 case 'L': // Integer constant (Range: 0)
8862 Info.setRequiresImmediate(0);
8863 return true;
8864 case 'M': // 8-bit integer constant
8865 Info.setRequiresImmediate(0, 0xff);
8866 return true;
8867 case 'N': // Integer constant (Range: -1)
8868 Info.setRequiresImmediate(-1);
8869 return true;
8870 case 'O': // Integer constant (Range: 8, 16, 24)
8871 Info.setRequiresImmediate({8, 16, 24});
8872 return true;
8873 case 'P': // Integer constant (Range: 1)
8874 Info.setRequiresImmediate(1);
8875 return true;
8876 case 'R': // Integer constant (Range: -6 to 5)
8877 Info.setRequiresImmediate(-6, 5);
8878 return true;
8879 case 'G': // Floating point constant
8880 case 'Q': // A memory address based on Y or Z pointer with displacement.
8881 return true;
8882 }
8883
Dylan McKay924fa3a2017-01-05 05:20:27 +00008884 return false;
8885 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008886
Dylan McKay924fa3a2017-01-05 05:20:27 +00008887 IntType getIntTypeByWidth(unsigned BitWidth,
8888 bool IsSigned) const final {
8889 // AVR prefers int for 16-bit integers.
8890 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8891 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8892 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008893
Dylan McKay924fa3a2017-01-05 05:20:27 +00008894 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8895 bool IsSigned) const final {
8896 // AVR uses int for int_least16_t and int_fast16_t.
8897 return BitWidth == 16
8898 ? (IsSigned ? SignedInt : UnsignedInt)
8899 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8900 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008901
8902 bool setCPU(const std::string &Name) override {
8903 bool IsFamily = llvm::StringSwitch<bool>(Name)
8904 .Case("avr1", true)
8905 .Case("avr2", true)
8906 .Case("avr25", true)
8907 .Case("avr3", true)
8908 .Case("avr31", true)
8909 .Case("avr35", true)
8910 .Case("avr4", true)
8911 .Case("avr5", true)
8912 .Case("avr51", true)
8913 .Case("avr6", true)
8914 .Case("avrxmega1", true)
8915 .Case("avrxmega2", true)
8916 .Case("avrxmega3", true)
8917 .Case("avrxmega4", true)
8918 .Case("avrxmega5", true)
8919 .Case("avrxmega6", true)
8920 .Case("avrxmega7", true)
8921 .Case("avrtiny", true)
8922 .Default(false);
8923
8924 if (IsFamily) this->CPU = Name;
8925
8926 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8927 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8928
8929 if (IsMCU) this->CPU = Name;
8930
8931 return IsFamily || IsMCU;
8932 }
8933
8934protected:
8935 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008936};
8937
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008938} // end anonymous namespace
8939
Chris Lattner5ba61f02006-10-14 07:39:34 +00008940//===----------------------------------------------------------------------===//
8941// Driver code
8942//===----------------------------------------------------------------------===//
8943
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008944static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8945 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008946 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008947
Daniel Dunbar52322032009-08-18 05:47:58 +00008948 switch (Triple.getArch()) {
8949 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008950 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008951
Tim Northover2a0783d2014-05-30 14:14:07 +00008952 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008953 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008954
8955 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008956 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008957
Jacques Pienaard964cc22016-03-28 21:02:54 +00008958 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008959 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008960
Tim Northover2a0783d2014-05-30 14:14:07 +00008961 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008962 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008963 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008964
8965 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008966 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008967 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008968 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008969 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008970 case llvm::Triple::Fuchsia:
8971 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008972 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008973 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008974 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008975 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00008976 case llvm::Triple::OpenBSD:
8977 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008978 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008979 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008980 }
8981
Christian Pirker9b019ae2014-02-25 13:51:00 +00008982 case llvm::Triple::aarch64_be:
8983 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008984 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008985 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008986 case llvm::Triple::Fuchsia:
8987 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008988 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008989 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008990 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008991 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008992 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008993 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008994 }
8995
Daniel Dunbar52322032009-08-18 05:47:58 +00008996 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008997 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008998 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008999 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009000
Daniel Dunbar52322032009-08-18 05:47:58 +00009001 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009002 case llvm::Triple::CloudABI:
9003 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009004 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009005 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009006 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009007 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009008 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009009 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009010 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009011 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009012 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009013 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009014 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009015 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009016 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009017 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009018 case llvm::Triple::Win32:
9019 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009020 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009021 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009022 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009023 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009024 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009025 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009026 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009027 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009028 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009029 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009030 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009031 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009032 }
9033
9034 case llvm::Triple::armeb:
9035 case llvm::Triple::thumbeb:
9036 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009037 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009038
9039 switch (os) {
9040 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009041 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009042 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009043 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009044 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009045 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009046 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009047 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009048 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009049 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009050 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009051 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009052 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009053 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009054 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009055 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009056 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009057
Dylan McKay924fa3a2017-01-05 05:20:27 +00009058 case llvm::Triple::avr:
9059 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009060 case llvm::Triple::bpfeb:
9061 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009062 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009063
Daniel Dunbar52322032009-08-18 05:47:58 +00009064 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009065 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009066
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009067 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009068 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009069 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009070 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009071 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009072 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009073 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009074 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009075 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009076 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009077 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009078 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009079 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009080
9081 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009082 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009083 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009084 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009085 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009086 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009087 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009088 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009089 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009090 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009091 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009092 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009093 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009094 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009095 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009096
Akira Hatanakabef17452011-09-20 19:21:49 +00009097 case llvm::Triple::mips64:
9098 switch (os) {
9099 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009100 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009101 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009102 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009103 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009104 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009105 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009106 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009107 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009108 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009109 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009110 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009111 }
9112
9113 case llvm::Triple::mips64el:
9114 switch (os) {
9115 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009116 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009117 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009118 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009119 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009120 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009121 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009122 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009123 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009124 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009125 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009126 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009127 }
9128
Ivan Krasindd7403e2011-08-24 20:22:22 +00009129 case llvm::Triple::le32:
9130 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009131 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009132 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009133 default:
9134 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009135 }
9136
JF Bastien643817d2014-09-12 17:52:47 +00009137 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009138 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009139
Daniel Dunbar52322032009-08-18 05:47:58 +00009140 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009141 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009143 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009144 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009145 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009146 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009147 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009148 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009149 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009150 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009151 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009152 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009153 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009154 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009155 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009156 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009157
9158 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009159 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009160 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009161 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009162 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009163 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009164 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009165 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009166 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009167 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009168 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009170 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009172 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009173
Bill Schmidt778d3872013-07-26 01:36:11 +00009174 case llvm::Triple::ppc64le:
9175 switch (os) {
9176 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009177 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009178 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009179 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009180 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009181 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009182 }
9183
Peter Collingbournec947aae2012-05-20 23:28:41 +00009184 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009185 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009186 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009187 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009188
Tom Stellardd8e38a32015-01-06 20:34:47 +00009189 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009190 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009191 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009192
Daniel Dunbar52322032009-08-18 05:47:58 +00009193 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009194 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009195 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009196 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009197 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009198 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009199 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009200 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009201 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009202 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009203 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009204 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009205 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009207 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009208
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009209 // The 'sparcel' architecture copies all the above cases except for Solaris.
9210 case llvm::Triple::sparcel:
9211 switch (os) {
9212 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009213 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009214 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009215 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009216 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009217 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009218 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009219 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009220 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009221 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009222 }
9223
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009224 case llvm::Triple::sparcv9:
9225 switch (os) {
9226 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009227 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009228 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009229 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009230 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009231 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009232 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009233 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009234 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009235 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009236 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009238 }
9239
Ulrich Weigand47445072013-05-06 16:26:41 +00009240 case llvm::Triple::systemz:
9241 switch (os) {
9242 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009244 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009245 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009246 }
9247
Eli Friedmana9c3d712009-08-19 20:47:07 +00009248 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009249 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009250
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009251 case llvm::Triple::tcele:
9252 return new TCELETargetInfo(Triple, Opts);
9253
Daniel Dunbar52322032009-08-18 05:47:58 +00009254 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009255 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009257
Daniel Dunbar52322032009-08-18 05:47:58 +00009258 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009259 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009261 case llvm::Triple::Linux: {
9262 switch (Triple.getEnvironment()) {
9263 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009264 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009265 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009266 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009267 }
9268 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009269 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009271 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009273 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009274 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009275 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009276 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009277 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009278 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009279 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009280 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009281 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009283 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009285 case llvm::Triple::Win32: {
9286 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009287 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009288 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009289 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009290 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009291 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009292 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009293 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009294 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009295 }
9296 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009297 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009298 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009299 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009301 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009303 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009304 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009305 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009306 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009307 }
9308
9309 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009310 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009312
Daniel Dunbar52322032009-08-18 05:47:58 +00009313 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009314 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009315 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009316 case llvm::Triple::Linux: {
9317 switch (Triple.getEnvironment()) {
9318 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009319 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009320 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009322 }
9323 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009324 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009325 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009326 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009327 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009328 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009329 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009330 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009331 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009332 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009333 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009334 case llvm::Triple::Fuchsia:
9335 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009336 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009337 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009338 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009339 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009340 case llvm::Triple::Win32: {
9341 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009342 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009343 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009344 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009345 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009346 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009347 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009348 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009349 }
9350 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009351 case llvm::Triple::Haiku:
9352 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009353 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009355 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009356 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009357 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009359 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009360
Douglas Katzman78d7c542015-05-12 21:18:10 +00009361 case llvm::Triple::spir: {
9362 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9363 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9364 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009366 }
9367 case llvm::Triple::spir64: {
9368 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9369 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9370 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009372 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009373 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009374 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9375 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9376 Triple.getOS() != llvm::Triple::UnknownOS ||
9377 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9378 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009379 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009380 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009381 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009382 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9383 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9384 Triple.getOS() != llvm::Triple::UnknownOS ||
9385 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9386 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009387 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009388 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009389
9390 case llvm::Triple::renderscript32:
9391 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9392 case llvm::Triple::renderscript64:
9393 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009394 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009395}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009396
9397/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009398/// options.
Alp Toker80758082014-07-06 05:26:44 +00009399TargetInfo *
9400TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009401 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009402 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009403
9404 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009405 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009406 if (!Target) {
9407 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009408 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009409 }
Alp Toker80758082014-07-06 05:26:44 +00009410 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009411
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009412 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009413 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9414 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009415 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009416 }
9417
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009418 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009419 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9420 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009421 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009422 }
9423
Rafael Espindolaeb265472013-08-21 21:59:03 +00009424 // Set the fp math unit.
9425 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9426 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009427 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009428 }
9429
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009430 // Compute the default target features, we need the target to handle this
9431 // because features may have dependencies on one another.
9432 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009433 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9434 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009435 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009436
9437 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009438 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009439 for (const auto &F : Features)
9440 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9441
Eric Christopher3ff21b32013-10-16 21:26:26 +00009442 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009443 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009444
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009445 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009446 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009447
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009448 if (!Target->validateTarget(Diags))
9449 return nullptr;
9450
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009451 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009452}