blob: e23ff3cc3806a99063597c99749357bc6f07607a [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
Konstantin Zhuravlyovd1ba16e2017-03-08 23:56:48 +00002261 /// \returns Target specific vtbl ptr address space.
2262 unsigned getVtblPtrAddressSpace() const override {
2263 // \todo: We currently have address spaces defined in AMDGPU Backend. It
2264 // would be nice if we could use it here instead of using bare numbers (same
2265 // applies to getDWARFAddressSpace).
2266 return 2; // constant.
2267 }
2268
2269 /// \returns If a target requires an address within a target specific address
2270 /// space \p AddressSpace to be converted in order to be used, then return the
2271 /// corresponding target specific DWARF address space.
2272 ///
2273 /// \returns Otherwise return None and no conversion will be emitted in the
2274 /// DWARF.
2275 Optional<unsigned> getDWARFAddressSpace(
2276 unsigned AddressSpace) const override {
2277 switch (AddressSpace) {
2278 case 0: // LLVM Private.
2279 return 1; // DWARF Private.
2280 case 3: // LLVM Local.
2281 return 2; // DWARF Local.
2282 default:
2283 return None;
2284 }
2285 }
2286
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002287 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2288 switch (CC) {
2289 default:
2290 return CCCR_Warning;
2291 case CC_C:
2292 case CC_OpenCLKernel:
2293 return CCCR_OK;
2294 }
2295 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002296
2297 // In amdgcn target the null pointer in global, constant, and generic
2298 // address space has value 0 but in private and local address space has
2299 // value ~0.
2300 uint64_t getNullPointerValue(unsigned AS) const override {
2301 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2302 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002303};
2304
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002305const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002306#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002307 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002308#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2309 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002310#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002311};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002312const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002313 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2314 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2315 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2316 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2317 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2318 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2319 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2320 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2321 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2322 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2323 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2324 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2325 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2326 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2327 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2328 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2329 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2330 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2331 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2332 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2333 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2334 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2335 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2336 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2337 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2338 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2339 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2340 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2341 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2342 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2343 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2344 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2345 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2346 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2347 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2348 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2349 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2350 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2351 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2352 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2353 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2354 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2355 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2356 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2357 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2358 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2359 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002360 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002361 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2362 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002363};
2364
Craig Topperf054e3a2015-10-19 03:52:27 +00002365ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2366 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002367}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002368
Matt Arsenault250024f2016-06-08 01:56:42 +00002369bool AMDGPUTargetInfo::initFeatureMap(
2370 llvm::StringMap<bool> &Features,
2371 DiagnosticsEngine &Diags, StringRef CPU,
2372 const std::vector<std::string> &FeatureVec) const {
2373
2374 // XXX - What does the member GPU mean if device name string passed here?
2375 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2376 if (CPU.empty())
2377 CPU = "tahiti";
2378
2379 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002380 case GK_GFX6:
2381 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002382 break;
2383
Matt Arsenaulta0c6dca2017-02-22 20:55:59 +00002384 case GK_GFX9:
2385 Features["gfx9-insts"] = true;
2386 LLVM_FALLTHROUGH;
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002387 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002388 Features["s-memrealtime"] = true;
2389 Features["16-bit-insts"] = true;
Yaxun Liu4d867992017-03-10 01:30:46 +00002390 Features["dpp"] = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00002391 break;
2392
2393 case GK_NONE:
2394 return false;
2395 default:
2396 llvm_unreachable("unhandled subtarget");
2397 }
2398 } else {
2399 if (CPU.empty())
2400 CPU = "r600";
2401
2402 switch (parseR600Name(CPU)) {
2403 case GK_R600:
2404 case GK_R700:
2405 case GK_EVERGREEN:
2406 case GK_NORTHERN_ISLANDS:
2407 break;
2408 case GK_R600_DOUBLE_OPS:
2409 case GK_R700_DOUBLE_OPS:
2410 case GK_EVERGREEN_DOUBLE_OPS:
2411 case GK_CAYMAN:
2412 Features["fp64"] = true;
2413 break;
2414 case GK_NONE:
2415 return false;
2416 default:
2417 llvm_unreachable("unhandled subtarget");
2418 }
2419 }
2420
2421 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2422}
2423
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002424const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002425#define BUILTIN(ID, TYPE, ATTRS) \
2426 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002427#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002428 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002429#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2430 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002431#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002432
2433#define BUILTIN(ID, TYPE, ATTRS) \
2434 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002435#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2436 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002437#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2438 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2439#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002440};
Eli Friedmanb5366062008-05-20 14:21:01 +00002441
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002442
Nuno Lopescfca1f02009-12-23 17:49:57 +00002443static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002444 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2445 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002446 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002447 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2448 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2449 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002450 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002451 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2452 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002453 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2454 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2455 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2456 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2457 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2458 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2459 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2460 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002461 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002462};
2463
Eric Christophercdd36352011-06-21 00:05:20 +00002464const TargetInfo::AddlRegName AddlRegNames[] = {
2465 { { "al", "ah", "eax", "rax" }, 0 },
2466 { { "bl", "bh", "ebx", "rbx" }, 3 },
2467 { { "cl", "ch", "ecx", "rcx" }, 2 },
2468 { { "dl", "dh", "edx", "rdx" }, 1 },
2469 { { "esi", "rsi" }, 4 },
2470 { { "edi", "rdi" }, 5 },
2471 { { "esp", "rsp" }, 7 },
2472 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002473 { { "r8d", "r8w", "r8b" }, 38 },
2474 { { "r9d", "r9w", "r9b" }, 39 },
2475 { { "r10d", "r10w", "r10b" }, 40 },
2476 { { "r11d", "r11w", "r11b" }, 41 },
2477 { { "r12d", "r12w", "r12b" }, 42 },
2478 { { "r13d", "r13w", "r13b" }, 43 },
2479 { { "r14d", "r14w", "r14b" }, 44 },
2480 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002481};
2482
2483// X86 target abstract base class; x86-32 and x86-64 are very close, so
2484// most of the implementation can be shared.
2485class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002486 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002487 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002488 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002489 enum MMX3DNowEnum {
2490 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002491 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002492 enum XOPEnum {
2493 NoXOP,
2494 SSE4A,
2495 FMA4,
2496 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002497 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002498
Craig Topper543f3bd2015-10-14 23:47:57 +00002499 bool HasAES = false;
2500 bool HasPCLMUL = false;
2501 bool HasLZCNT = false;
2502 bool HasRDRND = false;
2503 bool HasFSGSBASE = false;
2504 bool HasBMI = false;
2505 bool HasBMI2 = false;
2506 bool HasPOPCNT = false;
2507 bool HasRTM = false;
2508 bool HasPRFCHW = false;
2509 bool HasRDSEED = false;
2510 bool HasADX = false;
2511 bool HasTBM = false;
2512 bool HasFMA = false;
2513 bool HasF16C = false;
2514 bool HasAVX512CD = false;
2515 bool HasAVX512ER = false;
2516 bool HasAVX512PF = false;
2517 bool HasAVX512DQ = false;
2518 bool HasAVX512BW = false;
2519 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002520 bool HasAVX512VBMI = false;
2521 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002522 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002523 bool HasMPX = false;
2524 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002525 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002526 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002527 bool HasXSAVE = false;
2528 bool HasXSAVEOPT = false;
2529 bool HasXSAVEC = false;
2530 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002531 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002532 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002533 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002534 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002535 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002536 bool HasMOVBE = false;
2537 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002538
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002539 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2540 ///
2541 /// Each enumeration represents a particular CPU supported by Clang. These
2542 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2543 enum CPUKind {
2544 CK_Generic,
2545
2546 /// \name i386
2547 /// i386-generation processors.
2548 //@{
2549 CK_i386,
2550 //@}
2551
2552 /// \name i486
2553 /// i486-generation processors.
2554 //@{
2555 CK_i486,
2556 CK_WinChipC6,
2557 CK_WinChip2,
2558 CK_C3,
2559 //@}
2560
2561 /// \name i586
2562 /// i586-generation processors, P5 microarchitecture based.
2563 //@{
2564 CK_i586,
2565 CK_Pentium,
2566 CK_PentiumMMX,
2567 //@}
2568
2569 /// \name i686
2570 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2571 //@{
2572 CK_i686,
2573 CK_PentiumPro,
2574 CK_Pentium2,
2575 CK_Pentium3,
2576 CK_Pentium3M,
2577 CK_PentiumM,
2578 CK_C3_2,
2579
2580 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2581 /// Clang however has some logic to suport this.
2582 // FIXME: Warn, deprecate, and potentially remove this.
2583 CK_Yonah,
2584 //@}
2585
2586 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002587 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002588 //@{
2589 CK_Pentium4,
2590 CK_Pentium4M,
2591 CK_Prescott,
2592 CK_Nocona,
2593 //@}
2594
2595 /// \name Core
2596 /// Core microarchitecture based processors.
2597 //@{
2598 CK_Core2,
2599
2600 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2601 /// codename which GCC no longer accepts as an option to -march, but Clang
2602 /// has some logic for recognizing it.
2603 // FIXME: Warn, deprecate, and potentially remove this.
2604 CK_Penryn,
2605 //@}
2606
2607 /// \name Atom
2608 /// Atom processors
2609 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002610 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002611 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002612 //@}
2613
2614 /// \name Nehalem
2615 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002616 CK_Nehalem,
2617
2618 /// \name Westmere
2619 /// Westmere microarchitecture based processors.
2620 CK_Westmere,
2621
2622 /// \name Sandy Bridge
2623 /// Sandy Bridge microarchitecture based processors.
2624 CK_SandyBridge,
2625
2626 /// \name Ivy Bridge
2627 /// Ivy Bridge microarchitecture based processors.
2628 CK_IvyBridge,
2629
2630 /// \name Haswell
2631 /// Haswell microarchitecture based processors.
2632 CK_Haswell,
2633
2634 /// \name Broadwell
2635 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002636 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002637
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002638 /// \name Skylake Client
2639 /// Skylake client microarchitecture based processors.
2640 CK_SkylakeClient,
2641
2642 /// \name Skylake Server
2643 /// Skylake server microarchitecture based processors.
2644 CK_SkylakeServer,
2645
2646 /// \name Cannonlake Client
2647 /// Cannonlake client microarchitecture based processors.
2648 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002649
Craig Topper449314e2013-08-20 07:09:39 +00002650 /// \name Knights Landing
2651 /// Knights Landing processor.
2652 CK_KNL,
2653
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002654 /// \name Lakemont
2655 /// Lakemont microarchitecture based processors.
2656 CK_Lakemont,
2657
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002658 /// \name K6
2659 /// K6 architecture processors.
2660 //@{
2661 CK_K6,
2662 CK_K6_2,
2663 CK_K6_3,
2664 //@}
2665
2666 /// \name K7
2667 /// K7 architecture processors.
2668 //@{
2669 CK_Athlon,
2670 CK_AthlonThunderbird,
2671 CK_Athlon4,
2672 CK_AthlonXP,
2673 CK_AthlonMP,
2674 //@}
2675
2676 /// \name K8
2677 /// K8 architecture processors.
2678 //@{
2679 CK_Athlon64,
2680 CK_Athlon64SSE3,
2681 CK_AthlonFX,
2682 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002683 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002684 CK_Opteron,
2685 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002686 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002687 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002688
Benjamin Kramer569f2152012-01-10 11:50:18 +00002689 /// \name Bobcat
2690 /// Bobcat architecture processors.
2691 //@{
2692 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002693 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002694 //@}
2695
2696 /// \name Bulldozer
2697 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002698 //@{
2699 CK_BDVER1,
2700 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002701 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002702 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002703 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002704
Craig Topperc45744a2017-01-10 06:02:12 +00002705 /// \name zen
2706 /// Zen architecture processors.
2707 //@{
2708 CK_ZNVER1,
2709 //@}
2710
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002711 /// This specification is deprecated and will be removed in the future.
2712 /// Users should prefer \see CK_K8.
2713 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002714 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002715 CK_x86_64,
2716 //@}
2717
2718 /// \name Geode
2719 /// Geode processors.
2720 //@{
2721 CK_Geode
2722 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002723 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002724
Eric Christopherc50738f2015-08-27 00:05:50 +00002725 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002726 return llvm::StringSwitch<CPUKind>(CPU)
2727 .Case("i386", CK_i386)
2728 .Case("i486", CK_i486)
2729 .Case("winchip-c6", CK_WinChipC6)
2730 .Case("winchip2", CK_WinChip2)
2731 .Case("c3", CK_C3)
2732 .Case("i586", CK_i586)
2733 .Case("pentium", CK_Pentium)
2734 .Case("pentium-mmx", CK_PentiumMMX)
2735 .Case("i686", CK_i686)
2736 .Case("pentiumpro", CK_PentiumPro)
2737 .Case("pentium2", CK_Pentium2)
2738 .Case("pentium3", CK_Pentium3)
2739 .Case("pentium3m", CK_Pentium3M)
2740 .Case("pentium-m", CK_PentiumM)
2741 .Case("c3-2", CK_C3_2)
2742 .Case("yonah", CK_Yonah)
2743 .Case("pentium4", CK_Pentium4)
2744 .Case("pentium4m", CK_Pentium4M)
2745 .Case("prescott", CK_Prescott)
2746 .Case("nocona", CK_Nocona)
2747 .Case("core2", CK_Core2)
2748 .Case("penryn", CK_Penryn)
2749 .Case("bonnell", CK_Bonnell)
2750 .Case("atom", CK_Bonnell) // Legacy name.
2751 .Case("silvermont", CK_Silvermont)
2752 .Case("slm", CK_Silvermont) // Legacy name.
2753 .Case("nehalem", CK_Nehalem)
2754 .Case("corei7", CK_Nehalem) // Legacy name.
2755 .Case("westmere", CK_Westmere)
2756 .Case("sandybridge", CK_SandyBridge)
2757 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2758 .Case("ivybridge", CK_IvyBridge)
2759 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2760 .Case("haswell", CK_Haswell)
2761 .Case("core-avx2", CK_Haswell) // Legacy name.
2762 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002763 .Case("skylake", CK_SkylakeClient)
2764 .Case("skylake-avx512", CK_SkylakeServer)
2765 .Case("skx", CK_SkylakeServer) // Legacy name.
2766 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002767 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002768 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002769 .Case("k6", CK_K6)
2770 .Case("k6-2", CK_K6_2)
2771 .Case("k6-3", CK_K6_3)
2772 .Case("athlon", CK_Athlon)
2773 .Case("athlon-tbird", CK_AthlonThunderbird)
2774 .Case("athlon-4", CK_Athlon4)
2775 .Case("athlon-xp", CK_AthlonXP)
2776 .Case("athlon-mp", CK_AthlonMP)
2777 .Case("athlon64", CK_Athlon64)
2778 .Case("athlon64-sse3", CK_Athlon64SSE3)
2779 .Case("athlon-fx", CK_AthlonFX)
2780 .Case("k8", CK_K8)
2781 .Case("k8-sse3", CK_K8SSE3)
2782 .Case("opteron", CK_Opteron)
2783 .Case("opteron-sse3", CK_OpteronSSE3)
2784 .Case("barcelona", CK_AMDFAM10)
2785 .Case("amdfam10", CK_AMDFAM10)
2786 .Case("btver1", CK_BTVER1)
2787 .Case("btver2", CK_BTVER2)
2788 .Case("bdver1", CK_BDVER1)
2789 .Case("bdver2", CK_BDVER2)
2790 .Case("bdver3", CK_BDVER3)
2791 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002792 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002793 .Case("x86-64", CK_x86_64)
2794 .Case("geode", CK_Geode)
2795 .Default(CK_Generic);
2796 }
2797
Rafael Espindolaeb265472013-08-21 21:59:03 +00002798 enum FPMathKind {
2799 FP_Default,
2800 FP_SSE,
2801 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002802 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002803
Eli Friedman3fd920a2008-08-20 02:34:37 +00002804public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002805 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2806 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002807 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002808 }
Craig Topper3164f332014-03-11 03:39:26 +00002809 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002810 // X87 evaluates with 80 bits "long double" precision.
2811 return SSELevel == NoSSE ? 2 : 0;
2812 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002813 ArrayRef<const char *> getGCCRegNames() const override {
2814 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002815 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002816 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2817 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002818 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002819 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2820 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002821 }
Eric Christopherd9832702015-06-29 21:00:05 +00002822 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002823 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002824 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002825
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002826 bool validateGlobalRegisterVariable(StringRef RegName,
2827 unsigned RegSize,
2828 bool &HasSizeMismatch) const override {
2829 // esp and ebp are the only 32-bit registers the x86 backend can currently
2830 // handle.
2831 if (RegName.equals("esp") || RegName.equals("ebp")) {
2832 // Check that the register size is 32-bit.
2833 HasSizeMismatch = RegSize != 32;
2834 return true;
2835 }
2836
2837 return false;
2838 }
2839
Akira Hatanaka974131e2014-09-18 18:17:18 +00002840 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2841
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002842 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2843
Akira Hatanaka974131e2014-09-18 18:17:18 +00002844 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2845
Craig Topper3164f332014-03-11 03:39:26 +00002846 std::string convertConstraint(const char *&Constraint) const override;
2847 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002848 return "~{dirflag},~{fpsr},~{flags}";
2849 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002850
2851 StringRef getConstraintRegister(const StringRef &Constraint,
2852 const StringRef &Expression) const override {
2853 StringRef::iterator I, E;
2854 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2855 if (isalpha(*I))
2856 break;
2857 }
2858 if (I == E)
2859 return "";
2860 switch (*I) {
2861 // For the register constraints, return the matching register name
2862 case 'a':
2863 return "ax";
2864 case 'b':
2865 return "bx";
2866 case 'c':
2867 return "cx";
2868 case 'd':
2869 return "dx";
2870 case 'S':
2871 return "si";
2872 case 'D':
2873 return "di";
2874 // In case the constraint is 'r' we need to return Expression
2875 case 'r':
2876 return Expression;
2877 default:
2878 // Default value if there is no constraint for the register
2879 return "";
2880 }
2881 return "";
2882 }
2883
Craig Topper3164f332014-03-11 03:39:26 +00002884 void getTargetDefines(const LangOptions &Opts,
2885 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002886 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2887 bool Enabled);
2888 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2889 bool Enabled);
2890 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2891 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002892 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2893 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002894 setFeatureEnabledImpl(Features, Name, Enabled);
2895 }
2896 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002897 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002898 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2899 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002900 bool
2901 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2902 StringRef CPU,
2903 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002904 bool hasFeature(StringRef Feature) const override;
2905 bool handleTargetFeatures(std::vector<std::string> &Features,
2906 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002907 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002908 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2909 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002910 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002911 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002912 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002913 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002914 return "no-mmx";
2915 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002916 }
Craig Topper3164f332014-03-11 03:39:26 +00002917 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002918 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002919
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002920 // Perform any per-CPU checks necessary to determine if this CPU is
2921 // acceptable.
2922 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2923 // invalid without explaining *why*.
2924 switch (CPU) {
2925 case CK_Generic:
2926 // No processor selected!
2927 return false;
2928
2929 case CK_i386:
2930 case CK_i486:
2931 case CK_WinChipC6:
2932 case CK_WinChip2:
2933 case CK_C3:
2934 case CK_i586:
2935 case CK_Pentium:
2936 case CK_PentiumMMX:
2937 case CK_i686:
2938 case CK_PentiumPro:
2939 case CK_Pentium2:
2940 case CK_Pentium3:
2941 case CK_Pentium3M:
2942 case CK_PentiumM:
2943 case CK_Yonah:
2944 case CK_C3_2:
2945 case CK_Pentium4:
2946 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002947 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002948 case CK_Prescott:
2949 case CK_K6:
2950 case CK_K6_2:
2951 case CK_K6_3:
2952 case CK_Athlon:
2953 case CK_AthlonThunderbird:
2954 case CK_Athlon4:
2955 case CK_AthlonXP:
2956 case CK_AthlonMP:
2957 case CK_Geode:
2958 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002959 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002960 return false;
2961
2962 // Fallthrough
2963 case CK_Nocona:
2964 case CK_Core2:
2965 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002966 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002967 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002968 case CK_Nehalem:
2969 case CK_Westmere:
2970 case CK_SandyBridge:
2971 case CK_IvyBridge:
2972 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002973 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002974 case CK_SkylakeClient:
2975 case CK_SkylakeServer:
2976 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002977 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002978 case CK_Athlon64:
2979 case CK_Athlon64SSE3:
2980 case CK_AthlonFX:
2981 case CK_K8:
2982 case CK_K8SSE3:
2983 case CK_Opteron:
2984 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002985 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002986 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002987 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002988 case CK_BDVER1:
2989 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002990 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002991 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002992 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002993 case CK_x86_64:
2994 return true;
2995 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002996 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002997 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002998
Craig Topper3164f332014-03-11 03:39:26 +00002999 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003000
Craig Topper3164f332014-03-11 03:39:26 +00003001 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003002 // Most of the non-ARM calling conventions are i386 conventions.
3003 switch (CC) {
3004 case CC_X86ThisCall:
3005 case CC_X86FastCall:
3006 case CC_X86StdCall:
3007 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003008 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003009 case CC_C:
3010 case CC_Swift:
3011 case CC_X86Pascal:
3012 case CC_IntelOclBicc:
3013 return CCCR_OK;
3014 default:
3015 return CCCR_Warning;
3016 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003017 }
3018
Craig Topper3164f332014-03-11 03:39:26 +00003019 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003020 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003021 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003022
3023 bool hasSjLjLowering() const override {
3024 return true;
3025 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003026
3027 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003028 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003029 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003030};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003031
Rafael Espindolaeb265472013-08-21 21:59:03 +00003032bool X86TargetInfo::setFPMath(StringRef Name) {
3033 if (Name == "387") {
3034 FPMath = FP_387;
3035 return true;
3036 }
3037 if (Name == "sse") {
3038 FPMath = FP_SSE;
3039 return true;
3040 }
3041 return false;
3042}
3043
Eric Christopher007b0a02015-08-28 22:32:01 +00003044bool X86TargetInfo::initFeatureMap(
3045 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003046 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003047 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003048 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003049 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003050 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003051
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003052 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003053
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003054 // Enable X87 for all X86 processors but Lakemont.
3055 if (Kind != CK_Lakemont)
3056 setFeatureEnabledImpl(Features, "x87", true);
3057
3058 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 case CK_Generic:
3060 case CK_i386:
3061 case CK_i486:
3062 case CK_i586:
3063 case CK_Pentium:
3064 case CK_i686:
3065 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003066 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003067 break;
3068 case CK_PentiumMMX:
3069 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003070 case CK_K6:
3071 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003072 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003073 break;
3074 case CK_Pentium3:
3075 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003076 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003077 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003078 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 break;
3080 case CK_PentiumM:
3081 case CK_Pentium4:
3082 case CK_Pentium4M:
3083 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003084 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003085 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003086 break;
3087 case CK_Yonah:
3088 case CK_Prescott:
3089 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003090 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003091 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003092 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003093 break;
3094 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003095 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003096 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003097 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003098 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003099 break;
3100 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003101 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003102 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003103 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003104 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003105 case CK_Cannonlake:
3106 setFeatureEnabledImpl(Features, "avx512ifma", true);
3107 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3108 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003109 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003110 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003111 setFeatureEnabledImpl(Features, "avx512f", true);
3112 setFeatureEnabledImpl(Features, "avx512cd", true);
3113 setFeatureEnabledImpl(Features, "avx512dq", true);
3114 setFeatureEnabledImpl(Features, "avx512bw", true);
3115 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003116 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003117 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003118 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003119 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003120 setFeatureEnabledImpl(Features, "xsavec", true);
3121 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003122 setFeatureEnabledImpl(Features, "mpx", true);
3123 setFeatureEnabledImpl(Features, "sgx", true);
3124 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003125 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003126 case CK_Broadwell:
3127 setFeatureEnabledImpl(Features, "rdseed", true);
3128 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003129 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003130 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003131 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003132 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003133 setFeatureEnabledImpl(Features, "bmi", true);
3134 setFeatureEnabledImpl(Features, "bmi2", true);
3135 setFeatureEnabledImpl(Features, "rtm", true);
3136 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003137 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003138 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003139 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003140 setFeatureEnabledImpl(Features, "rdrnd", true);
3141 setFeatureEnabledImpl(Features, "f16c", true);
3142 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003143 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003144 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003145 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003146 setFeatureEnabledImpl(Features, "xsave", true);
3147 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003148 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003149 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003150 case CK_Silvermont:
3151 setFeatureEnabledImpl(Features, "aes", true);
3152 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003153 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003154 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003155 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003156 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003157 setFeatureEnabledImpl(Features, "cx16", true);
3158 break;
3159 case CK_KNL:
3160 setFeatureEnabledImpl(Features, "avx512f", true);
3161 setFeatureEnabledImpl(Features, "avx512cd", true);
3162 setFeatureEnabledImpl(Features, "avx512er", true);
3163 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003164 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003165 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003166 setFeatureEnabledImpl(Features, "rdseed", true);
3167 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003168 setFeatureEnabledImpl(Features, "lzcnt", true);
3169 setFeatureEnabledImpl(Features, "bmi", true);
3170 setFeatureEnabledImpl(Features, "bmi2", true);
3171 setFeatureEnabledImpl(Features, "rtm", true);
3172 setFeatureEnabledImpl(Features, "fma", true);
3173 setFeatureEnabledImpl(Features, "rdrnd", true);
3174 setFeatureEnabledImpl(Features, "f16c", true);
3175 setFeatureEnabledImpl(Features, "fsgsbase", true);
3176 setFeatureEnabledImpl(Features, "aes", true);
3177 setFeatureEnabledImpl(Features, "pclmul", true);
3178 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003179 setFeatureEnabledImpl(Features, "xsaveopt", true);
3180 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003181 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003182 break;
3183 case CK_K6_2:
3184 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003185 case CK_WinChip2:
3186 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003187 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003188 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003189 case CK_Athlon:
3190 case CK_AthlonThunderbird:
3191 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003192 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003193 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003194 case CK_Athlon4:
3195 case CK_AthlonXP:
3196 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003197 setFeatureEnabledImpl(Features, "sse", true);
3198 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003199 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003200 break;
3201 case CK_K8:
3202 case CK_Opteron:
3203 case CK_Athlon64:
3204 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003205 setFeatureEnabledImpl(Features, "sse2", true);
3206 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003207 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003208 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003209 case CK_AMDFAM10:
3210 setFeatureEnabledImpl(Features, "sse4a", true);
3211 setFeatureEnabledImpl(Features, "lzcnt", true);
3212 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003213 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003214 case CK_K8SSE3:
3215 case CK_OpteronSSE3:
3216 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003217 setFeatureEnabledImpl(Features, "sse3", true);
3218 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003219 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003220 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003221 case CK_BTVER2:
3222 setFeatureEnabledImpl(Features, "avx", true);
3223 setFeatureEnabledImpl(Features, "aes", true);
3224 setFeatureEnabledImpl(Features, "pclmul", true);
3225 setFeatureEnabledImpl(Features, "bmi", true);
3226 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003227 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003228 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003229 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003230 setFeatureEnabledImpl(Features, "ssse3", true);
3231 setFeatureEnabledImpl(Features, "sse4a", true);
3232 setFeatureEnabledImpl(Features, "lzcnt", true);
3233 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003234 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003235 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003236 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003237 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003238 case CK_ZNVER1:
3239 setFeatureEnabledImpl(Features, "adx", true);
3240 setFeatureEnabledImpl(Features, "aes", true);
3241 setFeatureEnabledImpl(Features, "avx2", true);
3242 setFeatureEnabledImpl(Features, "bmi", true);
3243 setFeatureEnabledImpl(Features, "bmi2", true);
3244 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003245 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003246 setFeatureEnabledImpl(Features, "cx16", true);
3247 setFeatureEnabledImpl(Features, "f16c", true);
3248 setFeatureEnabledImpl(Features, "fma", true);
3249 setFeatureEnabledImpl(Features, "fsgsbase", true);
3250 setFeatureEnabledImpl(Features, "fxsr", true);
3251 setFeatureEnabledImpl(Features, "lzcnt", true);
3252 setFeatureEnabledImpl(Features, "mwaitx", true);
3253 setFeatureEnabledImpl(Features, "movbe", true);
3254 setFeatureEnabledImpl(Features, "pclmul", true);
3255 setFeatureEnabledImpl(Features, "popcnt", true);
3256 setFeatureEnabledImpl(Features, "prfchw", true);
3257 setFeatureEnabledImpl(Features, "rdrnd", true);
3258 setFeatureEnabledImpl(Features, "rdseed", true);
3259 setFeatureEnabledImpl(Features, "sha", true);
3260 setFeatureEnabledImpl(Features, "sse4a", true);
3261 setFeatureEnabledImpl(Features, "xsave", true);
3262 setFeatureEnabledImpl(Features, "xsavec", true);
3263 setFeatureEnabledImpl(Features, "xsaveopt", true);
3264 setFeatureEnabledImpl(Features, "xsaves", true);
3265 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003266 case CK_BDVER4:
3267 setFeatureEnabledImpl(Features, "avx2", true);
3268 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003269 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003270 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003271 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003272 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003273 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003274 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003275 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003276 setFeatureEnabledImpl(Features, "bmi", true);
3277 setFeatureEnabledImpl(Features, "fma", true);
3278 setFeatureEnabledImpl(Features, "f16c", true);
3279 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003280 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003281 case CK_BDVER1:
3282 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003283 setFeatureEnabledImpl(Features, "xop", true);
3284 setFeatureEnabledImpl(Features, "lzcnt", true);
3285 setFeatureEnabledImpl(Features, "aes", true);
3286 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003287 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003288 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003289 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003290 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003291 break;
Eli Friedman33465822011-07-08 23:31:17 +00003292 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003293 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3294 return false;
3295
3296 // Can't do this earlier because we need to be able to explicitly enable
3297 // or disable these features and the things that they depend upon.
3298
3299 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3300 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003301 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003302 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3303 FeaturesVec.end())
3304 Features["popcnt"] = true;
3305
3306 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3307 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003308 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003309 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3310 FeaturesVec.end())
3311 Features["prfchw"] = true;
3312
Eric Christophera7260af2015-10-08 20:10:18 +00003313 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3314 // then enable MMX.
3315 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003316 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003317 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3318 FeaturesVec.end())
3319 Features["mmx"] = true;
3320
Eric Christopherbbd746d2015-10-08 20:10:14 +00003321 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003322}
3323
Rafael Espindolae62e2792013-08-20 13:44:29 +00003324void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003325 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003326 if (Enabled) {
3327 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003328 case AVX512F:
3329 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003330 case AVX2:
3331 Features["avx2"] = true;
3332 case AVX:
3333 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003334 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003335 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003336 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003337 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003338 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003339 case SSSE3:
3340 Features["ssse3"] = true;
3341 case SSE3:
3342 Features["sse3"] = true;
3343 case SSE2:
3344 Features["sse2"] = true;
3345 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003346 Features["sse"] = true;
3347 case NoSSE:
3348 break;
3349 }
3350 return;
3351 }
3352
3353 switch (Level) {
3354 case NoSSE:
3355 case SSE1:
3356 Features["sse"] = false;
3357 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003358 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3359 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003360 case SSE3:
3361 Features["sse3"] = false;
3362 setXOPLevel(Features, NoXOP, false);
3363 case SSSE3:
3364 Features["ssse3"] = false;
3365 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003366 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003367 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003368 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003369 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003370 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3371 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003372 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003373 case AVX2:
3374 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003375 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003376 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003377 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003378 Features["avx512vl"] = Features["avx512vbmi"] =
3379 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003380 }
3381}
3382
3383void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003384 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003385 if (Enabled) {
3386 switch (Level) {
3387 case AMD3DNowAthlon:
3388 Features["3dnowa"] = true;
3389 case AMD3DNow:
3390 Features["3dnow"] = true;
3391 case MMX:
3392 Features["mmx"] = true;
3393 case NoMMX3DNow:
3394 break;
3395 }
3396 return;
3397 }
3398
3399 switch (Level) {
3400 case NoMMX3DNow:
3401 case MMX:
3402 Features["mmx"] = false;
3403 case AMD3DNow:
3404 Features["3dnow"] = false;
3405 case AMD3DNowAthlon:
3406 Features["3dnowa"] = false;
3407 }
3408}
3409
3410void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003411 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 if (Enabled) {
3413 switch (Level) {
3414 case XOP:
3415 Features["xop"] = true;
3416 case FMA4:
3417 Features["fma4"] = true;
3418 setSSELevel(Features, AVX, true);
3419 case SSE4A:
3420 Features["sse4a"] = true;
3421 setSSELevel(Features, SSE3, true);
3422 case NoXOP:
3423 break;
3424 }
3425 return;
3426 }
3427
3428 switch (Level) {
3429 case NoXOP:
3430 case SSE4A:
3431 Features["sse4a"] = false;
3432 case FMA4:
3433 Features["fma4"] = false;
3434 case XOP:
3435 Features["xop"] = false;
3436 }
3437}
3438
Craig Topper86d79ef2013-09-17 04:51:29 +00003439void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3440 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003441 // This is a bit of a hack to deal with the sse4 target feature when used
3442 // as part of the target attribute. We handle sse4 correctly everywhere
3443 // else. See below for more information on how we handle the sse4 options.
3444 if (Name != "sse4")
3445 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003446
Craig Topper29561122013-09-19 01:13:07 +00003447 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003448 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003449 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003450 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003451 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003452 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003453 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003454 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003455 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003456 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003457 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003458 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003459 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003460 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003461 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003462 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003463 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003464 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003465 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003466 if (Enabled)
3467 setSSELevel(Features, SSE2, Enabled);
3468 } else if (Name == "pclmul") {
3469 if (Enabled)
3470 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003471 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003472 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003473 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003474 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003475 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003476 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003477 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3478 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3479 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003480 if (Enabled)
3481 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003482 // Enable BWI instruction if VBMI is being enabled.
3483 if (Name == "avx512vbmi" && Enabled)
3484 Features["avx512bw"] = true;
3485 // Also disable VBMI if BWI is being disabled.
3486 if (Name == "avx512bw" && !Enabled)
3487 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003488 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003489 if (Enabled)
3490 setSSELevel(Features, AVX, Enabled);
3491 } else if (Name == "fma4") {
3492 setXOPLevel(Features, FMA4, Enabled);
3493 } else if (Name == "xop") {
3494 setXOPLevel(Features, XOP, Enabled);
3495 } else if (Name == "sse4a") {
3496 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003497 } else if (Name == "f16c") {
3498 if (Enabled)
3499 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003500 } else if (Name == "sha") {
3501 if (Enabled)
3502 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003503 } else if (Name == "sse4") {
3504 // We can get here via the __target__ attribute since that's not controlled
3505 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3506 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3507 // disabled.
3508 if (Enabled)
3509 setSSELevel(Features, SSE42, Enabled);
3510 else
3511 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003512 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003513 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003514 Features["xsaveopt"] = false;
3515 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003516 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003517 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003518 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003519}
3520
Eric Christopher3ff21b32013-10-16 21:26:26 +00003521/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003522/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003523bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003524 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003525 for (const auto &Feature : Features) {
3526 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003527 continue;
3528
Eric Christopher610fe112015-08-26 08:21:55 +00003529 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003530 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003531 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003532 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003533 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003534 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003535 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003536 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003537 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003538 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003539 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003540 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003541 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003542 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003543 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003544 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003545 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003546 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003547 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003548 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003549 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003550 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003551 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003552 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003553 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003554 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003555 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003556 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003557 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003558 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003559 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003560 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003561 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003562 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003563 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003564 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003565 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003566 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003567 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003568 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003569 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003570 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003571 } else if (Feature == "+avx512vbmi") {
3572 HasAVX512VBMI = true;
3573 } else if (Feature == "+avx512ifma") {
3574 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003575 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003576 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003577 } else if (Feature == "+mpx") {
3578 HasMPX = true;
3579 } else if (Feature == "+movbe") {
3580 HasMOVBE = true;
3581 } else if (Feature == "+sgx") {
3582 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003583 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003584 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003585 } else if (Feature == "+fxsr") {
3586 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003587 } else if (Feature == "+xsave") {
3588 HasXSAVE = true;
3589 } else if (Feature == "+xsaveopt") {
3590 HasXSAVEOPT = true;
3591 } else if (Feature == "+xsavec") {
3592 HasXSAVEC = true;
3593 } else if (Feature == "+xsaves") {
3594 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003595 } else if (Feature == "+mwaitx") {
3596 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003597 } else if (Feature == "+pku") {
3598 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003599 } else if (Feature == "+clflushopt") {
3600 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003601 } else if (Feature == "+clwb") {
3602 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003603 } else if (Feature == "+prefetchwt1") {
3604 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003605 } else if (Feature == "+clzero") {
3606 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003607 }
3608
Benjamin Kramer27402c62012-03-05 15:10:44 +00003609 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003610 .Case("+avx512f", AVX512F)
3611 .Case("+avx2", AVX2)
3612 .Case("+avx", AVX)
3613 .Case("+sse4.2", SSE42)
3614 .Case("+sse4.1", SSE41)
3615 .Case("+ssse3", SSSE3)
3616 .Case("+sse3", SSE3)
3617 .Case("+sse2", SSE2)
3618 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003619 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003620 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003621
Eli Friedman33465822011-07-08 23:31:17 +00003622 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003623 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003624 .Case("+3dnowa", AMD3DNowAthlon)
3625 .Case("+3dnow", AMD3DNow)
3626 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003627 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003628 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003629
3630 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003631 .Case("+xop", XOP)
3632 .Case("+fma4", FMA4)
3633 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003634 .Default(NoXOP);
3635 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003636 }
Eli Friedman33465822011-07-08 23:31:17 +00003637
Rafael Espindolaeb265472013-08-21 21:59:03 +00003638 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3639 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003640 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3641 (FPMath == FP_387 && SSELevel >= SSE1)) {
3642 Diags.Report(diag::err_target_unsupported_fpmath) <<
3643 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003644 return false;
3645 }
3646
Alexey Bataev00396512015-07-02 03:40:19 +00003647 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003648 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003649 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003650}
Chris Lattnerecd49032009-03-02 22:27:17 +00003651
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003652/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3653/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003654void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003655 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003656 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003657 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003658 Builder.defineMacro("__amd64__");
3659 Builder.defineMacro("__amd64");
3660 Builder.defineMacro("__x86_64");
3661 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003662 if (getTriple().getArchName() == "x86_64h") {
3663 Builder.defineMacro("__x86_64h");
3664 Builder.defineMacro("__x86_64h__");
3665 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003666 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003667 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003668 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003669
Chris Lattnerecd49032009-03-02 22:27:17 +00003670 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003671 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3672 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003673 switch (CPU) {
3674 case CK_Generic:
3675 break;
3676 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003677 // The rest are coming from the i386 define above.
3678 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003679 break;
3680 case CK_i486:
3681 case CK_WinChipC6:
3682 case CK_WinChip2:
3683 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003684 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003685 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003686 case CK_PentiumMMX:
3687 Builder.defineMacro("__pentium_mmx__");
3688 Builder.defineMacro("__tune_pentium_mmx__");
3689 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003690 case CK_i586:
3691 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003692 defineCPUMacros(Builder, "i586");
3693 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003694 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003695 case CK_Pentium3:
3696 case CK_Pentium3M:
3697 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003698 Builder.defineMacro("__tune_pentium3__");
3699 // Fallthrough
3700 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003701 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003702 Builder.defineMacro("__tune_pentium2__");
3703 // Fallthrough
3704 case CK_PentiumPro:
3705 Builder.defineMacro("__tune_i686__");
3706 Builder.defineMacro("__tune_pentiumpro__");
3707 // Fallthrough
3708 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003709 Builder.defineMacro("__i686");
3710 Builder.defineMacro("__i686__");
3711 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3712 Builder.defineMacro("__pentiumpro");
3713 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003714 break;
3715 case CK_Pentium4:
3716 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003717 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003718 break;
3719 case CK_Yonah:
3720 case CK_Prescott:
3721 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003722 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003723 break;
3724 case CK_Core2:
3725 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003726 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003727 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003728 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003729 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003730 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003731 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003732 defineCPUMacros(Builder, "slm");
3733 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003734 case CK_Nehalem:
3735 case CK_Westmere:
3736 case CK_SandyBridge:
3737 case CK_IvyBridge:
3738 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003739 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003740 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003741 // FIXME: Historically, we defined this legacy name, it would be nice to
3742 // remove it at some point. We've never exposed fine-grained names for
3743 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003744 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003745 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003746 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003747 defineCPUMacros(Builder, "skx");
3748 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003749 case CK_Cannonlake:
3750 break;
Craig Topper449314e2013-08-20 07:09:39 +00003751 case CK_KNL:
3752 defineCPUMacros(Builder, "knl");
3753 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003754 case CK_Lakemont:
3755 Builder.defineMacro("__tune_lakemont__");
3756 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003757 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003758 Builder.defineMacro("__k6_2__");
3759 Builder.defineMacro("__tune_k6_2__");
3760 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003761 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003762 if (CPU != CK_K6_2) { // In case of fallthrough
3763 // FIXME: GCC may be enabling these in cases where some other k6
3764 // architecture is specified but -m3dnow is explicitly provided. The
3765 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003766 Builder.defineMacro("__k6_3__");
3767 Builder.defineMacro("__tune_k6_3__");
3768 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003769 // Fallthrough
3770 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003771 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003772 break;
3773 case CK_Athlon:
3774 case CK_AthlonThunderbird:
3775 case CK_Athlon4:
3776 case CK_AthlonXP:
3777 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003778 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003779 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003780 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003781 Builder.defineMacro("__tune_athlon_sse__");
3782 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003783 break;
3784 case CK_K8:
3785 case CK_K8SSE3:
3786 case CK_x86_64:
3787 case CK_Opteron:
3788 case CK_OpteronSSE3:
3789 case CK_Athlon64:
3790 case CK_Athlon64SSE3:
3791 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003792 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003793 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003794 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003795 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003796 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003797 case CK_BTVER1:
3798 defineCPUMacros(Builder, "btver1");
3799 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003800 case CK_BTVER2:
3801 defineCPUMacros(Builder, "btver2");
3802 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003803 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003804 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003805 break;
3806 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003807 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003808 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003809 case CK_BDVER3:
3810 defineCPUMacros(Builder, "bdver3");
3811 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003812 case CK_BDVER4:
3813 defineCPUMacros(Builder, "bdver4");
3814 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003815 case CK_ZNVER1:
3816 defineCPUMacros(Builder, "znver1");
3817 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003818 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003819 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003820 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003821 }
Chris Lattner96e43572009-03-02 22:40:39 +00003822
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003823 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003824 Builder.defineMacro("__REGISTER_PREFIX__", "");
3825
Chris Lattner6df41af2009-04-19 17:32:33 +00003826 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3827 // functions in glibc header files that use FP Stack inline asm which the
3828 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003829 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003830
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003831 if (HasAES)
3832 Builder.defineMacro("__AES__");
3833
Craig Topper3f122a72012-05-31 05:18:48 +00003834 if (HasPCLMUL)
3835 Builder.defineMacro("__PCLMUL__");
3836
Craig Topper22967d42011-12-25 05:06:45 +00003837 if (HasLZCNT)
3838 Builder.defineMacro("__LZCNT__");
3839
Benjamin Kramer1e250392012-07-07 09:39:18 +00003840 if (HasRDRND)
3841 Builder.defineMacro("__RDRND__");
3842
Craig Topper8c7f2512014-11-03 06:51:41 +00003843 if (HasFSGSBASE)
3844 Builder.defineMacro("__FSGSBASE__");
3845
Craig Topper22967d42011-12-25 05:06:45 +00003846 if (HasBMI)
3847 Builder.defineMacro("__BMI__");
3848
3849 if (HasBMI2)
3850 Builder.defineMacro("__BMI2__");
3851
Craig Topper1de83482011-12-29 16:10:46 +00003852 if (HasPOPCNT)
3853 Builder.defineMacro("__POPCNT__");
3854
Michael Liao625a8752012-11-10 05:17:46 +00003855 if (HasRTM)
3856 Builder.defineMacro("__RTM__");
3857
Michael Liao74f4eaf2013-03-26 17:52:08 +00003858 if (HasPRFCHW)
3859 Builder.defineMacro("__PRFCHW__");
3860
Michael Liaoffaae352013-03-29 05:17:55 +00003861 if (HasRDSEED)
3862 Builder.defineMacro("__RDSEED__");
3863
Robert Khasanov50e6f582014-09-19 09:53:48 +00003864 if (HasADX)
3865 Builder.defineMacro("__ADX__");
3866
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003867 if (HasTBM)
3868 Builder.defineMacro("__TBM__");
3869
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003870 if (HasMWAITX)
3871 Builder.defineMacro("__MWAITX__");
3872
Rafael Espindolae62e2792013-08-20 13:44:29 +00003873 switch (XOPLevel) {
3874 case XOP:
3875 Builder.defineMacro("__XOP__");
3876 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003877 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003878 case SSE4A:
3879 Builder.defineMacro("__SSE4A__");
3880 case NoXOP:
3881 break;
3882 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003883
Craig Topperbba778b2012-06-03 21:46:30 +00003884 if (HasFMA)
3885 Builder.defineMacro("__FMA__");
3886
Manman Rena45358c2012-10-11 00:59:55 +00003887 if (HasF16C)
3888 Builder.defineMacro("__F16C__");
3889
Craig Topper679b53a2013-08-21 05:29:10 +00003890 if (HasAVX512CD)
3891 Builder.defineMacro("__AVX512CD__");
3892 if (HasAVX512ER)
3893 Builder.defineMacro("__AVX512ER__");
3894 if (HasAVX512PF)
3895 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003896 if (HasAVX512DQ)
3897 Builder.defineMacro("__AVX512DQ__");
3898 if (HasAVX512BW)
3899 Builder.defineMacro("__AVX512BW__");
3900 if (HasAVX512VL)
3901 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003902 if (HasAVX512VBMI)
3903 Builder.defineMacro("__AVX512VBMI__");
3904 if (HasAVX512IFMA)
3905 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003906
Ben Langmuir58078d02013-09-19 13:22:04 +00003907 if (HasSHA)
3908 Builder.defineMacro("__SHA__");
3909
Craig Toppere33f51f2015-10-16 06:22:36 +00003910 if (HasFXSR)
3911 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003912 if (HasXSAVE)
3913 Builder.defineMacro("__XSAVE__");
3914 if (HasXSAVEOPT)
3915 Builder.defineMacro("__XSAVEOPT__");
3916 if (HasXSAVEC)
3917 Builder.defineMacro("__XSAVEC__");
3918 if (HasXSAVES)
3919 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003920 if (HasPKU)
3921 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003922 if (HasCX16)
3923 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003924 if (HasCLFLUSHOPT)
3925 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003926 if (HasCLWB)
3927 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003928 if (HasMPX)
3929 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003930 if (HasSGX)
3931 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003932 if (HasPREFETCHWT1)
3933 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003934 if (HasCLZERO)
3935 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003936
Chris Lattner96e43572009-03-02 22:40:39 +00003937 // Each case falls through to the previous one here.
3938 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003939 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003940 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003941 case AVX2:
3942 Builder.defineMacro("__AVX2__");
3943 case AVX:
3944 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003945 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003946 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003947 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003948 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003949 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003950 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003951 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003952 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003953 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003954 Builder.defineMacro("__SSE2__");
3955 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003956 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003957 Builder.defineMacro("__SSE__");
3958 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003959 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003960 break;
3961 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003962
Derek Schuffc7dd7222012-10-11 15:52:22 +00003963 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003964 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003965 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003966 case AVX2:
3967 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003968 case SSE42:
3969 case SSE41:
3970 case SSSE3:
3971 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003972 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003973 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003974 break;
3975 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003976 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003977 break;
3978 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003979 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003980 }
3981 }
3982
Anders Carlssone437c682010-01-27 03:47:49 +00003983 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003984 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003985 case AMD3DNowAthlon:
3986 Builder.defineMacro("__3dNOW_A__");
3987 case AMD3DNow:
3988 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003989 case MMX:
3990 Builder.defineMacro("__MMX__");
3991 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003992 break;
3993 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003994
3995 if (CPU >= CK_i486) {
3996 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3997 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3998 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3999 }
4000 if (CPU >= CK_i586)
4001 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004002}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004003
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004004bool X86TargetInfo::hasFeature(StringRef Feature) const {
4005 return llvm::StringSwitch<bool>(Feature)
4006 .Case("aes", HasAES)
4007 .Case("avx", SSELevel >= AVX)
4008 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004009 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004010 .Case("avx512cd", HasAVX512CD)
4011 .Case("avx512er", HasAVX512ER)
4012 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004013 .Case("avx512dq", HasAVX512DQ)
4014 .Case("avx512bw", HasAVX512BW)
4015 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004016 .Case("avx512vbmi", HasAVX512VBMI)
4017 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004018 .Case("bmi", HasBMI)
4019 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004020 .Case("clflushopt", HasCLFLUSHOPT)
4021 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004022 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004023 .Case("cx16", HasCX16)
4024 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004025 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004026 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004027 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004028 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004029 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004030 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4031 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4032 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004033 .Case("movbe", HasMOVBE)
4034 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004035 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004036 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004037 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004038 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004039 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004040 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004041 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004042 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004043 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004044 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004045 .Case("sse", SSELevel >= SSE1)
4046 .Case("sse2", SSELevel >= SSE2)
4047 .Case("sse3", SSELevel >= SSE3)
4048 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004049 .Case("sse4.1", SSELevel >= SSE41)
4050 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004051 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004052 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004053 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004054 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4055 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004056 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004057 .Case("xsave", HasXSAVE)
4058 .Case("xsavec", HasXSAVEC)
4059 .Case("xsaves", HasXSAVES)
4060 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004061 .Default(false);
4062}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004063
Eric Christopherd9832702015-06-29 21:00:05 +00004064// We can't use a generic validation scheme for the features accepted here
4065// versus subtarget features accepted in the target attribute because the
4066// bitfield structure that's initialized in the runtime only supports the
4067// below currently rather than the full range of subtarget features. (See
4068// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4069bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4070 return llvm::StringSwitch<bool>(FeatureStr)
4071 .Case("cmov", true)
4072 .Case("mmx", true)
4073 .Case("popcnt", true)
4074 .Case("sse", true)
4075 .Case("sse2", true)
4076 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004077 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004078 .Case("sse4.1", true)
4079 .Case("sse4.2", true)
4080 .Case("avx", true)
4081 .Case("avx2", true)
4082 .Case("sse4a", true)
4083 .Case("fma4", true)
4084 .Case("xop", true)
4085 .Case("fma", true)
4086 .Case("avx512f", true)
4087 .Case("bmi", true)
4088 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004089 .Case("aes", true)
4090 .Case("pclmul", true)
4091 .Case("avx512vl", true)
4092 .Case("avx512bw", true)
4093 .Case("avx512dq", true)
4094 .Case("avx512cd", true)
4095 .Case("avx512er", true)
4096 .Case("avx512pf", true)
4097 .Case("avx512vbmi", true)
4098 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004099 .Default(false);
4100}
4101
Eli Friedman3fd920a2008-08-20 02:34:37 +00004102bool
Anders Carlsson58436352009-02-28 17:11:49 +00004103X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004104 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004105 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004106 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004107 // Constant constraints.
4108 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4109 // instructions.
4110 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4111 // x86_64 instructions.
4112 case 's':
4113 Info.setRequiresImmediate();
4114 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004115 case 'I':
4116 Info.setRequiresImmediate(0, 31);
4117 return true;
4118 case 'J':
4119 Info.setRequiresImmediate(0, 63);
4120 return true;
4121 case 'K':
4122 Info.setRequiresImmediate(-128, 127);
4123 return true;
4124 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004125 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004126 return true;
4127 case 'M':
4128 Info.setRequiresImmediate(0, 3);
4129 return true;
4130 case 'N':
4131 Info.setRequiresImmediate(0, 255);
4132 return true;
4133 case 'O':
4134 Info.setRequiresImmediate(0, 127);
4135 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004136 // Register constraints.
4137 case 'Y': // 'Y' is the first character for several 2-character constraints.
4138 // Shift the pointer to the second character of the constraint.
4139 Name++;
4140 switch (*Name) {
4141 default:
4142 return false;
4143 case '0': // First SSE register.
4144 case 't': // Any SSE register, when SSE2 is enabled.
4145 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4146 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004147 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004148 Info.setAllowsRegister();
4149 return true;
4150 }
4151 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004152 // Constraint 'f' cannot be used for output operands.
4153 if (Info.ConstraintStr[0] == '=')
4154 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004155 Info.setAllowsRegister();
4156 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004157 case 'a': // eax.
4158 case 'b': // ebx.
4159 case 'c': // ecx.
4160 case 'd': // edx.
4161 case 'S': // esi.
4162 case 'D': // edi.
4163 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004164 case 't': // Top of floating point stack.
4165 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004166 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004167 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004168 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004169 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004170 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4171 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004172 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004173 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4174 case 'l': // "Index" registers: any general register that can be used as an
4175 // index in a base+index memory access.
4176 Info.setAllowsRegister();
4177 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004178 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004179 case 'C': // SSE floating point constant.
4180 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004181 return true;
4182 }
4183}
4184
Akira Hatanaka974131e2014-09-18 18:17:18 +00004185bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4186 unsigned Size) const {
4187 // Strip off constraint modifiers.
4188 while (Constraint[0] == '=' ||
4189 Constraint[0] == '+' ||
4190 Constraint[0] == '&')
4191 Constraint = Constraint.substr(1);
4192
4193 return validateOperandSize(Constraint, Size);
4194}
4195
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004196bool X86TargetInfo::validateInputSize(StringRef Constraint,
4197 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004198 return validateOperandSize(Constraint, Size);
4199}
4200
4201bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4202 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004203 switch (Constraint[0]) {
4204 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004205 case 'k':
4206 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004207 case 'y':
4208 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004209 case 'f':
4210 case 't':
4211 case 'u':
4212 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004213 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004214 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004215 if (SSELevel >= AVX512F)
4216 // 512-bit zmm registers can be used if target supports AVX512F.
4217 return Size <= 512U;
4218 else if (SSELevel >= AVX)
4219 // 256-bit ymm registers can be used if target supports AVX.
4220 return Size <= 256U;
4221 return Size <= 128U;
4222 case 'Y':
4223 // 'Y' is the first character for several 2-character constraints.
4224 switch (Constraint[1]) {
4225 default: break;
4226 case 'm':
4227 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004228 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004229 return Size <= 64;
4230 case 'i':
4231 case 't':
4232 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4233 if (SSELevel >= AVX512F)
4234 return Size <= 512U;
4235 else if (SSELevel >= AVX)
4236 return Size <= 256U;
4237 return SSELevel >= SSE2 && Size <= 128U;
4238 }
4239
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004240 }
4241
4242 return true;
4243}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004244
Eli Friedman3fd920a2008-08-20 02:34:37 +00004245std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004246X86TargetInfo::convertConstraint(const char *&Constraint) const {
4247 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004248 case 'a': return std::string("{ax}");
4249 case 'b': return std::string("{bx}");
4250 case 'c': return std::string("{cx}");
4251 case 'd': return std::string("{dx}");
4252 case 'S': return std::string("{si}");
4253 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004254 case 'p': // address
4255 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004256 case 't': // top of floating point stack.
4257 return std::string("{st}");
4258 case 'u': // second from top of floating point stack.
4259 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004260 case 'Y':
4261 switch (Constraint[1]) {
4262 default:
4263 // Break from inner switch and fall through (copy single char),
4264 // continue parsing after copying the current constraint into
4265 // the return string.
4266 break;
4267 case 'k':
4268 // "^" hints llvm that this is a 2 letter constraint.
4269 // "Constraint++" is used to promote the string iterator
4270 // to the next constraint.
4271 return std::string("^") + std::string(Constraint++, 2);
4272 }
4273 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004274 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004275 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004276 }
4277}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004278
Eli Friedman3fd920a2008-08-20 02:34:37 +00004279// X86-32 generic target
4280class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004281public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004282 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4283 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004284 DoubleAlign = LongLongAlign = 32;
4285 LongDoubleWidth = 96;
4286 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004287 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004288 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004289 SizeType = UnsignedInt;
4290 PtrDiffType = SignedInt;
4291 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004292 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004293
4294 // Use fpret for all types.
4295 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4296 (1 << TargetInfo::Double) |
4297 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004298
4299 // x86-32 has atomics up to 8 bytes
4300 // FIXME: Check that we actually have cmpxchg8b before setting
4301 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4302 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004303 }
Craig Topper3164f332014-03-11 03:39:26 +00004304 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004305 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004306 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004307
Craig Topper3164f332014-03-11 03:39:26 +00004308 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004309 if (RegNo == 0) return 0;
4310 if (RegNo == 1) return 2;
4311 return -1;
4312 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004313 bool validateOperandSize(StringRef Constraint,
4314 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004315 switch (Constraint[0]) {
4316 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004317 case 'R':
4318 case 'q':
4319 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004320 case 'a':
4321 case 'b':
4322 case 'c':
4323 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004324 case 'S':
4325 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004326 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004327 case 'A':
4328 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004329 }
4330
Akira Hatanaka974131e2014-09-18 18:17:18 +00004331 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004332 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004333 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4334 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4335 Builtin::FirstTSBuiltin + 1);
4336 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004337};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004338
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004339class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4340public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004341 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4342 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004343
Craig Topper3164f332014-03-11 03:39:26 +00004344 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004345 unsigned Major, Minor, Micro;
4346 getTriple().getOSVersion(Major, Minor, Micro);
4347 // New NetBSD uses the default rounding mode.
4348 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4349 return X86_32TargetInfo::getFloatEvalMethod();
4350 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004351 return 1;
4352 }
4353};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004354
Eli Friedmane3aa4542009-07-05 18:47:56 +00004355class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4356public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004357 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4358 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004359 SizeType = UnsignedLong;
4360 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004361 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004362 }
4363};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004364
Eli Friedman9fa28852012-08-08 23:57:20 +00004365class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4366public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004367 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4368 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004369 SizeType = UnsignedLong;
4370 IntPtrType = SignedLong;
4371 PtrDiffType = SignedLong;
4372 }
4373};
Eli Friedman9fa28852012-08-08 23:57:20 +00004374
Torok Edwinb2b37c62009-06-30 17:10:35 +00004375class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004376public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004377 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4378 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004379 LongDoubleWidth = 128;
4380 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004381 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004382 MaxVectorAlign = 256;
4383 // The watchOS simulator uses the builtin bool type for Objective-C.
4384 llvm::Triple T = llvm::Triple(Triple);
4385 if (T.isWatchOS())
4386 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004387 SizeType = UnsignedLong;
4388 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004389 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004390 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004391 }
4392
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004393 bool handleTargetFeatures(std::vector<std::string> &Features,
4394 DiagnosticsEngine &Diags) override {
4395 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4396 Diags))
4397 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004398 // We now know the features we have: we can decide how to align vectors.
4399 MaxVectorAlign =
4400 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004401 return true;
4402 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004403};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004404
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004405// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004406class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004407public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004408 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4409 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004410 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004411 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004412 bool IsWinCOFF =
4413 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004414 resetDataLayout(IsWinCOFF
4415 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4416 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004417 }
Craig Topper3164f332014-03-11 03:39:26 +00004418 void getTargetDefines(const LangOptions &Opts,
4419 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004420 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4421 }
4422};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004423
4424// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004425class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004427 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4428 const TargetOptions &Opts)
4429 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004430 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004431 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004432 }
Craig Topper3164f332014-03-11 03:39:26 +00004433 void getTargetDefines(const LangOptions &Opts,
4434 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004435 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4436 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4437 // The value of the following reflects processor type.
4438 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4439 // We lost the original triple, so we use the default.
4440 Builder.defineMacro("_M_IX86", "600");
4441 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004442};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004443
David Majnemerae1ed0e2015-05-28 04:36:18 +00004444static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004445 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4446 // supports __declspec natively under -fms-extensions, but we define a no-op
4447 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004448 if (Opts.MicrosoftExt)
4449 Builder.defineMacro("__declspec", "__declspec");
4450 else
4451 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4452
4453 if (!Opts.MicrosoftExt) {
4454 // Provide macros for all the calling convention keywords. Provide both
4455 // single and double underscore prefixed variants. These are available on
4456 // x64 as well as x86, even though they have no effect.
4457 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4458 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004459 std::string GCCSpelling = "__attribute__((__";
4460 GCCSpelling += CC;
4461 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004462 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4463 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4464 }
4465 }
4466}
4467
David Majnemerae1ed0e2015-05-28 04:36:18 +00004468static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4469 Builder.defineMacro("__MSVCRT__");
4470 Builder.defineMacro("__MINGW32__");
4471 addCygMingDefines(Opts, Builder);
4472}
4473
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004474// x86-32 MinGW target
4475class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004477 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4478 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004479 void getTargetDefines(const LangOptions &Opts,
4480 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004481 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004482 DefineStd(Builder, "WIN32", Opts);
4483 DefineStd(Builder, "WINNT", Opts);
4484 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004485 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004486 }
4487};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004488
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004489// x86-32 Cygwin target
4490class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4491public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004492 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4493 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004494 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004495 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004496 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 +00004497 }
Craig Topper3164f332014-03-11 03:39:26 +00004498 void getTargetDefines(const LangOptions &Opts,
4499 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004500 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004501 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004502 Builder.defineMacro("__CYGWIN__");
4503 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004504 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004505 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004506 if (Opts.CPlusPlus)
4507 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004508 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004509};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004510
Chris Lattnerb986aba2010-04-11 19:29:39 +00004511// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004512class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004513public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004514 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004515 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004516 }
Craig Topper3164f332014-03-11 03:39:26 +00004517 void getTargetDefines(const LangOptions &Opts,
4518 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004519 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004520 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004521 }
4522};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004523
Alexey Bataevc99b0492015-11-25 09:24:26 +00004524// X86-32 MCU target
4525class MCUX86_32TargetInfo : public X86_32TargetInfo {
4526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004527 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4528 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004529 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004530 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004531 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 +00004532 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004533 }
4534
4535 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4536 // On MCU we support only C calling convention.
4537 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4538 }
4539
4540 void getTargetDefines(const LangOptions &Opts,
4541 MacroBuilder &Builder) const override {
4542 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4543 Builder.defineMacro("__iamcu");
4544 Builder.defineMacro("__iamcu__");
4545 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004546
4547 bool allowsLargerPreferedTypeAlignment() const override {
4548 return false;
4549 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004550};
4551
Douglas Gregor9fabd852011-07-01 22:41:14 +00004552// RTEMS Target
4553template<typename Target>
4554class RTEMSTargetInfo : public OSTargetInfo<Target> {
4555protected:
Craig Topper3164f332014-03-11 03:39:26 +00004556 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4557 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004558 // RTEMS defines; list based off of gcc output
4559
Douglas Gregor9fabd852011-07-01 22:41:14 +00004560 Builder.defineMacro("__rtems__");
4561 Builder.defineMacro("__ELF__");
4562 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004563
Douglas Gregor9fabd852011-07-01 22:41:14 +00004564public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004565 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4566 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004567 switch (Triple.getArch()) {
4568 default:
4569 case llvm::Triple::x86:
4570 // this->MCountName = ".mcount";
4571 break;
4572 case llvm::Triple::mips:
4573 case llvm::Triple::mipsel:
4574 case llvm::Triple::ppc:
4575 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004576 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004577 // this->MCountName = "_mcount";
4578 break;
4579 case llvm::Triple::arm:
4580 // this->MCountName = "__mcount";
4581 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004582 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004583 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004584};
4585
Douglas Gregor9fabd852011-07-01 22:41:14 +00004586// x86-32 RTEMS target
4587class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4588public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004589 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4590 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004591 SizeType = UnsignedLong;
4592 IntPtrType = SignedLong;
4593 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004594 }
Craig Topper3164f332014-03-11 03:39:26 +00004595 void getTargetDefines(const LangOptions &Opts,
4596 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004597 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4598 Builder.defineMacro("__INTEL__");
4599 Builder.defineMacro("__rtems__");
4600 }
4601};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004602
Eli Friedman3fd920a2008-08-20 02:34:37 +00004603// x86-64 generic target
4604class X86_64TargetInfo : public X86TargetInfo {
4605public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004606 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4607 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004608 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004609 bool IsWinCOFF =
4610 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004611 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004612 LongDoubleWidth = 128;
4613 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004614 LargeArrayMinWidth = 128;
4615 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004616 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004617 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4618 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4619 IntPtrType = IsX32 ? SignedInt : SignedLong;
4620 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004621 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004622 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004623
Eric Christopher917e9522014-11-18 22:36:15 +00004624 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004625 resetDataLayout(IsX32
4626 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4627 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4628 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004629
4630 // Use fpret only for long double.
4631 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004632
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004633 // Use fp2ret for _Complex long double.
4634 ComplexLongDoubleUsesFP2Ret = true;
4635
Charles Davisc7d5c942015-09-17 20:55:33 +00004636 // Make __builtin_ms_va_list available.
4637 HasBuiltinMSVaList = true;
4638
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004639 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004640 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004641 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004642 }
Craig Topper3164f332014-03-11 03:39:26 +00004643 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004644 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004645 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004646
Craig Topper3164f332014-03-11 03:39:26 +00004647 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004648 if (RegNo == 0) return 0;
4649 if (RegNo == 1) return 1;
4650 return -1;
4651 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004652
Craig Topper3164f332014-03-11 03:39:26 +00004653 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004654 switch (CC) {
4655 case CC_C:
4656 case CC_Swift:
4657 case CC_X86VectorCall:
4658 case CC_IntelOclBicc:
4659 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004660 case CC_PreserveMost:
4661 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004662 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004663 return CCCR_OK;
4664 default:
4665 return CCCR_Warning;
4666 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004667 }
4668
Craig Topper3164f332014-03-11 03:39:26 +00004669 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004670 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004671 }
4672
Pavel Chupinfd223e12014-08-04 12:39:43 +00004673 // for x32 we need it here explicitly
4674 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004675 unsigned getUnwindWordWidth() const override { return 64; }
4676 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004677
4678 bool validateGlobalRegisterVariable(StringRef RegName,
4679 unsigned RegSize,
4680 bool &HasSizeMismatch) const override {
4681 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4682 // handle.
4683 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4684 // Check that the register size is 64-bit.
4685 HasSizeMismatch = RegSize != 64;
4686 return true;
4687 }
4688
4689 // Check if the register is a 32-bit register the backend can handle.
4690 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4691 HasSizeMismatch);
4692 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004693 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4694 return llvm::makeArrayRef(BuiltinInfoX86,
4695 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4696 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004697};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004698
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004699// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004700class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004701public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004702 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4703 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004704 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004705 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004706 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004707 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004708 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004709 SizeType = UnsignedLongLong;
4710 PtrDiffType = SignedLongLong;
4711 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004712 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004713
Craig Topper3164f332014-03-11 03:39:26 +00004714 void getTargetDefines(const LangOptions &Opts,
4715 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004716 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004717 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004718 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004719
Craig Topper3164f332014-03-11 03:39:26 +00004720 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004721 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004722 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004723
Craig Topper3164f332014-03-11 03:39:26 +00004724 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004725 switch (CC) {
4726 case CC_X86StdCall:
4727 case CC_X86ThisCall:
4728 case CC_X86FastCall:
4729 return CCCR_Ignore;
4730 case CC_C:
4731 case CC_X86VectorCall:
4732 case CC_IntelOclBicc:
4733 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004734 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004735 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004736 return CCCR_OK;
4737 default:
4738 return CCCR_Warning;
4739 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004740 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004741};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004742
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004743// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004744class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004745public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004746 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4747 const TargetOptions &Opts)
4748 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004749 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004750 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004751 }
Craig Topper3164f332014-03-11 03:39:26 +00004752 void getTargetDefines(const LangOptions &Opts,
4753 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004754 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4755 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004756 Builder.defineMacro("_M_X64", "100");
4757 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004758 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004759};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004760
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004761// x86-64 MinGW target
4762class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4763public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004764 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4765 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004766 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4767 // with x86 FP ops. Weird.
4768 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004769 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004770 }
4771
Craig Topper3164f332014-03-11 03:39:26 +00004772 void getTargetDefines(const LangOptions &Opts,
4773 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004774 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004775 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004776 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004777 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004778
4779 // GCC defines this macro when it is using __gxx_personality_seh0.
4780 if (!Opts.SjLjExceptions)
4781 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004782 }
4783};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004784
Yaron Kerend030d112015-07-22 17:38:19 +00004785// x86-64 Cygwin target
4786class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4787public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004788 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4789 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004790 TLSSupported = false;
4791 WCharType = UnsignedShort;
4792 }
4793 void getTargetDefines(const LangOptions &Opts,
4794 MacroBuilder &Builder) const override {
4795 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4796 Builder.defineMacro("__x86_64__");
4797 Builder.defineMacro("__CYGWIN__");
4798 Builder.defineMacro("__CYGWIN64__");
4799 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004800 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004801 if (Opts.CPlusPlus)
4802 Builder.defineMacro("_GNU_SOURCE");
4803
4804 // GCC defines this macro when it is using __gxx_personality_seh0.
4805 if (!Opts.SjLjExceptions)
4806 Builder.defineMacro("__SEH__");
4807 }
4808};
4809
Eli Friedman2857ccb2009-07-01 03:36:11 +00004810class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4811public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004812 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4813 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004814 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004815 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4816 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004817 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004818 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004819 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004820 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004821
4822 bool handleTargetFeatures(std::vector<std::string> &Features,
4823 DiagnosticsEngine &Diags) override {
4824 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4825 Diags))
4826 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004827 // We now know the features we have: we can decide how to align vectors.
4828 MaxVectorAlign =
4829 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004830 return true;
4831 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004832};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004833
Eli Friedman245f2292009-07-05 22:31:18 +00004834class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4835public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004836 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4837 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004838 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004839 Int64Type = SignedLongLong;
4840 }
4841};
Eli Friedman245f2292009-07-05 22:31:18 +00004842
Eli Friedman9fa28852012-08-08 23:57:20 +00004843class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004845 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4846 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004847 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004848 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004849 }
4850};
Tim Northover9bb857a2013-01-31 12:13:10 +00004851
Eli Friedmanf05b7722008-08-20 07:44:10 +00004852class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004853 // Possible FPU choices.
4854 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004855 VFP2FPU = (1 << 0),
4856 VFP3FPU = (1 << 1),
4857 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004858 NeonFPU = (1 << 3),
4859 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004860 };
4861
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004862 // Possible HWDiv features.
4863 enum HWDivMode {
4864 HWDivThumb = (1 << 0),
4865 HWDivARM = (1 << 1)
4866 };
4867
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004868 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004869 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004870 }
4871
4872 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4873 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004874
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004875 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004876
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004877 StringRef CPUProfile;
4878 StringRef CPUAttr;
4879
Rafael Espindolaeb265472013-08-21 21:59:03 +00004880 enum {
4881 FP_Default,
4882 FP_VFP,
4883 FP_Neon
4884 } FPMath;
4885
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004886 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004887 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004888 unsigned ArchProfile;
4889 unsigned ArchVersion;
4890
Bernard Ogdenda13af32013-10-24 18:32:51 +00004891 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004892
Logan Chien57086ce2012-10-10 06:56:20 +00004893 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004894 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004895
4896 // Initialized via features.
4897 unsigned SoftFloat : 1;
4898 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004899
Bernard Ogden18b57012013-10-29 09:47:51 +00004900 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004901 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004902 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004903 unsigned Unaligned : 1;
4904
4905 enum {
4906 LDREX_B = (1 << 0), /// byte (8-bit)
4907 LDREX_H = (1 << 1), /// half (16-bit)
4908 LDREX_W = (1 << 2), /// word (32-bit)
4909 LDREX_D = (1 << 3), /// double (64-bit)
4910 };
4911
4912 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004913
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004914 // ACLE 6.5.1 Hardware floating point
4915 enum {
4916 HW_FP_HP = (1 << 1), /// half (16-bit)
4917 HW_FP_SP = (1 << 2), /// single (32-bit)
4918 HW_FP_DP = (1 << 3), /// double (64-bit)
4919 };
4920 uint32_t HW_FP;
4921
Chris Lattner5cc15e02010-03-03 19:03:45 +00004922 static const Builtin::Info BuiltinInfo[];
4923
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004924 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004925 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004926
4927 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004928 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004929
Renato Golin0201a9e2016-09-22 19:28:20 +00004930 // size_t is unsigned long on MachO-derived environments, NetBSD,
4931 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004932 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004933 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004934 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004935 SizeType = UnsignedLong;
4936 else
4937 SizeType = UnsignedInt;
4938
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004939 switch (T.getOS()) {
4940 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004941 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004942 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004943 break;
4944 case llvm::Triple::Win32:
4945 WCharType = UnsignedShort;
4946 break;
4947 case llvm::Triple::Linux:
4948 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004949 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4950 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004951 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004952 }
4953
4954 UseBitFieldTypeAlignment = true;
4955
4956 ZeroLengthBitfieldBoundary = 0;
4957
Tim Northover147cd2f2014-10-14 22:12:21 +00004958 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4959 // so set preferred for small types to 32.
4960 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004961 resetDataLayout(BigEndian
4962 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4963 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004964 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004965 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004966 resetDataLayout("e"
4967 "-m:w"
4968 "-p:32:32"
4969 "-i64:64"
4970 "-v128:64:128"
4971 "-a:0:32"
4972 "-n32"
4973 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004974 } else if (T.isOSNaCl()) {
4975 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004976 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004977 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004978 resetDataLayout(BigEndian
4979 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4980 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004981 }
4982
4983 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004984 }
4985
Tim Northover5627d392015-10-30 16:30:45 +00004986 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004987 const llvm::Triple &T = getTriple();
4988
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004989 IsAAPCS = false;
4990
Tim Northover5627d392015-10-30 16:30:45 +00004991 if (IsAAPCS16)
4992 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4993 else
4994 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004995
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004996 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004997 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004998 SizeType = UnsignedInt;
4999 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005000 SizeType = UnsignedLong;
5001
5002 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5003 WCharType = SignedInt;
5004
5005 // Do not respect the alignment of bit-field types when laying out
5006 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5007 UseBitFieldTypeAlignment = false;
5008
5009 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5010 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5011 /// gcc.
5012 ZeroLengthBitfieldBoundary = 32;
5013
Tim Northover5627d392015-10-30 16:30:45 +00005014 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5015 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005016 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005017 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005018 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005019 BigEndian
5020 ? "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 +00005021 : "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 +00005022 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005023 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005024 BigEndian
5025 ? "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 +00005026 : "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 +00005027
5028 // FIXME: Override "preferred align" for double and long long.
5029 }
5030
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005031 void setArchInfo() {
5032 StringRef ArchName = getTriple().getArchName();
5033
Renato Goline84b0002015-10-08 16:43:26 +00005034 ArchISA = llvm::ARM::parseArchISA(ArchName);
5035 CPU = llvm::ARM::getDefaultCPU(ArchName);
5036 unsigned AK = llvm::ARM::parseArch(ArchName);
5037 if (AK != llvm::ARM::AK_INVALID)
5038 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005039 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005040 }
5041
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005042 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005043 StringRef SubArch;
5044
5045 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005046 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005047 SubArch = llvm::ARM::getSubArch(ArchKind);
5048 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5049 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005050
5051 // cache CPU related strings
5052 CPUAttr = getCPUAttr();
5053 CPUProfile = getCPUProfile();
5054 }
5055
5056 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005057 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005058 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005059 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005060 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5061 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005062 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005063 if (ArchProfile == llvm::ARM::PK_M) {
5064 MaxAtomicPromoteWidth = 32;
5065 if (ShouldUseInlineAtomic)
5066 MaxAtomicInlineWidth = 32;
5067 }
5068 else {
5069 MaxAtomicPromoteWidth = 64;
5070 if (ShouldUseInlineAtomic)
5071 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005072 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005073 }
5074
5075 bool isThumb() const {
5076 return (ArchISA == llvm::ARM::IK_THUMB);
5077 }
5078
5079 bool supportsThumb() const {
5080 return CPUAttr.count('T') || ArchVersion >= 6;
5081 }
5082
5083 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005084 return CPUAttr.equals("6T2") ||
5085 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005086 }
5087
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005088 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005089 // For most sub-arches, the build attribute CPU name is enough.
5090 // For Cortex variants, it's slightly different.
5091 switch(ArchKind) {
5092 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005093 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005094 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005095 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005096 case llvm::ARM::AK_ARMV7S:
5097 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005098 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005099 return "7A";
5100 case llvm::ARM::AK_ARMV7R:
5101 return "7R";
5102 case llvm::ARM::AK_ARMV7M:
5103 return "7M";
5104 case llvm::ARM::AK_ARMV7EM:
5105 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005106 case llvm::ARM::AK_ARMV7VE:
5107 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005108 case llvm::ARM::AK_ARMV8A:
5109 return "8A";
5110 case llvm::ARM::AK_ARMV8_1A:
5111 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005112 case llvm::ARM::AK_ARMV8_2A:
5113 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005114 case llvm::ARM::AK_ARMV8MBaseline:
5115 return "8M_BASE";
5116 case llvm::ARM::AK_ARMV8MMainline:
5117 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005118 case llvm::ARM::AK_ARMV8R:
5119 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005120 }
5121 }
5122
5123 StringRef getCPUProfile() const {
5124 switch(ArchProfile) {
5125 case llvm::ARM::PK_A:
5126 return "A";
5127 case llvm::ARM::PK_R:
5128 return "R";
5129 case llvm::ARM::PK_M:
5130 return "M";
5131 default:
5132 return "";
5133 }
5134 }
5135
Chris Lattner17df24e2008-04-21 18:56:49 +00005136public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005137 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005138 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5139 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005140
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005141 switch (getTriple().getOS()) {
5142 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005143 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005144 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005145 break;
5146 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005147 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005148 break;
5149 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005150
Renato Goline84b0002015-10-08 16:43:26 +00005151 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005152 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005153
Chris Lattner1a8f3942010-04-23 16:29:58 +00005154 // {} in inline assembly are neon specifiers, not assembly variant
5155 // specifiers.
5156 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005157
Eric Christopher0e261882014-12-05 01:06:59 +00005158 // FIXME: This duplicates code from the driver that sets the -target-abi
5159 // option - this code is used if -target-abi isn't passed and should
5160 // be unified in some way.
5161 if (Triple.isOSBinFormatMachO()) {
5162 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5163 // the frontend matches that.
5164 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5165 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005166 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005167 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005168 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005169 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005170 } else {
5171 setABI("apcs-gnu");
5172 }
5173 } else if (Triple.isOSWindows()) {
5174 // FIXME: this is invalid for WindowsCE
5175 setABI("aapcs");
5176 } else {
5177 // Select the default based on the platform.
5178 switch (Triple.getEnvironment()) {
5179 case llvm::Triple::Android:
5180 case llvm::Triple::GNUEABI:
5181 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005182 case llvm::Triple::MuslEABI:
5183 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005184 setABI("aapcs-linux");
5185 break;
5186 case llvm::Triple::EABIHF:
5187 case llvm::Triple::EABI:
5188 setABI("aapcs");
5189 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005190 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005191 setABI("apcs-gnu");
5192 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005193 default:
5194 if (Triple.getOS() == llvm::Triple::NetBSD)
5195 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005196 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5197 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005198 else
5199 setABI("aapcs");
5200 break;
5201 }
5202 }
John McCall86353412010-08-21 22:46:04 +00005203
5204 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005205 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005206
Renato Golin15b86152015-07-03 16:41:13 +00005207 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005208 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005209
James Molloya7139222012-03-12 09:14:10 +00005210 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005211 // the alignment of the zero-length bitfield is greater than the member
5212 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005213 // zero length bitfield.
5214 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005215
5216 if (Triple.getOS() == llvm::Triple::Linux ||
5217 Triple.getOS() == llvm::Triple::UnknownOS)
5218 this->MCountName =
5219 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005220 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005221
Alp Toker4925ba72014-06-07 23:30:42 +00005222 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005223
Craig Topper3164f332014-03-11 03:39:26 +00005224 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005225 ABI = Name;
5226
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005227 // The defaults (above) are for AAPCS, check if we need to change them.
5228 //
5229 // FIXME: We need support for -meabi... we could just mangle it into the
5230 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005231 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005232 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005233 return true;
5234 }
5235 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5236 setABIAAPCS();
5237 return true;
5238 }
5239 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005240 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005241
Renato Golinf5c4dec2015-05-27 13:33:00 +00005242 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005243 bool
5244 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5245 StringRef CPU,
5246 const std::vector<std::string> &FeaturesVec) const override {
5247
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005248 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005249 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005250
5251 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005252 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005253 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5254
5255 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005256 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005257 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5258
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005259 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005260 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005261 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005262
Eric Christopher007b0a02015-08-28 22:32:01 +00005263 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005264 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005265
Craig Topper3164f332014-03-11 03:39:26 +00005266 bool handleTargetFeatures(std::vector<std::string> &Features,
5267 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005268 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005269 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005270 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005271 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005272 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005273 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005274 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005275
Ranjeet Singhac08e532015-06-24 23:39:25 +00005276 // This does not diagnose illegal cases like having both
5277 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5278 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005279 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005280 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005281 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005282 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005283 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005284 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005285 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005286 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005287 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005288 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005289 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005290 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005291 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005292 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005293 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005294 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005295 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005296 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005297 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005298 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005299 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005300 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005301 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005302 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005303 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005304 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005305 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005306 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005307 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005308 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005309 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005310 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005311 } else if (Feature == "+strict-align") {
5312 Unaligned = 0;
5313 } else if (Feature == "+fp16") {
5314 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005315 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005316 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005317 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005318
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005319 switch (ArchVersion) {
5320 case 6:
5321 if (ArchProfile == llvm::ARM::PK_M)
5322 LDREX = 0;
5323 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5324 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5325 else
5326 LDREX = LDREX_W;
5327 break;
5328 case 7:
5329 if (ArchProfile == llvm::ARM::PK_M)
5330 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5331 else
5332 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5333 break;
5334 case 8:
5335 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5336 }
5337
Rafael Espindolaeb265472013-08-21 21:59:03 +00005338 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5339 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5340 return false;
5341 }
5342
5343 if (FPMath == FP_Neon)
5344 Features.push_back("+neonfp");
5345 else if (FPMath == FP_VFP)
5346 Features.push_back("-neonfp");
5347
Daniel Dunbar893d4752009-12-19 04:15:38 +00005348 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005349 auto Feature =
5350 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5351 if (Feature != Features.end())
5352 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005353
Rafael Espindolaeb265472013-08-21 21:59:03 +00005354 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005355 }
5356
Craig Topper3164f332014-03-11 03:39:26 +00005357 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005358 return llvm::StringSwitch<bool>(Feature)
5359 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005360 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005361 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005362 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005363 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005364 .Case("hwdiv", HWDiv & HWDivThumb)
5365 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005366 .Default(false);
5367 }
Renato Golin15b86152015-07-03 16:41:13 +00005368
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005369 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005370 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005371 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005372
Renato Golin15b86152015-07-03 16:41:13 +00005373 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005374 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005375 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005376 CPU = Name;
5377 return true;
5378 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005379
Craig Topper3164f332014-03-11 03:39:26 +00005380 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005381
Craig Topper3164f332014-03-11 03:39:26 +00005382 void getTargetDefines(const LangOptions &Opts,
5383 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005384 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005385 Builder.defineMacro("__arm");
5386 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005387 // For bare-metal none-eabi.
5388 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5389 getTriple().getEnvironment() == llvm::Triple::EABI)
5390 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005391
Chris Lattnerecd49032009-03-02 22:27:17 +00005392 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005393 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005394
5395 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5396 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005397 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005398 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5399
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005400 if (!CPUAttr.empty())
5401 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005402
5403 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005404 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005405 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005406
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005407 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005408 // ACLE 6.5.7 Crypto Extension
5409 if (Crypto)
5410 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5411 // ACLE 6.5.8 CRC32 Extension
5412 if (CRC)
5413 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5414 // ACLE 6.5.10 Numeric Maximum and Minimum
5415 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5416 // ACLE 6.5.9 Directed Rounding
5417 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005418 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005419
5420 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5421 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005422 // NOTE that the default profile is assumed to be 'A'
5423 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005424 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5425
Bradley Smithf4affc12016-03-03 13:52:22 +00005426 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5427 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5428 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5429 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005430 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005431 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005432 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005433 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5434
5435 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5436 // instruction set such as ARM or Thumb.
5437 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5438
5439 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5440
5441 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005442 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005443 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005444
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005445 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005446 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005447 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005448
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005449 // ACLE 6.4.4 LDREX/STREX
5450 if (LDREX)
5451 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5452
5453 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005454 if (ArchVersion == 5 ||
5455 (ArchVersion == 6 && CPUProfile != "M") ||
5456 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005457 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5458
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005459 // ACLE 6.5.1 Hardware Floating Point
5460 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005461 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005462
Yi Konga44c4d72014-06-27 21:25:42 +00005463 // ACLE predefines.
5464 Builder.defineMacro("__ARM_ACLE", "200");
5465
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005466 // FP16 support (we currently only support IEEE format).
5467 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5468 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5469
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005470 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005471 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005472 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5473
Mike Stump9d54bd72009-04-08 02:07:04 +00005474 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005475
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005476 // FIXME: It's more complicated than this and we don't really support
5477 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005478 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005479 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005480 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005481
David Tweed8f676532012-10-25 13:33:01 +00005482 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005483 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005484 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005485 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005486 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005487 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005488 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005489
Tim Northover28fc0e12016-04-28 13:59:55 +00005490 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5491 ABI == "aapcs16")
5492 Builder.defineMacro("__ARM_PCS_VFP", "1");
5493
Daniel Dunbar893d4752009-12-19 04:15:38 +00005494 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005495 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005496
Zijiao Ma56a83722016-08-17 02:13:33 +00005497 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005498 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005499
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005500 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005501 Builder.defineMacro("__THUMBEL__");
5502 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005503 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005504 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005505 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005506
5507 // ACLE 6.4.9 32-bit SIMD instructions
5508 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5509 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5510
5511 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005512 if (((HWDiv & HWDivThumb) && isThumb()) ||
5513 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005514 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005515 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005516 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005517
5518 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005519 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005520
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005521 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005522 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005523 if (FPU & VFP2FPU)
5524 Builder.defineMacro("__ARM_VFPV2__");
5525 if (FPU & VFP3FPU)
5526 Builder.defineMacro("__ARM_VFPV3__");
5527 if (FPU & VFP4FPU)
5528 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005529 if (FPU & FPARMV8)
5530 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005531 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005532
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005533 // This only gets set when Neon instructions are actually available, unlike
5534 // the VFP define, hence the soft float and arch check. This is subtly
5535 // different from gcc, we follow the intent which was that it should be set
5536 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005537 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005538 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005539 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005540 // current AArch32 NEON implementations do not support double-precision
5541 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005542 Builder.defineMacro("__ARM_NEON_FP",
5543 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005544 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005545
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005546 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5547 Opts.ShortWChar ? "2" : "4");
5548
5549 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5550 Opts.ShortEnums ? "1" : "4");
5551
Bradley Smithf4affc12016-03-03 13:52:22 +00005552 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005553 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5554 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5555 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5556 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5557 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005558
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005559 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005560 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005561 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005562 }
5563
5564 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005565 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005566 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5567 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005568 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005569 }
5570
5571 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005572 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005573 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005574
5575 if (Opts.UnsafeFPMath)
5576 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005577
5578 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5579 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005580 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005581
Craig Topper6c03a542015-10-19 04:51:35 +00005582 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5583 return llvm::makeArrayRef(BuiltinInfo,
5584 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005585 }
Craig Topper3164f332014-03-11 03:39:26 +00005586 bool isCLZForZeroUndef() const override { return false; }
5587 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005588 return IsAAPCS
5589 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005590 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5591 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005592 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005593 ArrayRef<const char *> getGCCRegNames() const override;
5594 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005595 bool validateAsmConstraint(const char *&Name,
5596 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005597 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005598 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005599 case 'l': // r0-r7
5600 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005601 case 't': // VFP Floating point register single precision
5602 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005603 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005604 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005605 case 'I':
5606 case 'J':
5607 case 'K':
5608 case 'L':
5609 case 'M':
5610 // FIXME
5611 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005612 case 'Q': // A memory address that is a single base register.
5613 Info.setAllowsMemory();
5614 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005615 case 'U': // a memory reference...
5616 switch (Name[1]) {
5617 case 'q': // ...ARMV4 ldrsb
5618 case 'v': // ...VFP load/store (reg+constant offset)
5619 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005620 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005621 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005622 case 'n': // valid address for Neon doubleword vector load/store
5623 case 'm': // valid address for Neon element and structure load/store
5624 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005625 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005626 Info.setAllowsMemory();
5627 Name++;
5628 return true;
5629 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005630 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005631 return false;
5632 }
Craig Topper3164f332014-03-11 03:39:26 +00005633 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005634 std::string R;
5635 switch (*Constraint) {
5636 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005637 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005638 Constraint++;
5639 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005640 case 'p': // 'p' should be translated to 'r' by default.
5641 R = std::string("r");
5642 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005643 default:
5644 return std::string(1, *Constraint);
5645 }
5646 return R;
5647 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005648 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005649 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005650 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005651 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005652 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005653
Bill Wendling9d1ee112012-10-25 23:28:48 +00005654 // Strip off constraint modifiers.
5655 while (Constraint[0] == '=' ||
5656 Constraint[0] == '+' ||
5657 Constraint[0] == '&')
5658 Constraint = Constraint.substr(1);
5659
5660 switch (Constraint[0]) {
5661 default: break;
5662 case 'r': {
5663 switch (Modifier) {
5664 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005665 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005666 case 'q':
5667 // A register of size 32 cannot fit a vector type.
5668 return false;
5669 }
5670 }
5671 }
5672
5673 return true;
5674 }
Craig Topper3164f332014-03-11 03:39:26 +00005675 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005676 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005677 return "";
5678 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005679
Craig Topper3164f332014-03-11 03:39:26 +00005680 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005681 switch (CC) {
5682 case CC_AAPCS:
5683 case CC_AAPCS_VFP:
5684 case CC_Swift:
5685 return CCCR_OK;
5686 default:
5687 return CCCR_Warning;
5688 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005689 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005690
Craig Topper3164f332014-03-11 03:39:26 +00005691 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005692 if (RegNo == 0) return 0;
5693 if (RegNo == 1) return 1;
5694 return -1;
5695 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005696
5697 bool hasSjLjLowering() const override {
5698 return true;
5699 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005700};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005701
Rafael Espindolaeb265472013-08-21 21:59:03 +00005702bool ARMTargetInfo::setFPMath(StringRef Name) {
5703 if (Name == "neon") {
5704 FPMath = FP_Neon;
5705 return true;
5706 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5707 Name == "vfp4") {
5708 FPMath = FP_VFP;
5709 return true;
5710 }
5711 return false;
5712}
5713
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005714const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005715 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005716 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005717 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5718
5719 // Float registers
5720 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5721 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5722 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005723 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005724
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005725 // Double registers
5726 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5727 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005728 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5729 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005730
5731 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005732 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5733 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005734};
5735
Craig Topperf054e3a2015-10-19 03:52:27 +00005736ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5737 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005738}
5739
5740const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005741 { { "a1" }, "r0" },
5742 { { "a2" }, "r1" },
5743 { { "a3" }, "r2" },
5744 { { "a4" }, "r3" },
5745 { { "v1" }, "r4" },
5746 { { "v2" }, "r5" },
5747 { { "v3" }, "r6" },
5748 { { "v4" }, "r7" },
5749 { { "v5" }, "r8" },
5750 { { "v6", "rfp" }, "r9" },
5751 { { "sl" }, "r10" },
5752 { { "fp" }, "r11" },
5753 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005754 { { "r13" }, "sp" },
5755 { { "r14" }, "lr" },
5756 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005757 // The S, D and Q registers overlap, but aren't really aliases; we
5758 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005759};
5760
Craig Topperf054e3a2015-10-19 03:52:27 +00005761ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5762 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005763}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005764
5765const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005766#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005767 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005768#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5769 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005770#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005771
Craig Topper07d3b622015-08-07 05:14:44 +00005772#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005773 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005774#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005775 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005776#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5777 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005778#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5779 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005780#include "clang/Basic/BuiltinsARM.def"
5781};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005782
5783class ARMleTargetInfo : public ARMTargetInfo {
5784public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005785 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005786 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005787 void getTargetDefines(const LangOptions &Opts,
5788 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005789 Builder.defineMacro("__ARMEL__");
5790 ARMTargetInfo::getTargetDefines(Opts, Builder);
5791 }
5792};
5793
5794class ARMbeTargetInfo : public ARMTargetInfo {
5795public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005796 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005797 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005798 void getTargetDefines(const LangOptions &Opts,
5799 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005800 Builder.defineMacro("__ARMEB__");
5801 Builder.defineMacro("__ARM_BIG_ENDIAN");
5802 ARMTargetInfo::getTargetDefines(Opts, Builder);
5803 }
5804};
Chris Lattner17df24e2008-04-21 18:56:49 +00005805
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005806class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5807 const llvm::Triple Triple;
5808public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005809 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5810 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005811 WCharType = UnsignedShort;
5812 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005813 }
5814 void getVisualStudioDefines(const LangOptions &Opts,
5815 MacroBuilder &Builder) const {
5816 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5817
5818 // FIXME: this is invalid for WindowsCE
5819 Builder.defineMacro("_M_ARM_NT", "1");
5820 Builder.defineMacro("_M_ARMT", "_M_ARM");
5821 Builder.defineMacro("_M_THUMB", "_M_ARM");
5822
5823 assert((Triple.getArch() == llvm::Triple::arm ||
5824 Triple.getArch() == llvm::Triple::thumb) &&
5825 "invalid architecture for Windows ARM target info");
5826 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5827 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5828
5829 // TODO map the complete set of values
5830 // 31: VFPv3 40: VFPv4
5831 Builder.defineMacro("_M_ARM_FP", "31");
5832 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005833 BuiltinVaListKind getBuiltinVaListKind() const override {
5834 return TargetInfo::CharPtrBuiltinVaList;
5835 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005836 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5837 switch (CC) {
5838 case CC_X86StdCall:
5839 case CC_X86ThisCall:
5840 case CC_X86FastCall:
5841 case CC_X86VectorCall:
5842 return CCCR_Ignore;
5843 case CC_C:
5844 return CCCR_OK;
5845 default:
5846 return CCCR_Warning;
5847 }
5848 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005849};
5850
5851// Windows ARM + Itanium C++ ABI Target
5852class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5853public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005854 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5855 const TargetOptions &Opts)
5856 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005857 TheCXXABI.set(TargetCXXABI::GenericARM);
5858 }
5859
5860 void getTargetDefines(const LangOptions &Opts,
5861 MacroBuilder &Builder) const override {
5862 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5863
5864 if (Opts.MSVCCompat)
5865 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5866 }
5867};
5868
5869// Windows ARM, MS (C++) ABI
5870class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5871public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005872 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5873 const TargetOptions &Opts)
5874 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005875 TheCXXABI.set(TargetCXXABI::Microsoft);
5876 }
5877
5878 void getTargetDefines(const LangOptions &Opts,
5879 MacroBuilder &Builder) const override {
5880 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5881 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5882 }
5883};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005884
Yaron Keren321249c2015-07-15 13:32:23 +00005885// ARM MinGW target
5886class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5887public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005888 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5889 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005890 TheCXXABI.set(TargetCXXABI::GenericARM);
5891 }
5892
5893 void getTargetDefines(const LangOptions &Opts,
5894 MacroBuilder &Builder) const override {
5895 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5896 DefineStd(Builder, "WIN32", Opts);
5897 DefineStd(Builder, "WINNT", Opts);
5898 Builder.defineMacro("_ARM_");
5899 addMinGWDefines(Opts, Builder);
5900 }
5901};
5902
5903// ARM Cygwin target
5904class CygwinARMTargetInfo : public ARMleTargetInfo {
5905public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005906 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5907 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005908 TLSSupported = false;
5909 WCharType = UnsignedShort;
5910 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005911 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005912 }
5913 void getTargetDefines(const LangOptions &Opts,
5914 MacroBuilder &Builder) const override {
5915 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5916 Builder.defineMacro("_ARM_");
5917 Builder.defineMacro("__CYGWIN__");
5918 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005919 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005920 if (Opts.CPlusPlus)
5921 Builder.defineMacro("_GNU_SOURCE");
5922 }
5923};
5924
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005925class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005926protected:
Craig Topper3164f332014-03-11 03:39:26 +00005927 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5928 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005929 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005930 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005931
Torok Edwinb2b37c62009-06-30 17:10:35 +00005932public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005933 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5934 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005935 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005936 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005937 // FIXME: This should be based off of the target features in
5938 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005939 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005940
Tim Northoverd88ecb32016-01-27 19:32:40 +00005941 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005942 // Darwin on iOS uses a variant of the ARM C++ ABI.
5943 TheCXXABI.set(TargetCXXABI::WatchOS);
5944
5945 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5946 // size_t is long, it's a bit weird for it to be int.
5947 PtrDiffType = SignedLong;
5948
5949 // BOOL should be a real boolean on the new ABI
5950 UseSignedCharForObjCBool = false;
5951 } else
5952 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005953 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005954};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005955
Tim Northover573cbee2014-05-24 12:52:07 +00005956class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005957 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005958 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5959 static const char *const GCCRegNames[];
5960
James Molloy75f5f9e2014-04-16 15:33:48 +00005961 enum FPUModeEnum {
5962 FPUMode,
5963 NeonMode
5964 };
5965
5966 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005967 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005968 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005969 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005970 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005971
Tim Northovera2ee4332014-03-29 15:09:45 +00005972 static const Builtin::Info BuiltinInfo[];
5973
5974 std::string ABI;
5975
5976public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005977 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005978 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00005979 if (getTriple().getOS() == llvm::Triple::NetBSD ||
5980 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00005981 WCharType = SignedInt;
5982
5983 // NetBSD apparently prefers consistency across ARM targets to consistency
5984 // across 64-bit targets.
5985 Int64Type = SignedLongLong;
5986 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005987 } else {
5988 WCharType = UnsignedInt;
5989 Int64Type = SignedLong;
5990 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005991 }
5992
Tim Northovera2ee4332014-03-29 15:09:45 +00005993 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005994 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005995 MaxAtomicInlineWidth = 128;
5996 MaxAtomicPromoteWidth = 128;
5997
Tim Northovera6a19f12015-02-06 01:25:07 +00005998 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005999 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00006000
Tim Northovera2ee4332014-03-29 15:09:45 +00006001 // {} in inline assembly are neon specifiers, not assembly variant
6002 // specifiers.
6003 NoAsmVariants = true;
6004
Tim Northover7ad87af2015-01-16 18:44:04 +00006005 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6006 // contributes to the alignment of the containing aggregate in the same way
6007 // a plain (non bit-field) member of that type would, without exception for
6008 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006009 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006010 UseZeroLengthBitfieldAlignment = true;
6011
Tim Northover573cbee2014-05-24 12:52:07 +00006012 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006013 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006014
Eric Christopherfb834a82017-02-28 17:22:05 +00006015 if (Triple.getOS() == llvm::Triple::Linux)
6016 this->MCountName = "\01_mcount";
6017 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006018 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006019 }
6020
Alp Toker4925ba72014-06-07 23:30:42 +00006021 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006022 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006023 if (Name != "aapcs" && Name != "darwinpcs")
6024 return false;
6025
6026 ABI = Name;
6027 return true;
6028 }
6029
David Blaikie1cbb9712014-11-14 19:09:44 +00006030 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006031 return Name == "generic" ||
6032 llvm::AArch64::parseCPUArch(Name) !=
6033 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006034 }
6035
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006036 void getTargetDefines(const LangOptions &Opts,
6037 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006038 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006039 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006040
6041 // Target properties.
6042 Builder.defineMacro("_LP64");
6043 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006044
6045 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6046 Builder.defineMacro("__ARM_ACLE", "200");
6047 Builder.defineMacro("__ARM_ARCH", "8");
6048 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6049
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006050 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006051 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006052 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006053
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006054 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6055 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6056 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6057 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006058 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006059 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6060 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006061
6062 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6063
6064 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006065 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006066
6067 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6068 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006069 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6070 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006071
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006072 if (Opts.UnsafeFPMath)
6073 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006074
6075 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6076
6077 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6078 Opts.ShortEnums ? "1" : "4");
6079
James Molloy75f5f9e2014-04-16 15:33:48 +00006080 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006081 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006082 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006083 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006084 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006085
Bradley Smith418c5932014-05-02 15:17:51 +00006086 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006087 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006088
James Molloy75f5f9e2014-04-16 15:33:48 +00006089 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006090 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6091
6092 if (Unaligned)
6093 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006094
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006095 if (V8_1A)
6096 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6097
Reid Klecknerd167d422015-05-06 15:31:46 +00006098 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6099 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6100 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6101 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6102 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006103 }
6104
Craig Topper6c03a542015-10-19 04:51:35 +00006105 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6106 return llvm::makeArrayRef(BuiltinInfo,
6107 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006108 }
6109
David Blaikie1cbb9712014-11-14 19:09:44 +00006110 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006111 return Feature == "aarch64" ||
6112 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006113 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006114 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006115 }
6116
James Molloy5e73df52014-04-16 15:06:20 +00006117 bool handleTargetFeatures(std::vector<std::string> &Features,
6118 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006119 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006120 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006121 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006122 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006123 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006124
Eric Christopher610fe112015-08-26 08:21:55 +00006125 for (const auto &Feature : Features) {
6126 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006127 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006128 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006129 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006130 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006131 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006132 if (Feature == "+strict-align")
6133 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006134 if (Feature == "+v8.1a")
6135 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006136 }
6137
James Y Knightb214cbc2016-03-04 19:00:41 +00006138 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006139
6140 return true;
6141 }
6142
John McCall477f2bb2016-03-03 06:39:32 +00006143 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6144 switch (CC) {
6145 case CC_C:
6146 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006147 case CC_PreserveMost:
6148 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006149 return CCCR_OK;
6150 default:
6151 return CCCR_Warning;
6152 }
6153 }
6154
David Blaikie1cbb9712014-11-14 19:09:44 +00006155 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006156
David Blaikie1cbb9712014-11-14 19:09:44 +00006157 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006158 return TargetInfo::AArch64ABIBuiltinVaList;
6159 }
6160
Craig Topperf054e3a2015-10-19 03:52:27 +00006161 ArrayRef<const char *> getGCCRegNames() const override;
6162 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006163
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006164 bool validateAsmConstraint(const char *&Name,
6165 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006166 switch (*Name) {
6167 default:
6168 return false;
6169 case 'w': // Floating point and SIMD registers (V0-V31)
6170 Info.setAllowsRegister();
6171 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006172 case 'I': // Constant that can be used with an ADD instruction
6173 case 'J': // Constant that can be used with a SUB instruction
6174 case 'K': // Constant that can be used with a 32-bit logical instruction
6175 case 'L': // Constant that can be used with a 64-bit logical instruction
6176 case 'M': // Constant that can be used as a 32-bit MOV immediate
6177 case 'N': // Constant that can be used as a 64-bit MOV immediate
6178 case 'Y': // Floating point constant zero
6179 case 'Z': // Integer constant zero
6180 return true;
6181 case 'Q': // A memory reference with base register and no offset
6182 Info.setAllowsMemory();
6183 return true;
6184 case 'S': // A symbolic address
6185 Info.setAllowsRegister();
6186 return true;
6187 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006188 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6189 // Utf: A memory address suitable for ldp/stp in TF mode.
6190 // Usa: An absolute symbolic address.
6191 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6192 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006193 case 'z': // Zero register, wzr or xzr
6194 Info.setAllowsRegister();
6195 return true;
6196 case 'x': // Floating point and SIMD registers (V0-V15)
6197 Info.setAllowsRegister();
6198 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006199 }
6200 return false;
6201 }
6202
Akira Hatanaka987f1862014-08-22 06:05:21 +00006203 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006204 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006205 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006206 // Strip off constraint modifiers.
6207 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6208 Constraint = Constraint.substr(1);
6209
6210 switch (Constraint[0]) {
6211 default:
6212 return true;
6213 case 'z':
6214 case 'r': {
6215 switch (Modifier) {
6216 case 'x':
6217 case 'w':
6218 // For now assume that the person knows what they're
6219 // doing with the modifier.
6220 return true;
6221 default:
6222 // By default an 'r' constraint will be in the 'x'
6223 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006224 if (Size == 64)
6225 return true;
6226
6227 SuggestedModifier = "w";
6228 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006229 }
6230 }
6231 }
6232 }
6233
David Blaikie1cbb9712014-11-14 19:09:44 +00006234 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006235
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006236 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006237 if (RegNo == 0)
6238 return 0;
6239 if (RegNo == 1)
6240 return 1;
6241 return -1;
6242 }
6243};
6244
Tim Northover573cbee2014-05-24 12:52:07 +00006245const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006246 // 32-bit Integer registers
6247 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6248 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6249 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6250
6251 // 64-bit Integer registers
6252 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6253 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6254 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6255
6256 // 32-bit floating point regsisters
6257 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6258 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6259 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6260
6261 // 64-bit floating point regsisters
6262 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6263 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6264 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6265
6266 // Vector registers
6267 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6268 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6269 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6270};
6271
Craig Topperf054e3a2015-10-19 03:52:27 +00006272ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6273 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006274}
6275
Tim Northover573cbee2014-05-24 12:52:07 +00006276const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006277 { { "w31" }, "wsp" },
6278 { { "x29" }, "fp" },
6279 { { "x30" }, "lr" },
6280 { { "x31" }, "sp" },
6281 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6282 // don't want to substitute one of these for a different-sized one.
6283};
6284
Craig Topperf054e3a2015-10-19 03:52:27 +00006285ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6286 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006287}
6288
Tim Northover573cbee2014-05-24 12:52:07 +00006289const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006290#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006291 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006292#include "clang/Basic/BuiltinsNEON.def"
6293
6294#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006295 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006296#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006297};
James Molloy5e73df52014-04-16 15:06:20 +00006298
Tim Northover573cbee2014-05-24 12:52:07 +00006299class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006300 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006301 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006302 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006303 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006304 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006305 }
6306
6307public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006308 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6309 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006310 }
James Molloy5e73df52014-04-16 15:06:20 +00006311 void getTargetDefines(const LangOptions &Opts,
6312 MacroBuilder &Builder) const override {
6313 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006314 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006315 }
6316};
6317
Tim Northover573cbee2014-05-24 12:52:07 +00006318class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006319 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006320 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006321 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006322 }
6323
6324public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006325 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6326 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006327 void getTargetDefines(const LangOptions &Opts,
6328 MacroBuilder &Builder) const override {
6329 Builder.defineMacro("__AARCH64EB__");
6330 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6331 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006332 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006333 }
6334};
Tim Northovera2ee4332014-03-29 15:09:45 +00006335
Tim Northover573cbee2014-05-24 12:52:07 +00006336class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006337protected:
6338 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6339 MacroBuilder &Builder) const override {
6340 Builder.defineMacro("__AARCH64_SIMD__");
6341 Builder.defineMacro("__ARM64_ARCH_8__");
6342 Builder.defineMacro("__ARM_NEON__");
6343 Builder.defineMacro("__LITTLE_ENDIAN__");
6344 Builder.defineMacro("__REGISTER_PREFIX__", "");
6345 Builder.defineMacro("__arm64", "1");
6346 Builder.defineMacro("__arm64__", "1");
6347
6348 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6349 }
6350
Tim Northovera2ee4332014-03-29 15:09:45 +00006351public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006352 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6353 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006354 Int64Type = SignedLongLong;
6355 WCharType = SignedInt;
6356 UseSignedCharForObjCBool = false;
6357
Tim Northovera6a19f12015-02-06 01:25:07 +00006358 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006359 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006360
6361 TheCXXABI.set(TargetCXXABI::iOS64);
6362 }
6363
David Blaikie1cbb9712014-11-14 19:09:44 +00006364 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006365 return TargetInfo::CharPtrBuiltinVaList;
6366 }
6367};
Tim Northovera2ee4332014-03-29 15:09:45 +00006368
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369// Hexagon abstract base class
6370class HexagonTargetInfo : public TargetInfo {
6371 static const Builtin::Info BuiltinInfo[];
6372 static const char * const GCCRegNames[];
6373 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6374 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006375 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006376 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006377
Tony Linthicum76329bf2011-12-12 21:14:55 +00006378public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006379 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6380 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006381 // Specify the vector alignment explicitly. For v512x1, the calculated
6382 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6383 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006384 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006385 "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 +00006386 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006387 SizeType = UnsignedInt;
6388 PtrDiffType = SignedInt;
6389 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006390
6391 // {} in inline assembly are packet specifiers, not assembly variant
6392 // specifiers.
6393 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006394
6395 LargeArrayMinWidth = 64;
6396 LargeArrayAlign = 64;
6397 UseBitFieldTypeAlignment = true;
6398 ZeroLengthBitfieldBoundary = 32;
6399 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006400 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006401 }
6402
Craig Topper6c03a542015-10-19 04:51:35 +00006403 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6404 return llvm::makeArrayRef(BuiltinInfo,
6405 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006406 }
6407
Craig Topper3164f332014-03-11 03:39:26 +00006408 bool validateAsmConstraint(const char *&Name,
6409 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006410 switch (*Name) {
6411 case 'v':
6412 case 'q':
6413 if (HasHVX) {
6414 Info.setAllowsRegister();
6415 return true;
6416 }
6417 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006418 case 's':
6419 // Relocatable constant.
6420 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006421 }
6422 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006423 }
6424
Craig Topper3164f332014-03-11 03:39:26 +00006425 void getTargetDefines(const LangOptions &Opts,
6426 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006427
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006428 bool isCLZForZeroUndef() const override { return false; }
6429
Craig Topper3164f332014-03-11 03:39:26 +00006430 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006431 return llvm::StringSwitch<bool>(Feature)
6432 .Case("hexagon", true)
6433 .Case("hvx", HasHVX)
6434 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006435 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006436 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006437 }
Craig Topper3164f332014-03-11 03:39:26 +00006438
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006439 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6440 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6441 const override;
6442
6443 bool handleTargetFeatures(std::vector<std::string> &Features,
6444 DiagnosticsEngine &Diags) override;
6445
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006446 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6447 bool Enabled) const override;
6448
Craig Topper3164f332014-03-11 03:39:26 +00006449 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006450 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006452 ArrayRef<const char *> getGCCRegNames() const override;
6453 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006454 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006455 return "";
6456 }
Sebastian Pop86500282012-01-13 20:37:10 +00006457
6458 static const char *getHexagonCPUSuffix(StringRef Name) {
6459 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006460 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006461 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006462 .Case("hexagonv55", "55")
6463 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006464 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006465 }
6466
Craig Topper3164f332014-03-11 03:39:26 +00006467 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006468 if (!getHexagonCPUSuffix(Name))
6469 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006470 CPU = Name;
6471 return true;
6472 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006473
6474 int getEHDataRegisterNumber(unsigned RegNo) const override {
6475 return RegNo < 2 ? RegNo : -1;
6476 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006477};
6478
6479void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006480 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006481 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006482 Builder.defineMacro("__hexagon__", "1");
6483
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006484 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006485 Builder.defineMacro("__HEXAGON_V4__");
6486 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006487 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006488 Builder.defineMacro("__QDSP6_V4__");
6489 Builder.defineMacro("__QDSP6_ARCH__", "4");
6490 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006491 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006492 Builder.defineMacro("__HEXAGON_V5__");
6493 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6494 if(Opts.HexagonQdsp6Compat) {
6495 Builder.defineMacro("__QDSP6_V5__");
6496 Builder.defineMacro("__QDSP6_ARCH__", "5");
6497 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006498 } else if (CPU == "hexagonv55") {
6499 Builder.defineMacro("__HEXAGON_V55__");
6500 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6501 Builder.defineMacro("__QDSP6_V55__");
6502 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006503 } else if (CPU == "hexagonv60") {
6504 Builder.defineMacro("__HEXAGON_V60__");
6505 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6506 Builder.defineMacro("__QDSP6_V60__");
6507 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006508 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006509
6510 if (hasFeature("hvx")) {
6511 Builder.defineMacro("__HVX__");
6512 if (hasFeature("hvx-double"))
6513 Builder.defineMacro("__HVXDBL__");
6514 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006515}
6516
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006517bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6518 DiagnosticsEngine &Diags, StringRef CPU,
6519 const std::vector<std::string> &FeaturesVec) const {
6520 // Default for v60: -hvx, -hvx-double.
6521 Features["hvx"] = false;
6522 Features["hvx-double"] = false;
6523 Features["long-calls"] = false;
6524
6525 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6526}
6527
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006528bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6529 DiagnosticsEngine &Diags) {
6530 for (auto &F : Features) {
6531 if (F == "+hvx")
6532 HasHVX = true;
6533 else if (F == "-hvx")
6534 HasHVX = HasHVXDouble = false;
6535 else if (F == "+hvx-double")
6536 HasHVX = HasHVXDouble = true;
6537 else if (F == "-hvx-double")
6538 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006539
6540 if (F == "+long-calls")
6541 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006542 else if (F == "-long-calls")
6543 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006544 }
6545 return true;
6546}
6547
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006548void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6549 StringRef Name, bool Enabled) const {
6550 if (Enabled) {
6551 if (Name == "hvx-double")
6552 Features["hvx"] = true;
6553 } else {
6554 if (Name == "hvx")
6555 Features["hvx-double"] = false;
6556 }
6557 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006558}
6559
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006560const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006561 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6562 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6563 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6564 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6565 "p0", "p1", "p2", "p3",
6566 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6567};
6568
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006569ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006570 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006571}
6572
Tony Linthicum76329bf2011-12-12 21:14:55 +00006573const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6574 { { "sp" }, "r29" },
6575 { { "fp" }, "r30" },
6576 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006578
Craig Topperf054e3a2015-10-19 03:52:27 +00006579ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6580 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006581}
6582
6583
6584const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006585#define BUILTIN(ID, TYPE, ATTRS) \
6586 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6587#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6588 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006589#include "clang/Basic/BuiltinsHexagon.def"
6590};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006591
Jacques Pienaard964cc22016-03-28 21:02:54 +00006592class LanaiTargetInfo : public TargetInfo {
6593 // Class for Lanai (32-bit).
6594 // The CPU profiles supported by the Lanai backend
6595 enum CPUKind {
6596 CK_NONE,
6597 CK_V11,
6598 } CPU;
6599
6600 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6601 static const char *const GCCRegNames[];
6602
6603public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006604 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6605 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006606 // Description string has to be kept in sync with backend.
6607 resetDataLayout("E" // Big endian
6608 "-m:e" // ELF name manging
6609 "-p:32:32" // 32 bit pointers, 32 bit aligned
6610 "-i64:64" // 64 bit integers, 64 bit aligned
6611 "-a:0:32" // 32 bit alignment of objects of aggregate type
6612 "-n32" // 32 bit native integer width
6613 "-S64" // 64 bit natural stack alignment
6614 );
6615
6616 // Setting RegParmMax equal to what mregparm was set to in the old
6617 // toolchain
6618 RegParmMax = 4;
6619
6620 // Set the default CPU to V11
6621 CPU = CK_V11;
6622
6623 // Temporary approach to make everything at least word-aligned and allow for
6624 // safely casting between pointers with different alignment requirements.
6625 // TODO: Remove this when there are no more cast align warnings on the
6626 // firmware.
6627 MinGlobalAlign = 32;
6628 }
6629
6630 void getTargetDefines(const LangOptions &Opts,
6631 MacroBuilder &Builder) const override {
6632 // Define __lanai__ when building for target lanai.
6633 Builder.defineMacro("__lanai__");
6634
6635 // Set define for the CPU specified.
6636 switch (CPU) {
6637 case CK_V11:
6638 Builder.defineMacro("__LANAI_V11__");
6639 break;
6640 case CK_NONE:
6641 llvm_unreachable("Unhandled target CPU");
6642 }
6643 }
6644
6645 bool setCPU(const std::string &Name) override {
6646 CPU = llvm::StringSwitch<CPUKind>(Name)
6647 .Case("v11", CK_V11)
6648 .Default(CK_NONE);
6649
6650 return CPU != CK_NONE;
6651 }
6652
6653 bool hasFeature(StringRef Feature) const override {
6654 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6655 }
6656
6657 ArrayRef<const char *> getGCCRegNames() const override;
6658
6659 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6660
6661 BuiltinVaListKind getBuiltinVaListKind() const override {
6662 return TargetInfo::VoidPtrBuiltinVaList;
6663 }
6664
6665 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6666
6667 bool validateAsmConstraint(const char *&Name,
6668 TargetInfo::ConstraintInfo &info) const override {
6669 return false;
6670 }
6671
6672 const char *getClobbers() const override { return ""; }
6673};
6674
6675const char *const LanaiTargetInfo::GCCRegNames[] = {
6676 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6677 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6678 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6679
6680ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6681 return llvm::makeArrayRef(GCCRegNames);
6682}
6683
6684const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6685 {{"pc"}, "r2"},
6686 {{"sp"}, "r4"},
6687 {{"fp"}, "r5"},
6688 {{"rv"}, "r8"},
6689 {{"rr1"}, "r10"},
6690 {{"rr2"}, "r11"},
6691 {{"rca"}, "r15"},
6692};
6693
6694ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6695 return llvm::makeArrayRef(GCCRegAliases);
6696}
6697
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006698// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6699class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006700 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6701 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006702 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006703public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006704 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006705 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006706
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006707 int getEHDataRegisterNumber(unsigned RegNo) const override {
6708 if (RegNo == 0) return 24;
6709 if (RegNo == 1) return 25;
6710 return -1;
6711 }
6712
Craig Topper3164f332014-03-11 03:39:26 +00006713 bool handleTargetFeatures(std::vector<std::string> &Features,
6714 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006715 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006716 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6717 if (Feature != Features.end()) {
6718 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006719 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006720 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006721 }
Craig Topper3164f332014-03-11 03:39:26 +00006722 void getTargetDefines(const LangOptions &Opts,
6723 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006724 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006725 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006726
6727 if (SoftFloat)
6728 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006729 }
Craig Topper3164f332014-03-11 03:39:26 +00006730
6731 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006732 return llvm::StringSwitch<bool>(Feature)
6733 .Case("softfloat", SoftFloat)
6734 .Case("sparc", true)
6735 .Default(false);
6736 }
Craig Topper3164f332014-03-11 03:39:26 +00006737
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006738 bool hasSjLjLowering() const override {
6739 return true;
6740 }
6741
Craig Topper6c03a542015-10-19 04:51:35 +00006742 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006743 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006744 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006745 }
Craig Topper3164f332014-03-11 03:39:26 +00006746 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006747 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006748 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006749 ArrayRef<const char *> getGCCRegNames() const override;
6750 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006751 bool validateAsmConstraint(const char *&Name,
6752 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006753 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006754 switch (*Name) {
6755 case 'I': // Signed 13-bit constant
6756 case 'J': // Zero
6757 case 'K': // 32-bit constant with the low 12 bits clear
6758 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6759 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6760 case 'N': // Same as 'K' but zext (required for SIMode)
6761 case 'O': // The constant 4096
6762 return true;
6763 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006764 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006765 }
Craig Topper3164f332014-03-11 03:39:26 +00006766 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006767 // FIXME: Implement!
6768 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006769 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006770
6771 // No Sparc V7 for now, the backend doesn't support it anyway.
6772 enum CPUKind {
6773 CK_GENERIC,
6774 CK_V8,
6775 CK_SUPERSPARC,
6776 CK_SPARCLITE,
6777 CK_F934,
6778 CK_HYPERSPARC,
6779 CK_SPARCLITE86X,
6780 CK_SPARCLET,
6781 CK_TSC701,
6782 CK_V9,
6783 CK_ULTRASPARC,
6784 CK_ULTRASPARC3,
6785 CK_NIAGARA,
6786 CK_NIAGARA2,
6787 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006788 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006789 CK_MYRIAD2100,
6790 CK_MYRIAD2150,
6791 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006792 CK_LEON2,
6793 CK_LEON2_AT697E,
6794 CK_LEON2_AT697F,
6795 CK_LEON3,
6796 CK_LEON3_UT699,
6797 CK_LEON3_GR712RC,
6798 CK_LEON4,
6799 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006800 } CPU = CK_GENERIC;
6801
6802 enum CPUGeneration {
6803 CG_V8,
6804 CG_V9,
6805 };
6806
6807 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6808 switch (Kind) {
6809 case CK_GENERIC:
6810 case CK_V8:
6811 case CK_SUPERSPARC:
6812 case CK_SPARCLITE:
6813 case CK_F934:
6814 case CK_HYPERSPARC:
6815 case CK_SPARCLITE86X:
6816 case CK_SPARCLET:
6817 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006818 case CK_MYRIAD2100:
6819 case CK_MYRIAD2150:
6820 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006821 case CK_LEON2:
6822 case CK_LEON2_AT697E:
6823 case CK_LEON2_AT697F:
6824 case CK_LEON3:
6825 case CK_LEON3_UT699:
6826 case CK_LEON3_GR712RC:
6827 case CK_LEON4:
6828 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006829 return CG_V8;
6830 case CK_V9:
6831 case CK_ULTRASPARC:
6832 case CK_ULTRASPARC3:
6833 case CK_NIAGARA:
6834 case CK_NIAGARA2:
6835 case CK_NIAGARA3:
6836 case CK_NIAGARA4:
6837 return CG_V9;
6838 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006839 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006840 }
6841
6842 CPUKind getCPUKind(StringRef Name) const {
6843 return llvm::StringSwitch<CPUKind>(Name)
6844 .Case("v8", CK_V8)
6845 .Case("supersparc", CK_SUPERSPARC)
6846 .Case("sparclite", CK_SPARCLITE)
6847 .Case("f934", CK_F934)
6848 .Case("hypersparc", CK_HYPERSPARC)
6849 .Case("sparclite86x", CK_SPARCLITE86X)
6850 .Case("sparclet", CK_SPARCLET)
6851 .Case("tsc701", CK_TSC701)
6852 .Case("v9", CK_V9)
6853 .Case("ultrasparc", CK_ULTRASPARC)
6854 .Case("ultrasparc3", CK_ULTRASPARC3)
6855 .Case("niagara", CK_NIAGARA)
6856 .Case("niagara2", CK_NIAGARA2)
6857 .Case("niagara3", CK_NIAGARA3)
6858 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006859 .Case("ma2100", CK_MYRIAD2100)
6860 .Case("ma2150", CK_MYRIAD2150)
6861 .Case("ma2450", CK_MYRIAD2450)
6862 // FIXME: the myriad2[.n] spellings are obsolete,
6863 // but a grace period is needed to allow updating dependent builds.
6864 .Case("myriad2", CK_MYRIAD2100)
6865 .Case("myriad2.1", CK_MYRIAD2100)
6866 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006867 .Case("leon2", CK_LEON2)
6868 .Case("at697e", CK_LEON2_AT697E)
6869 .Case("at697f", CK_LEON2_AT697F)
6870 .Case("leon3", CK_LEON3)
6871 .Case("ut699", CK_LEON3_UT699)
6872 .Case("gr712rc", CK_LEON3_GR712RC)
6873 .Case("leon4", CK_LEON4)
6874 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006875 .Default(CK_GENERIC);
6876 }
6877
6878 bool setCPU(const std::string &Name) override {
6879 CPU = getCPUKind(Name);
6880 return CPU != CK_GENERIC;
6881 }
Gabor Greif49991682008-02-21 16:29:08 +00006882};
6883
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006884const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006885 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6886 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6887 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6888 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6889};
6890
Craig Topperf054e3a2015-10-19 03:52:27 +00006891ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6892 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006893}
6894
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006895const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006896 { { "g0" }, "r0" },
6897 { { "g1" }, "r1" },
6898 { { "g2" }, "r2" },
6899 { { "g3" }, "r3" },
6900 { { "g4" }, "r4" },
6901 { { "g5" }, "r5" },
6902 { { "g6" }, "r6" },
6903 { { "g7" }, "r7" },
6904 { { "o0" }, "r8" },
6905 { { "o1" }, "r9" },
6906 { { "o2" }, "r10" },
6907 { { "o3" }, "r11" },
6908 { { "o4" }, "r12" },
6909 { { "o5" }, "r13" },
6910 { { "o6", "sp" }, "r14" },
6911 { { "o7" }, "r15" },
6912 { { "l0" }, "r16" },
6913 { { "l1" }, "r17" },
6914 { { "l2" }, "r18" },
6915 { { "l3" }, "r19" },
6916 { { "l4" }, "r20" },
6917 { { "l5" }, "r21" },
6918 { { "l6" }, "r22" },
6919 { { "l7" }, "r23" },
6920 { { "i0" }, "r24" },
6921 { { "i1" }, "r25" },
6922 { { "i2" }, "r26" },
6923 { { "i3" }, "r27" },
6924 { { "i4" }, "r28" },
6925 { { "i5" }, "r29" },
6926 { { "i6", "fp" }, "r30" },
6927 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006928};
6929
Craig Topperf054e3a2015-10-19 03:52:27 +00006930ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6931 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006932}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006933
6934// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6935class SparcV8TargetInfo : public SparcTargetInfo {
6936public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006937 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6938 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006939 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006940 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6941 switch (getTriple().getOS()) {
6942 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006943 SizeType = UnsignedInt;
6944 IntPtrType = SignedInt;
6945 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006946 break;
6947 case llvm::Triple::NetBSD:
6948 case llvm::Triple::OpenBSD:
6949 SizeType = UnsignedLong;
6950 IntPtrType = SignedLong;
6951 PtrDiffType = SignedLong;
6952 break;
Brad Smith56495d52015-08-13 22:00:53 +00006953 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006954 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6955 // on up to 64 bits.
6956 MaxAtomicPromoteWidth = 64;
6957 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006958 }
6959
Craig Topper3164f332014-03-11 03:39:26 +00006960 void getTargetDefines(const LangOptions &Opts,
6961 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006962 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006963 switch (getCPUGeneration(CPU)) {
6964 case CG_V8:
6965 Builder.defineMacro("__sparcv8");
6966 if (getTriple().getOS() != llvm::Triple::Solaris)
6967 Builder.defineMacro("__sparcv8__");
6968 break;
6969 case CG_V9:
6970 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006971 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006972 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006973 Builder.defineMacro("__sparc_v9__");
6974 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006975 break;
6976 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006977 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006978 std::string MyriadArchValue, Myriad2Value;
6979 Builder.defineMacro("__sparc_v8__");
6980 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006981 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006982 case CK_MYRIAD2150:
6983 MyriadArchValue = "__ma2150";
6984 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006985 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006986 case CK_MYRIAD2450:
6987 MyriadArchValue = "__ma2450";
6988 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006989 break;
6990 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006991 MyriadArchValue = "__ma2100";
6992 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006993 break;
6994 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006995 Builder.defineMacro(MyriadArchValue, "1");
6996 Builder.defineMacro(MyriadArchValue+"__", "1");
6997 Builder.defineMacro("__myriad2__", Myriad2Value);
6998 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006999 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007000 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007001
7002 bool hasSjLjLowering() const override {
7003 return true;
7004 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007005};
7006
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007007// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7008class SparcV8elTargetInfo : public SparcV8TargetInfo {
7009 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007010 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7011 : SparcV8TargetInfo(Triple, Opts) {
7012 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007013 }
7014};
7015
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007016// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7017class SparcV9TargetInfo : public SparcTargetInfo {
7018public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007019 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7020 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007021 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007022 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007023 // This is an LP64 platform.
7024 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007025
7026 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007027 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007028 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007029 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007030 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007031 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007032
7033 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7034 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7035 LongDoubleWidth = 128;
7036 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007037 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007038 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007039 }
7040
Craig Topper3164f332014-03-11 03:39:26 +00007041 void getTargetDefines(const LangOptions &Opts,
7042 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007043 SparcTargetInfo::getTargetDefines(Opts, Builder);
7044 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007045 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007046 // Solaris doesn't need these variants, but the BSDs do.
7047 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007048 Builder.defineMacro("__sparc64__");
7049 Builder.defineMacro("__sparc_v9__");
7050 Builder.defineMacro("__sparcv9__");
7051 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007052 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007053
Craig Topper3164f332014-03-11 03:39:26 +00007054 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007055 if (!SparcTargetInfo::setCPU(Name))
7056 return false;
7057 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007058 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007059};
7060
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007061class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007062 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007063 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007064 std::string CPU;
7065 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007066 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007067
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007068public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007069 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007070 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7071 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007072 IntMaxType = SignedLong;
7073 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007074 TLSSupported = true;
7075 IntWidth = IntAlign = 32;
7076 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7077 PointerWidth = PointerAlign = 64;
7078 LongDoubleWidth = 128;
7079 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007080 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007081 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007082 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007083 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 +00007084 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7085 }
7086 void getTargetDefines(const LangOptions &Opts,
7087 MacroBuilder &Builder) const override {
7088 Builder.defineMacro("__s390__");
7089 Builder.defineMacro("__s390x__");
7090 Builder.defineMacro("__zarch__");
7091 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007092
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007093 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7094 .Cases("arch8", "z10", "8")
7095 .Cases("arch9", "z196", "9")
7096 .Cases("arch10", "zEC12", "10")
7097 .Cases("arch11", "z13", "11")
7098 .Default("");
7099 if (!ISARev.empty())
7100 Builder.defineMacro("__ARCH__", ISARev);
7101
Ulrich Weigandb038a522016-02-05 21:34:28 +00007102 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7103 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7104 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7105 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7106
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007107 if (HasTransactionalExecution)
7108 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007109 if (HasVector)
7110 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007111 if (Opts.ZVector)
7112 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007113 }
Craig Topper6c03a542015-10-19 04:51:35 +00007114 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7115 return llvm::makeArrayRef(BuiltinInfo,
7116 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007117 }
7118
Craig Topperf054e3a2015-10-19 03:52:27 +00007119 ArrayRef<const char *> getGCCRegNames() const override;
7120 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007121 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007122 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007123 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007124 bool validateAsmConstraint(const char *&Name,
7125 TargetInfo::ConstraintInfo &info) const override;
7126 const char *getClobbers() const override {
7127 // FIXME: Is this really right?
7128 return "";
7129 }
7130 BuiltinVaListKind getBuiltinVaListKind() const override {
7131 return TargetInfo::SystemZBuiltinVaList;
7132 }
7133 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007134 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007135 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7136 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007137 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007138 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007139 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007140 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007141 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007142 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007143 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007144 .Default(false);
7145
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007146 return CPUKnown;
7147 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007148 bool
7149 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7150 StringRef CPU,
7151 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007152 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007153 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007154 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007155 Features["transactional-execution"] = true;
7156 Features["vector"] = true;
7157 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007158 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007159 }
7160
7161 bool handleTargetFeatures(std::vector<std::string> &Features,
7162 DiagnosticsEngine &Diags) override {
7163 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007164 for (const auto &Feature : Features) {
7165 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007166 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007167 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007168 HasVector = true;
7169 }
7170 // If we use the vector ABI, vector types are 64-bit aligned.
7171 if (HasVector) {
7172 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007173 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7174 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007175 }
7176 return true;
7177 }
7178
7179 bool hasFeature(StringRef Feature) const override {
7180 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007181 .Case("systemz", true)
7182 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007183 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007184 .Default(false);
7185 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007186
Bryan Chane3f1ed52016-04-28 13:56:43 +00007187 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7188 switch (CC) {
7189 case CC_C:
7190 case CC_Swift:
7191 return CCCR_OK;
7192 default:
7193 return CCCR_Warning;
7194 }
7195 }
7196
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007197 StringRef getABI() const override {
7198 if (HasVector)
7199 return "vector";
7200 return "";
7201 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007202
7203 bool useFloat128ManglingForLongDouble() const override {
7204 return true;
7205 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007206};
7207
7208const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7209#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007210 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007211#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7212 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007213#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007214};
7215
7216const char *const SystemZTargetInfo::GCCRegNames[] = {
7217 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7218 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7219 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7220 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7221};
7222
Craig Topperf054e3a2015-10-19 03:52:27 +00007223ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7224 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007225}
7226
7227bool SystemZTargetInfo::
7228validateAsmConstraint(const char *&Name,
7229 TargetInfo::ConstraintInfo &Info) const {
7230 switch (*Name) {
7231 default:
7232 return false;
7233
7234 case 'a': // Address register
7235 case 'd': // Data register (equivalent to 'r')
7236 case 'f': // Floating-point register
7237 Info.setAllowsRegister();
7238 return true;
7239
7240 case 'I': // Unsigned 8-bit constant
7241 case 'J': // Unsigned 12-bit constant
7242 case 'K': // Signed 16-bit constant
7243 case 'L': // Signed 20-bit displacement (on all targets we support)
7244 case 'M': // 0x7fffffff
7245 return true;
7246
7247 case 'Q': // Memory with base and unsigned 12-bit displacement
7248 case 'R': // Likewise, plus an index
7249 case 'S': // Memory with base and signed 20-bit displacement
7250 case 'T': // Likewise, plus an index
7251 Info.setAllowsMemory();
7252 return true;
7253 }
7254}
Ulrich Weigand47445072013-05-06 16:26:41 +00007255
Eric Christopherc48497a2015-09-18 21:26:24 +00007256class MSP430TargetInfo : public TargetInfo {
7257 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007258
Eric Christopherc48497a2015-09-18 21:26:24 +00007259public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007260 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7261 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007262 TLSSupported = false;
7263 IntWidth = 16;
7264 IntAlign = 16;
7265 LongWidth = 32;
7266 LongLongWidth = 64;
7267 LongAlign = LongLongAlign = 16;
7268 PointerWidth = 16;
7269 PointerAlign = 16;
7270 SuitableAlign = 16;
7271 SizeType = UnsignedInt;
7272 IntMaxType = SignedLongLong;
7273 IntPtrType = SignedInt;
7274 PtrDiffType = SignedInt;
7275 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007276 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007277 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007278 void getTargetDefines(const LangOptions &Opts,
7279 MacroBuilder &Builder) const override {
7280 Builder.defineMacro("MSP430");
7281 Builder.defineMacro("__MSP430__");
7282 // FIXME: defines for different 'flavours' of MCU
7283 }
Craig Topper6c03a542015-10-19 04:51:35 +00007284 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007285 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007286 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007287 }
7288 bool hasFeature(StringRef Feature) const override {
7289 return Feature == "msp430";
7290 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007291 ArrayRef<const char *> getGCCRegNames() const override;
7292 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007293 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007294 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007295 }
7296 bool validateAsmConstraint(const char *&Name,
7297 TargetInfo::ConstraintInfo &info) const override {
7298 // FIXME: implement
7299 switch (*Name) {
7300 case 'K': // the constant 1
7301 case 'L': // constant -1^20 .. 1^19
7302 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007303 return true;
7304 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007305 // No target constraints for now.
7306 return false;
7307 }
7308 const char *getClobbers() const override {
7309 // FIXME: Is this really right?
7310 return "";
7311 }
7312 BuiltinVaListKind getBuiltinVaListKind() const override {
7313 // FIXME: implement
7314 return TargetInfo::CharPtrBuiltinVaList;
7315 }
7316};
7317
7318const char *const MSP430TargetInfo::GCCRegNames[] = {
7319 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7320 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7321
Craig Topperf054e3a2015-10-19 03:52:27 +00007322ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7323 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007324}
7325
7326// LLVM and Clang cannot be used directly to output native binaries for
7327// target, but is used to compile C code to llvm bitcode with correct
7328// type and alignment information.
7329//
7330// TCE uses the llvm bitcode as input and uses it for generating customized
7331// target processor and program binary. TCE co-design environment is
7332// publicly available in http://tce.cs.tut.fi
7333
7334static const unsigned TCEOpenCLAddrSpaceMap[] = {
7335 3, // opencl_global
7336 4, // opencl_local
7337 5, // opencl_constant
7338 // FIXME: generic has to be added to the target
7339 0, // opencl_generic
7340 0, // cuda_device
7341 0, // cuda_constant
7342 0 // cuda_shared
7343};
7344
7345class TCETargetInfo : public TargetInfo {
7346public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007347 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7348 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007349 TLSSupported = false;
7350 IntWidth = 32;
7351 LongWidth = LongLongWidth = 32;
7352 PointerWidth = 32;
7353 IntAlign = 32;
7354 LongAlign = LongLongAlign = 32;
7355 PointerAlign = 32;
7356 SuitableAlign = 32;
7357 SizeType = UnsignedInt;
7358 IntMaxType = SignedLong;
7359 IntPtrType = SignedInt;
7360 PtrDiffType = SignedInt;
7361 FloatWidth = 32;
7362 FloatAlign = 32;
7363 DoubleWidth = 32;
7364 DoubleAlign = 32;
7365 LongDoubleWidth = 32;
7366 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007367 FloatFormat = &llvm::APFloat::IEEEsingle();
7368 DoubleFormat = &llvm::APFloat::IEEEsingle();
7369 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007370 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7371 "i16:16:32-i32:32:32-i64:32:32-"
7372 "f32:32:32-f64:32:32-v64:32:32-"
7373 "v128:32:32-v256:32:32-v512:32:32-"
7374 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007375 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7376 UseAddrSpaceMapMangling = true;
7377 }
7378
7379 void getTargetDefines(const LangOptions &Opts,
7380 MacroBuilder &Builder) const override {
7381 DefineStd(Builder, "tce", Opts);
7382 Builder.defineMacro("__TCE__");
7383 Builder.defineMacro("__TCE_V1__");
7384 }
7385 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7386
Craig Topper6c03a542015-10-19 04:51:35 +00007387 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007388 const char *getClobbers() const override { return ""; }
7389 BuiltinVaListKind getBuiltinVaListKind() const override {
7390 return TargetInfo::VoidPtrBuiltinVaList;
7391 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007392 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007393 bool validateAsmConstraint(const char *&Name,
7394 TargetInfo::ConstraintInfo &info) const override {
7395 return true;
7396 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007397 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7398 return None;
7399 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007400};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007401
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007402class TCELETargetInfo : public TCETargetInfo {
7403public:
7404 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7405 : TCETargetInfo(Triple, Opts) {
7406 BigEndian = false;
7407
7408 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7409 "i16:16:32-i32:32:32-i64:32:32-"
7410 "f32:32:32-f64:32:32-v64:32:32-"
7411 "v128:32:32-v256:32:32-v512:32:32-"
7412 "v1024:32:32-a0:0:32-n32");
7413
7414 }
7415
7416 virtual void getTargetDefines(const LangOptions &Opts,
7417 MacroBuilder &Builder) const {
7418 DefineStd(Builder, "tcele", Opts);
7419 Builder.defineMacro("__TCE__");
7420 Builder.defineMacro("__TCE_V1__");
7421 Builder.defineMacro("__TCELE__");
7422 Builder.defineMacro("__TCELE_V1__");
7423 }
7424
7425};
7426
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007427class BPFTargetInfo : public TargetInfo {
7428public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007429 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7430 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007431 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7432 SizeType = UnsignedLong;
7433 PtrDiffType = SignedLong;
7434 IntPtrType = SignedLong;
7435 IntMaxType = SignedLong;
7436 Int64Type = SignedLong;
7437 RegParmMax = 5;
7438 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007439 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007440 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007441 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007442 }
7443 MaxAtomicPromoteWidth = 64;
7444 MaxAtomicInlineWidth = 64;
7445 TLSSupported = false;
7446 }
7447 void getTargetDefines(const LangOptions &Opts,
7448 MacroBuilder &Builder) const override {
7449 DefineStd(Builder, "bpf", Opts);
7450 Builder.defineMacro("__BPF__");
7451 }
7452 bool hasFeature(StringRef Feature) const override {
7453 return Feature == "bpf";
7454 }
7455
Craig Topper6c03a542015-10-19 04:51:35 +00007456 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007457 const char *getClobbers() const override {
7458 return "";
7459 }
7460 BuiltinVaListKind getBuiltinVaListKind() const override {
7461 return TargetInfo::VoidPtrBuiltinVaList;
7462 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007463 ArrayRef<const char *> getGCCRegNames() const override {
7464 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007465 }
7466 bool validateAsmConstraint(const char *&Name,
7467 TargetInfo::ConstraintInfo &info) const override {
7468 return true;
7469 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007470 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7471 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007472 }
7473};
7474
Daniel Sanders4672af62016-05-27 11:51:02 +00007475class MipsTargetInfo : public TargetInfo {
7476 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007477 StringRef Layout;
7478
7479 if (ABI == "o32")
7480 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7481 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007482 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007483 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007484 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007485 else
7486 llvm_unreachable("Invalid ABI");
7487
7488 if (BigEndian)
7489 resetDataLayout(("E-" + Layout).str());
7490 else
7491 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007492 }
7493
Akira Hatanaka9064e362013-10-29 18:30:33 +00007494
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007495 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007496 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007497 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007498 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007499 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007500 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007501 bool IsNoABICalls;
7502 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007503 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007504 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007505 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007506 enum DspRevEnum {
7507 NoDSP, DSP1, DSP2
7508 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007509 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007510
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007511protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007512 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007513 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007514
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007515public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007516 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007517 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007518 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7519 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7520 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007521 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007522
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007523 setABI((getTriple().getArch() == llvm::Triple::mips ||
7524 getTriple().getArch() == llvm::Triple::mipsel)
7525 ? "o32"
7526 : "n64");
7527
7528 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007529
7530 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7531 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007532 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007533
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007534 bool isNaN2008Default() const {
7535 return CPU == "mips32r6" || CPU == "mips64r6";
7536 }
7537
7538 bool isFP64Default() const {
7539 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7540 }
7541
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007542 bool isNan2008() const override {
7543 return IsNan2008;
7544 }
7545
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007546 bool processorSupportsGPR64() const {
7547 return llvm::StringSwitch<bool>(CPU)
7548 .Case("mips3", true)
7549 .Case("mips4", true)
7550 .Case("mips5", true)
7551 .Case("mips64", true)
7552 .Case("mips64r2", true)
7553 .Case("mips64r3", true)
7554 .Case("mips64r5", true)
7555 .Case("mips64r6", true)
7556 .Case("octeon", true)
7557 .Default(false);
7558 return false;
7559 }
7560
Alp Toker4925ba72014-06-07 23:30:42 +00007561 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007562 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007563 if (Name == "o32") {
7564 setO32ABITypes();
7565 ABI = Name;
7566 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007567 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007568
7569 if (Name == "n32") {
7570 setN32ABITypes();
7571 ABI = Name;
7572 return true;
7573 }
7574 if (Name == "n64") {
7575 setN64ABITypes();
7576 ABI = Name;
7577 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007578 }
7579 return false;
7580 }
7581
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007582 void setO32ABITypes() {
7583 Int64Type = SignedLongLong;
7584 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007585 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007586 LongDoubleWidth = LongDoubleAlign = 64;
7587 LongWidth = LongAlign = 32;
7588 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7589 PointerWidth = PointerAlign = 32;
7590 PtrDiffType = SignedInt;
7591 SizeType = UnsignedInt;
7592 SuitableAlign = 64;
7593 }
7594
7595 void setN32N64ABITypes() {
7596 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007597 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007598 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7599 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007600 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007601 }
7602 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7603 SuitableAlign = 128;
7604 }
7605
Daniel Sanders4672af62016-05-27 11:51:02 +00007606 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007607 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007608 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7609 Int64Type = SignedLongLong;
7610 } else {
7611 Int64Type = SignedLong;
7612 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007613 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007614 LongWidth = LongAlign = 64;
7615 PointerWidth = PointerAlign = 64;
7616 PtrDiffType = SignedLong;
7617 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007618 }
7619
7620 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007621 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007622 Int64Type = SignedLongLong;
7623 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007624 LongWidth = LongAlign = 32;
7625 PointerWidth = PointerAlign = 32;
7626 PtrDiffType = SignedInt;
7627 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007628 }
7629
Craig Topper3164f332014-03-11 03:39:26 +00007630 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007631 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007632 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007633 .Case("mips1", true)
7634 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007635 .Case("mips3", true)
7636 .Case("mips4", true)
7637 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007638 .Case("mips32", true)
7639 .Case("mips32r2", true)
7640 .Case("mips32r3", true)
7641 .Case("mips32r5", true)
7642 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007643 .Case("mips64", true)
7644 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007645 .Case("mips64r3", true)
7646 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007647 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007648 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007649 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007650 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007651 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007652 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007653 bool
7654 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7655 StringRef CPU,
7656 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007657 if (CPU.empty())
7658 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007659 if (CPU == "octeon")
7660 Features["mips64r2"] = Features["cnmips"] = true;
7661 else
7662 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007663 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007664 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007665
Craig Topper3164f332014-03-11 03:39:26 +00007666 void getTargetDefines(const LangOptions &Opts,
7667 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007668 if (BigEndian) {
7669 DefineStd(Builder, "MIPSEB", Opts);
7670 Builder.defineMacro("_MIPSEB");
7671 } else {
7672 DefineStd(Builder, "MIPSEL", Opts);
7673 Builder.defineMacro("_MIPSEL");
7674 }
7675
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007676 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007677 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007678 if (Opts.GNUMode)
7679 Builder.defineMacro("mips");
7680
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007681 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007682 Builder.defineMacro("__mips", "32");
7683 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7684 } else {
7685 Builder.defineMacro("__mips", "64");
7686 Builder.defineMacro("__mips64");
7687 Builder.defineMacro("__mips64__");
7688 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7689 }
7690
7691 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7692 .Cases("mips32", "mips64", "1")
7693 .Cases("mips32r2", "mips64r2", "2")
7694 .Cases("mips32r3", "mips64r3", "3")
7695 .Cases("mips32r5", "mips64r5", "5")
7696 .Cases("mips32r6", "mips64r6", "6")
7697 .Default("");
7698 if (!ISARev.empty())
7699 Builder.defineMacro("__mips_isa_rev", ISARev);
7700
7701 if (ABI == "o32") {
7702 Builder.defineMacro("__mips_o32");
7703 Builder.defineMacro("_ABIO32", "1");
7704 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007705 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007706 Builder.defineMacro("__mips_n32");
7707 Builder.defineMacro("_ABIN32", "2");
7708 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7709 } else if (ABI == "n64") {
7710 Builder.defineMacro("__mips_n64");
7711 Builder.defineMacro("_ABI64", "3");
7712 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7713 } else
7714 llvm_unreachable("Invalid ABI.");
7715
Simon Dardisdf827a72017-02-21 16:01:00 +00007716 if (!IsNoABICalls) {
7717 Builder.defineMacro("__mips_abicalls");
7718 if (CanUseBSDABICalls)
7719 Builder.defineMacro("__ABICALLS__");
7720 }
7721
Simon Atanasyan683535b2012-08-29 19:14:58 +00007722 Builder.defineMacro("__REGISTER_PREFIX__", "");
7723
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007724 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007725 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007726 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007727 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007728 case SoftFloat:
7729 Builder.defineMacro("__mips_soft_float", Twine(1));
7730 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007731 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007732
Simon Atanasyan16071912013-04-14 14:07:30 +00007733 if (IsSingleFloat)
7734 Builder.defineMacro("__mips_single_float", Twine(1));
7735
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007736 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7737 Builder.defineMacro("_MIPS_FPSET",
7738 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7739
Simon Atanasyan72244b62012-07-05 16:06:06 +00007740 if (IsMips16)
7741 Builder.defineMacro("__mips16", Twine(1));
7742
Simon Atanasyan60777612013-04-14 14:07:51 +00007743 if (IsMicromips)
7744 Builder.defineMacro("__mips_micromips", Twine(1));
7745
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007746 if (IsNan2008)
7747 Builder.defineMacro("__mips_nan2008", Twine(1));
7748
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007749 switch (DspRev) {
7750 default:
7751 break;
7752 case DSP1:
7753 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7754 Builder.defineMacro("__mips_dsp", Twine(1));
7755 break;
7756 case DSP2:
7757 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7758 Builder.defineMacro("__mips_dspr2", Twine(1));
7759 Builder.defineMacro("__mips_dsp", Twine(1));
7760 break;
7761 }
7762
Jack Carter44ff1e52013-08-12 17:20:29 +00007763 if (HasMSA)
7764 Builder.defineMacro("__mips_msa", Twine(1));
7765
Simon Atanasyan26f19672012-04-05 19:28:31 +00007766 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7767 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7768 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007769
7770 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7771 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007772
7773 // These shouldn't be defined for MIPS-I but there's no need to check
7774 // for that since MIPS-I isn't supported.
7775 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7776 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7777 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007778
7779 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7780 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7781 // the instructions exist but using them violates the ABI since they
7782 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7783 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007784 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007785 }
7786
Craig Topper6c03a542015-10-19 04:51:35 +00007787 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7788 return llvm::makeArrayRef(BuiltinInfo,
7789 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007790 }
Craig Topper3164f332014-03-11 03:39:26 +00007791 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007792 return llvm::StringSwitch<bool>(Feature)
7793 .Case("mips", true)
7794 .Case("fp64", HasFP64)
7795 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007796 }
Craig Topper3164f332014-03-11 03:39:26 +00007797 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007798 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007799 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007800 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007801 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007802 // CPU register names
7803 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007804 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7805 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7806 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007807 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7808 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007809 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7810 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7811 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7812 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007813 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007814 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007815 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7816 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007817 // MSA register names
7818 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7819 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7820 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7821 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7822 // MSA control register names
7823 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7824 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007825 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007826 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007827 }
Craig Topper3164f332014-03-11 03:39:26 +00007828 bool validateAsmConstraint(const char *&Name,
7829 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007830 switch (*Name) {
7831 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007832 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007833 case 'r': // CPU registers.
7834 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007835 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007836 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007837 case 'c': // $25 for indirect jumps
7838 case 'l': // lo register
7839 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007840 Info.setAllowsRegister();
7841 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007842 case 'I': // Signed 16-bit constant
7843 case 'J': // Integer 0
7844 case 'K': // Unsigned 16-bit constant
7845 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7846 case 'M': // Constants not loadable via lui, addiu, or ori
7847 case 'N': // Constant -1 to -65535
7848 case 'O': // A signed 15-bit constant
7849 case 'P': // A constant between 1 go 65535
7850 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007851 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007852 Info.setAllowsMemory();
7853 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007854 case 'Z':
7855 if (Name[1] == 'C') { // An address usable by ll, and sc.
7856 Info.setAllowsMemory();
7857 Name++; // Skip over 'Z'.
7858 return true;
7859 }
7860 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007861 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007862 }
7863
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007864 std::string convertConstraint(const char *&Constraint) const override {
7865 std::string R;
7866 switch (*Constraint) {
7867 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7868 if (Constraint[1] == 'C') {
7869 R = std::string("^") + std::string(Constraint, 2);
7870 Constraint++;
7871 return R;
7872 }
7873 break;
7874 }
7875 return TargetInfo::convertConstraint(Constraint);
7876 }
7877
Craig Topper3164f332014-03-11 03:39:26 +00007878 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007879 // In GCC, $1 is not widely used in generated code (it's used only in a few
7880 // specific situations), so there is no real need for users to add it to
7881 // the clobbers list if they want to use it in their inline assembly code.
7882 //
7883 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7884 // code generation, so using it in inline assembly without adding it to the
7885 // clobbers list can cause conflicts between the inline assembly code and
7886 // the surrounding generated code.
7887 //
7888 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7889 // operands, which will conflict with the ".set at" assembler option (which
7890 // we use only for inline assembly, in order to maintain compatibility with
7891 // GCC) and will also conflict with the user's usage of $1.
7892 //
7893 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7894 // register for generated code is to automatically clobber $1 for all inline
7895 // assembly code.
7896 //
7897 // FIXME: We should automatically clobber $1 only for inline assembly code
7898 // which actually uses it. This would allow LLVM to use $1 for inline
7899 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007900 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007901 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007902
Craig Topper3164f332014-03-11 03:39:26 +00007903 bool handleTargetFeatures(std::vector<std::string> &Features,
7904 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007905 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007906 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007907 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007908 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007909 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007910 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007911 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007912
Eric Christopher610fe112015-08-26 08:21:55 +00007913 for (const auto &Feature : Features) {
7914 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007915 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007916 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007917 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007918 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007919 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007920 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007921 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007922 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007923 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007924 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007925 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007926 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007927 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007928 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007929 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007930 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007931 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007932 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007933 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007934 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007935 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00007936 else if (Feature == "+noabicalls")
7937 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007938 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007939
James Y Knightb214cbc2016-03-04 19:00:41 +00007940 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007941
Rafael Espindolaeb265472013-08-21 21:59:03 +00007942 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007943 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007944
Craig Topper3164f332014-03-11 03:39:26 +00007945 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007946 if (RegNo == 0) return 4;
7947 if (RegNo == 1) return 5;
7948 return -1;
7949 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007950
7951 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007952
7953 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7954 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7955 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7956 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7957 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7958 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7959 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7960 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7961 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7962 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7963 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7964 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7965 {{"ra"}, "$31"}};
7966 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7967 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7968 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7969 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7970 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7971 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7972 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7973 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7974 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7975 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7976 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7977 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007978 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007979 return llvm::makeArrayRef(O32RegAliases);
7980 return llvm::makeArrayRef(NewABIRegAliases);
7981 }
7982
7983 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007984 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007985 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007986
7987 bool validateTarget(DiagnosticsEngine &Diags) const override {
7988 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7989 // this yet. It's better to fail here than on the backend assertion.
7990 if (processorSupportsGPR64() && ABI == "o32") {
7991 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7992 return false;
7993 }
7994
7995 // 64-bit ABI's require 64-bit CPU's.
7996 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7997 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7998 return false;
7999 }
8000
8001 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8002 // can't handle this yet. It's better to fail here than on the
8003 // backend assertion.
8004 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8005 getTriple().getArch() == llvm::Triple::mips64el) &&
8006 ABI == "o32") {
8007 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8008 << ABI << getTriple().str();
8009 return false;
8010 }
8011
8012 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8013 // can't handle this yet. It's better to fail here than on the
8014 // backend assertion.
8015 if ((getTriple().getArch() == llvm::Triple::mips ||
8016 getTriple().getArch() == llvm::Triple::mipsel) &&
8017 (ABI == "n32" || ABI == "n64")) {
8018 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8019 << ABI << getTriple().str();
8020 return false;
8021 }
8022
8023 return true;
8024 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008025};
8026
Daniel Sanders4672af62016-05-27 11:51:02 +00008027const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008028#define BUILTIN(ID, TYPE, ATTRS) \
8029 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8030#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8031 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008032#include "clang/Basic/BuiltinsMips.def"
8033};
8034
Ivan Krasindd7403e2011-08-24 20:22:22 +00008035class PNaClTargetInfo : public TargetInfo {
8036public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008037 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8038 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008039 this->LongAlign = 32;
8040 this->LongWidth = 32;
8041 this->PointerAlign = 32;
8042 this->PointerWidth = 32;
8043 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008044 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008045 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008046 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008047 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008048 this->SizeType = TargetInfo::UnsignedInt;
8049 this->PtrDiffType = TargetInfo::SignedInt;
8050 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008051 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008052 }
8053
Craig Toppere6f17d02014-03-11 04:07:52 +00008054 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008055 Builder.defineMacro("__le32__");
8056 Builder.defineMacro("__pnacl__");
8057 }
Craig Topper3164f332014-03-11 03:39:26 +00008058 void getTargetDefines(const LangOptions &Opts,
8059 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008060 getArchDefines(Opts, Builder);
8061 }
Craig Topper3164f332014-03-11 03:39:26 +00008062 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008063 return Feature == "pnacl";
8064 }
Craig Topper6c03a542015-10-19 04:51:35 +00008065 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008066 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008067 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008068 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008069 ArrayRef<const char *> getGCCRegNames() const override;
8070 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008071 bool validateAsmConstraint(const char *&Name,
8072 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008073 return false;
8074 }
8075
Craig Topper3164f332014-03-11 03:39:26 +00008076 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008077 return "";
8078 }
8079};
8080
Craig Topperf054e3a2015-10-19 03:52:27 +00008081ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8082 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008083}
8084
Craig Topperf054e3a2015-10-19 03:52:27 +00008085ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8086 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008087}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008088
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008089// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008090class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008091public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008092 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8093 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008094
8095 BuiltinVaListKind getBuiltinVaListKind() const override {
8096 return TargetInfo::PNaClABIBuiltinVaList;
8097 }
8098};
8099
JF Bastien643817d2014-09-12 17:52:47 +00008100class Le64TargetInfo : public TargetInfo {
8101 static const Builtin::Info BuiltinInfo[];
8102
8103public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008104 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8105 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008106 NoAsmVariants = true;
8107 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8108 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008109 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008110 }
8111
8112 void getTargetDefines(const LangOptions &Opts,
8113 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008114 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008115 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8116 Builder.defineMacro("__ELF__");
8117 }
Craig Topper6c03a542015-10-19 04:51:35 +00008118 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8119 return llvm::makeArrayRef(BuiltinInfo,
8120 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008121 }
8122 BuiltinVaListKind getBuiltinVaListKind() const override {
8123 return TargetInfo::PNaClABIBuiltinVaList;
8124 }
8125 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008126 ArrayRef<const char *> getGCCRegNames() const override {
8127 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008128 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008129 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8130 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008131 }
8132 bool validateAsmConstraint(const char *&Name,
8133 TargetInfo::ConstraintInfo &Info) const override {
8134 return false;
8135 }
8136
8137 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008138};
Dan Gohmanc2853072015-09-03 22:51:53 +00008139
8140class WebAssemblyTargetInfo : public TargetInfo {
8141 static const Builtin::Info BuiltinInfo[];
8142
8143 enum SIMDEnum {
8144 NoSIMD,
8145 SIMD128,
8146 } SIMDLevel;
8147
8148public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008149 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008150 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008151 NoAsmVariants = true;
8152 SuitableAlign = 128;
8153 LargeArrayMinWidth = 128;
8154 LargeArrayAlign = 128;
8155 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008156 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008157 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008158 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008159 SizeType = UnsignedInt;
8160 PtrDiffType = SignedInt;
8161 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008162 }
8163
8164protected:
8165 void getTargetDefines(const LangOptions &Opts,
8166 MacroBuilder &Builder) const override {
8167 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8168 if (SIMDLevel >= SIMD128)
8169 Builder.defineMacro("__wasm_simd128__");
8170 }
8171
8172private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008173 bool
8174 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8175 StringRef CPU,
8176 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008177 if (CPU == "bleeding-edge")
8178 Features["simd128"] = true;
8179 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8180 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008181 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008182 return llvm::StringSwitch<bool>(Feature)
8183 .Case("simd128", SIMDLevel >= SIMD128)
8184 .Default(false);
8185 }
8186 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008187 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008188 for (const auto &Feature : Features) {
8189 if (Feature == "+simd128") {
8190 SIMDLevel = std::max(SIMDLevel, SIMD128);
8191 continue;
8192 }
8193 if (Feature == "-simd128") {
8194 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8195 continue;
8196 }
8197
8198 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8199 << "-target-feature";
8200 return false;
8201 }
8202 return true;
8203 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008204 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008205 return llvm::StringSwitch<bool>(Name)
8206 .Case("mvp", true)
8207 .Case("bleeding-edge", true)
8208 .Case("generic", true)
8209 .Default(false);
8210 }
Craig Topper6c03a542015-10-19 04:51:35 +00008211 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8212 return llvm::makeArrayRef(BuiltinInfo,
8213 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008214 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008215 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008216 return VoidPtrBuiltinVaList;
8217 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008218 ArrayRef<const char *> getGCCRegNames() const final {
8219 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008220 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008221 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8222 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008223 }
8224 bool
8225 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008226 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008227 return false;
8228 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008229 const char *getClobbers() const final { return ""; }
8230 bool isCLZForZeroUndef() const final { return false; }
8231 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008232 IntType getIntTypeByWidth(unsigned BitWidth,
8233 bool IsSigned) const final {
8234 // WebAssembly prefers long long for explicitly 64-bit integers.
8235 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8236 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8237 }
8238 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8239 bool IsSigned) const final {
8240 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8241 return BitWidth == 64
8242 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8243 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8244 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008245};
8246
8247const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8248#define BUILTIN(ID, TYPE, ATTRS) \
8249 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8250#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8251 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8252#include "clang/Basic/BuiltinsWebAssembly.def"
8253};
8254
8255class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8256public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8258 const TargetOptions &Opts)
8259 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008260 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008261 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008262 }
8263
8264protected:
8265 void getTargetDefines(const LangOptions &Opts,
8266 MacroBuilder &Builder) const override {
8267 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8268 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8269 }
8270};
8271
8272class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8273public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8275 const TargetOptions &Opts)
8276 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008277 LongAlign = LongWidth = 64;
8278 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008279 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008280 SizeType = UnsignedLong;
8281 PtrDiffType = SignedLong;
8282 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008283 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008284 }
8285
8286protected:
8287 void getTargetDefines(const LangOptions &Opts,
8288 MacroBuilder &Builder) const override {
8289 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8290 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8291 }
8292};
8293
JF Bastien643817d2014-09-12 17:52:47 +00008294const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8295#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008296 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008297#include "clang/Basic/BuiltinsLe64.def"
8298};
8299
Eric Christopherc48497a2015-09-18 21:26:24 +00008300static const unsigned SPIRAddrSpaceMap[] = {
8301 1, // opencl_global
8302 3, // opencl_local
8303 2, // opencl_constant
8304 4, // opencl_generic
8305 0, // cuda_device
8306 0, // cuda_constant
8307 0 // cuda_shared
8308};
8309class SPIRTargetInfo : public TargetInfo {
8310public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8312 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008313 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8314 "SPIR target must use unknown OS");
8315 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8316 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008317 TLSSupported = false;
8318 LongWidth = LongAlign = 64;
8319 AddrSpaceMap = &SPIRAddrSpaceMap;
8320 UseAddrSpaceMapMangling = true;
8321 // Define available target features
8322 // These must be defined in sorted order!
8323 NoAsmVariants = true;
8324 }
8325 void getTargetDefines(const LangOptions &Opts,
8326 MacroBuilder &Builder) const override {
8327 DefineStd(Builder, "SPIR", Opts);
8328 }
8329 bool hasFeature(StringRef Feature) const override {
8330 return Feature == "spir";
8331 }
Craig Topper3164f332014-03-11 03:39:26 +00008332
Craig Topper6c03a542015-10-19 04:51:35 +00008333 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008334 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008335 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008336 bool validateAsmConstraint(const char *&Name,
8337 TargetInfo::ConstraintInfo &info) const override {
8338 return true;
8339 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008340 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8341 return None;
8342 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008343 BuiltinVaListKind getBuiltinVaListKind() const override {
8344 return TargetInfo::VoidPtrBuiltinVaList;
8345 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008346
Eric Christopherc48497a2015-09-18 21:26:24 +00008347 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008348 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8349 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008350 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008351
Eric Christopherc48497a2015-09-18 21:26:24 +00008352 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8353 return CC_SpirFunction;
8354 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008355
8356 void setSupportedOpenCLOpts() override {
8357 // Assume all OpenCL extensions and optional core features are supported
8358 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008359 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008360 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008361};
Guy Benyeib798fc92012-12-11 21:38:14 +00008362
Eric Christopherc48497a2015-09-18 21:26:24 +00008363class SPIR32TargetInfo : public SPIRTargetInfo {
8364public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8366 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008367 PointerWidth = PointerAlign = 32;
8368 SizeType = TargetInfo::UnsignedInt;
8369 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008370 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8371 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008372 }
8373 void getTargetDefines(const LangOptions &Opts,
8374 MacroBuilder &Builder) const override {
8375 DefineStd(Builder, "SPIR32", Opts);
8376 }
8377};
Guy Benyeib798fc92012-12-11 21:38:14 +00008378
Eric Christopherc48497a2015-09-18 21:26:24 +00008379class SPIR64TargetInfo : public SPIRTargetInfo {
8380public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008381 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8382 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008383 PointerWidth = PointerAlign = 64;
8384 SizeType = TargetInfo::UnsignedLong;
8385 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008386 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8387 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008388 }
8389 void getTargetDefines(const LangOptions &Opts,
8390 MacroBuilder &Builder) const override {
8391 DefineStd(Builder, "SPIR64", Opts);
8392 }
8393};
Guy Benyeib798fc92012-12-11 21:38:14 +00008394
Robert Lytton0e076492013-08-13 09:43:10 +00008395class XCoreTargetInfo : public TargetInfo {
8396 static const Builtin::Info BuiltinInfo[];
8397public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8399 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008400 NoAsmVariants = true;
8401 LongLongAlign = 32;
8402 SuitableAlign = 32;
8403 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008404 SizeType = UnsignedInt;
8405 PtrDiffType = SignedInt;
8406 IntPtrType = SignedInt;
8407 WCharType = UnsignedChar;
8408 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008409 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008410 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8411 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008412 }
Craig Topper3164f332014-03-11 03:39:26 +00008413 void getTargetDefines(const LangOptions &Opts,
8414 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008415 Builder.defineMacro("__XS1B__");
8416 }
Craig Topper6c03a542015-10-19 04:51:35 +00008417 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8418 return llvm::makeArrayRef(BuiltinInfo,
8419 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008420 }
Craig Topper3164f332014-03-11 03:39:26 +00008421 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008422 return TargetInfo::VoidPtrBuiltinVaList;
8423 }
Craig Topper3164f332014-03-11 03:39:26 +00008424 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008425 return "";
8426 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008427 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008428 static const char * const GCCRegNames[] = {
8429 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8430 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8431 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008432 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008433 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008434 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8435 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008436 }
Craig Topper3164f332014-03-11 03:39:26 +00008437 bool validateAsmConstraint(const char *&Name,
8438 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008439 return false;
8440 }
Craig Topper3164f332014-03-11 03:39:26 +00008441 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008442 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8443 return (RegNo < 2)? RegNo : -1;
8444 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008445 bool allowsLargerPreferedTypeAlignment() const override {
8446 return false;
8447 }
Robert Lytton0e076492013-08-13 09:43:10 +00008448};
8449
8450const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008451#define BUILTIN(ID, TYPE, ATTRS) \
8452 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8453#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8454 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008455#include "clang/Basic/BuiltinsXCore.def"
8456};
Robert Lytton0e076492013-08-13 09:43:10 +00008457
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008458// x86_32 Android target
8459class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8460public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8462 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008463 SuitableAlign = 32;
8464 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008465 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008466 }
8467};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008468
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008469// x86_64 Android target
8470class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8471public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8473 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008474 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008475 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008476
8477 bool useFloat128ManglingForLongDouble() const override {
8478 return true;
8479 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008480};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008481
8482// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8483class RenderScript32TargetInfo : public ARMleTargetInfo {
8484public:
8485 RenderScript32TargetInfo(const llvm::Triple &Triple,
8486 const TargetOptions &Opts)
8487 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8488 Triple.getOSName(),
8489 Triple.getEnvironmentName()),
8490 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008491 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008492 LongWidth = LongAlign = 64;
8493 }
8494 void getTargetDefines(const LangOptions &Opts,
8495 MacroBuilder &Builder) const override {
8496 Builder.defineMacro("__RENDERSCRIPT__");
8497 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8498 }
8499};
8500
8501// 64-bit RenderScript is aarch64
8502class RenderScript64TargetInfo : public AArch64leTargetInfo {
8503public:
8504 RenderScript64TargetInfo(const llvm::Triple &Triple,
8505 const TargetOptions &Opts)
8506 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8507 Triple.getOSName(),
8508 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008509 Opts) {
8510 IsRenderScriptTarget = true;
8511 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008512
8513 void getTargetDefines(const LangOptions &Opts,
8514 MacroBuilder &Builder) const override {
8515 Builder.defineMacro("__RENDERSCRIPT__");
8516 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8517 }
8518};
8519
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008520/// Information about a specific microcontroller.
8521struct MCUInfo {
8522 const char *Name;
8523 const char *DefineName;
8524};
8525
8526// This list should be kept up-to-date with AVRDevices.td in LLVM.
8527static ArrayRef<MCUInfo> AVRMcus = {
8528 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008529 { "attiny11", "__AVR_ATtiny11__" },
8530 { "attiny12", "__AVR_ATtiny12__" },
8531 { "attiny15", "__AVR_ATtiny15__" },
8532 { "attiny28", "__AVR_ATtiny28__" },
8533 { "at90s2313", "__AVR_AT90S2313__" },
8534 { "at90s2323", "__AVR_AT90S2323__" },
8535 { "at90s2333", "__AVR_AT90S2333__" },
8536 { "at90s2343", "__AVR_AT90S2343__" },
8537 { "attiny22", "__AVR_ATtiny22__" },
8538 { "attiny26", "__AVR_ATtiny26__" },
8539 { "at86rf401", "__AVR_AT86RF401__" },
8540 { "at90s4414", "__AVR_AT90S4414__" },
8541 { "at90s4433", "__AVR_AT90S4433__" },
8542 { "at90s4434", "__AVR_AT90S4434__" },
8543 { "at90s8515", "__AVR_AT90S8515__" },
8544 { "at90c8534", "__AVR_AT90c8534__" },
8545 { "at90s8535", "__AVR_AT90S8535__" },
8546 { "ata5272", "__AVR_ATA5272__" },
8547 { "attiny13", "__AVR_ATtiny13__" },
8548 { "attiny13a", "__AVR_ATtiny13A__" },
8549 { "attiny2313", "__AVR_ATtiny2313__" },
8550 { "attiny2313a", "__AVR_ATtiny2313A__" },
8551 { "attiny24", "__AVR_ATtiny24__" },
8552 { "attiny24a", "__AVR_ATtiny24A__" },
8553 { "attiny4313", "__AVR_ATtiny4313__" },
8554 { "attiny44", "__AVR_ATtiny44__" },
8555 { "attiny44a", "__AVR_ATtiny44A__" },
8556 { "attiny84", "__AVR_ATtiny84__" },
8557 { "attiny84a", "__AVR_ATtiny84A__" },
8558 { "attiny25", "__AVR_ATtiny25__" },
8559 { "attiny45", "__AVR_ATtiny45__" },
8560 { "attiny85", "__AVR_ATtiny85__" },
8561 { "attiny261", "__AVR_ATtiny261__" },
8562 { "attiny261a", "__AVR_ATtiny261A__" },
8563 { "attiny461", "__AVR_ATtiny461__" },
8564 { "attiny461a", "__AVR_ATtiny461A__" },
8565 { "attiny861", "__AVR_ATtiny861__" },
8566 { "attiny861a", "__AVR_ATtiny861A__" },
8567 { "attiny87", "__AVR_ATtiny87__" },
8568 { "attiny43u", "__AVR_ATtiny43U__" },
8569 { "attiny48", "__AVR_ATtiny48__" },
8570 { "attiny88", "__AVR_ATtiny88__" },
8571 { "attiny828", "__AVR_ATtiny828__" },
8572 { "at43usb355", "__AVR_AT43USB355__" },
8573 { "at76c711", "__AVR_AT76C711__" },
8574 { "atmega103", "__AVR_ATmega103__" },
8575 { "at43usb320", "__AVR_AT43USB320__" },
8576 { "attiny167", "__AVR_ATtiny167__" },
8577 { "at90usb82", "__AVR_AT90USB82__" },
8578 { "at90usb162", "__AVR_AT90USB162__" },
8579 { "ata5505", "__AVR_ATA5505__" },
8580 { "atmega8u2", "__AVR_ATmega8U2__" },
8581 { "atmega16u2", "__AVR_ATmega16U2__" },
8582 { "atmega32u2", "__AVR_ATmega32U2__" },
8583 { "attiny1634", "__AVR_ATtiny1634__" },
8584 { "atmega8", "__AVR_ATmega8__" },
8585 { "ata6289", "__AVR_ATA6289__" },
8586 { "atmega8a", "__AVR_ATmega8A__" },
8587 { "ata6285", "__AVR_ATA6285__" },
8588 { "ata6286", "__AVR_ATA6286__" },
8589 { "atmega48", "__AVR_ATmega48__" },
8590 { "atmega48a", "__AVR_ATmega48A__" },
8591 { "atmega48pa", "__AVR_ATmega48PA__" },
8592 { "atmega48p", "__AVR_ATmega48P__" },
8593 { "atmega88", "__AVR_ATmega88__" },
8594 { "atmega88a", "__AVR_ATmega88A__" },
8595 { "atmega88p", "__AVR_ATmega88P__" },
8596 { "atmega88pa", "__AVR_ATmega88PA__" },
8597 { "atmega8515", "__AVR_ATmega8515__" },
8598 { "atmega8535", "__AVR_ATmega8535__" },
8599 { "atmega8hva", "__AVR_ATmega8HVA__" },
8600 { "at90pwm1", "__AVR_AT90PWM1__" },
8601 { "at90pwm2", "__AVR_AT90PWM2__" },
8602 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8603 { "at90pwm3", "__AVR_AT90PWM3__" },
8604 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8605 { "at90pwm81", "__AVR_AT90PWM81__" },
8606 { "ata5790", "__AVR_ATA5790__" },
8607 { "ata5795", "__AVR_ATA5795__" },
8608 { "atmega16", "__AVR_ATmega16__" },
8609 { "atmega16a", "__AVR_ATmega16A__" },
8610 { "atmega161", "__AVR_ATmega161__" },
8611 { "atmega162", "__AVR_ATmega162__" },
8612 { "atmega163", "__AVR_ATmega163__" },
8613 { "atmega164a", "__AVR_ATmega164A__" },
8614 { "atmega164p", "__AVR_ATmega164P__" },
8615 { "atmega164pa", "__AVR_ATmega164PA__" },
8616 { "atmega165", "__AVR_ATmega165__" },
8617 { "atmega165a", "__AVR_ATmega165A__" },
8618 { "atmega165p", "__AVR_ATmega165P__" },
8619 { "atmega165pa", "__AVR_ATmega165PA__" },
8620 { "atmega168", "__AVR_ATmega168__" },
8621 { "atmega168a", "__AVR_ATmega168A__" },
8622 { "atmega168p", "__AVR_ATmega168P__" },
8623 { "atmega168pa", "__AVR_ATmega168PA__" },
8624 { "atmega169", "__AVR_ATmega169__" },
8625 { "atmega169a", "__AVR_ATmega169A__" },
8626 { "atmega169p", "__AVR_ATmega169P__" },
8627 { "atmega169pa", "__AVR_ATmega169PA__" },
8628 { "atmega32", "__AVR_ATmega32__" },
8629 { "atmega32a", "__AVR_ATmega32A__" },
8630 { "atmega323", "__AVR_ATmega323__" },
8631 { "atmega324a", "__AVR_ATmega324A__" },
8632 { "atmega324p", "__AVR_ATmega324P__" },
8633 { "atmega324pa", "__AVR_ATmega324PA__" },
8634 { "atmega325", "__AVR_ATmega325__" },
8635 { "atmega325a", "__AVR_ATmega325A__" },
8636 { "atmega325p", "__AVR_ATmega325P__" },
8637 { "atmega325pa", "__AVR_ATmega325PA__" },
8638 { "atmega3250", "__AVR_ATmega3250__" },
8639 { "atmega3250a", "__AVR_ATmega3250A__" },
8640 { "atmega3250p", "__AVR_ATmega3250P__" },
8641 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8642 { "atmega328", "__AVR_ATmega328__" },
8643 { "atmega328p", "__AVR_ATmega328P__" },
8644 { "atmega329", "__AVR_ATmega329__" },
8645 { "atmega329a", "__AVR_ATmega329A__" },
8646 { "atmega329p", "__AVR_ATmega329P__" },
8647 { "atmega329pa", "__AVR_ATmega329PA__" },
8648 { "atmega3290", "__AVR_ATmega3290__" },
8649 { "atmega3290a", "__AVR_ATmega3290A__" },
8650 { "atmega3290p", "__AVR_ATmega3290P__" },
8651 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8652 { "atmega406", "__AVR_ATmega406__" },
8653 { "atmega64", "__AVR_ATmega64__" },
8654 { "atmega64a", "__AVR_ATmega64A__" },
8655 { "atmega640", "__AVR_ATmega640__" },
8656 { "atmega644", "__AVR_ATmega644__" },
8657 { "atmega644a", "__AVR_ATmega644A__" },
8658 { "atmega644p", "__AVR_ATmega644P__" },
8659 { "atmega644pa", "__AVR_ATmega644PA__" },
8660 { "atmega645", "__AVR_ATmega645__" },
8661 { "atmega645a", "__AVR_ATmega645A__" },
8662 { "atmega645p", "__AVR_ATmega645P__" },
8663 { "atmega649", "__AVR_ATmega649__" },
8664 { "atmega649a", "__AVR_ATmega649A__" },
8665 { "atmega649p", "__AVR_ATmega649P__" },
8666 { "atmega6450", "__AVR_ATmega6450__" },
8667 { "atmega6450a", "__AVR_ATmega6450A__" },
8668 { "atmega6450p", "__AVR_ATmega6450P__" },
8669 { "atmega6490", "__AVR_ATmega6490__" },
8670 { "atmega6490a", "__AVR_ATmega6490A__" },
8671 { "atmega6490p", "__AVR_ATmega6490P__" },
8672 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8673 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8674 { "atmega16hva", "__AVR_ATmega16HVA__" },
8675 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8676 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8677 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8678 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8679 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8680 { "atmega64hve", "__AVR_ATmega64HVE__" },
8681 { "at90can32", "__AVR_AT90CAN32__" },
8682 { "at90can64", "__AVR_AT90CAN64__" },
8683 { "at90pwm161", "__AVR_AT90PWM161__" },
8684 { "at90pwm216", "__AVR_AT90PWM216__" },
8685 { "at90pwm316", "__AVR_AT90PWM316__" },
8686 { "atmega32c1", "__AVR_ATmega32C1__" },
8687 { "atmega64c1", "__AVR_ATmega64C1__" },
8688 { "atmega16m1", "__AVR_ATmega16M1__" },
8689 { "atmega32m1", "__AVR_ATmega32M1__" },
8690 { "atmega64m1", "__AVR_ATmega64M1__" },
8691 { "atmega16u4", "__AVR_ATmega16U4__" },
8692 { "atmega32u4", "__AVR_ATmega32U4__" },
8693 { "atmega32u6", "__AVR_ATmega32U6__" },
8694 { "at90usb646", "__AVR_AT90USB646__" },
8695 { "at90usb647", "__AVR_AT90USB647__" },
8696 { "at90scr100", "__AVR_AT90SCR100__" },
8697 { "at94k", "__AVR_AT94K__" },
8698 { "m3000", "__AVR_AT000__" },
8699 { "atmega128", "__AVR_ATmega128__" },
8700 { "atmega128a", "__AVR_ATmega128A__" },
8701 { "atmega1280", "__AVR_ATmega1280__" },
8702 { "atmega1281", "__AVR_ATmega1281__" },
8703 { "atmega1284", "__AVR_ATmega1284__" },
8704 { "atmega1284p", "__AVR_ATmega1284P__" },
8705 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8706 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8707 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8708 { "at90can128", "__AVR_AT90CAN128__" },
8709 { "at90usb1286", "__AVR_AT90USB1286__" },
8710 { "at90usb1287", "__AVR_AT90USB1287__" },
8711 { "atmega2560", "__AVR_ATmega2560__" },
8712 { "atmega2561", "__AVR_ATmega2561__" },
8713 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8714 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8715 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8716 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8717 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8718 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8719 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8720 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8721 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8722 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8723 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8724 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8725 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8726 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8727 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8728 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8729 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8730 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8731 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8732 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8733 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8734 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8735 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8736 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8737 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8738 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8739 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8740 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8741 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8742 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8743 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8744 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8745 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8746 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8747 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8748 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8749 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8750 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8751 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8752 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8753 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8754 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8755 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8756 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8757 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8758 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8759 { "attiny4", "__AVR_ATtiny4__" },
8760 { "attiny5", "__AVR_ATtiny5__" },
8761 { "attiny9", "__AVR_ATtiny9__" },
8762 { "attiny10", "__AVR_ATtiny10__" },
8763 { "attiny20", "__AVR_ATtiny20__" },
8764 { "attiny40", "__AVR_ATtiny40__" },
8765 { "attiny102", "__AVR_ATtiny102__" },
8766 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008767};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008768
8769// AVR Target
8770class AVRTargetInfo : public TargetInfo {
8771public:
8772 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8773 : TargetInfo(Triple) {
8774 TLSSupported = false;
8775 PointerWidth = 16;
8776 PointerAlign = 8;
8777 IntWidth = 16;
8778 IntAlign = 8;
8779 LongWidth = 32;
8780 LongAlign = 8;
8781 LongLongWidth = 64;
8782 LongLongAlign = 8;
8783 SuitableAlign = 8;
8784 DefaultAlignForAttributeAligned = 8;
8785 HalfWidth = 16;
8786 HalfAlign = 8;
8787 FloatWidth = 32;
8788 FloatAlign = 8;
8789 DoubleWidth = 32;
8790 DoubleAlign = 8;
8791 DoubleFormat = &llvm::APFloat::IEEEsingle();
8792 LongDoubleWidth = 32;
8793 LongDoubleAlign = 8;
8794 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8795 SizeType = UnsignedInt;
8796 PtrDiffType = SignedInt;
8797 IntPtrType = SignedInt;
8798 Char16Type = UnsignedInt;
8799 WCharType = SignedInt;
8800 WIntType = SignedInt;
8801 Char32Type = UnsignedLong;
8802 SigAtomicType = SignedChar;
8803 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8804 "-f32:32:32-f64:64:64-n8");
8805 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008806
Dylan McKay924fa3a2017-01-05 05:20:27 +00008807 void getTargetDefines(const LangOptions &Opts,
8808 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008809 Builder.defineMacro("AVR");
8810 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008811 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008812
8813 if (!this->CPU.empty()) {
8814 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8815 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8816
8817 if (It != AVRMcus.end())
8818 Builder.defineMacro(It->DefineName);
8819 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008820 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008821
Dylan McKay924fa3a2017-01-05 05:20:27 +00008822 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8823 return None;
8824 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008825
Dylan McKay924fa3a2017-01-05 05:20:27 +00008826 BuiltinVaListKind getBuiltinVaListKind() const override {
8827 return TargetInfo::VoidPtrBuiltinVaList;
8828 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008829
Dylan McKay924fa3a2017-01-05 05:20:27 +00008830 const char *getClobbers() const override {
8831 return "";
8832 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008833
Dylan McKay924fa3a2017-01-05 05:20:27 +00008834 ArrayRef<const char *> getGCCRegNames() const override {
8835 static const char * const GCCRegNames[] = {
8836 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8837 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8838 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008839 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008840 };
8841 return llvm::makeArrayRef(GCCRegNames);
8842 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008843
Dylan McKay924fa3a2017-01-05 05:20:27 +00008844 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8845 return None;
8846 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008847
Dylan McKay924fa3a2017-01-05 05:20:27 +00008848 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8849 static const TargetInfo::AddlRegName AddlRegNames[] = {
8850 { { "r26", "r27"}, 26 },
8851 { { "r28", "r29"}, 27 },
8852 { { "r30", "r31"}, 28 },
8853 { { "SPL", "SPH"}, 29 },
8854 };
8855 return llvm::makeArrayRef(AddlRegNames);
8856 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008857
Dylan McKay924fa3a2017-01-05 05:20:27 +00008858 bool validateAsmConstraint(const char *&Name,
8859 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008860 // There aren't any multi-character AVR specific constraints.
8861 if (StringRef(Name).size() > 1) return false;
8862
8863 switch (*Name) {
8864 default: return false;
8865 case 'a': // Simple upper registers
8866 case 'b': // Base pointer registers pairs
8867 case 'd': // Upper register
8868 case 'l': // Lower registers
8869 case 'e': // Pointer register pairs
8870 case 'q': // Stack pointer register
8871 case 'r': // Any register
8872 case 'w': // Special upper register pairs
8873 case 't': // Temporary register
8874 case 'x': case 'X': // Pointer register pair X
8875 case 'y': case 'Y': // Pointer register pair Y
8876 case 'z': case 'Z': // Pointer register pair Z
8877 Info.setAllowsRegister();
8878 return true;
8879 case 'I': // 6-bit positive integer constant
8880 Info.setRequiresImmediate(0, 63);
8881 return true;
8882 case 'J': // 6-bit negative integer constant
8883 Info.setRequiresImmediate(-63, 0);
8884 return true;
8885 case 'K': // Integer constant (Range: 2)
8886 Info.setRequiresImmediate(2);
8887 return true;
8888 case 'L': // Integer constant (Range: 0)
8889 Info.setRequiresImmediate(0);
8890 return true;
8891 case 'M': // 8-bit integer constant
8892 Info.setRequiresImmediate(0, 0xff);
8893 return true;
8894 case 'N': // Integer constant (Range: -1)
8895 Info.setRequiresImmediate(-1);
8896 return true;
8897 case 'O': // Integer constant (Range: 8, 16, 24)
8898 Info.setRequiresImmediate({8, 16, 24});
8899 return true;
8900 case 'P': // Integer constant (Range: 1)
8901 Info.setRequiresImmediate(1);
8902 return true;
8903 case 'R': // Integer constant (Range: -6 to 5)
8904 Info.setRequiresImmediate(-6, 5);
8905 return true;
8906 case 'G': // Floating point constant
8907 case 'Q': // A memory address based on Y or Z pointer with displacement.
8908 return true;
8909 }
8910
Dylan McKay924fa3a2017-01-05 05:20:27 +00008911 return false;
8912 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008913
Dylan McKay924fa3a2017-01-05 05:20:27 +00008914 IntType getIntTypeByWidth(unsigned BitWidth,
8915 bool IsSigned) const final {
8916 // AVR prefers int for 16-bit integers.
8917 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8918 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8919 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008920
Dylan McKay924fa3a2017-01-05 05:20:27 +00008921 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8922 bool IsSigned) const final {
8923 // AVR uses int for int_least16_t and int_fast16_t.
8924 return BitWidth == 16
8925 ? (IsSigned ? SignedInt : UnsignedInt)
8926 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8927 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008928
8929 bool setCPU(const std::string &Name) override {
8930 bool IsFamily = llvm::StringSwitch<bool>(Name)
8931 .Case("avr1", true)
8932 .Case("avr2", true)
8933 .Case("avr25", true)
8934 .Case("avr3", true)
8935 .Case("avr31", true)
8936 .Case("avr35", true)
8937 .Case("avr4", true)
8938 .Case("avr5", true)
8939 .Case("avr51", true)
8940 .Case("avr6", true)
8941 .Case("avrxmega1", true)
8942 .Case("avrxmega2", true)
8943 .Case("avrxmega3", true)
8944 .Case("avrxmega4", true)
8945 .Case("avrxmega5", true)
8946 .Case("avrxmega6", true)
8947 .Case("avrxmega7", true)
8948 .Case("avrtiny", true)
8949 .Default(false);
8950
8951 if (IsFamily) this->CPU = Name;
8952
8953 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8954 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8955
8956 if (IsMCU) this->CPU = Name;
8957
8958 return IsFamily || IsMCU;
8959 }
8960
8961protected:
8962 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008963};
8964
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008965} // end anonymous namespace
8966
Chris Lattner5ba61f02006-10-14 07:39:34 +00008967//===----------------------------------------------------------------------===//
8968// Driver code
8969//===----------------------------------------------------------------------===//
8970
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008971static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8972 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008973 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008974
Daniel Dunbar52322032009-08-18 05:47:58 +00008975 switch (Triple.getArch()) {
8976 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008977 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008978
Tim Northover2a0783d2014-05-30 14:14:07 +00008979 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008980 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008981
8982 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008983 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008984
Jacques Pienaard964cc22016-03-28 21:02:54 +00008985 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008986 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008987
Tim Northover2a0783d2014-05-30 14:14:07 +00008988 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008989 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008990 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008991
8992 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008993 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008994 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008995 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008996 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008997 case llvm::Triple::Fuchsia:
8998 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008999 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009000 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009001 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009002 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009003 case llvm::Triple::OpenBSD:
9004 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009005 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009006 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009007 }
9008
Christian Pirker9b019ae2014-02-25 13:51:00 +00009009 case llvm::Triple::aarch64_be:
9010 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009011 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009012 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009013 case llvm::Triple::Fuchsia:
9014 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009015 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009016 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009017 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009018 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009019 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009020 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009021 }
9022
Daniel Dunbar52322032009-08-18 05:47:58 +00009023 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009024 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009025 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009026 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009027
Daniel Dunbar52322032009-08-18 05:47:58 +00009028 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009029 case llvm::Triple::CloudABI:
9030 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009031 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009032 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009033 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009034 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009035 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009036 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009037 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009038 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009039 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009040 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009041 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009042 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009043 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009044 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009045 case llvm::Triple::Win32:
9046 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009047 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009048 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009049 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009050 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009051 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009052 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009053 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009054 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009055 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009056 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009057 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009058 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009059 }
9060
9061 case llvm::Triple::armeb:
9062 case llvm::Triple::thumbeb:
9063 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009064 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009065
9066 switch (os) {
9067 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009068 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009069 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009070 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009071 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009072 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009073 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009074 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009075 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009076 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009077 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009078 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009079 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009080 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009081 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009082 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009083 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009084
Dylan McKay924fa3a2017-01-05 05:20:27 +00009085 case llvm::Triple::avr:
9086 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009087 case llvm::Triple::bpfeb:
9088 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009089 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009090
Daniel Dunbar52322032009-08-18 05:47:58 +00009091 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009092 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009093
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009094 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009095 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009096 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009097 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009098 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009099 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009100 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009101 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009102 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009103 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009104 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009105 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009106 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009107
9108 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009109 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009110 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009111 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009112 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009113 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009114 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009115 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009116 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009117 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009118 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009119 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009120 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009121 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009122 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009123
Akira Hatanakabef17452011-09-20 19:21:49 +00009124 case llvm::Triple::mips64:
9125 switch (os) {
9126 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009127 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009128 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009129 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009130 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009131 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009132 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009133 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009134 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009135 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009136 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009137 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009138 }
9139
9140 case llvm::Triple::mips64el:
9141 switch (os) {
9142 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009143 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009144 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009145 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009146 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009147 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009148 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009149 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009150 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009151 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009152 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009153 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009154 }
9155
Ivan Krasindd7403e2011-08-24 20:22:22 +00009156 case llvm::Triple::le32:
9157 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009158 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009159 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009160 default:
9161 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009162 }
9163
JF Bastien643817d2014-09-12 17:52:47 +00009164 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009165 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009166
Daniel Dunbar52322032009-08-18 05:47:58 +00009167 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009168 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009170 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009171 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009172 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009173 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009174 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009175 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009176 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009177 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009178 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009179 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009180 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009181 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009182 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009183 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009184
9185 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009186 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009187 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009188 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009189 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009190 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009191 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009192 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009193 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009194 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009195 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009196 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009197 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009198 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009199 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009200
Bill Schmidt778d3872013-07-26 01:36:11 +00009201 case llvm::Triple::ppc64le:
9202 switch (os) {
9203 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009204 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009205 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009207 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009208 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009209 }
9210
Peter Collingbournec947aae2012-05-20 23:28:41 +00009211 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009212 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009213 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009214 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009215
Tom Stellardd8e38a32015-01-06 20:34:47 +00009216 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009217 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009218 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009219
Daniel Dunbar52322032009-08-18 05:47:58 +00009220 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009221 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009222 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009223 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009224 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009225 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009226 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009227 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009228 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009229 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009230 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009231 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009232 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009233 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009234 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009235
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009236 // The 'sparcel' architecture copies all the above cases except for Solaris.
9237 case llvm::Triple::sparcel:
9238 switch (os) {
9239 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009240 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009241 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009242 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009243 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009244 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009245 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009246 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009247 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009248 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009249 }
9250
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009251 case llvm::Triple::sparcv9:
9252 switch (os) {
9253 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009255 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009257 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009259 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009261 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009262 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009263 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009264 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009265 }
9266
Ulrich Weigand47445072013-05-06 16:26:41 +00009267 case llvm::Triple::systemz:
9268 switch (os) {
9269 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009270 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009271 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009272 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009273 }
9274
Eli Friedmana9c3d712009-08-19 20:47:07 +00009275 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009276 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009277
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009278 case llvm::Triple::tcele:
9279 return new TCELETargetInfo(Triple, Opts);
9280
Daniel Dunbar52322032009-08-18 05:47:58 +00009281 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009282 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009284
Daniel Dunbar52322032009-08-18 05:47:58 +00009285 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009286 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009287 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009288 case llvm::Triple::Linux: {
9289 switch (Triple.getEnvironment()) {
9290 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009292 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009293 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009294 }
9295 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009296 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009297 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009298 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009300 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009301 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009302 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009303 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009304 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009305 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009306 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009307 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009308 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009309 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009310 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009312 case llvm::Triple::Win32: {
9313 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009314 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009315 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009316 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009317 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009318 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009319 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009320 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009322 }
9323 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009324 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009325 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009326 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009327 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009328 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009329 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009330 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009331 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009332 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009333 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009334 }
9335
9336 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009337 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009339
Daniel Dunbar52322032009-08-18 05:47:58 +00009340 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009341 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009342 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009343 case llvm::Triple::Linux: {
9344 switch (Triple.getEnvironment()) {
9345 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009346 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009347 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009348 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009349 }
9350 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009351 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009352 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009353 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009354 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009355 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009356 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009357 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009358 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009359 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009360 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009361 case llvm::Triple::Fuchsia:
9362 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009363 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009364 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009365 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009366 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009367 case llvm::Triple::Win32: {
9368 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009369 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009370 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009371 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009372 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009373 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009374 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009375 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009376 }
9377 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009378 case llvm::Triple::Haiku:
9379 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009380 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009381 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009382 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009383 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009384 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009385 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009386 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009387
Douglas Katzman78d7c542015-05-12 21:18:10 +00009388 case llvm::Triple::spir: {
9389 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9390 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9391 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009392 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009393 }
9394 case llvm::Triple::spir64: {
9395 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9396 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9397 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009398 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009399 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009400 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009401 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9402 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9403 Triple.getOS() != llvm::Triple::UnknownOS ||
9404 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9405 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009406 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009407 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009408 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009409 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9410 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9411 Triple.getOS() != llvm::Triple::UnknownOS ||
9412 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9413 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009414 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009415 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009416
9417 case llvm::Triple::renderscript32:
9418 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9419 case llvm::Triple::renderscript64:
9420 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009421 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009422}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009423
9424/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009425/// options.
Alp Toker80758082014-07-06 05:26:44 +00009426TargetInfo *
9427TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009428 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009429 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009430
9431 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009432 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009433 if (!Target) {
9434 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009435 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009436 }
Alp Toker80758082014-07-06 05:26:44 +00009437 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009438
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009439 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009440 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9441 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009442 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009443 }
9444
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009445 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009446 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9447 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009448 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009449 }
9450
Rafael Espindolaeb265472013-08-21 21:59:03 +00009451 // Set the fp math unit.
9452 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9453 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009454 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009455 }
9456
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009457 // Compute the default target features, we need the target to handle this
9458 // because features may have dependencies on one another.
9459 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009460 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9461 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009462 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009463
9464 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009465 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009466 for (const auto &F : Features)
9467 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9468
Eric Christopher3ff21b32013-10-16 21:26:26 +00009469 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009470 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009471
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009472 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009473 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009474
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009475 if (!Target->validateTarget(Diags))
9476 return nullptr;
9477
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009478 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009479}