blob: 6b0b9100b3e201d2c6ca2f26f9376dc646dcfcc5 [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;
2390 break;
2391
2392 case GK_NONE:
2393 return false;
2394 default:
2395 llvm_unreachable("unhandled subtarget");
2396 }
2397 } else {
2398 if (CPU.empty())
2399 CPU = "r600";
2400
2401 switch (parseR600Name(CPU)) {
2402 case GK_R600:
2403 case GK_R700:
2404 case GK_EVERGREEN:
2405 case GK_NORTHERN_ISLANDS:
2406 break;
2407 case GK_R600_DOUBLE_OPS:
2408 case GK_R700_DOUBLE_OPS:
2409 case GK_EVERGREEN_DOUBLE_OPS:
2410 case GK_CAYMAN:
2411 Features["fp64"] = true;
2412 break;
2413 case GK_NONE:
2414 return false;
2415 default:
2416 llvm_unreachable("unhandled subtarget");
2417 }
2418 }
2419
2420 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2421}
2422
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002423const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002424#define BUILTIN(ID, TYPE, ATTRS) \
2425 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002426#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002427 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002428#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2429 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002430#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002431
2432#define BUILTIN(ID, TYPE, ATTRS) \
2433 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002434#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2435 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002436#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2437 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2438#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002439};
Eli Friedmanb5366062008-05-20 14:21:01 +00002440
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002441
Nuno Lopescfca1f02009-12-23 17:49:57 +00002442static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002443 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2444 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002445 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002446 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2447 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2448 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002449 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002450 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2451 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002452 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2453 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2454 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2455 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2456 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2457 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2458 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2459 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002460 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002461};
2462
Eric Christophercdd36352011-06-21 00:05:20 +00002463const TargetInfo::AddlRegName AddlRegNames[] = {
2464 { { "al", "ah", "eax", "rax" }, 0 },
2465 { { "bl", "bh", "ebx", "rbx" }, 3 },
2466 { { "cl", "ch", "ecx", "rcx" }, 2 },
2467 { { "dl", "dh", "edx", "rdx" }, 1 },
2468 { { "esi", "rsi" }, 4 },
2469 { { "edi", "rdi" }, 5 },
2470 { { "esp", "rsp" }, 7 },
2471 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002472 { { "r8d", "r8w", "r8b" }, 38 },
2473 { { "r9d", "r9w", "r9b" }, 39 },
2474 { { "r10d", "r10w", "r10b" }, 40 },
2475 { { "r11d", "r11w", "r11b" }, 41 },
2476 { { "r12d", "r12w", "r12b" }, 42 },
2477 { { "r13d", "r13w", "r13b" }, 43 },
2478 { { "r14d", "r14w", "r14b" }, 44 },
2479 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002480};
2481
2482// X86 target abstract base class; x86-32 and x86-64 are very close, so
2483// most of the implementation can be shared.
2484class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002485 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002486 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002487 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002488 enum MMX3DNowEnum {
2489 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002490 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002491 enum XOPEnum {
2492 NoXOP,
2493 SSE4A,
2494 FMA4,
2495 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002496 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002497
Craig Topper543f3bd2015-10-14 23:47:57 +00002498 bool HasAES = false;
2499 bool HasPCLMUL = false;
2500 bool HasLZCNT = false;
2501 bool HasRDRND = false;
2502 bool HasFSGSBASE = false;
2503 bool HasBMI = false;
2504 bool HasBMI2 = false;
2505 bool HasPOPCNT = false;
2506 bool HasRTM = false;
2507 bool HasPRFCHW = false;
2508 bool HasRDSEED = false;
2509 bool HasADX = false;
2510 bool HasTBM = false;
2511 bool HasFMA = false;
2512 bool HasF16C = false;
2513 bool HasAVX512CD = false;
2514 bool HasAVX512ER = false;
2515 bool HasAVX512PF = false;
2516 bool HasAVX512DQ = false;
2517 bool HasAVX512BW = false;
2518 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002519 bool HasAVX512VBMI = false;
2520 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002521 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002522 bool HasMPX = false;
2523 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002524 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002525 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002526 bool HasXSAVE = false;
2527 bool HasXSAVEOPT = false;
2528 bool HasXSAVEC = false;
2529 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002530 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002531 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002532 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002533 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002534 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002535 bool HasMOVBE = false;
2536 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002537
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002538 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2539 ///
2540 /// Each enumeration represents a particular CPU supported by Clang. These
2541 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2542 enum CPUKind {
2543 CK_Generic,
2544
2545 /// \name i386
2546 /// i386-generation processors.
2547 //@{
2548 CK_i386,
2549 //@}
2550
2551 /// \name i486
2552 /// i486-generation processors.
2553 //@{
2554 CK_i486,
2555 CK_WinChipC6,
2556 CK_WinChip2,
2557 CK_C3,
2558 //@}
2559
2560 /// \name i586
2561 /// i586-generation processors, P5 microarchitecture based.
2562 //@{
2563 CK_i586,
2564 CK_Pentium,
2565 CK_PentiumMMX,
2566 //@}
2567
2568 /// \name i686
2569 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2570 //@{
2571 CK_i686,
2572 CK_PentiumPro,
2573 CK_Pentium2,
2574 CK_Pentium3,
2575 CK_Pentium3M,
2576 CK_PentiumM,
2577 CK_C3_2,
2578
2579 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2580 /// Clang however has some logic to suport this.
2581 // FIXME: Warn, deprecate, and potentially remove this.
2582 CK_Yonah,
2583 //@}
2584
2585 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002586 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002587 //@{
2588 CK_Pentium4,
2589 CK_Pentium4M,
2590 CK_Prescott,
2591 CK_Nocona,
2592 //@}
2593
2594 /// \name Core
2595 /// Core microarchitecture based processors.
2596 //@{
2597 CK_Core2,
2598
2599 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2600 /// codename which GCC no longer accepts as an option to -march, but Clang
2601 /// has some logic for recognizing it.
2602 // FIXME: Warn, deprecate, and potentially remove this.
2603 CK_Penryn,
2604 //@}
2605
2606 /// \name Atom
2607 /// Atom processors
2608 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002609 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002610 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002611 //@}
2612
2613 /// \name Nehalem
2614 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002615 CK_Nehalem,
2616
2617 /// \name Westmere
2618 /// Westmere microarchitecture based processors.
2619 CK_Westmere,
2620
2621 /// \name Sandy Bridge
2622 /// Sandy Bridge microarchitecture based processors.
2623 CK_SandyBridge,
2624
2625 /// \name Ivy Bridge
2626 /// Ivy Bridge microarchitecture based processors.
2627 CK_IvyBridge,
2628
2629 /// \name Haswell
2630 /// Haswell microarchitecture based processors.
2631 CK_Haswell,
2632
2633 /// \name Broadwell
2634 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002635 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002636
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002637 /// \name Skylake Client
2638 /// Skylake client microarchitecture based processors.
2639 CK_SkylakeClient,
2640
2641 /// \name Skylake Server
2642 /// Skylake server microarchitecture based processors.
2643 CK_SkylakeServer,
2644
2645 /// \name Cannonlake Client
2646 /// Cannonlake client microarchitecture based processors.
2647 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002648
Craig Topper449314e2013-08-20 07:09:39 +00002649 /// \name Knights Landing
2650 /// Knights Landing processor.
2651 CK_KNL,
2652
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002653 /// \name Lakemont
2654 /// Lakemont microarchitecture based processors.
2655 CK_Lakemont,
2656
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002657 /// \name K6
2658 /// K6 architecture processors.
2659 //@{
2660 CK_K6,
2661 CK_K6_2,
2662 CK_K6_3,
2663 //@}
2664
2665 /// \name K7
2666 /// K7 architecture processors.
2667 //@{
2668 CK_Athlon,
2669 CK_AthlonThunderbird,
2670 CK_Athlon4,
2671 CK_AthlonXP,
2672 CK_AthlonMP,
2673 //@}
2674
2675 /// \name K8
2676 /// K8 architecture processors.
2677 //@{
2678 CK_Athlon64,
2679 CK_Athlon64SSE3,
2680 CK_AthlonFX,
2681 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002682 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002683 CK_Opteron,
2684 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002685 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002686 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002687
Benjamin Kramer569f2152012-01-10 11:50:18 +00002688 /// \name Bobcat
2689 /// Bobcat architecture processors.
2690 //@{
2691 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002692 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002693 //@}
2694
2695 /// \name Bulldozer
2696 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002697 //@{
2698 CK_BDVER1,
2699 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002700 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002701 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002702 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002703
Craig Topperc45744a2017-01-10 06:02:12 +00002704 /// \name zen
2705 /// Zen architecture processors.
2706 //@{
2707 CK_ZNVER1,
2708 //@}
2709
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002710 /// This specification is deprecated and will be removed in the future.
2711 /// Users should prefer \see CK_K8.
2712 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002713 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002714 CK_x86_64,
2715 //@}
2716
2717 /// \name Geode
2718 /// Geode processors.
2719 //@{
2720 CK_Geode
2721 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002722 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002723
Eric Christopherc50738f2015-08-27 00:05:50 +00002724 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002725 return llvm::StringSwitch<CPUKind>(CPU)
2726 .Case("i386", CK_i386)
2727 .Case("i486", CK_i486)
2728 .Case("winchip-c6", CK_WinChipC6)
2729 .Case("winchip2", CK_WinChip2)
2730 .Case("c3", CK_C3)
2731 .Case("i586", CK_i586)
2732 .Case("pentium", CK_Pentium)
2733 .Case("pentium-mmx", CK_PentiumMMX)
2734 .Case("i686", CK_i686)
2735 .Case("pentiumpro", CK_PentiumPro)
2736 .Case("pentium2", CK_Pentium2)
2737 .Case("pentium3", CK_Pentium3)
2738 .Case("pentium3m", CK_Pentium3M)
2739 .Case("pentium-m", CK_PentiumM)
2740 .Case("c3-2", CK_C3_2)
2741 .Case("yonah", CK_Yonah)
2742 .Case("pentium4", CK_Pentium4)
2743 .Case("pentium4m", CK_Pentium4M)
2744 .Case("prescott", CK_Prescott)
2745 .Case("nocona", CK_Nocona)
2746 .Case("core2", CK_Core2)
2747 .Case("penryn", CK_Penryn)
2748 .Case("bonnell", CK_Bonnell)
2749 .Case("atom", CK_Bonnell) // Legacy name.
2750 .Case("silvermont", CK_Silvermont)
2751 .Case("slm", CK_Silvermont) // Legacy name.
2752 .Case("nehalem", CK_Nehalem)
2753 .Case("corei7", CK_Nehalem) // Legacy name.
2754 .Case("westmere", CK_Westmere)
2755 .Case("sandybridge", CK_SandyBridge)
2756 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2757 .Case("ivybridge", CK_IvyBridge)
2758 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2759 .Case("haswell", CK_Haswell)
2760 .Case("core-avx2", CK_Haswell) // Legacy name.
2761 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002762 .Case("skylake", CK_SkylakeClient)
2763 .Case("skylake-avx512", CK_SkylakeServer)
2764 .Case("skx", CK_SkylakeServer) // Legacy name.
2765 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002766 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002767 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002768 .Case("k6", CK_K6)
2769 .Case("k6-2", CK_K6_2)
2770 .Case("k6-3", CK_K6_3)
2771 .Case("athlon", CK_Athlon)
2772 .Case("athlon-tbird", CK_AthlonThunderbird)
2773 .Case("athlon-4", CK_Athlon4)
2774 .Case("athlon-xp", CK_AthlonXP)
2775 .Case("athlon-mp", CK_AthlonMP)
2776 .Case("athlon64", CK_Athlon64)
2777 .Case("athlon64-sse3", CK_Athlon64SSE3)
2778 .Case("athlon-fx", CK_AthlonFX)
2779 .Case("k8", CK_K8)
2780 .Case("k8-sse3", CK_K8SSE3)
2781 .Case("opteron", CK_Opteron)
2782 .Case("opteron-sse3", CK_OpteronSSE3)
2783 .Case("barcelona", CK_AMDFAM10)
2784 .Case("amdfam10", CK_AMDFAM10)
2785 .Case("btver1", CK_BTVER1)
2786 .Case("btver2", CK_BTVER2)
2787 .Case("bdver1", CK_BDVER1)
2788 .Case("bdver2", CK_BDVER2)
2789 .Case("bdver3", CK_BDVER3)
2790 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002791 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002792 .Case("x86-64", CK_x86_64)
2793 .Case("geode", CK_Geode)
2794 .Default(CK_Generic);
2795 }
2796
Rafael Espindolaeb265472013-08-21 21:59:03 +00002797 enum FPMathKind {
2798 FP_Default,
2799 FP_SSE,
2800 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002801 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002802
Eli Friedman3fd920a2008-08-20 02:34:37 +00002803public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002804 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2805 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002806 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002807 }
Craig Topper3164f332014-03-11 03:39:26 +00002808 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002809 // X87 evaluates with 80 bits "long double" precision.
2810 return SSELevel == NoSSE ? 2 : 0;
2811 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002812 ArrayRef<const char *> getGCCRegNames() const override {
2813 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002814 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002815 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2816 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002817 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002818 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2819 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002820 }
Eric Christopherd9832702015-06-29 21:00:05 +00002821 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002822 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002823 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002824
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002825 bool validateGlobalRegisterVariable(StringRef RegName,
2826 unsigned RegSize,
2827 bool &HasSizeMismatch) const override {
2828 // esp and ebp are the only 32-bit registers the x86 backend can currently
2829 // handle.
2830 if (RegName.equals("esp") || RegName.equals("ebp")) {
2831 // Check that the register size is 32-bit.
2832 HasSizeMismatch = RegSize != 32;
2833 return true;
2834 }
2835
2836 return false;
2837 }
2838
Akira Hatanaka974131e2014-09-18 18:17:18 +00002839 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2840
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002841 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2842
Akira Hatanaka974131e2014-09-18 18:17:18 +00002843 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2844
Craig Topper3164f332014-03-11 03:39:26 +00002845 std::string convertConstraint(const char *&Constraint) const override;
2846 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002847 return "~{dirflag},~{fpsr},~{flags}";
2848 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002849
2850 StringRef getConstraintRegister(const StringRef &Constraint,
2851 const StringRef &Expression) const override {
2852 StringRef::iterator I, E;
2853 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2854 if (isalpha(*I))
2855 break;
2856 }
2857 if (I == E)
2858 return "";
2859 switch (*I) {
2860 // For the register constraints, return the matching register name
2861 case 'a':
2862 return "ax";
2863 case 'b':
2864 return "bx";
2865 case 'c':
2866 return "cx";
2867 case 'd':
2868 return "dx";
2869 case 'S':
2870 return "si";
2871 case 'D':
2872 return "di";
2873 // In case the constraint is 'r' we need to return Expression
2874 case 'r':
2875 return Expression;
2876 default:
2877 // Default value if there is no constraint for the register
2878 return "";
2879 }
2880 return "";
2881 }
2882
Craig Topper3164f332014-03-11 03:39:26 +00002883 void getTargetDefines(const LangOptions &Opts,
2884 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002885 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2886 bool Enabled);
2887 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2888 bool Enabled);
2889 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2890 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002891 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2892 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002893 setFeatureEnabledImpl(Features, Name, Enabled);
2894 }
2895 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002896 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002897 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2898 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002899 bool
2900 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2901 StringRef CPU,
2902 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002903 bool hasFeature(StringRef Feature) const override;
2904 bool handleTargetFeatures(std::vector<std::string> &Features,
2905 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002906 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002907 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2908 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002909 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002910 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002911 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002912 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002913 return "no-mmx";
2914 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002915 }
Craig Topper3164f332014-03-11 03:39:26 +00002916 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002917 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002918
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002919 // Perform any per-CPU checks necessary to determine if this CPU is
2920 // acceptable.
2921 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2922 // invalid without explaining *why*.
2923 switch (CPU) {
2924 case CK_Generic:
2925 // No processor selected!
2926 return false;
2927
2928 case CK_i386:
2929 case CK_i486:
2930 case CK_WinChipC6:
2931 case CK_WinChip2:
2932 case CK_C3:
2933 case CK_i586:
2934 case CK_Pentium:
2935 case CK_PentiumMMX:
2936 case CK_i686:
2937 case CK_PentiumPro:
2938 case CK_Pentium2:
2939 case CK_Pentium3:
2940 case CK_Pentium3M:
2941 case CK_PentiumM:
2942 case CK_Yonah:
2943 case CK_C3_2:
2944 case CK_Pentium4:
2945 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002946 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002947 case CK_Prescott:
2948 case CK_K6:
2949 case CK_K6_2:
2950 case CK_K6_3:
2951 case CK_Athlon:
2952 case CK_AthlonThunderbird:
2953 case CK_Athlon4:
2954 case CK_AthlonXP:
2955 case CK_AthlonMP:
2956 case CK_Geode:
2957 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002958 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002959 return false;
2960
2961 // Fallthrough
2962 case CK_Nocona:
2963 case CK_Core2:
2964 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002965 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002966 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002967 case CK_Nehalem:
2968 case CK_Westmere:
2969 case CK_SandyBridge:
2970 case CK_IvyBridge:
2971 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002972 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002973 case CK_SkylakeClient:
2974 case CK_SkylakeServer:
2975 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002976 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002977 case CK_Athlon64:
2978 case CK_Athlon64SSE3:
2979 case CK_AthlonFX:
2980 case CK_K8:
2981 case CK_K8SSE3:
2982 case CK_Opteron:
2983 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002984 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002985 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002986 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002987 case CK_BDVER1:
2988 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002989 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002990 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002991 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002992 case CK_x86_64:
2993 return true;
2994 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002995 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002996 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002997
Craig Topper3164f332014-03-11 03:39:26 +00002998 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002999
Craig Topper3164f332014-03-11 03:39:26 +00003000 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00003001 // Most of the non-ARM calling conventions are i386 conventions.
3002 switch (CC) {
3003 case CC_X86ThisCall:
3004 case CC_X86FastCall:
3005 case CC_X86StdCall:
3006 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00003007 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00003008 case CC_C:
3009 case CC_Swift:
3010 case CC_X86Pascal:
3011 case CC_IntelOclBicc:
3012 return CCCR_OK;
3013 default:
3014 return CCCR_Warning;
3015 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003016 }
3017
Craig Topper3164f332014-03-11 03:39:26 +00003018 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00003019 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00003020 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00003021
3022 bool hasSjLjLowering() const override {
3023 return true;
3024 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003025
3026 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00003027 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00003028 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003029};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003030
Rafael Espindolaeb265472013-08-21 21:59:03 +00003031bool X86TargetInfo::setFPMath(StringRef Name) {
3032 if (Name == "387") {
3033 FPMath = FP_387;
3034 return true;
3035 }
3036 if (Name == "sse") {
3037 FPMath = FP_SSE;
3038 return true;
3039 }
3040 return false;
3041}
3042
Eric Christopher007b0a02015-08-28 22:32:01 +00003043bool X86TargetInfo::initFeatureMap(
3044 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003045 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003046 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003047 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003048 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003049 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003050
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003051 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003052
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003053 // Enable X87 for all X86 processors but Lakemont.
3054 if (Kind != CK_Lakemont)
3055 setFeatureEnabledImpl(Features, "x87", true);
3056
3057 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003058 case CK_Generic:
3059 case CK_i386:
3060 case CK_i486:
3061 case CK_i586:
3062 case CK_Pentium:
3063 case CK_i686:
3064 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003065 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003066 break;
3067 case CK_PentiumMMX:
3068 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003069 case CK_K6:
3070 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003071 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003072 break;
3073 case CK_Pentium3:
3074 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003075 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003076 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003077 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003078 break;
3079 case CK_PentiumM:
3080 case CK_Pentium4:
3081 case CK_Pentium4M:
3082 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003083 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003084 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 break;
3086 case CK_Yonah:
3087 case CK_Prescott:
3088 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003089 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003090 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003091 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003092 break;
3093 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003094 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003095 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003096 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003097 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003100 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003101 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003102 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003104 case CK_Cannonlake:
3105 setFeatureEnabledImpl(Features, "avx512ifma", true);
3106 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3107 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003108 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003109 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003110 setFeatureEnabledImpl(Features, "avx512f", true);
3111 setFeatureEnabledImpl(Features, "avx512cd", true);
3112 setFeatureEnabledImpl(Features, "avx512dq", true);
3113 setFeatureEnabledImpl(Features, "avx512bw", true);
3114 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003115 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003116 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003117 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003118 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003119 setFeatureEnabledImpl(Features, "xsavec", true);
3120 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003121 setFeatureEnabledImpl(Features, "mpx", true);
3122 setFeatureEnabledImpl(Features, "sgx", true);
3123 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003124 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003125 case CK_Broadwell:
3126 setFeatureEnabledImpl(Features, "rdseed", true);
3127 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003128 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003129 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003130 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003131 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003132 setFeatureEnabledImpl(Features, "bmi", true);
3133 setFeatureEnabledImpl(Features, "bmi2", true);
3134 setFeatureEnabledImpl(Features, "rtm", true);
3135 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003136 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003137 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003138 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003139 setFeatureEnabledImpl(Features, "rdrnd", true);
3140 setFeatureEnabledImpl(Features, "f16c", true);
3141 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003142 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003143 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003144 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003145 setFeatureEnabledImpl(Features, "xsave", true);
3146 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003147 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003148 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003149 case CK_Silvermont:
3150 setFeatureEnabledImpl(Features, "aes", true);
3151 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003152 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003153 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003154 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003155 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003156 setFeatureEnabledImpl(Features, "cx16", true);
3157 break;
3158 case CK_KNL:
3159 setFeatureEnabledImpl(Features, "avx512f", true);
3160 setFeatureEnabledImpl(Features, "avx512cd", true);
3161 setFeatureEnabledImpl(Features, "avx512er", true);
3162 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003163 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003164 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003165 setFeatureEnabledImpl(Features, "rdseed", true);
3166 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003167 setFeatureEnabledImpl(Features, "lzcnt", true);
3168 setFeatureEnabledImpl(Features, "bmi", true);
3169 setFeatureEnabledImpl(Features, "bmi2", true);
3170 setFeatureEnabledImpl(Features, "rtm", true);
3171 setFeatureEnabledImpl(Features, "fma", true);
3172 setFeatureEnabledImpl(Features, "rdrnd", true);
3173 setFeatureEnabledImpl(Features, "f16c", true);
3174 setFeatureEnabledImpl(Features, "fsgsbase", true);
3175 setFeatureEnabledImpl(Features, "aes", true);
3176 setFeatureEnabledImpl(Features, "pclmul", true);
3177 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003178 setFeatureEnabledImpl(Features, "xsaveopt", true);
3179 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003180 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003181 break;
3182 case CK_K6_2:
3183 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003184 case CK_WinChip2:
3185 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003186 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003187 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003188 case CK_Athlon:
3189 case CK_AthlonThunderbird:
3190 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003191 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003192 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003193 case CK_Athlon4:
3194 case CK_AthlonXP:
3195 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003196 setFeatureEnabledImpl(Features, "sse", true);
3197 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003198 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003199 break;
3200 case CK_K8:
3201 case CK_Opteron:
3202 case CK_Athlon64:
3203 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003204 setFeatureEnabledImpl(Features, "sse2", true);
3205 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003206 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003207 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003208 case CK_AMDFAM10:
3209 setFeatureEnabledImpl(Features, "sse4a", true);
3210 setFeatureEnabledImpl(Features, "lzcnt", true);
3211 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003212 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003213 case CK_K8SSE3:
3214 case CK_OpteronSSE3:
3215 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003216 setFeatureEnabledImpl(Features, "sse3", true);
3217 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003218 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003219 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003220 case CK_BTVER2:
3221 setFeatureEnabledImpl(Features, "avx", true);
3222 setFeatureEnabledImpl(Features, "aes", true);
3223 setFeatureEnabledImpl(Features, "pclmul", true);
3224 setFeatureEnabledImpl(Features, "bmi", true);
3225 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003226 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003227 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003228 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003229 setFeatureEnabledImpl(Features, "ssse3", true);
3230 setFeatureEnabledImpl(Features, "sse4a", true);
3231 setFeatureEnabledImpl(Features, "lzcnt", true);
3232 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003233 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003234 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003235 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003236 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003237 case CK_ZNVER1:
3238 setFeatureEnabledImpl(Features, "adx", true);
3239 setFeatureEnabledImpl(Features, "aes", true);
3240 setFeatureEnabledImpl(Features, "avx2", true);
3241 setFeatureEnabledImpl(Features, "bmi", true);
3242 setFeatureEnabledImpl(Features, "bmi2", true);
3243 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003244 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003245 setFeatureEnabledImpl(Features, "cx16", true);
3246 setFeatureEnabledImpl(Features, "f16c", true);
3247 setFeatureEnabledImpl(Features, "fma", true);
3248 setFeatureEnabledImpl(Features, "fsgsbase", true);
3249 setFeatureEnabledImpl(Features, "fxsr", true);
3250 setFeatureEnabledImpl(Features, "lzcnt", true);
3251 setFeatureEnabledImpl(Features, "mwaitx", true);
3252 setFeatureEnabledImpl(Features, "movbe", true);
3253 setFeatureEnabledImpl(Features, "pclmul", true);
3254 setFeatureEnabledImpl(Features, "popcnt", true);
3255 setFeatureEnabledImpl(Features, "prfchw", true);
3256 setFeatureEnabledImpl(Features, "rdrnd", true);
3257 setFeatureEnabledImpl(Features, "rdseed", true);
3258 setFeatureEnabledImpl(Features, "sha", true);
3259 setFeatureEnabledImpl(Features, "sse4a", true);
3260 setFeatureEnabledImpl(Features, "xsave", true);
3261 setFeatureEnabledImpl(Features, "xsavec", true);
3262 setFeatureEnabledImpl(Features, "xsaveopt", true);
3263 setFeatureEnabledImpl(Features, "xsaves", true);
3264 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003265 case CK_BDVER4:
3266 setFeatureEnabledImpl(Features, "avx2", true);
3267 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003268 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003269 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003270 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003271 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003272 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003273 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003274 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003275 setFeatureEnabledImpl(Features, "bmi", true);
3276 setFeatureEnabledImpl(Features, "fma", true);
3277 setFeatureEnabledImpl(Features, "f16c", true);
3278 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003279 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003280 case CK_BDVER1:
3281 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003282 setFeatureEnabledImpl(Features, "xop", true);
3283 setFeatureEnabledImpl(Features, "lzcnt", true);
3284 setFeatureEnabledImpl(Features, "aes", true);
3285 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003286 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003287 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003288 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003289 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003290 break;
Eli Friedman33465822011-07-08 23:31:17 +00003291 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003292 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3293 return false;
3294
3295 // Can't do this earlier because we need to be able to explicitly enable
3296 // or disable these features and the things that they depend upon.
3297
3298 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3299 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003300 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003301 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3302 FeaturesVec.end())
3303 Features["popcnt"] = true;
3304
3305 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3306 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003307 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003308 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3309 FeaturesVec.end())
3310 Features["prfchw"] = true;
3311
Eric Christophera7260af2015-10-08 20:10:18 +00003312 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3313 // then enable MMX.
3314 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003315 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003316 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3317 FeaturesVec.end())
3318 Features["mmx"] = true;
3319
Eric Christopherbbd746d2015-10-08 20:10:14 +00003320 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003321}
3322
Rafael Espindolae62e2792013-08-20 13:44:29 +00003323void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003324 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003325 if (Enabled) {
3326 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003327 case AVX512F:
3328 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003329 case AVX2:
3330 Features["avx2"] = true;
3331 case AVX:
3332 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003333 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003334 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003335 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003336 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003337 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003338 case SSSE3:
3339 Features["ssse3"] = true;
3340 case SSE3:
3341 Features["sse3"] = true;
3342 case SSE2:
3343 Features["sse2"] = true;
3344 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003345 Features["sse"] = true;
3346 case NoSSE:
3347 break;
3348 }
3349 return;
3350 }
3351
3352 switch (Level) {
3353 case NoSSE:
3354 case SSE1:
3355 Features["sse"] = false;
3356 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003357 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3358 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003359 case SSE3:
3360 Features["sse3"] = false;
3361 setXOPLevel(Features, NoXOP, false);
3362 case SSSE3:
3363 Features["ssse3"] = false;
3364 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003365 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003366 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003367 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003368 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003369 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3370 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003371 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003372 case AVX2:
3373 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003374 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003375 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003376 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003377 Features["avx512vl"] = Features["avx512vbmi"] =
3378 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379 }
3380}
3381
3382void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003383 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003384 if (Enabled) {
3385 switch (Level) {
3386 case AMD3DNowAthlon:
3387 Features["3dnowa"] = true;
3388 case AMD3DNow:
3389 Features["3dnow"] = true;
3390 case MMX:
3391 Features["mmx"] = true;
3392 case NoMMX3DNow:
3393 break;
3394 }
3395 return;
3396 }
3397
3398 switch (Level) {
3399 case NoMMX3DNow:
3400 case MMX:
3401 Features["mmx"] = false;
3402 case AMD3DNow:
3403 Features["3dnow"] = false;
3404 case AMD3DNowAthlon:
3405 Features["3dnowa"] = false;
3406 }
3407}
3408
3409void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003410 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003411 if (Enabled) {
3412 switch (Level) {
3413 case XOP:
3414 Features["xop"] = true;
3415 case FMA4:
3416 Features["fma4"] = true;
3417 setSSELevel(Features, AVX, true);
3418 case SSE4A:
3419 Features["sse4a"] = true;
3420 setSSELevel(Features, SSE3, true);
3421 case NoXOP:
3422 break;
3423 }
3424 return;
3425 }
3426
3427 switch (Level) {
3428 case NoXOP:
3429 case SSE4A:
3430 Features["sse4a"] = false;
3431 case FMA4:
3432 Features["fma4"] = false;
3433 case XOP:
3434 Features["xop"] = false;
3435 }
3436}
3437
Craig Topper86d79ef2013-09-17 04:51:29 +00003438void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3439 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003440 // This is a bit of a hack to deal with the sse4 target feature when used
3441 // as part of the target attribute. We handle sse4 correctly everywhere
3442 // else. See below for more information on how we handle the sse4 options.
3443 if (Name != "sse4")
3444 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003445
Craig Topper29561122013-09-19 01:13:07 +00003446 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003447 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003448 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003449 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003450 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003451 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003452 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003453 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003454 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003455 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003456 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003457 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003458 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003459 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003460 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003461 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003462 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003463 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003464 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003465 if (Enabled)
3466 setSSELevel(Features, SSE2, Enabled);
3467 } else if (Name == "pclmul") {
3468 if (Enabled)
3469 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003470 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003471 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003472 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003473 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003474 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003475 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003476 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3477 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3478 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003479 if (Enabled)
3480 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003481 // Enable BWI instruction if VBMI is being enabled.
3482 if (Name == "avx512vbmi" && Enabled)
3483 Features["avx512bw"] = true;
3484 // Also disable VBMI if BWI is being disabled.
3485 if (Name == "avx512bw" && !Enabled)
3486 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003487 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003488 if (Enabled)
3489 setSSELevel(Features, AVX, Enabled);
3490 } else if (Name == "fma4") {
3491 setXOPLevel(Features, FMA4, Enabled);
3492 } else if (Name == "xop") {
3493 setXOPLevel(Features, XOP, Enabled);
3494 } else if (Name == "sse4a") {
3495 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003496 } else if (Name == "f16c") {
3497 if (Enabled)
3498 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003499 } else if (Name == "sha") {
3500 if (Enabled)
3501 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003502 } else if (Name == "sse4") {
3503 // We can get here via the __target__ attribute since that's not controlled
3504 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3505 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3506 // disabled.
3507 if (Enabled)
3508 setSSELevel(Features, SSE42, Enabled);
3509 else
3510 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003511 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003512 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003513 Features["xsaveopt"] = false;
3514 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003515 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003516 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003517 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003518}
3519
Eric Christopher3ff21b32013-10-16 21:26:26 +00003520/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003521/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003522bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003523 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003524 for (const auto &Feature : Features) {
3525 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003526 continue;
3527
Eric Christopher610fe112015-08-26 08:21:55 +00003528 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003529 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003530 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003531 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003532 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003533 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003534 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003535 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003536 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003537 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003538 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003539 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003540 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003541 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003542 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003543 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003544 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003545 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003546 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003547 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003548 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003549 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003550 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003551 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003552 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003553 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003554 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003555 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003556 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003557 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003558 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003559 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003560 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003561 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003562 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003563 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003564 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003565 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003566 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003567 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003568 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003569 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003570 } else if (Feature == "+avx512vbmi") {
3571 HasAVX512VBMI = true;
3572 } else if (Feature == "+avx512ifma") {
3573 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003574 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003575 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003576 } else if (Feature == "+mpx") {
3577 HasMPX = true;
3578 } else if (Feature == "+movbe") {
3579 HasMOVBE = true;
3580 } else if (Feature == "+sgx") {
3581 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003582 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003583 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003584 } else if (Feature == "+fxsr") {
3585 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003586 } else if (Feature == "+xsave") {
3587 HasXSAVE = true;
3588 } else if (Feature == "+xsaveopt") {
3589 HasXSAVEOPT = true;
3590 } else if (Feature == "+xsavec") {
3591 HasXSAVEC = true;
3592 } else if (Feature == "+xsaves") {
3593 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003594 } else if (Feature == "+mwaitx") {
3595 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003596 } else if (Feature == "+pku") {
3597 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003598 } else if (Feature == "+clflushopt") {
3599 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003600 } else if (Feature == "+clwb") {
3601 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003602 } else if (Feature == "+prefetchwt1") {
3603 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003604 } else if (Feature == "+clzero") {
3605 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003606 }
3607
Benjamin Kramer27402c62012-03-05 15:10:44 +00003608 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003609 .Case("+avx512f", AVX512F)
3610 .Case("+avx2", AVX2)
3611 .Case("+avx", AVX)
3612 .Case("+sse4.2", SSE42)
3613 .Case("+sse4.1", SSE41)
3614 .Case("+ssse3", SSSE3)
3615 .Case("+sse3", SSE3)
3616 .Case("+sse2", SSE2)
3617 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003618 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003619 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003620
Eli Friedman33465822011-07-08 23:31:17 +00003621 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003622 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003623 .Case("+3dnowa", AMD3DNowAthlon)
3624 .Case("+3dnow", AMD3DNow)
3625 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003626 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003627 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003628
3629 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003630 .Case("+xop", XOP)
3631 .Case("+fma4", FMA4)
3632 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003633 .Default(NoXOP);
3634 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003635 }
Eli Friedman33465822011-07-08 23:31:17 +00003636
Rafael Espindolaeb265472013-08-21 21:59:03 +00003637 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3638 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003639 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3640 (FPMath == FP_387 && SSELevel >= SSE1)) {
3641 Diags.Report(diag::err_target_unsupported_fpmath) <<
3642 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003643 return false;
3644 }
3645
Alexey Bataev00396512015-07-02 03:40:19 +00003646 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003647 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003648 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003649}
Chris Lattnerecd49032009-03-02 22:27:17 +00003650
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003651/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3652/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003653void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003654 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003655 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003656 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003657 Builder.defineMacro("__amd64__");
3658 Builder.defineMacro("__amd64");
3659 Builder.defineMacro("__x86_64");
3660 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003661 if (getTriple().getArchName() == "x86_64h") {
3662 Builder.defineMacro("__x86_64h");
3663 Builder.defineMacro("__x86_64h__");
3664 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003665 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003666 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003667 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003668
Chris Lattnerecd49032009-03-02 22:27:17 +00003669 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003670 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3671 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003672 switch (CPU) {
3673 case CK_Generic:
3674 break;
3675 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003676 // The rest are coming from the i386 define above.
3677 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003678 break;
3679 case CK_i486:
3680 case CK_WinChipC6:
3681 case CK_WinChip2:
3682 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003683 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003684 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003685 case CK_PentiumMMX:
3686 Builder.defineMacro("__pentium_mmx__");
3687 Builder.defineMacro("__tune_pentium_mmx__");
3688 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003689 case CK_i586:
3690 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003691 defineCPUMacros(Builder, "i586");
3692 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003693 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003694 case CK_Pentium3:
3695 case CK_Pentium3M:
3696 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003697 Builder.defineMacro("__tune_pentium3__");
3698 // Fallthrough
3699 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003700 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003701 Builder.defineMacro("__tune_pentium2__");
3702 // Fallthrough
3703 case CK_PentiumPro:
3704 Builder.defineMacro("__tune_i686__");
3705 Builder.defineMacro("__tune_pentiumpro__");
3706 // Fallthrough
3707 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003708 Builder.defineMacro("__i686");
3709 Builder.defineMacro("__i686__");
3710 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3711 Builder.defineMacro("__pentiumpro");
3712 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003713 break;
3714 case CK_Pentium4:
3715 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003716 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003717 break;
3718 case CK_Yonah:
3719 case CK_Prescott:
3720 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003721 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003722 break;
3723 case CK_Core2:
3724 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003725 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003726 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003727 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003728 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003729 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003730 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003731 defineCPUMacros(Builder, "slm");
3732 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003733 case CK_Nehalem:
3734 case CK_Westmere:
3735 case CK_SandyBridge:
3736 case CK_IvyBridge:
3737 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003738 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003739 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003740 // FIXME: Historically, we defined this legacy name, it would be nice to
3741 // remove it at some point. We've never exposed fine-grained names for
3742 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003743 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003744 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003745 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003746 defineCPUMacros(Builder, "skx");
3747 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003748 case CK_Cannonlake:
3749 break;
Craig Topper449314e2013-08-20 07:09:39 +00003750 case CK_KNL:
3751 defineCPUMacros(Builder, "knl");
3752 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003753 case CK_Lakemont:
3754 Builder.defineMacro("__tune_lakemont__");
3755 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003756 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003757 Builder.defineMacro("__k6_2__");
3758 Builder.defineMacro("__tune_k6_2__");
3759 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003760 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003761 if (CPU != CK_K6_2) { // In case of fallthrough
3762 // FIXME: GCC may be enabling these in cases where some other k6
3763 // architecture is specified but -m3dnow is explicitly provided. The
3764 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003765 Builder.defineMacro("__k6_3__");
3766 Builder.defineMacro("__tune_k6_3__");
3767 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003768 // Fallthrough
3769 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003770 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003771 break;
3772 case CK_Athlon:
3773 case CK_AthlonThunderbird:
3774 case CK_Athlon4:
3775 case CK_AthlonXP:
3776 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003777 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003778 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003779 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003780 Builder.defineMacro("__tune_athlon_sse__");
3781 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003782 break;
3783 case CK_K8:
3784 case CK_K8SSE3:
3785 case CK_x86_64:
3786 case CK_Opteron:
3787 case CK_OpteronSSE3:
3788 case CK_Athlon64:
3789 case CK_Athlon64SSE3:
3790 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003791 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003792 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003793 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003794 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003795 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003796 case CK_BTVER1:
3797 defineCPUMacros(Builder, "btver1");
3798 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003799 case CK_BTVER2:
3800 defineCPUMacros(Builder, "btver2");
3801 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003802 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003803 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003804 break;
3805 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003806 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003807 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003808 case CK_BDVER3:
3809 defineCPUMacros(Builder, "bdver3");
3810 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003811 case CK_BDVER4:
3812 defineCPUMacros(Builder, "bdver4");
3813 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003814 case CK_ZNVER1:
3815 defineCPUMacros(Builder, "znver1");
3816 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003817 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003818 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003819 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003820 }
Chris Lattner96e43572009-03-02 22:40:39 +00003821
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003822 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003823 Builder.defineMacro("__REGISTER_PREFIX__", "");
3824
Chris Lattner6df41af2009-04-19 17:32:33 +00003825 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3826 // functions in glibc header files that use FP Stack inline asm which the
3827 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003828 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003829
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003830 if (HasAES)
3831 Builder.defineMacro("__AES__");
3832
Craig Topper3f122a72012-05-31 05:18:48 +00003833 if (HasPCLMUL)
3834 Builder.defineMacro("__PCLMUL__");
3835
Craig Topper22967d42011-12-25 05:06:45 +00003836 if (HasLZCNT)
3837 Builder.defineMacro("__LZCNT__");
3838
Benjamin Kramer1e250392012-07-07 09:39:18 +00003839 if (HasRDRND)
3840 Builder.defineMacro("__RDRND__");
3841
Craig Topper8c7f2512014-11-03 06:51:41 +00003842 if (HasFSGSBASE)
3843 Builder.defineMacro("__FSGSBASE__");
3844
Craig Topper22967d42011-12-25 05:06:45 +00003845 if (HasBMI)
3846 Builder.defineMacro("__BMI__");
3847
3848 if (HasBMI2)
3849 Builder.defineMacro("__BMI2__");
3850
Craig Topper1de83482011-12-29 16:10:46 +00003851 if (HasPOPCNT)
3852 Builder.defineMacro("__POPCNT__");
3853
Michael Liao625a8752012-11-10 05:17:46 +00003854 if (HasRTM)
3855 Builder.defineMacro("__RTM__");
3856
Michael Liao74f4eaf2013-03-26 17:52:08 +00003857 if (HasPRFCHW)
3858 Builder.defineMacro("__PRFCHW__");
3859
Michael Liaoffaae352013-03-29 05:17:55 +00003860 if (HasRDSEED)
3861 Builder.defineMacro("__RDSEED__");
3862
Robert Khasanov50e6f582014-09-19 09:53:48 +00003863 if (HasADX)
3864 Builder.defineMacro("__ADX__");
3865
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003866 if (HasTBM)
3867 Builder.defineMacro("__TBM__");
3868
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003869 if (HasMWAITX)
3870 Builder.defineMacro("__MWAITX__");
3871
Rafael Espindolae62e2792013-08-20 13:44:29 +00003872 switch (XOPLevel) {
3873 case XOP:
3874 Builder.defineMacro("__XOP__");
3875 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003876 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003877 case SSE4A:
3878 Builder.defineMacro("__SSE4A__");
3879 case NoXOP:
3880 break;
3881 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003882
Craig Topperbba778b2012-06-03 21:46:30 +00003883 if (HasFMA)
3884 Builder.defineMacro("__FMA__");
3885
Manman Rena45358c2012-10-11 00:59:55 +00003886 if (HasF16C)
3887 Builder.defineMacro("__F16C__");
3888
Craig Topper679b53a2013-08-21 05:29:10 +00003889 if (HasAVX512CD)
3890 Builder.defineMacro("__AVX512CD__");
3891 if (HasAVX512ER)
3892 Builder.defineMacro("__AVX512ER__");
3893 if (HasAVX512PF)
3894 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003895 if (HasAVX512DQ)
3896 Builder.defineMacro("__AVX512DQ__");
3897 if (HasAVX512BW)
3898 Builder.defineMacro("__AVX512BW__");
3899 if (HasAVX512VL)
3900 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003901 if (HasAVX512VBMI)
3902 Builder.defineMacro("__AVX512VBMI__");
3903 if (HasAVX512IFMA)
3904 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003905
Ben Langmuir58078d02013-09-19 13:22:04 +00003906 if (HasSHA)
3907 Builder.defineMacro("__SHA__");
3908
Craig Toppere33f51f2015-10-16 06:22:36 +00003909 if (HasFXSR)
3910 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003911 if (HasXSAVE)
3912 Builder.defineMacro("__XSAVE__");
3913 if (HasXSAVEOPT)
3914 Builder.defineMacro("__XSAVEOPT__");
3915 if (HasXSAVEC)
3916 Builder.defineMacro("__XSAVEC__");
3917 if (HasXSAVES)
3918 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003919 if (HasPKU)
3920 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003921 if (HasCX16)
3922 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003923 if (HasCLFLUSHOPT)
3924 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003925 if (HasCLWB)
3926 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003927 if (HasMPX)
3928 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003929 if (HasSGX)
3930 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003931 if (HasPREFETCHWT1)
3932 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003933 if (HasCLZERO)
3934 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003935
Chris Lattner96e43572009-03-02 22:40:39 +00003936 // Each case falls through to the previous one here.
3937 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003938 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003939 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003940 case AVX2:
3941 Builder.defineMacro("__AVX2__");
3942 case AVX:
3943 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003944 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003945 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003946 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003947 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003948 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003949 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003950 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003951 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003952 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003953 Builder.defineMacro("__SSE2__");
3954 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003955 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003956 Builder.defineMacro("__SSE__");
3957 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003958 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003959 break;
3960 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003961
Derek Schuffc7dd7222012-10-11 15:52:22 +00003962 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003963 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003964 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003965 case AVX2:
3966 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003967 case SSE42:
3968 case SSE41:
3969 case SSSE3:
3970 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003971 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003972 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003973 break;
3974 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003975 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003976 break;
3977 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003978 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003979 }
3980 }
3981
Anders Carlssone437c682010-01-27 03:47:49 +00003982 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003983 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003984 case AMD3DNowAthlon:
3985 Builder.defineMacro("__3dNOW_A__");
3986 case AMD3DNow:
3987 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003988 case MMX:
3989 Builder.defineMacro("__MMX__");
3990 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003991 break;
3992 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003993
3994 if (CPU >= CK_i486) {
3995 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3996 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3997 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3998 }
3999 if (CPU >= CK_i586)
4000 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00004001}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004002
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004003bool X86TargetInfo::hasFeature(StringRef Feature) const {
4004 return llvm::StringSwitch<bool>(Feature)
4005 .Case("aes", HasAES)
4006 .Case("avx", SSELevel >= AVX)
4007 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00004008 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00004009 .Case("avx512cd", HasAVX512CD)
4010 .Case("avx512er", HasAVX512ER)
4011 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00004012 .Case("avx512dq", HasAVX512DQ)
4013 .Case("avx512bw", HasAVX512BW)
4014 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004015 .Case("avx512vbmi", HasAVX512VBMI)
4016 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004017 .Case("bmi", HasBMI)
4018 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004019 .Case("clflushopt", HasCLFLUSHOPT)
4020 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00004021 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00004022 .Case("cx16", HasCX16)
4023 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00004024 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004025 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00004026 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00004027 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00004028 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004029 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4030 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4031 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004032 .Case("movbe", HasMOVBE)
4033 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004034 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004035 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004036 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004037 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004038 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004039 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004040 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004041 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004042 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004043 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004044 .Case("sse", SSELevel >= SSE1)
4045 .Case("sse2", SSELevel >= SSE2)
4046 .Case("sse3", SSELevel >= SSE3)
4047 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004048 .Case("sse4.1", SSELevel >= SSE41)
4049 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004050 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004051 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004052 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004053 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4054 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004055 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004056 .Case("xsave", HasXSAVE)
4057 .Case("xsavec", HasXSAVEC)
4058 .Case("xsaves", HasXSAVES)
4059 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004060 .Default(false);
4061}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004062
Eric Christopherd9832702015-06-29 21:00:05 +00004063// We can't use a generic validation scheme for the features accepted here
4064// versus subtarget features accepted in the target attribute because the
4065// bitfield structure that's initialized in the runtime only supports the
4066// below currently rather than the full range of subtarget features. (See
4067// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4068bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4069 return llvm::StringSwitch<bool>(FeatureStr)
4070 .Case("cmov", true)
4071 .Case("mmx", true)
4072 .Case("popcnt", true)
4073 .Case("sse", true)
4074 .Case("sse2", true)
4075 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004076 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004077 .Case("sse4.1", true)
4078 .Case("sse4.2", true)
4079 .Case("avx", true)
4080 .Case("avx2", true)
4081 .Case("sse4a", true)
4082 .Case("fma4", true)
4083 .Case("xop", true)
4084 .Case("fma", true)
4085 .Case("avx512f", true)
4086 .Case("bmi", true)
4087 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004088 .Case("aes", true)
4089 .Case("pclmul", true)
4090 .Case("avx512vl", true)
4091 .Case("avx512bw", true)
4092 .Case("avx512dq", true)
4093 .Case("avx512cd", true)
4094 .Case("avx512er", true)
4095 .Case("avx512pf", true)
4096 .Case("avx512vbmi", true)
4097 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004098 .Default(false);
4099}
4100
Eli Friedman3fd920a2008-08-20 02:34:37 +00004101bool
Anders Carlsson58436352009-02-28 17:11:49 +00004102X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004103 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004104 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004105 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004106 // Constant constraints.
4107 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4108 // instructions.
4109 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4110 // x86_64 instructions.
4111 case 's':
4112 Info.setRequiresImmediate();
4113 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004114 case 'I':
4115 Info.setRequiresImmediate(0, 31);
4116 return true;
4117 case 'J':
4118 Info.setRequiresImmediate(0, 63);
4119 return true;
4120 case 'K':
4121 Info.setRequiresImmediate(-128, 127);
4122 return true;
4123 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004124 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004125 return true;
4126 case 'M':
4127 Info.setRequiresImmediate(0, 3);
4128 return true;
4129 case 'N':
4130 Info.setRequiresImmediate(0, 255);
4131 return true;
4132 case 'O':
4133 Info.setRequiresImmediate(0, 127);
4134 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004135 // Register constraints.
4136 case 'Y': // 'Y' is the first character for several 2-character constraints.
4137 // Shift the pointer to the second character of the constraint.
4138 Name++;
4139 switch (*Name) {
4140 default:
4141 return false;
4142 case '0': // First SSE register.
4143 case 't': // Any SSE register, when SSE2 is enabled.
4144 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4145 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004146 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004147 Info.setAllowsRegister();
4148 return true;
4149 }
4150 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004151 // Constraint 'f' cannot be used for output operands.
4152 if (Info.ConstraintStr[0] == '=')
4153 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004154 Info.setAllowsRegister();
4155 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004156 case 'a': // eax.
4157 case 'b': // ebx.
4158 case 'c': // ecx.
4159 case 'd': // edx.
4160 case 'S': // esi.
4161 case 'D': // edi.
4162 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004163 case 't': // Top of floating point stack.
4164 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004165 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004166 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004167 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004168 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004169 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4170 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004171 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004172 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4173 case 'l': // "Index" registers: any general register that can be used as an
4174 // index in a base+index memory access.
4175 Info.setAllowsRegister();
4176 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004177 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004178 case 'C': // SSE floating point constant.
4179 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004180 return true;
4181 }
4182}
4183
Akira Hatanaka974131e2014-09-18 18:17:18 +00004184bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4185 unsigned Size) const {
4186 // Strip off constraint modifiers.
4187 while (Constraint[0] == '=' ||
4188 Constraint[0] == '+' ||
4189 Constraint[0] == '&')
4190 Constraint = Constraint.substr(1);
4191
4192 return validateOperandSize(Constraint, Size);
4193}
4194
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004195bool X86TargetInfo::validateInputSize(StringRef Constraint,
4196 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004197 return validateOperandSize(Constraint, Size);
4198}
4199
4200bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4201 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004202 switch (Constraint[0]) {
4203 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004204 case 'k':
4205 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004206 case 'y':
4207 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004208 case 'f':
4209 case 't':
4210 case 'u':
4211 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004212 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004213 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004214 if (SSELevel >= AVX512F)
4215 // 512-bit zmm registers can be used if target supports AVX512F.
4216 return Size <= 512U;
4217 else if (SSELevel >= AVX)
4218 // 256-bit ymm registers can be used if target supports AVX.
4219 return Size <= 256U;
4220 return Size <= 128U;
4221 case 'Y':
4222 // 'Y' is the first character for several 2-character constraints.
4223 switch (Constraint[1]) {
4224 default: break;
4225 case 'm':
4226 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004227 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004228 return Size <= 64;
4229 case 'i':
4230 case 't':
4231 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4232 if (SSELevel >= AVX512F)
4233 return Size <= 512U;
4234 else if (SSELevel >= AVX)
4235 return Size <= 256U;
4236 return SSELevel >= SSE2 && Size <= 128U;
4237 }
4238
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004239 }
4240
4241 return true;
4242}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004243
Eli Friedman3fd920a2008-08-20 02:34:37 +00004244std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004245X86TargetInfo::convertConstraint(const char *&Constraint) const {
4246 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004247 case 'a': return std::string("{ax}");
4248 case 'b': return std::string("{bx}");
4249 case 'c': return std::string("{cx}");
4250 case 'd': return std::string("{dx}");
4251 case 'S': return std::string("{si}");
4252 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004253 case 'p': // address
4254 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004255 case 't': // top of floating point stack.
4256 return std::string("{st}");
4257 case 'u': // second from top of floating point stack.
4258 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004259 case 'Y':
4260 switch (Constraint[1]) {
4261 default:
4262 // Break from inner switch and fall through (copy single char),
4263 // continue parsing after copying the current constraint into
4264 // the return string.
4265 break;
4266 case 'k':
4267 // "^" hints llvm that this is a 2 letter constraint.
4268 // "Constraint++" is used to promote the string iterator
4269 // to the next constraint.
4270 return std::string("^") + std::string(Constraint++, 2);
4271 }
4272 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004273 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004274 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004275 }
4276}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004277
Eli Friedman3fd920a2008-08-20 02:34:37 +00004278// X86-32 generic target
4279class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004280public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004281 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4282 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004283 DoubleAlign = LongLongAlign = 32;
4284 LongDoubleWidth = 96;
4285 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004286 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004287 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004288 SizeType = UnsignedInt;
4289 PtrDiffType = SignedInt;
4290 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004291 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004292
4293 // Use fpret for all types.
4294 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4295 (1 << TargetInfo::Double) |
4296 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004297
4298 // x86-32 has atomics up to 8 bytes
4299 // FIXME: Check that we actually have cmpxchg8b before setting
4300 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4301 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004302 }
Craig Topper3164f332014-03-11 03:39:26 +00004303 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004304 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004305 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004306
Craig Topper3164f332014-03-11 03:39:26 +00004307 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004308 if (RegNo == 0) return 0;
4309 if (RegNo == 1) return 2;
4310 return -1;
4311 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004312 bool validateOperandSize(StringRef Constraint,
4313 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004314 switch (Constraint[0]) {
4315 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004316 case 'R':
4317 case 'q':
4318 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004319 case 'a':
4320 case 'b':
4321 case 'c':
4322 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004323 case 'S':
4324 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004325 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004326 case 'A':
4327 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004328 }
4329
Akira Hatanaka974131e2014-09-18 18:17:18 +00004330 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004331 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004332 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4333 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4334 Builtin::FirstTSBuiltin + 1);
4335 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004336};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004337
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004338class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004340 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4341 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004342
Craig Topper3164f332014-03-11 03:39:26 +00004343 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004344 unsigned Major, Minor, Micro;
4345 getTriple().getOSVersion(Major, Minor, Micro);
4346 // New NetBSD uses the default rounding mode.
4347 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4348 return X86_32TargetInfo::getFloatEvalMethod();
4349 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004350 return 1;
4351 }
4352};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004353
Eli Friedmane3aa4542009-07-05 18:47:56 +00004354class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4355public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004356 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4357 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004358 SizeType = UnsignedLong;
4359 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004360 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004361 }
4362};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004363
Eli Friedman9fa28852012-08-08 23:57:20 +00004364class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4365public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004366 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4367 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004368 SizeType = UnsignedLong;
4369 IntPtrType = SignedLong;
4370 PtrDiffType = SignedLong;
4371 }
4372};
Eli Friedman9fa28852012-08-08 23:57:20 +00004373
Torok Edwinb2b37c62009-06-30 17:10:35 +00004374class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004375public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004376 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4377 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004378 LongDoubleWidth = 128;
4379 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004380 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004381 MaxVectorAlign = 256;
4382 // The watchOS simulator uses the builtin bool type for Objective-C.
4383 llvm::Triple T = llvm::Triple(Triple);
4384 if (T.isWatchOS())
4385 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004386 SizeType = UnsignedLong;
4387 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004388 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004389 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004390 }
4391
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004392 bool handleTargetFeatures(std::vector<std::string> &Features,
4393 DiagnosticsEngine &Diags) override {
4394 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4395 Diags))
4396 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004397 // We now know the features we have: we can decide how to align vectors.
4398 MaxVectorAlign =
4399 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004400 return true;
4401 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004402};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004403
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004404// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004405class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004406public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004407 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4408 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004409 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004410 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004411 bool IsWinCOFF =
4412 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004413 resetDataLayout(IsWinCOFF
4414 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4415 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004416 }
Craig Topper3164f332014-03-11 03:39:26 +00004417 void getTargetDefines(const LangOptions &Opts,
4418 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004419 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4420 }
4421};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004422
4423// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004424class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004425public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004426 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4427 const TargetOptions &Opts)
4428 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004429 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004430 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004431 }
Craig Topper3164f332014-03-11 03:39:26 +00004432 void getTargetDefines(const LangOptions &Opts,
4433 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004434 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4435 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4436 // The value of the following reflects processor type.
4437 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4438 // We lost the original triple, so we use the default.
4439 Builder.defineMacro("_M_IX86", "600");
4440 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004441};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004442
David Majnemerae1ed0e2015-05-28 04:36:18 +00004443static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004444 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4445 // supports __declspec natively under -fms-extensions, but we define a no-op
4446 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004447 if (Opts.MicrosoftExt)
4448 Builder.defineMacro("__declspec", "__declspec");
4449 else
4450 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4451
4452 if (!Opts.MicrosoftExt) {
4453 // Provide macros for all the calling convention keywords. Provide both
4454 // single and double underscore prefixed variants. These are available on
4455 // x64 as well as x86, even though they have no effect.
4456 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4457 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004458 std::string GCCSpelling = "__attribute__((__";
4459 GCCSpelling += CC;
4460 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004461 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4462 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4463 }
4464 }
4465}
4466
David Majnemerae1ed0e2015-05-28 04:36:18 +00004467static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4468 Builder.defineMacro("__MSVCRT__");
4469 Builder.defineMacro("__MINGW32__");
4470 addCygMingDefines(Opts, Builder);
4471}
4472
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004473// x86-32 MinGW target
4474class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004476 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4477 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004478 void getTargetDefines(const LangOptions &Opts,
4479 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004480 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004481 DefineStd(Builder, "WIN32", Opts);
4482 DefineStd(Builder, "WINNT", Opts);
4483 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004484 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004485 }
4486};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004487
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004488// x86-32 Cygwin target
4489class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004491 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4492 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004493 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004494 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004495 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 +00004496 }
Craig Topper3164f332014-03-11 03:39:26 +00004497 void getTargetDefines(const LangOptions &Opts,
4498 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004499 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004500 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004501 Builder.defineMacro("__CYGWIN__");
4502 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004503 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004504 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004505 if (Opts.CPlusPlus)
4506 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004507 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004508};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004509
Chris Lattnerb986aba2010-04-11 19:29:39 +00004510// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004511class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004512public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004513 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004514 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004515 }
Craig Topper3164f332014-03-11 03:39:26 +00004516 void getTargetDefines(const LangOptions &Opts,
4517 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004518 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004519 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004520 }
4521};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004522
Alexey Bataevc99b0492015-11-25 09:24:26 +00004523// X86-32 MCU target
4524class MCUX86_32TargetInfo : public X86_32TargetInfo {
4525public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004526 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4527 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004528 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004529 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004530 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 +00004531 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004532 }
4533
4534 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4535 // On MCU we support only C calling convention.
4536 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4537 }
4538
4539 void getTargetDefines(const LangOptions &Opts,
4540 MacroBuilder &Builder) const override {
4541 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4542 Builder.defineMacro("__iamcu");
4543 Builder.defineMacro("__iamcu__");
4544 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004545
4546 bool allowsLargerPreferedTypeAlignment() const override {
4547 return false;
4548 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004549};
4550
Douglas Gregor9fabd852011-07-01 22:41:14 +00004551// RTEMS Target
4552template<typename Target>
4553class RTEMSTargetInfo : public OSTargetInfo<Target> {
4554protected:
Craig Topper3164f332014-03-11 03:39:26 +00004555 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4556 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004557 // RTEMS defines; list based off of gcc output
4558
Douglas Gregor9fabd852011-07-01 22:41:14 +00004559 Builder.defineMacro("__rtems__");
4560 Builder.defineMacro("__ELF__");
4561 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004562
Douglas Gregor9fabd852011-07-01 22:41:14 +00004563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004564 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4565 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004566 switch (Triple.getArch()) {
4567 default:
4568 case llvm::Triple::x86:
4569 // this->MCountName = ".mcount";
4570 break;
4571 case llvm::Triple::mips:
4572 case llvm::Triple::mipsel:
4573 case llvm::Triple::ppc:
4574 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004575 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004576 // this->MCountName = "_mcount";
4577 break;
4578 case llvm::Triple::arm:
4579 // this->MCountName = "__mcount";
4580 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004581 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004582 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004583};
4584
Douglas Gregor9fabd852011-07-01 22:41:14 +00004585// x86-32 RTEMS target
4586class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004588 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4589 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004590 SizeType = UnsignedLong;
4591 IntPtrType = SignedLong;
4592 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004593 }
Craig Topper3164f332014-03-11 03:39:26 +00004594 void getTargetDefines(const LangOptions &Opts,
4595 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004596 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4597 Builder.defineMacro("__INTEL__");
4598 Builder.defineMacro("__rtems__");
4599 }
4600};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004601
Eli Friedman3fd920a2008-08-20 02:34:37 +00004602// x86-64 generic target
4603class X86_64TargetInfo : public X86TargetInfo {
4604public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004605 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4606 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004607 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004608 bool IsWinCOFF =
4609 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004610 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004611 LongDoubleWidth = 128;
4612 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004613 LargeArrayMinWidth = 128;
4614 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004615 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004616 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4617 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4618 IntPtrType = IsX32 ? SignedInt : SignedLong;
4619 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004620 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004621 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004622
Eric Christopher917e9522014-11-18 22:36:15 +00004623 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004624 resetDataLayout(IsX32
4625 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4626 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4627 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004628
4629 // Use fpret only for long double.
4630 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004631
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004632 // Use fp2ret for _Complex long double.
4633 ComplexLongDoubleUsesFP2Ret = true;
4634
Charles Davisc7d5c942015-09-17 20:55:33 +00004635 // Make __builtin_ms_va_list available.
4636 HasBuiltinMSVaList = true;
4637
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004638 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004639 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004640 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004641 }
Craig Topper3164f332014-03-11 03:39:26 +00004642 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004643 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004644 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004645
Craig Topper3164f332014-03-11 03:39:26 +00004646 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004647 if (RegNo == 0) return 0;
4648 if (RegNo == 1) return 1;
4649 return -1;
4650 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004651
Craig Topper3164f332014-03-11 03:39:26 +00004652 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004653 switch (CC) {
4654 case CC_C:
4655 case CC_Swift:
4656 case CC_X86VectorCall:
4657 case CC_IntelOclBicc:
4658 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004659 case CC_PreserveMost:
4660 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004661 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004662 return CCCR_OK;
4663 default:
4664 return CCCR_Warning;
4665 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004666 }
4667
Craig Topper3164f332014-03-11 03:39:26 +00004668 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004669 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004670 }
4671
Pavel Chupinfd223e12014-08-04 12:39:43 +00004672 // for x32 we need it here explicitly
4673 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004674 unsigned getUnwindWordWidth() const override { return 64; }
4675 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004676
4677 bool validateGlobalRegisterVariable(StringRef RegName,
4678 unsigned RegSize,
4679 bool &HasSizeMismatch) const override {
4680 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4681 // handle.
4682 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4683 // Check that the register size is 64-bit.
4684 HasSizeMismatch = RegSize != 64;
4685 return true;
4686 }
4687
4688 // Check if the register is a 32-bit register the backend can handle.
4689 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4690 HasSizeMismatch);
4691 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004692 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4693 return llvm::makeArrayRef(BuiltinInfoX86,
4694 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4695 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004696};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004697
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004698// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004699class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004700public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004701 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4702 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004703 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004704 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004705 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004706 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004707 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004708 SizeType = UnsignedLongLong;
4709 PtrDiffType = SignedLongLong;
4710 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004711 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004712
Craig Topper3164f332014-03-11 03:39:26 +00004713 void getTargetDefines(const LangOptions &Opts,
4714 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004715 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004716 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004717 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004718
Craig Topper3164f332014-03-11 03:39:26 +00004719 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004720 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004721 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004722
Craig Topper3164f332014-03-11 03:39:26 +00004723 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004724 switch (CC) {
4725 case CC_X86StdCall:
4726 case CC_X86ThisCall:
4727 case CC_X86FastCall:
4728 return CCCR_Ignore;
4729 case CC_C:
4730 case CC_X86VectorCall:
4731 case CC_IntelOclBicc:
4732 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004733 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004734 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004735 return CCCR_OK;
4736 default:
4737 return CCCR_Warning;
4738 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004739 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004740};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004741
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004742// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004743class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004744public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004745 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4746 const TargetOptions &Opts)
4747 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004748 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004749 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004750 }
Craig Topper3164f332014-03-11 03:39:26 +00004751 void getTargetDefines(const LangOptions &Opts,
4752 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004753 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4754 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004755 Builder.defineMacro("_M_X64", "100");
4756 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004757 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004758};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004759
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004760// x86-64 MinGW target
4761class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4762public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004763 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4764 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004765 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4766 // with x86 FP ops. Weird.
4767 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004768 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004769 }
4770
Craig Topper3164f332014-03-11 03:39:26 +00004771 void getTargetDefines(const LangOptions &Opts,
4772 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004773 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004774 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004775 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004776 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004777
4778 // GCC defines this macro when it is using __gxx_personality_seh0.
4779 if (!Opts.SjLjExceptions)
4780 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004781 }
4782};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004783
Yaron Kerend030d112015-07-22 17:38:19 +00004784// x86-64 Cygwin target
4785class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4786public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004787 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4788 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004789 TLSSupported = false;
4790 WCharType = UnsignedShort;
4791 }
4792 void getTargetDefines(const LangOptions &Opts,
4793 MacroBuilder &Builder) const override {
4794 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4795 Builder.defineMacro("__x86_64__");
4796 Builder.defineMacro("__CYGWIN__");
4797 Builder.defineMacro("__CYGWIN64__");
4798 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004799 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004800 if (Opts.CPlusPlus)
4801 Builder.defineMacro("_GNU_SOURCE");
4802
4803 // GCC defines this macro when it is using __gxx_personality_seh0.
4804 if (!Opts.SjLjExceptions)
4805 Builder.defineMacro("__SEH__");
4806 }
4807};
4808
Eli Friedman2857ccb2009-07-01 03:36:11 +00004809class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4810public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004811 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4812 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004813 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004814 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4815 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004816 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004817 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004818 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004819 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004820
4821 bool handleTargetFeatures(std::vector<std::string> &Features,
4822 DiagnosticsEngine &Diags) override {
4823 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4824 Diags))
4825 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004826 // We now know the features we have: we can decide how to align vectors.
4827 MaxVectorAlign =
4828 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004829 return true;
4830 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004831};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004832
Eli Friedman245f2292009-07-05 22:31:18 +00004833class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4834public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004835 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4836 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004837 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004838 Int64Type = SignedLongLong;
4839 }
4840};
Eli Friedman245f2292009-07-05 22:31:18 +00004841
Eli Friedman9fa28852012-08-08 23:57:20 +00004842class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4843public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004844 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4845 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004846 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004847 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004848 }
4849};
Tim Northover9bb857a2013-01-31 12:13:10 +00004850
Eli Friedmanf05b7722008-08-20 07:44:10 +00004851class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004852 // Possible FPU choices.
4853 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004854 VFP2FPU = (1 << 0),
4855 VFP3FPU = (1 << 1),
4856 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004857 NeonFPU = (1 << 3),
4858 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004859 };
4860
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004861 // Possible HWDiv features.
4862 enum HWDivMode {
4863 HWDivThumb = (1 << 0),
4864 HWDivARM = (1 << 1)
4865 };
4866
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004867 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004868 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004869 }
4870
4871 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4872 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004873
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004874 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004875
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004876 StringRef CPUProfile;
4877 StringRef CPUAttr;
4878
Rafael Espindolaeb265472013-08-21 21:59:03 +00004879 enum {
4880 FP_Default,
4881 FP_VFP,
4882 FP_Neon
4883 } FPMath;
4884
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004885 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004886 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004887 unsigned ArchProfile;
4888 unsigned ArchVersion;
4889
Bernard Ogdenda13af32013-10-24 18:32:51 +00004890 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004891
Logan Chien57086ce2012-10-10 06:56:20 +00004892 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004893 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004894
4895 // Initialized via features.
4896 unsigned SoftFloat : 1;
4897 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004898
Bernard Ogden18b57012013-10-29 09:47:51 +00004899 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004900 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004901 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004902 unsigned Unaligned : 1;
4903
4904 enum {
4905 LDREX_B = (1 << 0), /// byte (8-bit)
4906 LDREX_H = (1 << 1), /// half (16-bit)
4907 LDREX_W = (1 << 2), /// word (32-bit)
4908 LDREX_D = (1 << 3), /// double (64-bit)
4909 };
4910
4911 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004912
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004913 // ACLE 6.5.1 Hardware floating point
4914 enum {
4915 HW_FP_HP = (1 << 1), /// half (16-bit)
4916 HW_FP_SP = (1 << 2), /// single (32-bit)
4917 HW_FP_DP = (1 << 3), /// double (64-bit)
4918 };
4919 uint32_t HW_FP;
4920
Chris Lattner5cc15e02010-03-03 19:03:45 +00004921 static const Builtin::Info BuiltinInfo[];
4922
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004923 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004924 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004925
4926 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004927 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004928
Renato Golin0201a9e2016-09-22 19:28:20 +00004929 // size_t is unsigned long on MachO-derived environments, NetBSD,
4930 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004931 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004932 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004933 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004934 SizeType = UnsignedLong;
4935 else
4936 SizeType = UnsignedInt;
4937
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004938 switch (T.getOS()) {
4939 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004940 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004941 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004942 break;
4943 case llvm::Triple::Win32:
4944 WCharType = UnsignedShort;
4945 break;
4946 case llvm::Triple::Linux:
4947 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004948 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4949 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004950 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004951 }
4952
4953 UseBitFieldTypeAlignment = true;
4954
4955 ZeroLengthBitfieldBoundary = 0;
4956
Tim Northover147cd2f2014-10-14 22:12:21 +00004957 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4958 // so set preferred for small types to 32.
4959 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004960 resetDataLayout(BigEndian
4961 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4962 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004963 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004964 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004965 resetDataLayout("e"
4966 "-m:w"
4967 "-p:32:32"
4968 "-i64:64"
4969 "-v128:64:128"
4970 "-a:0:32"
4971 "-n32"
4972 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004973 } else if (T.isOSNaCl()) {
4974 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004975 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004976 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004977 resetDataLayout(BigEndian
4978 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4979 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004980 }
4981
4982 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004983 }
4984
Tim Northover5627d392015-10-30 16:30:45 +00004985 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004986 const llvm::Triple &T = getTriple();
4987
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004988 IsAAPCS = false;
4989
Tim Northover5627d392015-10-30 16:30:45 +00004990 if (IsAAPCS16)
4991 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4992 else
4993 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004994
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004995 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004996 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004997 SizeType = UnsignedInt;
4998 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004999 SizeType = UnsignedLong;
5000
5001 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
5002 WCharType = SignedInt;
5003
5004 // Do not respect the alignment of bit-field types when laying out
5005 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
5006 UseBitFieldTypeAlignment = false;
5007
5008 /// gcc forces the alignment to 4 bytes, regardless of the type of the
5009 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
5010 /// gcc.
5011 ZeroLengthBitfieldBoundary = 32;
5012
Tim Northover5627d392015-10-30 16:30:45 +00005013 if (T.isOSBinFormatMachO() && IsAAPCS16) {
5014 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00005015 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00005016 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00005017 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005018 BigEndian
5019 ? "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 +00005020 : "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 +00005021 else
James Y Knightb214cbc2016-03-04 19:00:41 +00005022 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00005023 BigEndian
5024 ? "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 +00005025 : "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 +00005026
5027 // FIXME: Override "preferred align" for double and long long.
5028 }
5029
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005030 void setArchInfo() {
5031 StringRef ArchName = getTriple().getArchName();
5032
Renato Goline84b0002015-10-08 16:43:26 +00005033 ArchISA = llvm::ARM::parseArchISA(ArchName);
5034 CPU = llvm::ARM::getDefaultCPU(ArchName);
5035 unsigned AK = llvm::ARM::parseArch(ArchName);
5036 if (AK != llvm::ARM::AK_INVALID)
5037 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005038 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005039 }
5040
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005041 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005042 StringRef SubArch;
5043
5044 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005045 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005046 SubArch = llvm::ARM::getSubArch(ArchKind);
5047 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5048 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005049
5050 // cache CPU related strings
5051 CPUAttr = getCPUAttr();
5052 CPUProfile = getCPUProfile();
5053 }
5054
5055 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005056 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005057 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005058 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005059 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5060 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005061 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005062 if (ArchProfile == llvm::ARM::PK_M) {
5063 MaxAtomicPromoteWidth = 32;
5064 if (ShouldUseInlineAtomic)
5065 MaxAtomicInlineWidth = 32;
5066 }
5067 else {
5068 MaxAtomicPromoteWidth = 64;
5069 if (ShouldUseInlineAtomic)
5070 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005071 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005072 }
5073
5074 bool isThumb() const {
5075 return (ArchISA == llvm::ARM::IK_THUMB);
5076 }
5077
5078 bool supportsThumb() const {
5079 return CPUAttr.count('T') || ArchVersion >= 6;
5080 }
5081
5082 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005083 return CPUAttr.equals("6T2") ||
5084 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005085 }
5086
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005087 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005088 // For most sub-arches, the build attribute CPU name is enough.
5089 // For Cortex variants, it's slightly different.
5090 switch(ArchKind) {
5091 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005092 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005093 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005094 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005095 case llvm::ARM::AK_ARMV7S:
5096 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005097 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005098 return "7A";
5099 case llvm::ARM::AK_ARMV7R:
5100 return "7R";
5101 case llvm::ARM::AK_ARMV7M:
5102 return "7M";
5103 case llvm::ARM::AK_ARMV7EM:
5104 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005105 case llvm::ARM::AK_ARMV7VE:
5106 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005107 case llvm::ARM::AK_ARMV8A:
5108 return "8A";
5109 case llvm::ARM::AK_ARMV8_1A:
5110 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005111 case llvm::ARM::AK_ARMV8_2A:
5112 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005113 case llvm::ARM::AK_ARMV8MBaseline:
5114 return "8M_BASE";
5115 case llvm::ARM::AK_ARMV8MMainline:
5116 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005117 case llvm::ARM::AK_ARMV8R:
5118 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005119 }
5120 }
5121
5122 StringRef getCPUProfile() const {
5123 switch(ArchProfile) {
5124 case llvm::ARM::PK_A:
5125 return "A";
5126 case llvm::ARM::PK_R:
5127 return "R";
5128 case llvm::ARM::PK_M:
5129 return "M";
5130 default:
5131 return "";
5132 }
5133 }
5134
Chris Lattner17df24e2008-04-21 18:56:49 +00005135public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005136 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005137 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5138 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005139
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005140 switch (getTriple().getOS()) {
5141 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005142 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005143 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005144 break;
5145 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005146 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005147 break;
5148 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005149
Renato Goline84b0002015-10-08 16:43:26 +00005150 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005151 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005152
Chris Lattner1a8f3942010-04-23 16:29:58 +00005153 // {} in inline assembly are neon specifiers, not assembly variant
5154 // specifiers.
5155 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005156
Eric Christopher0e261882014-12-05 01:06:59 +00005157 // FIXME: This duplicates code from the driver that sets the -target-abi
5158 // option - this code is used if -target-abi isn't passed and should
5159 // be unified in some way.
5160 if (Triple.isOSBinFormatMachO()) {
5161 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5162 // the frontend matches that.
5163 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5164 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005165 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005166 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005167 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005168 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005169 } else {
5170 setABI("apcs-gnu");
5171 }
5172 } else if (Triple.isOSWindows()) {
5173 // FIXME: this is invalid for WindowsCE
5174 setABI("aapcs");
5175 } else {
5176 // Select the default based on the platform.
5177 switch (Triple.getEnvironment()) {
5178 case llvm::Triple::Android:
5179 case llvm::Triple::GNUEABI:
5180 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005181 case llvm::Triple::MuslEABI:
5182 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005183 setABI("aapcs-linux");
5184 break;
5185 case llvm::Triple::EABIHF:
5186 case llvm::Triple::EABI:
5187 setABI("aapcs");
5188 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005189 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005190 setABI("apcs-gnu");
5191 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005192 default:
5193 if (Triple.getOS() == llvm::Triple::NetBSD)
5194 setABI("apcs-gnu");
Brad Smith3d648b32017-02-28 03:20:26 +00005195 else if (Triple.getOS() == llvm::Triple::OpenBSD)
5196 setABI("aapcs-linux");
Eric Christopher0e261882014-12-05 01:06:59 +00005197 else
5198 setABI("aapcs");
5199 break;
5200 }
5201 }
John McCall86353412010-08-21 22:46:04 +00005202
5203 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005204 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005205
Renato Golin15b86152015-07-03 16:41:13 +00005206 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005207 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005208
James Molloya7139222012-03-12 09:14:10 +00005209 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005210 // the alignment of the zero-length bitfield is greater than the member
5211 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005212 // zero length bitfield.
5213 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005214
5215 if (Triple.getOS() == llvm::Triple::Linux ||
5216 Triple.getOS() == llvm::Triple::UnknownOS)
5217 this->MCountName =
5218 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005219 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005220
Alp Toker4925ba72014-06-07 23:30:42 +00005221 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005222
Craig Topper3164f332014-03-11 03:39:26 +00005223 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005224 ABI = Name;
5225
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005226 // The defaults (above) are for AAPCS, check if we need to change them.
5227 //
5228 // FIXME: We need support for -meabi... we could just mangle it into the
5229 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005230 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005231 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005232 return true;
5233 }
5234 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5235 setABIAAPCS();
5236 return true;
5237 }
5238 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005239 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005240
Renato Golinf5c4dec2015-05-27 13:33:00 +00005241 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005242 bool
5243 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5244 StringRef CPU,
5245 const std::vector<std::string> &FeaturesVec) const override {
5246
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005247 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005248 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005249
5250 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005251 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005252 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5253
5254 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005255 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005256 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5257
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005258 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005259 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005260 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005261
Eric Christopher007b0a02015-08-28 22:32:01 +00005262 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005263 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005264
Craig Topper3164f332014-03-11 03:39:26 +00005265 bool handleTargetFeatures(std::vector<std::string> &Features,
5266 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005267 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005268 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005269 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005270 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005271 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005272 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005273 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005274
Ranjeet Singhac08e532015-06-24 23:39:25 +00005275 // This does not diagnose illegal cases like having both
5276 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5277 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005278 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005279 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005280 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005281 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005282 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005283 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005284 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005285 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005286 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005287 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005288 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005289 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005290 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005291 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005292 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005293 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005294 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005295 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005296 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005297 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005298 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005299 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005300 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005301 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005302 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005303 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005304 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005305 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005306 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005307 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005308 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005309 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005310 } else if (Feature == "+strict-align") {
5311 Unaligned = 0;
5312 } else if (Feature == "+fp16") {
5313 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005314 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005315 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005316 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005317
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005318 switch (ArchVersion) {
5319 case 6:
5320 if (ArchProfile == llvm::ARM::PK_M)
5321 LDREX = 0;
5322 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5323 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5324 else
5325 LDREX = LDREX_W;
5326 break;
5327 case 7:
5328 if (ArchProfile == llvm::ARM::PK_M)
5329 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5330 else
5331 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5332 break;
5333 case 8:
5334 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5335 }
5336
Rafael Espindolaeb265472013-08-21 21:59:03 +00005337 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5338 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5339 return false;
5340 }
5341
5342 if (FPMath == FP_Neon)
5343 Features.push_back("+neonfp");
5344 else if (FPMath == FP_VFP)
5345 Features.push_back("-neonfp");
5346
Daniel Dunbar893d4752009-12-19 04:15:38 +00005347 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005348 auto Feature =
5349 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5350 if (Feature != Features.end())
5351 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005352
Rafael Espindolaeb265472013-08-21 21:59:03 +00005353 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005354 }
5355
Craig Topper3164f332014-03-11 03:39:26 +00005356 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005357 return llvm::StringSwitch<bool>(Feature)
5358 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005359 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005360 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005361 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005362 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005363 .Case("hwdiv", HWDiv & HWDivThumb)
5364 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005365 .Default(false);
5366 }
Renato Golin15b86152015-07-03 16:41:13 +00005367
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005368 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005369 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005370 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005371
Renato Golin15b86152015-07-03 16:41:13 +00005372 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005373 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005374 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005375 CPU = Name;
5376 return true;
5377 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005378
Craig Topper3164f332014-03-11 03:39:26 +00005379 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005380
Craig Topper3164f332014-03-11 03:39:26 +00005381 void getTargetDefines(const LangOptions &Opts,
5382 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005383 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005384 Builder.defineMacro("__arm");
5385 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005386 // For bare-metal none-eabi.
5387 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5388 getTriple().getEnvironment() == llvm::Triple::EABI)
5389 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005390
Chris Lattnerecd49032009-03-02 22:27:17 +00005391 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005392 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005393
5394 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5395 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005396 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005397 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5398
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005399 if (!CPUAttr.empty())
5400 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005401
5402 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005403 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005404 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005405
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005406 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005407 // ACLE 6.5.7 Crypto Extension
5408 if (Crypto)
5409 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5410 // ACLE 6.5.8 CRC32 Extension
5411 if (CRC)
5412 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5413 // ACLE 6.5.10 Numeric Maximum and Minimum
5414 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5415 // ACLE 6.5.9 Directed Rounding
5416 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005417 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005418
5419 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5420 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005421 // NOTE that the default profile is assumed to be 'A'
5422 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005423 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5424
Bradley Smithf4affc12016-03-03 13:52:22 +00005425 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5426 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5427 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5428 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005429 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005430 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005431 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005432 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5433
5434 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5435 // instruction set such as ARM or Thumb.
5436 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5437
5438 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5439
5440 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005441 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005442 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005443
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005444 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005445 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005446 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005447
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005448 // ACLE 6.4.4 LDREX/STREX
5449 if (LDREX)
5450 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5451
5452 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005453 if (ArchVersion == 5 ||
5454 (ArchVersion == 6 && CPUProfile != "M") ||
5455 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005456 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5457
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005458 // ACLE 6.5.1 Hardware Floating Point
5459 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005460 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005461
Yi Konga44c4d72014-06-27 21:25:42 +00005462 // ACLE predefines.
5463 Builder.defineMacro("__ARM_ACLE", "200");
5464
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005465 // FP16 support (we currently only support IEEE format).
5466 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5467 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5468
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005469 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005470 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005471 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5472
Mike Stump9d54bd72009-04-08 02:07:04 +00005473 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005474
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005475 // FIXME: It's more complicated than this and we don't really support
5476 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005477 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005478 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005479 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005480
David Tweed8f676532012-10-25 13:33:01 +00005481 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005482 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005483 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005484 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005485 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005486 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005487 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005488
Tim Northover28fc0e12016-04-28 13:59:55 +00005489 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5490 ABI == "aapcs16")
5491 Builder.defineMacro("__ARM_PCS_VFP", "1");
5492
Daniel Dunbar893d4752009-12-19 04:15:38 +00005493 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005494 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005495
Zijiao Ma56a83722016-08-17 02:13:33 +00005496 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005497 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005498
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005499 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005500 Builder.defineMacro("__THUMBEL__");
5501 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005502 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005503 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005504 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005505
5506 // ACLE 6.4.9 32-bit SIMD instructions
5507 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5508 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5509
5510 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005511 if (((HWDiv & HWDivThumb) && isThumb()) ||
5512 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005513 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005514 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005515 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005516
5517 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005518 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005519
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005520 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005521 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005522 if (FPU & VFP2FPU)
5523 Builder.defineMacro("__ARM_VFPV2__");
5524 if (FPU & VFP3FPU)
5525 Builder.defineMacro("__ARM_VFPV3__");
5526 if (FPU & VFP4FPU)
5527 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005528 if (FPU & FPARMV8)
5529 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005530 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005531
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005532 // This only gets set when Neon instructions are actually available, unlike
5533 // the VFP define, hence the soft float and arch check. This is subtly
5534 // different from gcc, we follow the intent which was that it should be set
5535 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005536 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005537 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005538 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005539 // current AArch32 NEON implementations do not support double-precision
5540 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005541 Builder.defineMacro("__ARM_NEON_FP",
5542 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005543 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005544
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005545 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5546 Opts.ShortWChar ? "2" : "4");
5547
5548 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5549 Opts.ShortEnums ? "1" : "4");
5550
Bradley Smithf4affc12016-03-03 13:52:22 +00005551 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005552 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5553 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5554 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5555 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5556 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005557
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005558 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005559 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005560 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005561 }
5562
5563 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005564 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005565 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5566 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005567 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005568 }
5569
5570 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005571 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005572 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005573
5574 if (Opts.UnsafeFPMath)
5575 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005576
5577 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5578 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005579 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005580
Craig Topper6c03a542015-10-19 04:51:35 +00005581 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5582 return llvm::makeArrayRef(BuiltinInfo,
5583 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005584 }
Craig Topper3164f332014-03-11 03:39:26 +00005585 bool isCLZForZeroUndef() const override { return false; }
5586 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005587 return IsAAPCS
5588 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005589 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5590 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005591 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005592 ArrayRef<const char *> getGCCRegNames() const override;
5593 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005594 bool validateAsmConstraint(const char *&Name,
5595 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005596 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005597 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005598 case 'l': // r0-r7
5599 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005600 case 't': // VFP Floating point register single precision
5601 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005602 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005603 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005604 case 'I':
5605 case 'J':
5606 case 'K':
5607 case 'L':
5608 case 'M':
5609 // FIXME
5610 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005611 case 'Q': // A memory address that is a single base register.
5612 Info.setAllowsMemory();
5613 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005614 case 'U': // a memory reference...
5615 switch (Name[1]) {
5616 case 'q': // ...ARMV4 ldrsb
5617 case 'v': // ...VFP load/store (reg+constant offset)
5618 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005619 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005620 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005621 case 'n': // valid address for Neon doubleword vector load/store
5622 case 'm': // valid address for Neon element and structure load/store
5623 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005624 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005625 Info.setAllowsMemory();
5626 Name++;
5627 return true;
5628 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005629 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005630 return false;
5631 }
Craig Topper3164f332014-03-11 03:39:26 +00005632 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005633 std::string R;
5634 switch (*Constraint) {
5635 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005636 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005637 Constraint++;
5638 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005639 case 'p': // 'p' should be translated to 'r' by default.
5640 R = std::string("r");
5641 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005642 default:
5643 return std::string(1, *Constraint);
5644 }
5645 return R;
5646 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005647 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005648 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005649 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005650 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005651 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005652
Bill Wendling9d1ee112012-10-25 23:28:48 +00005653 // Strip off constraint modifiers.
5654 while (Constraint[0] == '=' ||
5655 Constraint[0] == '+' ||
5656 Constraint[0] == '&')
5657 Constraint = Constraint.substr(1);
5658
5659 switch (Constraint[0]) {
5660 default: break;
5661 case 'r': {
5662 switch (Modifier) {
5663 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005664 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005665 case 'q':
5666 // A register of size 32 cannot fit a vector type.
5667 return false;
5668 }
5669 }
5670 }
5671
5672 return true;
5673 }
Craig Topper3164f332014-03-11 03:39:26 +00005674 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005675 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005676 return "";
5677 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005678
Craig Topper3164f332014-03-11 03:39:26 +00005679 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005680 switch (CC) {
5681 case CC_AAPCS:
5682 case CC_AAPCS_VFP:
5683 case CC_Swift:
5684 return CCCR_OK;
5685 default:
5686 return CCCR_Warning;
5687 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005688 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005689
Craig Topper3164f332014-03-11 03:39:26 +00005690 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005691 if (RegNo == 0) return 0;
5692 if (RegNo == 1) return 1;
5693 return -1;
5694 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005695
5696 bool hasSjLjLowering() const override {
5697 return true;
5698 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005699};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005700
Rafael Espindolaeb265472013-08-21 21:59:03 +00005701bool ARMTargetInfo::setFPMath(StringRef Name) {
5702 if (Name == "neon") {
5703 FPMath = FP_Neon;
5704 return true;
5705 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5706 Name == "vfp4") {
5707 FPMath = FP_VFP;
5708 return true;
5709 }
5710 return false;
5711}
5712
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005713const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005714 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005715 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005716 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5717
5718 // Float registers
5719 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5720 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5721 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005722 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005723
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005724 // Double registers
5725 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5726 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005727 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5728 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005729
5730 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005731 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5732 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005733};
5734
Craig Topperf054e3a2015-10-19 03:52:27 +00005735ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5736 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005737}
5738
5739const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005740 { { "a1" }, "r0" },
5741 { { "a2" }, "r1" },
5742 { { "a3" }, "r2" },
5743 { { "a4" }, "r3" },
5744 { { "v1" }, "r4" },
5745 { { "v2" }, "r5" },
5746 { { "v3" }, "r6" },
5747 { { "v4" }, "r7" },
5748 { { "v5" }, "r8" },
5749 { { "v6", "rfp" }, "r9" },
5750 { { "sl" }, "r10" },
5751 { { "fp" }, "r11" },
5752 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005753 { { "r13" }, "sp" },
5754 { { "r14" }, "lr" },
5755 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005756 // The S, D and Q registers overlap, but aren't really aliases; we
5757 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005758};
5759
Craig Topperf054e3a2015-10-19 03:52:27 +00005760ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5761 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005762}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005763
5764const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005765#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005766 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005767#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5768 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005769#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005770
Craig Topper07d3b622015-08-07 05:14:44 +00005771#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005772 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005773#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005774 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005775#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5776 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005777#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5778 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005779#include "clang/Basic/BuiltinsARM.def"
5780};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005781
5782class ARMleTargetInfo : public ARMTargetInfo {
5783public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005784 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005785 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005786 void getTargetDefines(const LangOptions &Opts,
5787 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005788 Builder.defineMacro("__ARMEL__");
5789 ARMTargetInfo::getTargetDefines(Opts, Builder);
5790 }
5791};
5792
5793class ARMbeTargetInfo : public ARMTargetInfo {
5794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005795 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005796 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005797 void getTargetDefines(const LangOptions &Opts,
5798 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005799 Builder.defineMacro("__ARMEB__");
5800 Builder.defineMacro("__ARM_BIG_ENDIAN");
5801 ARMTargetInfo::getTargetDefines(Opts, Builder);
5802 }
5803};
Chris Lattner17df24e2008-04-21 18:56:49 +00005804
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005805class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5806 const llvm::Triple Triple;
5807public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005808 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5809 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005810 WCharType = UnsignedShort;
5811 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005812 }
5813 void getVisualStudioDefines(const LangOptions &Opts,
5814 MacroBuilder &Builder) const {
5815 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5816
5817 // FIXME: this is invalid for WindowsCE
5818 Builder.defineMacro("_M_ARM_NT", "1");
5819 Builder.defineMacro("_M_ARMT", "_M_ARM");
5820 Builder.defineMacro("_M_THUMB", "_M_ARM");
5821
5822 assert((Triple.getArch() == llvm::Triple::arm ||
5823 Triple.getArch() == llvm::Triple::thumb) &&
5824 "invalid architecture for Windows ARM target info");
5825 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5826 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5827
5828 // TODO map the complete set of values
5829 // 31: VFPv3 40: VFPv4
5830 Builder.defineMacro("_M_ARM_FP", "31");
5831 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005832 BuiltinVaListKind getBuiltinVaListKind() const override {
5833 return TargetInfo::CharPtrBuiltinVaList;
5834 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005835 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5836 switch (CC) {
5837 case CC_X86StdCall:
5838 case CC_X86ThisCall:
5839 case CC_X86FastCall:
5840 case CC_X86VectorCall:
5841 return CCCR_Ignore;
5842 case CC_C:
5843 return CCCR_OK;
5844 default:
5845 return CCCR_Warning;
5846 }
5847 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005848};
5849
5850// Windows ARM + Itanium C++ ABI Target
5851class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5852public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005853 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5854 const TargetOptions &Opts)
5855 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005856 TheCXXABI.set(TargetCXXABI::GenericARM);
5857 }
5858
5859 void getTargetDefines(const LangOptions &Opts,
5860 MacroBuilder &Builder) const override {
5861 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5862
5863 if (Opts.MSVCCompat)
5864 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5865 }
5866};
5867
5868// Windows ARM, MS (C++) ABI
5869class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005871 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5872 const TargetOptions &Opts)
5873 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005874 TheCXXABI.set(TargetCXXABI::Microsoft);
5875 }
5876
5877 void getTargetDefines(const LangOptions &Opts,
5878 MacroBuilder &Builder) const override {
5879 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5880 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5881 }
5882};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005883
Yaron Keren321249c2015-07-15 13:32:23 +00005884// ARM MinGW target
5885class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5886public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005887 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5888 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005889 TheCXXABI.set(TargetCXXABI::GenericARM);
5890 }
5891
5892 void getTargetDefines(const LangOptions &Opts,
5893 MacroBuilder &Builder) const override {
5894 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5895 DefineStd(Builder, "WIN32", Opts);
5896 DefineStd(Builder, "WINNT", Opts);
5897 Builder.defineMacro("_ARM_");
5898 addMinGWDefines(Opts, Builder);
5899 }
5900};
5901
5902// ARM Cygwin target
5903class CygwinARMTargetInfo : public ARMleTargetInfo {
5904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005905 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5906 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005907 TLSSupported = false;
5908 WCharType = UnsignedShort;
5909 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005910 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005911 }
5912 void getTargetDefines(const LangOptions &Opts,
5913 MacroBuilder &Builder) const override {
5914 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5915 Builder.defineMacro("_ARM_");
5916 Builder.defineMacro("__CYGWIN__");
5917 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005918 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005919 if (Opts.CPlusPlus)
5920 Builder.defineMacro("_GNU_SOURCE");
5921 }
5922};
5923
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005924class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005925protected:
Craig Topper3164f332014-03-11 03:39:26 +00005926 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5927 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005928 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005929 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005930
Torok Edwinb2b37c62009-06-30 17:10:35 +00005931public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005932 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5933 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005934 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005935 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005936 // FIXME: This should be based off of the target features in
5937 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005938 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005939
Tim Northoverd88ecb32016-01-27 19:32:40 +00005940 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005941 // Darwin on iOS uses a variant of the ARM C++ ABI.
5942 TheCXXABI.set(TargetCXXABI::WatchOS);
5943
5944 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5945 // size_t is long, it's a bit weird for it to be int.
5946 PtrDiffType = SignedLong;
5947
5948 // BOOL should be a real boolean on the new ABI
5949 UseSignedCharForObjCBool = false;
5950 } else
5951 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005952 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005953};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005954
Tim Northover573cbee2014-05-24 12:52:07 +00005955class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005956 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005957 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5958 static const char *const GCCRegNames[];
5959
James Molloy75f5f9e2014-04-16 15:33:48 +00005960 enum FPUModeEnum {
5961 FPUMode,
5962 NeonMode
5963 };
5964
5965 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005966 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005967 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005968 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005969 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005970
Tim Northovera2ee4332014-03-29 15:09:45 +00005971 static const Builtin::Info BuiltinInfo[];
5972
5973 std::string ABI;
5974
5975public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005976 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005977 : TargetInfo(Triple), ABI("aapcs") {
Brad Smith9aa2bf22017-02-21 23:13:09 +00005978 if (getTriple().getOS() == llvm::Triple::NetBSD ||
5979 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northover25e8a672014-05-24 12:51:25 +00005980 WCharType = SignedInt;
5981
5982 // NetBSD apparently prefers consistency across ARM targets to consistency
5983 // across 64-bit targets.
5984 Int64Type = SignedLongLong;
5985 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005986 } else {
5987 WCharType = UnsignedInt;
5988 Int64Type = SignedLong;
5989 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005990 }
5991
Tim Northovera2ee4332014-03-29 15:09:45 +00005992 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005993 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005994 MaxAtomicInlineWidth = 128;
5995 MaxAtomicPromoteWidth = 128;
5996
Tim Northovera6a19f12015-02-06 01:25:07 +00005997 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005998 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005999
Tim Northovera2ee4332014-03-29 15:09:45 +00006000 // {} in inline assembly are neon specifiers, not assembly variant
6001 // specifiers.
6002 NoAsmVariants = true;
6003
Tim Northover7ad87af2015-01-16 18:44:04 +00006004 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
6005 // contributes to the alignment of the containing aggregate in the same way
6006 // a plain (non bit-field) member of that type would, without exception for
6007 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00006008 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00006009 UseZeroLengthBitfieldAlignment = true;
6010
Tim Northover573cbee2014-05-24 12:52:07 +00006011 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00006012 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006013
Eric Christopherfb834a82017-02-28 17:22:05 +00006014 if (Triple.getOS() == llvm::Triple::Linux)
6015 this->MCountName = "\01_mcount";
6016 else if (Triple.getOS() == llvm::Triple::UnknownOS)
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00006017 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00006018 }
6019
Alp Toker4925ba72014-06-07 23:30:42 +00006020 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00006021 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006022 if (Name != "aapcs" && Name != "darwinpcs")
6023 return false;
6024
6025 ABI = Name;
6026 return true;
6027 }
6028
David Blaikie1cbb9712014-11-14 19:09:44 +00006029 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00006030 return Name == "generic" ||
6031 llvm::AArch64::parseCPUArch(Name) !=
6032 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006033 }
6034
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006035 void getTargetDefines(const LangOptions &Opts,
6036 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006037 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006038 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006039
6040 // Target properties.
6041 Builder.defineMacro("_LP64");
6042 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006043
6044 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6045 Builder.defineMacro("__ARM_ACLE", "200");
6046 Builder.defineMacro("__ARM_ARCH", "8");
6047 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6048
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006049 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006050 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006051 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006052
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006053 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6054 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6055 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6056 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006057 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006058 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6059 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006060
6061 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6062
6063 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006064 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006065
6066 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6067 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006068 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6069 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006070
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006071 if (Opts.UnsafeFPMath)
6072 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006073
6074 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6075
6076 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6077 Opts.ShortEnums ? "1" : "4");
6078
James Molloy75f5f9e2014-04-16 15:33:48 +00006079 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006080 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006081 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006082 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006083 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006084
Bradley Smith418c5932014-05-02 15:17:51 +00006085 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006086 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006087
James Molloy75f5f9e2014-04-16 15:33:48 +00006088 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006089 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6090
6091 if (Unaligned)
6092 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006093
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006094 if (V8_1A)
6095 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6096
Reid Klecknerd167d422015-05-06 15:31:46 +00006097 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6098 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6099 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6100 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6101 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006102 }
6103
Craig Topper6c03a542015-10-19 04:51:35 +00006104 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6105 return llvm::makeArrayRef(BuiltinInfo,
6106 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006107 }
6108
David Blaikie1cbb9712014-11-14 19:09:44 +00006109 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006110 return Feature == "aarch64" ||
6111 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006112 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006113 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006114 }
6115
James Molloy5e73df52014-04-16 15:06:20 +00006116 bool handleTargetFeatures(std::vector<std::string> &Features,
6117 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006118 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006119 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006120 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006121 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006122 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006123
Eric Christopher610fe112015-08-26 08:21:55 +00006124 for (const auto &Feature : Features) {
6125 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006126 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006127 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006128 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006129 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006130 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006131 if (Feature == "+strict-align")
6132 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006133 if (Feature == "+v8.1a")
6134 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006135 }
6136
James Y Knightb214cbc2016-03-04 19:00:41 +00006137 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006138
6139 return true;
6140 }
6141
John McCall477f2bb2016-03-03 06:39:32 +00006142 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6143 switch (CC) {
6144 case CC_C:
6145 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006146 case CC_PreserveMost:
6147 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006148 return CCCR_OK;
6149 default:
6150 return CCCR_Warning;
6151 }
6152 }
6153
David Blaikie1cbb9712014-11-14 19:09:44 +00006154 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006155
David Blaikie1cbb9712014-11-14 19:09:44 +00006156 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006157 return TargetInfo::AArch64ABIBuiltinVaList;
6158 }
6159
Craig Topperf054e3a2015-10-19 03:52:27 +00006160 ArrayRef<const char *> getGCCRegNames() const override;
6161 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006162
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006163 bool validateAsmConstraint(const char *&Name,
6164 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006165 switch (*Name) {
6166 default:
6167 return false;
6168 case 'w': // Floating point and SIMD registers (V0-V31)
6169 Info.setAllowsRegister();
6170 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006171 case 'I': // Constant that can be used with an ADD instruction
6172 case 'J': // Constant that can be used with a SUB instruction
6173 case 'K': // Constant that can be used with a 32-bit logical instruction
6174 case 'L': // Constant that can be used with a 64-bit logical instruction
6175 case 'M': // Constant that can be used as a 32-bit MOV immediate
6176 case 'N': // Constant that can be used as a 64-bit MOV immediate
6177 case 'Y': // Floating point constant zero
6178 case 'Z': // Integer constant zero
6179 return true;
6180 case 'Q': // A memory reference with base register and no offset
6181 Info.setAllowsMemory();
6182 return true;
6183 case 'S': // A symbolic address
6184 Info.setAllowsRegister();
6185 return true;
6186 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006187 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6188 // Utf: A memory address suitable for ldp/stp in TF mode.
6189 // Usa: An absolute symbolic address.
6190 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6191 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006192 case 'z': // Zero register, wzr or xzr
6193 Info.setAllowsRegister();
6194 return true;
6195 case 'x': // Floating point and SIMD registers (V0-V15)
6196 Info.setAllowsRegister();
6197 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006198 }
6199 return false;
6200 }
6201
Akira Hatanaka987f1862014-08-22 06:05:21 +00006202 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006203 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006204 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006205 // Strip off constraint modifiers.
6206 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6207 Constraint = Constraint.substr(1);
6208
6209 switch (Constraint[0]) {
6210 default:
6211 return true;
6212 case 'z':
6213 case 'r': {
6214 switch (Modifier) {
6215 case 'x':
6216 case 'w':
6217 // For now assume that the person knows what they're
6218 // doing with the modifier.
6219 return true;
6220 default:
6221 // By default an 'r' constraint will be in the 'x'
6222 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006223 if (Size == 64)
6224 return true;
6225
6226 SuggestedModifier = "w";
6227 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006228 }
6229 }
6230 }
6231 }
6232
David Blaikie1cbb9712014-11-14 19:09:44 +00006233 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006234
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006235 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006236 if (RegNo == 0)
6237 return 0;
6238 if (RegNo == 1)
6239 return 1;
6240 return -1;
6241 }
6242};
6243
Tim Northover573cbee2014-05-24 12:52:07 +00006244const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006245 // 32-bit Integer registers
6246 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6247 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6248 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6249
6250 // 64-bit Integer registers
6251 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6252 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6253 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6254
6255 // 32-bit floating point regsisters
6256 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6257 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6258 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6259
6260 // 64-bit floating point regsisters
6261 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6262 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6263 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6264
6265 // Vector registers
6266 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6267 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6268 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6269};
6270
Craig Topperf054e3a2015-10-19 03:52:27 +00006271ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6272 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006273}
6274
Tim Northover573cbee2014-05-24 12:52:07 +00006275const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006276 { { "w31" }, "wsp" },
6277 { { "x29" }, "fp" },
6278 { { "x30" }, "lr" },
6279 { { "x31" }, "sp" },
6280 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6281 // don't want to substitute one of these for a different-sized one.
6282};
6283
Craig Topperf054e3a2015-10-19 03:52:27 +00006284ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6285 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006286}
6287
Tim Northover573cbee2014-05-24 12:52:07 +00006288const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006289#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006290 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006291#include "clang/Basic/BuiltinsNEON.def"
6292
6293#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006294 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006295#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006296};
James Molloy5e73df52014-04-16 15:06:20 +00006297
Tim Northover573cbee2014-05-24 12:52:07 +00006298class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006299 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006300 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006301 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006302 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006303 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006304 }
6305
6306public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006307 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6308 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006309 }
James Molloy5e73df52014-04-16 15:06:20 +00006310 void getTargetDefines(const LangOptions &Opts,
6311 MacroBuilder &Builder) const override {
6312 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006313 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006314 }
6315};
6316
Tim Northover573cbee2014-05-24 12:52:07 +00006317class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006318 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006319 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006320 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006321 }
6322
6323public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006324 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6325 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006326 void getTargetDefines(const LangOptions &Opts,
6327 MacroBuilder &Builder) const override {
6328 Builder.defineMacro("__AARCH64EB__");
6329 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6330 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006331 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006332 }
6333};
Tim Northovera2ee4332014-03-29 15:09:45 +00006334
Tim Northover573cbee2014-05-24 12:52:07 +00006335class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006336protected:
6337 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6338 MacroBuilder &Builder) const override {
6339 Builder.defineMacro("__AARCH64_SIMD__");
6340 Builder.defineMacro("__ARM64_ARCH_8__");
6341 Builder.defineMacro("__ARM_NEON__");
6342 Builder.defineMacro("__LITTLE_ENDIAN__");
6343 Builder.defineMacro("__REGISTER_PREFIX__", "");
6344 Builder.defineMacro("__arm64", "1");
6345 Builder.defineMacro("__arm64__", "1");
6346
6347 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6348 }
6349
Tim Northovera2ee4332014-03-29 15:09:45 +00006350public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006351 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6352 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006353 Int64Type = SignedLongLong;
6354 WCharType = SignedInt;
6355 UseSignedCharForObjCBool = false;
6356
Tim Northovera6a19f12015-02-06 01:25:07 +00006357 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006358 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006359
6360 TheCXXABI.set(TargetCXXABI::iOS64);
6361 }
6362
David Blaikie1cbb9712014-11-14 19:09:44 +00006363 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006364 return TargetInfo::CharPtrBuiltinVaList;
6365 }
6366};
Tim Northovera2ee4332014-03-29 15:09:45 +00006367
Tony Linthicum76329bf2011-12-12 21:14:55 +00006368// Hexagon abstract base class
6369class HexagonTargetInfo : public TargetInfo {
6370 static const Builtin::Info BuiltinInfo[];
6371 static const char * const GCCRegNames[];
6372 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6373 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006374 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006375 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006376
Tony Linthicum76329bf2011-12-12 21:14:55 +00006377public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006378 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6379 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006380 // Specify the vector alignment explicitly. For v512x1, the calculated
6381 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6382 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006383 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006384 "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 +00006385 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006386 SizeType = UnsignedInt;
6387 PtrDiffType = SignedInt;
6388 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006389
6390 // {} in inline assembly are packet specifiers, not assembly variant
6391 // specifiers.
6392 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006393
6394 LargeArrayMinWidth = 64;
6395 LargeArrayAlign = 64;
6396 UseBitFieldTypeAlignment = true;
6397 ZeroLengthBitfieldBoundary = 32;
6398 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006399 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006400 }
6401
Craig Topper6c03a542015-10-19 04:51:35 +00006402 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6403 return llvm::makeArrayRef(BuiltinInfo,
6404 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006405 }
6406
Craig Topper3164f332014-03-11 03:39:26 +00006407 bool validateAsmConstraint(const char *&Name,
6408 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006409 switch (*Name) {
6410 case 'v':
6411 case 'q':
6412 if (HasHVX) {
6413 Info.setAllowsRegister();
6414 return true;
6415 }
6416 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006417 case 's':
6418 // Relocatable constant.
6419 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006420 }
6421 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006422 }
6423
Craig Topper3164f332014-03-11 03:39:26 +00006424 void getTargetDefines(const LangOptions &Opts,
6425 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006426
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006427 bool isCLZForZeroUndef() const override { return false; }
6428
Craig Topper3164f332014-03-11 03:39:26 +00006429 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006430 return llvm::StringSwitch<bool>(Feature)
6431 .Case("hexagon", true)
6432 .Case("hvx", HasHVX)
6433 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006434 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006435 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006436 }
Craig Topper3164f332014-03-11 03:39:26 +00006437
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006438 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6439 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6440 const override;
6441
6442 bool handleTargetFeatures(std::vector<std::string> &Features,
6443 DiagnosticsEngine &Diags) override;
6444
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006445 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6446 bool Enabled) const override;
6447
Craig Topper3164f332014-03-11 03:39:26 +00006448 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006449 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006450 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006451 ArrayRef<const char *> getGCCRegNames() const override;
6452 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006453 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454 return "";
6455 }
Sebastian Pop86500282012-01-13 20:37:10 +00006456
6457 static const char *getHexagonCPUSuffix(StringRef Name) {
6458 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006459 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006460 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006461 .Case("hexagonv55", "55")
6462 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006463 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006464 }
6465
Craig Topper3164f332014-03-11 03:39:26 +00006466 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006467 if (!getHexagonCPUSuffix(Name))
6468 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006469 CPU = Name;
6470 return true;
6471 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006472
6473 int getEHDataRegisterNumber(unsigned RegNo) const override {
6474 return RegNo < 2 ? RegNo : -1;
6475 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006476};
6477
6478void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006479 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006480 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006481 Builder.defineMacro("__hexagon__", "1");
6482
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006483 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006484 Builder.defineMacro("__HEXAGON_V4__");
6485 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006486 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006487 Builder.defineMacro("__QDSP6_V4__");
6488 Builder.defineMacro("__QDSP6_ARCH__", "4");
6489 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006490 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006491 Builder.defineMacro("__HEXAGON_V5__");
6492 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6493 if(Opts.HexagonQdsp6Compat) {
6494 Builder.defineMacro("__QDSP6_V5__");
6495 Builder.defineMacro("__QDSP6_ARCH__", "5");
6496 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006497 } else if (CPU == "hexagonv55") {
6498 Builder.defineMacro("__HEXAGON_V55__");
6499 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6500 Builder.defineMacro("__QDSP6_V55__");
6501 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006502 } else if (CPU == "hexagonv60") {
6503 Builder.defineMacro("__HEXAGON_V60__");
6504 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6505 Builder.defineMacro("__QDSP6_V60__");
6506 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006507 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006508
6509 if (hasFeature("hvx")) {
6510 Builder.defineMacro("__HVX__");
6511 if (hasFeature("hvx-double"))
6512 Builder.defineMacro("__HVXDBL__");
6513 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006514}
6515
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006516bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6517 DiagnosticsEngine &Diags, StringRef CPU,
6518 const std::vector<std::string> &FeaturesVec) const {
6519 // Default for v60: -hvx, -hvx-double.
6520 Features["hvx"] = false;
6521 Features["hvx-double"] = false;
6522 Features["long-calls"] = false;
6523
6524 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6525}
6526
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006527bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6528 DiagnosticsEngine &Diags) {
6529 for (auto &F : Features) {
6530 if (F == "+hvx")
6531 HasHVX = true;
6532 else if (F == "-hvx")
6533 HasHVX = HasHVXDouble = false;
6534 else if (F == "+hvx-double")
6535 HasHVX = HasHVXDouble = true;
6536 else if (F == "-hvx-double")
6537 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006538
6539 if (F == "+long-calls")
6540 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006541 else if (F == "-long-calls")
6542 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006543 }
6544 return true;
6545}
6546
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006547void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6548 StringRef Name, bool Enabled) const {
6549 if (Enabled) {
6550 if (Name == "hvx-double")
6551 Features["hvx"] = true;
6552 } else {
6553 if (Name == "hvx")
6554 Features["hvx-double"] = false;
6555 }
6556 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006557}
6558
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006559const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006560 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6561 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6562 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6563 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6564 "p0", "p1", "p2", "p3",
6565 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6566};
6567
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006568ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006569 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006570}
6571
Tony Linthicum76329bf2011-12-12 21:14:55 +00006572const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6573 { { "sp" }, "r29" },
6574 { { "fp" }, "r30" },
6575 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006576};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006577
Craig Topperf054e3a2015-10-19 03:52:27 +00006578ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6579 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006580}
6581
6582
6583const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006584#define BUILTIN(ID, TYPE, ATTRS) \
6585 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6586#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6587 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006588#include "clang/Basic/BuiltinsHexagon.def"
6589};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006590
Jacques Pienaard964cc22016-03-28 21:02:54 +00006591class LanaiTargetInfo : public TargetInfo {
6592 // Class for Lanai (32-bit).
6593 // The CPU profiles supported by the Lanai backend
6594 enum CPUKind {
6595 CK_NONE,
6596 CK_V11,
6597 } CPU;
6598
6599 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6600 static const char *const GCCRegNames[];
6601
6602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006603 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6604 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006605 // Description string has to be kept in sync with backend.
6606 resetDataLayout("E" // Big endian
6607 "-m:e" // ELF name manging
6608 "-p:32:32" // 32 bit pointers, 32 bit aligned
6609 "-i64:64" // 64 bit integers, 64 bit aligned
6610 "-a:0:32" // 32 bit alignment of objects of aggregate type
6611 "-n32" // 32 bit native integer width
6612 "-S64" // 64 bit natural stack alignment
6613 );
6614
6615 // Setting RegParmMax equal to what mregparm was set to in the old
6616 // toolchain
6617 RegParmMax = 4;
6618
6619 // Set the default CPU to V11
6620 CPU = CK_V11;
6621
6622 // Temporary approach to make everything at least word-aligned and allow for
6623 // safely casting between pointers with different alignment requirements.
6624 // TODO: Remove this when there are no more cast align warnings on the
6625 // firmware.
6626 MinGlobalAlign = 32;
6627 }
6628
6629 void getTargetDefines(const LangOptions &Opts,
6630 MacroBuilder &Builder) const override {
6631 // Define __lanai__ when building for target lanai.
6632 Builder.defineMacro("__lanai__");
6633
6634 // Set define for the CPU specified.
6635 switch (CPU) {
6636 case CK_V11:
6637 Builder.defineMacro("__LANAI_V11__");
6638 break;
6639 case CK_NONE:
6640 llvm_unreachable("Unhandled target CPU");
6641 }
6642 }
6643
6644 bool setCPU(const std::string &Name) override {
6645 CPU = llvm::StringSwitch<CPUKind>(Name)
6646 .Case("v11", CK_V11)
6647 .Default(CK_NONE);
6648
6649 return CPU != CK_NONE;
6650 }
6651
6652 bool hasFeature(StringRef Feature) const override {
6653 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6654 }
6655
6656 ArrayRef<const char *> getGCCRegNames() const override;
6657
6658 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6659
6660 BuiltinVaListKind getBuiltinVaListKind() const override {
6661 return TargetInfo::VoidPtrBuiltinVaList;
6662 }
6663
6664 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6665
6666 bool validateAsmConstraint(const char *&Name,
6667 TargetInfo::ConstraintInfo &info) const override {
6668 return false;
6669 }
6670
6671 const char *getClobbers() const override { return ""; }
6672};
6673
6674const char *const LanaiTargetInfo::GCCRegNames[] = {
6675 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6676 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6677 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6678
6679ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6680 return llvm::makeArrayRef(GCCRegNames);
6681}
6682
6683const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6684 {{"pc"}, "r2"},
6685 {{"sp"}, "r4"},
6686 {{"fp"}, "r5"},
6687 {{"rv"}, "r8"},
6688 {{"rr1"}, "r10"},
6689 {{"rr2"}, "r11"},
6690 {{"rca"}, "r15"},
6691};
6692
6693ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6694 return llvm::makeArrayRef(GCCRegAliases);
6695}
6696
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006697// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6698class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006699 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6700 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006701 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006702public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006703 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006704 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006705
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006706 int getEHDataRegisterNumber(unsigned RegNo) const override {
6707 if (RegNo == 0) return 24;
6708 if (RegNo == 1) return 25;
6709 return -1;
6710 }
6711
Craig Topper3164f332014-03-11 03:39:26 +00006712 bool handleTargetFeatures(std::vector<std::string> &Features,
6713 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006714 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006715 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6716 if (Feature != Features.end()) {
6717 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006718 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006719 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006720 }
Craig Topper3164f332014-03-11 03:39:26 +00006721 void getTargetDefines(const LangOptions &Opts,
6722 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006723 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006724 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006725
6726 if (SoftFloat)
6727 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006728 }
Craig Topper3164f332014-03-11 03:39:26 +00006729
6730 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006731 return llvm::StringSwitch<bool>(Feature)
6732 .Case("softfloat", SoftFloat)
6733 .Case("sparc", true)
6734 .Default(false);
6735 }
Craig Topper3164f332014-03-11 03:39:26 +00006736
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006737 bool hasSjLjLowering() const override {
6738 return true;
6739 }
6740
Craig Topper6c03a542015-10-19 04:51:35 +00006741 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006742 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006743 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006744 }
Craig Topper3164f332014-03-11 03:39:26 +00006745 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006746 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006747 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006748 ArrayRef<const char *> getGCCRegNames() const override;
6749 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006750 bool validateAsmConstraint(const char *&Name,
6751 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006752 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006753 switch (*Name) {
6754 case 'I': // Signed 13-bit constant
6755 case 'J': // Zero
6756 case 'K': // 32-bit constant with the low 12 bits clear
6757 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6758 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6759 case 'N': // Same as 'K' but zext (required for SIMode)
6760 case 'O': // The constant 4096
6761 return true;
6762 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006763 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006764 }
Craig Topper3164f332014-03-11 03:39:26 +00006765 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006766 // FIXME: Implement!
6767 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006768 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006769
6770 // No Sparc V7 for now, the backend doesn't support it anyway.
6771 enum CPUKind {
6772 CK_GENERIC,
6773 CK_V8,
6774 CK_SUPERSPARC,
6775 CK_SPARCLITE,
6776 CK_F934,
6777 CK_HYPERSPARC,
6778 CK_SPARCLITE86X,
6779 CK_SPARCLET,
6780 CK_TSC701,
6781 CK_V9,
6782 CK_ULTRASPARC,
6783 CK_ULTRASPARC3,
6784 CK_NIAGARA,
6785 CK_NIAGARA2,
6786 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006787 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006788 CK_MYRIAD2100,
6789 CK_MYRIAD2150,
6790 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006791 CK_LEON2,
6792 CK_LEON2_AT697E,
6793 CK_LEON2_AT697F,
6794 CK_LEON3,
6795 CK_LEON3_UT699,
6796 CK_LEON3_GR712RC,
6797 CK_LEON4,
6798 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006799 } CPU = CK_GENERIC;
6800
6801 enum CPUGeneration {
6802 CG_V8,
6803 CG_V9,
6804 };
6805
6806 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6807 switch (Kind) {
6808 case CK_GENERIC:
6809 case CK_V8:
6810 case CK_SUPERSPARC:
6811 case CK_SPARCLITE:
6812 case CK_F934:
6813 case CK_HYPERSPARC:
6814 case CK_SPARCLITE86X:
6815 case CK_SPARCLET:
6816 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006817 case CK_MYRIAD2100:
6818 case CK_MYRIAD2150:
6819 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006820 case CK_LEON2:
6821 case CK_LEON2_AT697E:
6822 case CK_LEON2_AT697F:
6823 case CK_LEON3:
6824 case CK_LEON3_UT699:
6825 case CK_LEON3_GR712RC:
6826 case CK_LEON4:
6827 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006828 return CG_V8;
6829 case CK_V9:
6830 case CK_ULTRASPARC:
6831 case CK_ULTRASPARC3:
6832 case CK_NIAGARA:
6833 case CK_NIAGARA2:
6834 case CK_NIAGARA3:
6835 case CK_NIAGARA4:
6836 return CG_V9;
6837 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006838 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006839 }
6840
6841 CPUKind getCPUKind(StringRef Name) const {
6842 return llvm::StringSwitch<CPUKind>(Name)
6843 .Case("v8", CK_V8)
6844 .Case("supersparc", CK_SUPERSPARC)
6845 .Case("sparclite", CK_SPARCLITE)
6846 .Case("f934", CK_F934)
6847 .Case("hypersparc", CK_HYPERSPARC)
6848 .Case("sparclite86x", CK_SPARCLITE86X)
6849 .Case("sparclet", CK_SPARCLET)
6850 .Case("tsc701", CK_TSC701)
6851 .Case("v9", CK_V9)
6852 .Case("ultrasparc", CK_ULTRASPARC)
6853 .Case("ultrasparc3", CK_ULTRASPARC3)
6854 .Case("niagara", CK_NIAGARA)
6855 .Case("niagara2", CK_NIAGARA2)
6856 .Case("niagara3", CK_NIAGARA3)
6857 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006858 .Case("ma2100", CK_MYRIAD2100)
6859 .Case("ma2150", CK_MYRIAD2150)
6860 .Case("ma2450", CK_MYRIAD2450)
6861 // FIXME: the myriad2[.n] spellings are obsolete,
6862 // but a grace period is needed to allow updating dependent builds.
6863 .Case("myriad2", CK_MYRIAD2100)
6864 .Case("myriad2.1", CK_MYRIAD2100)
6865 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006866 .Case("leon2", CK_LEON2)
6867 .Case("at697e", CK_LEON2_AT697E)
6868 .Case("at697f", CK_LEON2_AT697F)
6869 .Case("leon3", CK_LEON3)
6870 .Case("ut699", CK_LEON3_UT699)
6871 .Case("gr712rc", CK_LEON3_GR712RC)
6872 .Case("leon4", CK_LEON4)
6873 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006874 .Default(CK_GENERIC);
6875 }
6876
6877 bool setCPU(const std::string &Name) override {
6878 CPU = getCPUKind(Name);
6879 return CPU != CK_GENERIC;
6880 }
Gabor Greif49991682008-02-21 16:29:08 +00006881};
6882
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006883const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006884 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6885 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6886 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6887 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6888};
6889
Craig Topperf054e3a2015-10-19 03:52:27 +00006890ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6891 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006892}
6893
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006894const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006895 { { "g0" }, "r0" },
6896 { { "g1" }, "r1" },
6897 { { "g2" }, "r2" },
6898 { { "g3" }, "r3" },
6899 { { "g4" }, "r4" },
6900 { { "g5" }, "r5" },
6901 { { "g6" }, "r6" },
6902 { { "g7" }, "r7" },
6903 { { "o0" }, "r8" },
6904 { { "o1" }, "r9" },
6905 { { "o2" }, "r10" },
6906 { { "o3" }, "r11" },
6907 { { "o4" }, "r12" },
6908 { { "o5" }, "r13" },
6909 { { "o6", "sp" }, "r14" },
6910 { { "o7" }, "r15" },
6911 { { "l0" }, "r16" },
6912 { { "l1" }, "r17" },
6913 { { "l2" }, "r18" },
6914 { { "l3" }, "r19" },
6915 { { "l4" }, "r20" },
6916 { { "l5" }, "r21" },
6917 { { "l6" }, "r22" },
6918 { { "l7" }, "r23" },
6919 { { "i0" }, "r24" },
6920 { { "i1" }, "r25" },
6921 { { "i2" }, "r26" },
6922 { { "i3" }, "r27" },
6923 { { "i4" }, "r28" },
6924 { { "i5" }, "r29" },
6925 { { "i6", "fp" }, "r30" },
6926 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006927};
6928
Craig Topperf054e3a2015-10-19 03:52:27 +00006929ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6930 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006931}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006932
6933// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6934class SparcV8TargetInfo : public SparcTargetInfo {
6935public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006936 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6937 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006938 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006939 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6940 switch (getTriple().getOS()) {
6941 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006942 SizeType = UnsignedInt;
6943 IntPtrType = SignedInt;
6944 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006945 break;
6946 case llvm::Triple::NetBSD:
6947 case llvm::Triple::OpenBSD:
6948 SizeType = UnsignedLong;
6949 IntPtrType = SignedLong;
6950 PtrDiffType = SignedLong;
6951 break;
Brad Smith56495d52015-08-13 22:00:53 +00006952 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006953 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6954 // on up to 64 bits.
6955 MaxAtomicPromoteWidth = 64;
6956 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006957 }
6958
Craig Topper3164f332014-03-11 03:39:26 +00006959 void getTargetDefines(const LangOptions &Opts,
6960 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006961 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006962 switch (getCPUGeneration(CPU)) {
6963 case CG_V8:
6964 Builder.defineMacro("__sparcv8");
6965 if (getTriple().getOS() != llvm::Triple::Solaris)
6966 Builder.defineMacro("__sparcv8__");
6967 break;
6968 case CG_V9:
6969 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006970 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006971 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006972 Builder.defineMacro("__sparc_v9__");
6973 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006974 break;
6975 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006976 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006977 std::string MyriadArchValue, Myriad2Value;
6978 Builder.defineMacro("__sparc_v8__");
6979 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006980 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006981 case CK_MYRIAD2150:
6982 MyriadArchValue = "__ma2150";
6983 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006984 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006985 case CK_MYRIAD2450:
6986 MyriadArchValue = "__ma2450";
6987 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006988 break;
6989 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006990 MyriadArchValue = "__ma2100";
6991 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006992 break;
6993 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006994 Builder.defineMacro(MyriadArchValue, "1");
6995 Builder.defineMacro(MyriadArchValue+"__", "1");
6996 Builder.defineMacro("__myriad2__", Myriad2Value);
6997 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006998 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006999 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00007000
7001 bool hasSjLjLowering() const override {
7002 return true;
7003 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007004};
7005
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007006// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
7007class SparcV8elTargetInfo : public SparcV8TargetInfo {
7008 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007009 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7010 : SparcV8TargetInfo(Triple, Opts) {
7011 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00007012 }
7013};
7014
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007015// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
7016class SparcV9TargetInfo : public SparcTargetInfo {
7017public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007018 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7019 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007020 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00007021 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00007022 // This is an LP64 platform.
7023 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007024
7025 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007026 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007027 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00007028 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007029 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00007030 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00007031
7032 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7033 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7034 LongDoubleWidth = 128;
7035 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007036 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007037 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007038 }
7039
Craig Topper3164f332014-03-11 03:39:26 +00007040 void getTargetDefines(const LangOptions &Opts,
7041 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007042 SparcTargetInfo::getTargetDefines(Opts, Builder);
7043 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007044 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007045 // Solaris doesn't need these variants, but the BSDs do.
7046 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007047 Builder.defineMacro("__sparc64__");
7048 Builder.defineMacro("__sparc_v9__");
7049 Builder.defineMacro("__sparcv9__");
7050 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007051 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007052
Craig Topper3164f332014-03-11 03:39:26 +00007053 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007054 if (!SparcTargetInfo::setCPU(Name))
7055 return false;
7056 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007057 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007058};
7059
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007060class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007061 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007062 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007063 std::string CPU;
7064 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007065 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007066
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007067public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007068 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007069 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7070 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007071 IntMaxType = SignedLong;
7072 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007073 TLSSupported = true;
7074 IntWidth = IntAlign = 32;
7075 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7076 PointerWidth = PointerAlign = 64;
7077 LongDoubleWidth = 128;
7078 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007079 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007080 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007081 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007082 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 +00007083 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7084 }
7085 void getTargetDefines(const LangOptions &Opts,
7086 MacroBuilder &Builder) const override {
7087 Builder.defineMacro("__s390__");
7088 Builder.defineMacro("__s390x__");
7089 Builder.defineMacro("__zarch__");
7090 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007091
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007092 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7093 .Cases("arch8", "z10", "8")
7094 .Cases("arch9", "z196", "9")
7095 .Cases("arch10", "zEC12", "10")
7096 .Cases("arch11", "z13", "11")
7097 .Default("");
7098 if (!ISARev.empty())
7099 Builder.defineMacro("__ARCH__", ISARev);
7100
Ulrich Weigandb038a522016-02-05 21:34:28 +00007101 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7102 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7103 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7104 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7105
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007106 if (HasTransactionalExecution)
7107 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007108 if (HasVector)
7109 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007110 if (Opts.ZVector)
7111 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007112 }
Craig Topper6c03a542015-10-19 04:51:35 +00007113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7114 return llvm::makeArrayRef(BuiltinInfo,
7115 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007116 }
7117
Craig Topperf054e3a2015-10-19 03:52:27 +00007118 ArrayRef<const char *> getGCCRegNames() const override;
7119 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007120 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007121 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007122 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007123 bool validateAsmConstraint(const char *&Name,
7124 TargetInfo::ConstraintInfo &info) const override;
7125 const char *getClobbers() const override {
7126 // FIXME: Is this really right?
7127 return "";
7128 }
7129 BuiltinVaListKind getBuiltinVaListKind() const override {
7130 return TargetInfo::SystemZBuiltinVaList;
7131 }
7132 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007133 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007134 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7135 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007136 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007137 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007138 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007139 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007140 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007141 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007142 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007143 .Default(false);
7144
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007145 return CPUKnown;
7146 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007147 bool
7148 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7149 StringRef CPU,
7150 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007151 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007152 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007153 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007154 Features["transactional-execution"] = true;
7155 Features["vector"] = true;
7156 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007157 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007158 }
7159
7160 bool handleTargetFeatures(std::vector<std::string> &Features,
7161 DiagnosticsEngine &Diags) override {
7162 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007163 for (const auto &Feature : Features) {
7164 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007165 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007166 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007167 HasVector = true;
7168 }
7169 // If we use the vector ABI, vector types are 64-bit aligned.
7170 if (HasVector) {
7171 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007172 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7173 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007174 }
7175 return true;
7176 }
7177
7178 bool hasFeature(StringRef Feature) const override {
7179 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007180 .Case("systemz", true)
7181 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007182 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007183 .Default(false);
7184 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007185
Bryan Chane3f1ed52016-04-28 13:56:43 +00007186 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7187 switch (CC) {
7188 case CC_C:
7189 case CC_Swift:
7190 return CCCR_OK;
7191 default:
7192 return CCCR_Warning;
7193 }
7194 }
7195
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007196 StringRef getABI() const override {
7197 if (HasVector)
7198 return "vector";
7199 return "";
7200 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007201
7202 bool useFloat128ManglingForLongDouble() const override {
7203 return true;
7204 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007205};
7206
7207const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7208#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007209 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007210#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7211 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007212#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007213};
7214
7215const char *const SystemZTargetInfo::GCCRegNames[] = {
7216 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7217 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7218 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7219 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7220};
7221
Craig Topperf054e3a2015-10-19 03:52:27 +00007222ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7223 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007224}
7225
7226bool SystemZTargetInfo::
7227validateAsmConstraint(const char *&Name,
7228 TargetInfo::ConstraintInfo &Info) const {
7229 switch (*Name) {
7230 default:
7231 return false;
7232
7233 case 'a': // Address register
7234 case 'd': // Data register (equivalent to 'r')
7235 case 'f': // Floating-point register
7236 Info.setAllowsRegister();
7237 return true;
7238
7239 case 'I': // Unsigned 8-bit constant
7240 case 'J': // Unsigned 12-bit constant
7241 case 'K': // Signed 16-bit constant
7242 case 'L': // Signed 20-bit displacement (on all targets we support)
7243 case 'M': // 0x7fffffff
7244 return true;
7245
7246 case 'Q': // Memory with base and unsigned 12-bit displacement
7247 case 'R': // Likewise, plus an index
7248 case 'S': // Memory with base and signed 20-bit displacement
7249 case 'T': // Likewise, plus an index
7250 Info.setAllowsMemory();
7251 return true;
7252 }
7253}
Ulrich Weigand47445072013-05-06 16:26:41 +00007254
Eric Christopherc48497a2015-09-18 21:26:24 +00007255class MSP430TargetInfo : public TargetInfo {
7256 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007257
Eric Christopherc48497a2015-09-18 21:26:24 +00007258public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007259 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7260 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007261 TLSSupported = false;
7262 IntWidth = 16;
7263 IntAlign = 16;
7264 LongWidth = 32;
7265 LongLongWidth = 64;
7266 LongAlign = LongLongAlign = 16;
7267 PointerWidth = 16;
7268 PointerAlign = 16;
7269 SuitableAlign = 16;
7270 SizeType = UnsignedInt;
7271 IntMaxType = SignedLongLong;
7272 IntPtrType = SignedInt;
7273 PtrDiffType = SignedInt;
7274 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007275 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007276 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007277 void getTargetDefines(const LangOptions &Opts,
7278 MacroBuilder &Builder) const override {
7279 Builder.defineMacro("MSP430");
7280 Builder.defineMacro("__MSP430__");
7281 // FIXME: defines for different 'flavours' of MCU
7282 }
Craig Topper6c03a542015-10-19 04:51:35 +00007283 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007284 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007285 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007286 }
7287 bool hasFeature(StringRef Feature) const override {
7288 return Feature == "msp430";
7289 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007290 ArrayRef<const char *> getGCCRegNames() const override;
7291 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007292 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007293 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007294 }
7295 bool validateAsmConstraint(const char *&Name,
7296 TargetInfo::ConstraintInfo &info) const override {
7297 // FIXME: implement
7298 switch (*Name) {
7299 case 'K': // the constant 1
7300 case 'L': // constant -1^20 .. 1^19
7301 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007302 return true;
7303 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007304 // No target constraints for now.
7305 return false;
7306 }
7307 const char *getClobbers() const override {
7308 // FIXME: Is this really right?
7309 return "";
7310 }
7311 BuiltinVaListKind getBuiltinVaListKind() const override {
7312 // FIXME: implement
7313 return TargetInfo::CharPtrBuiltinVaList;
7314 }
7315};
7316
7317const char *const MSP430TargetInfo::GCCRegNames[] = {
7318 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7319 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7320
Craig Topperf054e3a2015-10-19 03:52:27 +00007321ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7322 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007323}
7324
7325// LLVM and Clang cannot be used directly to output native binaries for
7326// target, but is used to compile C code to llvm bitcode with correct
7327// type and alignment information.
7328//
7329// TCE uses the llvm bitcode as input and uses it for generating customized
7330// target processor and program binary. TCE co-design environment is
7331// publicly available in http://tce.cs.tut.fi
7332
7333static const unsigned TCEOpenCLAddrSpaceMap[] = {
7334 3, // opencl_global
7335 4, // opencl_local
7336 5, // opencl_constant
7337 // FIXME: generic has to be added to the target
7338 0, // opencl_generic
7339 0, // cuda_device
7340 0, // cuda_constant
7341 0 // cuda_shared
7342};
7343
7344class TCETargetInfo : public TargetInfo {
7345public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007346 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7347 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007348 TLSSupported = false;
7349 IntWidth = 32;
7350 LongWidth = LongLongWidth = 32;
7351 PointerWidth = 32;
7352 IntAlign = 32;
7353 LongAlign = LongLongAlign = 32;
7354 PointerAlign = 32;
7355 SuitableAlign = 32;
7356 SizeType = UnsignedInt;
7357 IntMaxType = SignedLong;
7358 IntPtrType = SignedInt;
7359 PtrDiffType = SignedInt;
7360 FloatWidth = 32;
7361 FloatAlign = 32;
7362 DoubleWidth = 32;
7363 DoubleAlign = 32;
7364 LongDoubleWidth = 32;
7365 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007366 FloatFormat = &llvm::APFloat::IEEEsingle();
7367 DoubleFormat = &llvm::APFloat::IEEEsingle();
7368 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007369 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7370 "i16:16:32-i32:32:32-i64:32:32-"
7371 "f32:32:32-f64:32:32-v64:32:32-"
7372 "v128:32:32-v256:32:32-v512:32:32-"
7373 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007374 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7375 UseAddrSpaceMapMangling = true;
7376 }
7377
7378 void getTargetDefines(const LangOptions &Opts,
7379 MacroBuilder &Builder) const override {
7380 DefineStd(Builder, "tce", Opts);
7381 Builder.defineMacro("__TCE__");
7382 Builder.defineMacro("__TCE_V1__");
7383 }
7384 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7385
Craig Topper6c03a542015-10-19 04:51:35 +00007386 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007387 const char *getClobbers() const override { return ""; }
7388 BuiltinVaListKind getBuiltinVaListKind() const override {
7389 return TargetInfo::VoidPtrBuiltinVaList;
7390 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007391 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007392 bool validateAsmConstraint(const char *&Name,
7393 TargetInfo::ConstraintInfo &info) const override {
7394 return true;
7395 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007396 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7397 return None;
7398 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007399};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007400
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007401class TCELETargetInfo : public TCETargetInfo {
7402public:
7403 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7404 : TCETargetInfo(Triple, Opts) {
7405 BigEndian = false;
7406
7407 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7408 "i16:16:32-i32:32:32-i64:32:32-"
7409 "f32:32:32-f64:32:32-v64:32:32-"
7410 "v128:32:32-v256:32:32-v512:32:32-"
7411 "v1024:32:32-a0:0:32-n32");
7412
7413 }
7414
7415 virtual void getTargetDefines(const LangOptions &Opts,
7416 MacroBuilder &Builder) const {
7417 DefineStd(Builder, "tcele", Opts);
7418 Builder.defineMacro("__TCE__");
7419 Builder.defineMacro("__TCE_V1__");
7420 Builder.defineMacro("__TCELE__");
7421 Builder.defineMacro("__TCELE_V1__");
7422 }
7423
7424};
7425
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007426class BPFTargetInfo : public TargetInfo {
7427public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007428 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7429 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007430 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7431 SizeType = UnsignedLong;
7432 PtrDiffType = SignedLong;
7433 IntPtrType = SignedLong;
7434 IntMaxType = SignedLong;
7435 Int64Type = SignedLong;
7436 RegParmMax = 5;
7437 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007438 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007439 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007440 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007441 }
7442 MaxAtomicPromoteWidth = 64;
7443 MaxAtomicInlineWidth = 64;
7444 TLSSupported = false;
7445 }
7446 void getTargetDefines(const LangOptions &Opts,
7447 MacroBuilder &Builder) const override {
7448 DefineStd(Builder, "bpf", Opts);
7449 Builder.defineMacro("__BPF__");
7450 }
7451 bool hasFeature(StringRef Feature) const override {
7452 return Feature == "bpf";
7453 }
7454
Craig Topper6c03a542015-10-19 04:51:35 +00007455 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007456 const char *getClobbers() const override {
7457 return "";
7458 }
7459 BuiltinVaListKind getBuiltinVaListKind() const override {
7460 return TargetInfo::VoidPtrBuiltinVaList;
7461 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007462 ArrayRef<const char *> getGCCRegNames() const override {
7463 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007464 }
7465 bool validateAsmConstraint(const char *&Name,
7466 TargetInfo::ConstraintInfo &info) const override {
7467 return true;
7468 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007469 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7470 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007471 }
7472};
7473
Daniel Sanders4672af62016-05-27 11:51:02 +00007474class MipsTargetInfo : public TargetInfo {
7475 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007476 StringRef Layout;
7477
7478 if (ABI == "o32")
7479 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7480 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007481 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007482 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007483 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007484 else
7485 llvm_unreachable("Invalid ABI");
7486
7487 if (BigEndian)
7488 resetDataLayout(("E-" + Layout).str());
7489 else
7490 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007491 }
7492
Akira Hatanaka9064e362013-10-29 18:30:33 +00007493
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007494 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007495 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007496 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007497 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007498 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007499 bool IsSingleFloat;
Simon Dardisdf827a72017-02-21 16:01:00 +00007500 bool IsNoABICalls;
7501 bool CanUseBSDABICalls;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007502 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007503 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007504 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007505 enum DspRevEnum {
7506 NoDSP, DSP1, DSP2
7507 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007508 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007509
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007510protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007511 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007512 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007513
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007514public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007515 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007516 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
Simon Dardisdf827a72017-02-21 16:01:00 +00007517 IsNan2008(false), IsSingleFloat(false), IsNoABICalls(false),
7518 CanUseBSDABICalls(false), FloatABI(HardFloat), DspRev(NoDSP),
7519 HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007520 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007521
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007522 setABI((getTriple().getArch() == llvm::Triple::mips ||
7523 getTriple().getArch() == llvm::Triple::mipsel)
7524 ? "o32"
7525 : "n64");
7526
7527 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Simon Dardisdf827a72017-02-21 16:01:00 +00007528
7529 CanUseBSDABICalls = Triple.getOS() == llvm::Triple::FreeBSD ||
7530 Triple.getOS() == llvm::Triple::OpenBSD;
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007531 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007532
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007533 bool isNaN2008Default() const {
7534 return CPU == "mips32r6" || CPU == "mips64r6";
7535 }
7536
7537 bool isFP64Default() const {
7538 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7539 }
7540
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007541 bool isNan2008() const override {
7542 return IsNan2008;
7543 }
7544
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007545 bool processorSupportsGPR64() const {
7546 return llvm::StringSwitch<bool>(CPU)
7547 .Case("mips3", true)
7548 .Case("mips4", true)
7549 .Case("mips5", true)
7550 .Case("mips64", true)
7551 .Case("mips64r2", true)
7552 .Case("mips64r3", true)
7553 .Case("mips64r5", true)
7554 .Case("mips64r6", true)
7555 .Case("octeon", true)
7556 .Default(false);
7557 return false;
7558 }
7559
Alp Toker4925ba72014-06-07 23:30:42 +00007560 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007561 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007562 if (Name == "o32") {
7563 setO32ABITypes();
7564 ABI = Name;
7565 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007566 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007567
7568 if (Name == "n32") {
7569 setN32ABITypes();
7570 ABI = Name;
7571 return true;
7572 }
7573 if (Name == "n64") {
7574 setN64ABITypes();
7575 ABI = Name;
7576 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007577 }
7578 return false;
7579 }
7580
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007581 void setO32ABITypes() {
7582 Int64Type = SignedLongLong;
7583 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007584 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007585 LongDoubleWidth = LongDoubleAlign = 64;
7586 LongWidth = LongAlign = 32;
7587 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7588 PointerWidth = PointerAlign = 32;
7589 PtrDiffType = SignedInt;
7590 SizeType = UnsignedInt;
7591 SuitableAlign = 64;
7592 }
7593
7594 void setN32N64ABITypes() {
7595 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007596 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007597 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7598 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007599 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007600 }
7601 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7602 SuitableAlign = 128;
7603 }
7604
Daniel Sanders4672af62016-05-27 11:51:02 +00007605 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007606 setN32N64ABITypes();
Brad Smith8e55bd52017-03-06 23:48:31 +00007607 if (getTriple().getOS() == llvm::Triple::OpenBSD) {
7608 Int64Type = SignedLongLong;
7609 } else {
7610 Int64Type = SignedLong;
7611 }
Daniel Sanders4672af62016-05-27 11:51:02 +00007612 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007613 LongWidth = LongAlign = 64;
7614 PointerWidth = PointerAlign = 64;
7615 PtrDiffType = SignedLong;
7616 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007617 }
7618
7619 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007620 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007621 Int64Type = SignedLongLong;
7622 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007623 LongWidth = LongAlign = 32;
7624 PointerWidth = PointerAlign = 32;
7625 PtrDiffType = SignedInt;
7626 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007627 }
7628
Craig Topper3164f332014-03-11 03:39:26 +00007629 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007630 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007631 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007632 .Case("mips1", true)
7633 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007634 .Case("mips3", true)
7635 .Case("mips4", true)
7636 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007637 .Case("mips32", true)
7638 .Case("mips32r2", true)
7639 .Case("mips32r3", true)
7640 .Case("mips32r5", true)
7641 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007642 .Case("mips64", true)
7643 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007644 .Case("mips64r3", true)
7645 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007646 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007647 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007648 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007649 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007650 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007651 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007652 bool
7653 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7654 StringRef CPU,
7655 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007656 if (CPU.empty())
7657 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007658 if (CPU == "octeon")
7659 Features["mips64r2"] = Features["cnmips"] = true;
7660 else
7661 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007662 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007663 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007664
Craig Topper3164f332014-03-11 03:39:26 +00007665 void getTargetDefines(const LangOptions &Opts,
7666 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007667 if (BigEndian) {
7668 DefineStd(Builder, "MIPSEB", Opts);
7669 Builder.defineMacro("_MIPSEB");
7670 } else {
7671 DefineStd(Builder, "MIPSEL", Opts);
7672 Builder.defineMacro("_MIPSEL");
7673 }
7674
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007675 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007676 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007677 if (Opts.GNUMode)
7678 Builder.defineMacro("mips");
7679
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007680 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007681 Builder.defineMacro("__mips", "32");
7682 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7683 } else {
7684 Builder.defineMacro("__mips", "64");
7685 Builder.defineMacro("__mips64");
7686 Builder.defineMacro("__mips64__");
7687 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7688 }
7689
7690 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7691 .Cases("mips32", "mips64", "1")
7692 .Cases("mips32r2", "mips64r2", "2")
7693 .Cases("mips32r3", "mips64r3", "3")
7694 .Cases("mips32r5", "mips64r5", "5")
7695 .Cases("mips32r6", "mips64r6", "6")
7696 .Default("");
7697 if (!ISARev.empty())
7698 Builder.defineMacro("__mips_isa_rev", ISARev);
7699
7700 if (ABI == "o32") {
7701 Builder.defineMacro("__mips_o32");
7702 Builder.defineMacro("_ABIO32", "1");
7703 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007704 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007705 Builder.defineMacro("__mips_n32");
7706 Builder.defineMacro("_ABIN32", "2");
7707 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7708 } else if (ABI == "n64") {
7709 Builder.defineMacro("__mips_n64");
7710 Builder.defineMacro("_ABI64", "3");
7711 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7712 } else
7713 llvm_unreachable("Invalid ABI.");
7714
Simon Dardisdf827a72017-02-21 16:01:00 +00007715 if (!IsNoABICalls) {
7716 Builder.defineMacro("__mips_abicalls");
7717 if (CanUseBSDABICalls)
7718 Builder.defineMacro("__ABICALLS__");
7719 }
7720
Simon Atanasyan683535b2012-08-29 19:14:58 +00007721 Builder.defineMacro("__REGISTER_PREFIX__", "");
7722
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007723 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007724 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007725 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007726 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007727 case SoftFloat:
7728 Builder.defineMacro("__mips_soft_float", Twine(1));
7729 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007730 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007731
Simon Atanasyan16071912013-04-14 14:07:30 +00007732 if (IsSingleFloat)
7733 Builder.defineMacro("__mips_single_float", Twine(1));
7734
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007735 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7736 Builder.defineMacro("_MIPS_FPSET",
7737 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7738
Simon Atanasyan72244b62012-07-05 16:06:06 +00007739 if (IsMips16)
7740 Builder.defineMacro("__mips16", Twine(1));
7741
Simon Atanasyan60777612013-04-14 14:07:51 +00007742 if (IsMicromips)
7743 Builder.defineMacro("__mips_micromips", Twine(1));
7744
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007745 if (IsNan2008)
7746 Builder.defineMacro("__mips_nan2008", Twine(1));
7747
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007748 switch (DspRev) {
7749 default:
7750 break;
7751 case DSP1:
7752 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7753 Builder.defineMacro("__mips_dsp", Twine(1));
7754 break;
7755 case DSP2:
7756 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7757 Builder.defineMacro("__mips_dspr2", Twine(1));
7758 Builder.defineMacro("__mips_dsp", Twine(1));
7759 break;
7760 }
7761
Jack Carter44ff1e52013-08-12 17:20:29 +00007762 if (HasMSA)
7763 Builder.defineMacro("__mips_msa", Twine(1));
7764
Simon Atanasyan26f19672012-04-05 19:28:31 +00007765 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7766 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7767 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007768
7769 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7770 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007771
7772 // These shouldn't be defined for MIPS-I but there's no need to check
7773 // for that since MIPS-I isn't supported.
7774 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7775 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7776 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007777
7778 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7779 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7780 // the instructions exist but using them violates the ABI since they
7781 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7782 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007783 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007784 }
7785
Craig Topper6c03a542015-10-19 04:51:35 +00007786 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7787 return llvm::makeArrayRef(BuiltinInfo,
7788 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007789 }
Craig Topper3164f332014-03-11 03:39:26 +00007790 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007791 return llvm::StringSwitch<bool>(Feature)
7792 .Case("mips", true)
7793 .Case("fp64", HasFP64)
7794 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007795 }
Craig Topper3164f332014-03-11 03:39:26 +00007796 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007797 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007798 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007799 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007800 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007801 // CPU register names
7802 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007803 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7804 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7805 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007806 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7807 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007808 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7809 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7810 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7811 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007812 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007813 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007814 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7815 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007816 // MSA register names
7817 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7818 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7819 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7820 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7821 // MSA control register names
7822 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7823 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007824 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007825 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007826 }
Craig Topper3164f332014-03-11 03:39:26 +00007827 bool validateAsmConstraint(const char *&Name,
7828 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007829 switch (*Name) {
7830 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007831 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007832 case 'r': // CPU registers.
7833 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007834 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007835 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007836 case 'c': // $25 for indirect jumps
7837 case 'l': // lo register
7838 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007839 Info.setAllowsRegister();
7840 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007841 case 'I': // Signed 16-bit constant
7842 case 'J': // Integer 0
7843 case 'K': // Unsigned 16-bit constant
7844 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7845 case 'M': // Constants not loadable via lui, addiu, or ori
7846 case 'N': // Constant -1 to -65535
7847 case 'O': // A signed 15-bit constant
7848 case 'P': // A constant between 1 go 65535
7849 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007850 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007851 Info.setAllowsMemory();
7852 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007853 case 'Z':
7854 if (Name[1] == 'C') { // An address usable by ll, and sc.
7855 Info.setAllowsMemory();
7856 Name++; // Skip over 'Z'.
7857 return true;
7858 }
7859 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007860 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007861 }
7862
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007863 std::string convertConstraint(const char *&Constraint) const override {
7864 std::string R;
7865 switch (*Constraint) {
7866 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7867 if (Constraint[1] == 'C') {
7868 R = std::string("^") + std::string(Constraint, 2);
7869 Constraint++;
7870 return R;
7871 }
7872 break;
7873 }
7874 return TargetInfo::convertConstraint(Constraint);
7875 }
7876
Craig Topper3164f332014-03-11 03:39:26 +00007877 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007878 // In GCC, $1 is not widely used in generated code (it's used only in a few
7879 // specific situations), so there is no real need for users to add it to
7880 // the clobbers list if they want to use it in their inline assembly code.
7881 //
7882 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7883 // code generation, so using it in inline assembly without adding it to the
7884 // clobbers list can cause conflicts between the inline assembly code and
7885 // the surrounding generated code.
7886 //
7887 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7888 // operands, which will conflict with the ".set at" assembler option (which
7889 // we use only for inline assembly, in order to maintain compatibility with
7890 // GCC) and will also conflict with the user's usage of $1.
7891 //
7892 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7893 // register for generated code is to automatically clobber $1 for all inline
7894 // assembly code.
7895 //
7896 // FIXME: We should automatically clobber $1 only for inline assembly code
7897 // which actually uses it. This would allow LLVM to use $1 for inline
7898 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007899 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007900 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007901
Craig Topper3164f332014-03-11 03:39:26 +00007902 bool handleTargetFeatures(std::vector<std::string> &Features,
7903 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007904 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007905 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007906 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007907 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007908 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007909 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007910 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007911
Eric Christopher610fe112015-08-26 08:21:55 +00007912 for (const auto &Feature : Features) {
7913 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007914 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007915 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007916 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007917 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007918 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007919 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007920 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007921 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007922 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007923 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007924 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007925 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007926 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007927 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007928 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007929 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007930 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007931 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007932 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007933 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007934 IsNan2008 = false;
Simon Dardisdf827a72017-02-21 16:01:00 +00007935 else if (Feature == "+noabicalls")
7936 IsNoABICalls = true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007937 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007938
James Y Knightb214cbc2016-03-04 19:00:41 +00007939 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007940
Rafael Espindolaeb265472013-08-21 21:59:03 +00007941 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007942 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007943
Craig Topper3164f332014-03-11 03:39:26 +00007944 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007945 if (RegNo == 0) return 4;
7946 if (RegNo == 1) return 5;
7947 return -1;
7948 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007949
7950 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007951
7952 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7953 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7954 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7955 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7956 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7957 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7958 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7959 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7960 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7961 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7962 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7963 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7964 {{"ra"}, "$31"}};
7965 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7966 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7967 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7968 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7969 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7970 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7971 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7972 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7973 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7974 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7975 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7976 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007977 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007978 return llvm::makeArrayRef(O32RegAliases);
7979 return llvm::makeArrayRef(NewABIRegAliases);
7980 }
7981
7982 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007983 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007984 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007985
7986 bool validateTarget(DiagnosticsEngine &Diags) const override {
7987 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7988 // this yet. It's better to fail here than on the backend assertion.
7989 if (processorSupportsGPR64() && ABI == "o32") {
7990 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7991 return false;
7992 }
7993
7994 // 64-bit ABI's require 64-bit CPU's.
7995 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7996 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7997 return false;
7998 }
7999
8000 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
8001 // can't handle this yet. It's better to fail here than on the
8002 // backend assertion.
8003 if ((getTriple().getArch() == llvm::Triple::mips64 ||
8004 getTriple().getArch() == llvm::Triple::mips64el) &&
8005 ABI == "o32") {
8006 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8007 << ABI << getTriple().str();
8008 return false;
8009 }
8010
8011 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
8012 // can't handle this yet. It's better to fail here than on the
8013 // backend assertion.
8014 if ((getTriple().getArch() == llvm::Triple::mips ||
8015 getTriple().getArch() == llvm::Triple::mipsel) &&
8016 (ABI == "n32" || ABI == "n64")) {
8017 Diags.Report(diag::err_target_unsupported_abi_for_triple)
8018 << ABI << getTriple().str();
8019 return false;
8020 }
8021
8022 return true;
8023 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008024};
8025
Daniel Sanders4672af62016-05-27 11:51:02 +00008026const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008027#define BUILTIN(ID, TYPE, ATTRS) \
8028 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8029#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8030 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00008031#include "clang/Basic/BuiltinsMips.def"
8032};
8033
Ivan Krasindd7403e2011-08-24 20:22:22 +00008034class PNaClTargetInfo : public TargetInfo {
8035public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008036 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8037 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008038 this->LongAlign = 32;
8039 this->LongWidth = 32;
8040 this->PointerAlign = 32;
8041 this->PointerWidth = 32;
8042 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008043 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008044 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008045 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00008046 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00008047 this->SizeType = TargetInfo::UnsignedInt;
8048 this->PtrDiffType = TargetInfo::SignedInt;
8049 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00008050 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008051 }
8052
Craig Toppere6f17d02014-03-11 04:07:52 +00008053 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008054 Builder.defineMacro("__le32__");
8055 Builder.defineMacro("__pnacl__");
8056 }
Craig Topper3164f332014-03-11 03:39:26 +00008057 void getTargetDefines(const LangOptions &Opts,
8058 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008059 getArchDefines(Opts, Builder);
8060 }
Craig Topper3164f332014-03-11 03:39:26 +00008061 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008062 return Feature == "pnacl";
8063 }
Craig Topper6c03a542015-10-19 04:51:35 +00008064 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008065 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008066 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008067 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008068 ArrayRef<const char *> getGCCRegNames() const override;
8069 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008070 bool validateAsmConstraint(const char *&Name,
8071 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008072 return false;
8073 }
8074
Craig Topper3164f332014-03-11 03:39:26 +00008075 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008076 return "";
8077 }
8078};
8079
Craig Topperf054e3a2015-10-19 03:52:27 +00008080ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8081 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008082}
8083
Craig Topperf054e3a2015-10-19 03:52:27 +00008084ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8085 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008086}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008087
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008088// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008089class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008090public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008091 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8092 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008093
8094 BuiltinVaListKind getBuiltinVaListKind() const override {
8095 return TargetInfo::PNaClABIBuiltinVaList;
8096 }
8097};
8098
JF Bastien643817d2014-09-12 17:52:47 +00008099class Le64TargetInfo : public TargetInfo {
8100 static const Builtin::Info BuiltinInfo[];
8101
8102public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008103 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8104 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008105 NoAsmVariants = true;
8106 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8107 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008108 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008109 }
8110
8111 void getTargetDefines(const LangOptions &Opts,
8112 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008113 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008114 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8115 Builder.defineMacro("__ELF__");
8116 }
Craig Topper6c03a542015-10-19 04:51:35 +00008117 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8118 return llvm::makeArrayRef(BuiltinInfo,
8119 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008120 }
8121 BuiltinVaListKind getBuiltinVaListKind() const override {
8122 return TargetInfo::PNaClABIBuiltinVaList;
8123 }
8124 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008125 ArrayRef<const char *> getGCCRegNames() const override {
8126 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008127 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008128 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8129 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008130 }
8131 bool validateAsmConstraint(const char *&Name,
8132 TargetInfo::ConstraintInfo &Info) const override {
8133 return false;
8134 }
8135
8136 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008137};
Dan Gohmanc2853072015-09-03 22:51:53 +00008138
8139class WebAssemblyTargetInfo : public TargetInfo {
8140 static const Builtin::Info BuiltinInfo[];
8141
8142 enum SIMDEnum {
8143 NoSIMD,
8144 SIMD128,
8145 } SIMDLevel;
8146
8147public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008149 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008150 NoAsmVariants = true;
8151 SuitableAlign = 128;
8152 LargeArrayMinWidth = 128;
8153 LargeArrayAlign = 128;
8154 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008155 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008156 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008157 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008158 SizeType = UnsignedInt;
8159 PtrDiffType = SignedInt;
8160 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008161 }
8162
8163protected:
8164 void getTargetDefines(const LangOptions &Opts,
8165 MacroBuilder &Builder) const override {
8166 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8167 if (SIMDLevel >= SIMD128)
8168 Builder.defineMacro("__wasm_simd128__");
8169 }
8170
8171private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008172 bool
8173 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8174 StringRef CPU,
8175 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008176 if (CPU == "bleeding-edge")
8177 Features["simd128"] = true;
8178 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8179 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008180 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008181 return llvm::StringSwitch<bool>(Feature)
8182 .Case("simd128", SIMDLevel >= SIMD128)
8183 .Default(false);
8184 }
8185 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008186 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008187 for (const auto &Feature : Features) {
8188 if (Feature == "+simd128") {
8189 SIMDLevel = std::max(SIMDLevel, SIMD128);
8190 continue;
8191 }
8192 if (Feature == "-simd128") {
8193 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8194 continue;
8195 }
8196
8197 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8198 << "-target-feature";
8199 return false;
8200 }
8201 return true;
8202 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008203 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008204 return llvm::StringSwitch<bool>(Name)
8205 .Case("mvp", true)
8206 .Case("bleeding-edge", true)
8207 .Case("generic", true)
8208 .Default(false);
8209 }
Craig Topper6c03a542015-10-19 04:51:35 +00008210 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8211 return llvm::makeArrayRef(BuiltinInfo,
8212 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008213 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008214 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008215 return VoidPtrBuiltinVaList;
8216 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008217 ArrayRef<const char *> getGCCRegNames() const final {
8218 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008219 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008220 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8221 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008222 }
8223 bool
8224 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008225 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008226 return false;
8227 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008228 const char *getClobbers() const final { return ""; }
8229 bool isCLZForZeroUndef() const final { return false; }
8230 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008231 IntType getIntTypeByWidth(unsigned BitWidth,
8232 bool IsSigned) const final {
8233 // WebAssembly prefers long long for explicitly 64-bit integers.
8234 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8235 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8236 }
8237 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8238 bool IsSigned) const final {
8239 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8240 return BitWidth == 64
8241 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8242 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8243 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008244};
8245
8246const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8247#define BUILTIN(ID, TYPE, ATTRS) \
8248 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8249#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8250 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8251#include "clang/Basic/BuiltinsWebAssembly.def"
8252};
8253
8254class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8255public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8257 const TargetOptions &Opts)
8258 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008259 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008260 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008261 }
8262
8263protected:
8264 void getTargetDefines(const LangOptions &Opts,
8265 MacroBuilder &Builder) const override {
8266 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8267 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8268 }
8269};
8270
8271class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8272public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8274 const TargetOptions &Opts)
8275 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008276 LongAlign = LongWidth = 64;
8277 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008278 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008279 SizeType = UnsignedLong;
8280 PtrDiffType = SignedLong;
8281 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008282 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008283 }
8284
8285protected:
8286 void getTargetDefines(const LangOptions &Opts,
8287 MacroBuilder &Builder) const override {
8288 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8289 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8290 }
8291};
8292
JF Bastien643817d2014-09-12 17:52:47 +00008293const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8294#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008295 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008296#include "clang/Basic/BuiltinsLe64.def"
8297};
8298
Eric Christopherc48497a2015-09-18 21:26:24 +00008299static const unsigned SPIRAddrSpaceMap[] = {
8300 1, // opencl_global
8301 3, // opencl_local
8302 2, // opencl_constant
8303 4, // opencl_generic
8304 0, // cuda_device
8305 0, // cuda_constant
8306 0 // cuda_shared
8307};
8308class SPIRTargetInfo : public TargetInfo {
8309public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8311 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008312 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8313 "SPIR target must use unknown OS");
8314 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8315 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008316 TLSSupported = false;
8317 LongWidth = LongAlign = 64;
8318 AddrSpaceMap = &SPIRAddrSpaceMap;
8319 UseAddrSpaceMapMangling = true;
8320 // Define available target features
8321 // These must be defined in sorted order!
8322 NoAsmVariants = true;
8323 }
8324 void getTargetDefines(const LangOptions &Opts,
8325 MacroBuilder &Builder) const override {
8326 DefineStd(Builder, "SPIR", Opts);
8327 }
8328 bool hasFeature(StringRef Feature) const override {
8329 return Feature == "spir";
8330 }
Craig Topper3164f332014-03-11 03:39:26 +00008331
Craig Topper6c03a542015-10-19 04:51:35 +00008332 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008333 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008334 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008335 bool validateAsmConstraint(const char *&Name,
8336 TargetInfo::ConstraintInfo &info) const override {
8337 return true;
8338 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008339 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8340 return None;
8341 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008342 BuiltinVaListKind getBuiltinVaListKind() const override {
8343 return TargetInfo::VoidPtrBuiltinVaList;
8344 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008345
Eric Christopherc48497a2015-09-18 21:26:24 +00008346 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008347 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8348 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008349 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008350
Eric Christopherc48497a2015-09-18 21:26:24 +00008351 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8352 return CC_SpirFunction;
8353 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008354
8355 void setSupportedOpenCLOpts() override {
8356 // Assume all OpenCL extensions and optional core features are supported
8357 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008358 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008359 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008360};
Guy Benyeib798fc92012-12-11 21:38:14 +00008361
Eric Christopherc48497a2015-09-18 21:26:24 +00008362class SPIR32TargetInfo : public SPIRTargetInfo {
8363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008364 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8365 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008366 PointerWidth = PointerAlign = 32;
8367 SizeType = TargetInfo::UnsignedInt;
8368 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008369 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8370 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008371 }
8372 void getTargetDefines(const LangOptions &Opts,
8373 MacroBuilder &Builder) const override {
8374 DefineStd(Builder, "SPIR32", Opts);
8375 }
8376};
Guy Benyeib798fc92012-12-11 21:38:14 +00008377
Eric Christopherc48497a2015-09-18 21:26:24 +00008378class SPIR64TargetInfo : public SPIRTargetInfo {
8379public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8381 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008382 PointerWidth = PointerAlign = 64;
8383 SizeType = TargetInfo::UnsignedLong;
8384 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008385 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8386 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008387 }
8388 void getTargetDefines(const LangOptions &Opts,
8389 MacroBuilder &Builder) const override {
8390 DefineStd(Builder, "SPIR64", Opts);
8391 }
8392};
Guy Benyeib798fc92012-12-11 21:38:14 +00008393
Robert Lytton0e076492013-08-13 09:43:10 +00008394class XCoreTargetInfo : public TargetInfo {
8395 static const Builtin::Info BuiltinInfo[];
8396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8398 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008399 NoAsmVariants = true;
8400 LongLongAlign = 32;
8401 SuitableAlign = 32;
8402 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008403 SizeType = UnsignedInt;
8404 PtrDiffType = SignedInt;
8405 IntPtrType = SignedInt;
8406 WCharType = UnsignedChar;
8407 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008408 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008409 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8410 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008411 }
Craig Topper3164f332014-03-11 03:39:26 +00008412 void getTargetDefines(const LangOptions &Opts,
8413 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008414 Builder.defineMacro("__XS1B__");
8415 }
Craig Topper6c03a542015-10-19 04:51:35 +00008416 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8417 return llvm::makeArrayRef(BuiltinInfo,
8418 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008419 }
Craig Topper3164f332014-03-11 03:39:26 +00008420 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008421 return TargetInfo::VoidPtrBuiltinVaList;
8422 }
Craig Topper3164f332014-03-11 03:39:26 +00008423 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008424 return "";
8425 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008426 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008427 static const char * const GCCRegNames[] = {
8428 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8429 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8430 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008431 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008432 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008433 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8434 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008435 }
Craig Topper3164f332014-03-11 03:39:26 +00008436 bool validateAsmConstraint(const char *&Name,
8437 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008438 return false;
8439 }
Craig Topper3164f332014-03-11 03:39:26 +00008440 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008441 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8442 return (RegNo < 2)? RegNo : -1;
8443 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008444 bool allowsLargerPreferedTypeAlignment() const override {
8445 return false;
8446 }
Robert Lytton0e076492013-08-13 09:43:10 +00008447};
8448
8449const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008450#define BUILTIN(ID, TYPE, ATTRS) \
8451 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8452#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8453 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008454#include "clang/Basic/BuiltinsXCore.def"
8455};
Robert Lytton0e076492013-08-13 09:43:10 +00008456
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008457// x86_32 Android target
8458class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8459public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8461 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008462 SuitableAlign = 32;
8463 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008464 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008465 }
8466};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008467
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008468// x86_64 Android target
8469class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8470public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8472 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008473 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008474 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008475
8476 bool useFloat128ManglingForLongDouble() const override {
8477 return true;
8478 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008479};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008480
8481// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8482class RenderScript32TargetInfo : public ARMleTargetInfo {
8483public:
8484 RenderScript32TargetInfo(const llvm::Triple &Triple,
8485 const TargetOptions &Opts)
8486 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8487 Triple.getOSName(),
8488 Triple.getEnvironmentName()),
8489 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008490 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008491 LongWidth = LongAlign = 64;
8492 }
8493 void getTargetDefines(const LangOptions &Opts,
8494 MacroBuilder &Builder) const override {
8495 Builder.defineMacro("__RENDERSCRIPT__");
8496 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8497 }
8498};
8499
8500// 64-bit RenderScript is aarch64
8501class RenderScript64TargetInfo : public AArch64leTargetInfo {
8502public:
8503 RenderScript64TargetInfo(const llvm::Triple &Triple,
8504 const TargetOptions &Opts)
8505 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8506 Triple.getOSName(),
8507 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008508 Opts) {
8509 IsRenderScriptTarget = true;
8510 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008511
8512 void getTargetDefines(const LangOptions &Opts,
8513 MacroBuilder &Builder) const override {
8514 Builder.defineMacro("__RENDERSCRIPT__");
8515 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8516 }
8517};
8518
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008519/// Information about a specific microcontroller.
8520struct MCUInfo {
8521 const char *Name;
8522 const char *DefineName;
8523};
8524
8525// This list should be kept up-to-date with AVRDevices.td in LLVM.
8526static ArrayRef<MCUInfo> AVRMcus = {
8527 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008528 { "attiny11", "__AVR_ATtiny11__" },
8529 { "attiny12", "__AVR_ATtiny12__" },
8530 { "attiny15", "__AVR_ATtiny15__" },
8531 { "attiny28", "__AVR_ATtiny28__" },
8532 { "at90s2313", "__AVR_AT90S2313__" },
8533 { "at90s2323", "__AVR_AT90S2323__" },
8534 { "at90s2333", "__AVR_AT90S2333__" },
8535 { "at90s2343", "__AVR_AT90S2343__" },
8536 { "attiny22", "__AVR_ATtiny22__" },
8537 { "attiny26", "__AVR_ATtiny26__" },
8538 { "at86rf401", "__AVR_AT86RF401__" },
8539 { "at90s4414", "__AVR_AT90S4414__" },
8540 { "at90s4433", "__AVR_AT90S4433__" },
8541 { "at90s4434", "__AVR_AT90S4434__" },
8542 { "at90s8515", "__AVR_AT90S8515__" },
8543 { "at90c8534", "__AVR_AT90c8534__" },
8544 { "at90s8535", "__AVR_AT90S8535__" },
8545 { "ata5272", "__AVR_ATA5272__" },
8546 { "attiny13", "__AVR_ATtiny13__" },
8547 { "attiny13a", "__AVR_ATtiny13A__" },
8548 { "attiny2313", "__AVR_ATtiny2313__" },
8549 { "attiny2313a", "__AVR_ATtiny2313A__" },
8550 { "attiny24", "__AVR_ATtiny24__" },
8551 { "attiny24a", "__AVR_ATtiny24A__" },
8552 { "attiny4313", "__AVR_ATtiny4313__" },
8553 { "attiny44", "__AVR_ATtiny44__" },
8554 { "attiny44a", "__AVR_ATtiny44A__" },
8555 { "attiny84", "__AVR_ATtiny84__" },
8556 { "attiny84a", "__AVR_ATtiny84A__" },
8557 { "attiny25", "__AVR_ATtiny25__" },
8558 { "attiny45", "__AVR_ATtiny45__" },
8559 { "attiny85", "__AVR_ATtiny85__" },
8560 { "attiny261", "__AVR_ATtiny261__" },
8561 { "attiny261a", "__AVR_ATtiny261A__" },
8562 { "attiny461", "__AVR_ATtiny461__" },
8563 { "attiny461a", "__AVR_ATtiny461A__" },
8564 { "attiny861", "__AVR_ATtiny861__" },
8565 { "attiny861a", "__AVR_ATtiny861A__" },
8566 { "attiny87", "__AVR_ATtiny87__" },
8567 { "attiny43u", "__AVR_ATtiny43U__" },
8568 { "attiny48", "__AVR_ATtiny48__" },
8569 { "attiny88", "__AVR_ATtiny88__" },
8570 { "attiny828", "__AVR_ATtiny828__" },
8571 { "at43usb355", "__AVR_AT43USB355__" },
8572 { "at76c711", "__AVR_AT76C711__" },
8573 { "atmega103", "__AVR_ATmega103__" },
8574 { "at43usb320", "__AVR_AT43USB320__" },
8575 { "attiny167", "__AVR_ATtiny167__" },
8576 { "at90usb82", "__AVR_AT90USB82__" },
8577 { "at90usb162", "__AVR_AT90USB162__" },
8578 { "ata5505", "__AVR_ATA5505__" },
8579 { "atmega8u2", "__AVR_ATmega8U2__" },
8580 { "atmega16u2", "__AVR_ATmega16U2__" },
8581 { "atmega32u2", "__AVR_ATmega32U2__" },
8582 { "attiny1634", "__AVR_ATtiny1634__" },
8583 { "atmega8", "__AVR_ATmega8__" },
8584 { "ata6289", "__AVR_ATA6289__" },
8585 { "atmega8a", "__AVR_ATmega8A__" },
8586 { "ata6285", "__AVR_ATA6285__" },
8587 { "ata6286", "__AVR_ATA6286__" },
8588 { "atmega48", "__AVR_ATmega48__" },
8589 { "atmega48a", "__AVR_ATmega48A__" },
8590 { "atmega48pa", "__AVR_ATmega48PA__" },
8591 { "atmega48p", "__AVR_ATmega48P__" },
8592 { "atmega88", "__AVR_ATmega88__" },
8593 { "atmega88a", "__AVR_ATmega88A__" },
8594 { "atmega88p", "__AVR_ATmega88P__" },
8595 { "atmega88pa", "__AVR_ATmega88PA__" },
8596 { "atmega8515", "__AVR_ATmega8515__" },
8597 { "atmega8535", "__AVR_ATmega8535__" },
8598 { "atmega8hva", "__AVR_ATmega8HVA__" },
8599 { "at90pwm1", "__AVR_AT90PWM1__" },
8600 { "at90pwm2", "__AVR_AT90PWM2__" },
8601 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8602 { "at90pwm3", "__AVR_AT90PWM3__" },
8603 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8604 { "at90pwm81", "__AVR_AT90PWM81__" },
8605 { "ata5790", "__AVR_ATA5790__" },
8606 { "ata5795", "__AVR_ATA5795__" },
8607 { "atmega16", "__AVR_ATmega16__" },
8608 { "atmega16a", "__AVR_ATmega16A__" },
8609 { "atmega161", "__AVR_ATmega161__" },
8610 { "atmega162", "__AVR_ATmega162__" },
8611 { "atmega163", "__AVR_ATmega163__" },
8612 { "atmega164a", "__AVR_ATmega164A__" },
8613 { "atmega164p", "__AVR_ATmega164P__" },
8614 { "atmega164pa", "__AVR_ATmega164PA__" },
8615 { "atmega165", "__AVR_ATmega165__" },
8616 { "atmega165a", "__AVR_ATmega165A__" },
8617 { "atmega165p", "__AVR_ATmega165P__" },
8618 { "atmega165pa", "__AVR_ATmega165PA__" },
8619 { "atmega168", "__AVR_ATmega168__" },
8620 { "atmega168a", "__AVR_ATmega168A__" },
8621 { "atmega168p", "__AVR_ATmega168P__" },
8622 { "atmega168pa", "__AVR_ATmega168PA__" },
8623 { "atmega169", "__AVR_ATmega169__" },
8624 { "atmega169a", "__AVR_ATmega169A__" },
8625 { "atmega169p", "__AVR_ATmega169P__" },
8626 { "atmega169pa", "__AVR_ATmega169PA__" },
8627 { "atmega32", "__AVR_ATmega32__" },
8628 { "atmega32a", "__AVR_ATmega32A__" },
8629 { "atmega323", "__AVR_ATmega323__" },
8630 { "atmega324a", "__AVR_ATmega324A__" },
8631 { "atmega324p", "__AVR_ATmega324P__" },
8632 { "atmega324pa", "__AVR_ATmega324PA__" },
8633 { "atmega325", "__AVR_ATmega325__" },
8634 { "atmega325a", "__AVR_ATmega325A__" },
8635 { "atmega325p", "__AVR_ATmega325P__" },
8636 { "atmega325pa", "__AVR_ATmega325PA__" },
8637 { "atmega3250", "__AVR_ATmega3250__" },
8638 { "atmega3250a", "__AVR_ATmega3250A__" },
8639 { "atmega3250p", "__AVR_ATmega3250P__" },
8640 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8641 { "atmega328", "__AVR_ATmega328__" },
8642 { "atmega328p", "__AVR_ATmega328P__" },
8643 { "atmega329", "__AVR_ATmega329__" },
8644 { "atmega329a", "__AVR_ATmega329A__" },
8645 { "atmega329p", "__AVR_ATmega329P__" },
8646 { "atmega329pa", "__AVR_ATmega329PA__" },
8647 { "atmega3290", "__AVR_ATmega3290__" },
8648 { "atmega3290a", "__AVR_ATmega3290A__" },
8649 { "atmega3290p", "__AVR_ATmega3290P__" },
8650 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8651 { "atmega406", "__AVR_ATmega406__" },
8652 { "atmega64", "__AVR_ATmega64__" },
8653 { "atmega64a", "__AVR_ATmega64A__" },
8654 { "atmega640", "__AVR_ATmega640__" },
8655 { "atmega644", "__AVR_ATmega644__" },
8656 { "atmega644a", "__AVR_ATmega644A__" },
8657 { "atmega644p", "__AVR_ATmega644P__" },
8658 { "atmega644pa", "__AVR_ATmega644PA__" },
8659 { "atmega645", "__AVR_ATmega645__" },
8660 { "atmega645a", "__AVR_ATmega645A__" },
8661 { "atmega645p", "__AVR_ATmega645P__" },
8662 { "atmega649", "__AVR_ATmega649__" },
8663 { "atmega649a", "__AVR_ATmega649A__" },
8664 { "atmega649p", "__AVR_ATmega649P__" },
8665 { "atmega6450", "__AVR_ATmega6450__" },
8666 { "atmega6450a", "__AVR_ATmega6450A__" },
8667 { "atmega6450p", "__AVR_ATmega6450P__" },
8668 { "atmega6490", "__AVR_ATmega6490__" },
8669 { "atmega6490a", "__AVR_ATmega6490A__" },
8670 { "atmega6490p", "__AVR_ATmega6490P__" },
8671 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8672 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8673 { "atmega16hva", "__AVR_ATmega16HVA__" },
8674 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8675 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8676 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8677 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8678 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8679 { "atmega64hve", "__AVR_ATmega64HVE__" },
8680 { "at90can32", "__AVR_AT90CAN32__" },
8681 { "at90can64", "__AVR_AT90CAN64__" },
8682 { "at90pwm161", "__AVR_AT90PWM161__" },
8683 { "at90pwm216", "__AVR_AT90PWM216__" },
8684 { "at90pwm316", "__AVR_AT90PWM316__" },
8685 { "atmega32c1", "__AVR_ATmega32C1__" },
8686 { "atmega64c1", "__AVR_ATmega64C1__" },
8687 { "atmega16m1", "__AVR_ATmega16M1__" },
8688 { "atmega32m1", "__AVR_ATmega32M1__" },
8689 { "atmega64m1", "__AVR_ATmega64M1__" },
8690 { "atmega16u4", "__AVR_ATmega16U4__" },
8691 { "atmega32u4", "__AVR_ATmega32U4__" },
8692 { "atmega32u6", "__AVR_ATmega32U6__" },
8693 { "at90usb646", "__AVR_AT90USB646__" },
8694 { "at90usb647", "__AVR_AT90USB647__" },
8695 { "at90scr100", "__AVR_AT90SCR100__" },
8696 { "at94k", "__AVR_AT94K__" },
8697 { "m3000", "__AVR_AT000__" },
8698 { "atmega128", "__AVR_ATmega128__" },
8699 { "atmega128a", "__AVR_ATmega128A__" },
8700 { "atmega1280", "__AVR_ATmega1280__" },
8701 { "atmega1281", "__AVR_ATmega1281__" },
8702 { "atmega1284", "__AVR_ATmega1284__" },
8703 { "atmega1284p", "__AVR_ATmega1284P__" },
8704 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8705 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8706 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8707 { "at90can128", "__AVR_AT90CAN128__" },
8708 { "at90usb1286", "__AVR_AT90USB1286__" },
8709 { "at90usb1287", "__AVR_AT90USB1287__" },
8710 { "atmega2560", "__AVR_ATmega2560__" },
8711 { "atmega2561", "__AVR_ATmega2561__" },
8712 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8713 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8714 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8715 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8716 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8717 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8718 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8719 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8720 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8721 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8722 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8723 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8724 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8725 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8726 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8727 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8728 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8729 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8730 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8731 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8732 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8733 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8734 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8735 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8736 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8737 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8738 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8739 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8740 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8741 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8742 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8743 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8744 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8745 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8746 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8747 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8748 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8749 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8750 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8751 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8752 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8753 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8754 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8755 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8756 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8757 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8758 { "attiny4", "__AVR_ATtiny4__" },
8759 { "attiny5", "__AVR_ATtiny5__" },
8760 { "attiny9", "__AVR_ATtiny9__" },
8761 { "attiny10", "__AVR_ATtiny10__" },
8762 { "attiny20", "__AVR_ATtiny20__" },
8763 { "attiny40", "__AVR_ATtiny40__" },
8764 { "attiny102", "__AVR_ATtiny102__" },
8765 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008766};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008767
8768// AVR Target
8769class AVRTargetInfo : public TargetInfo {
8770public:
8771 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8772 : TargetInfo(Triple) {
8773 TLSSupported = false;
8774 PointerWidth = 16;
8775 PointerAlign = 8;
8776 IntWidth = 16;
8777 IntAlign = 8;
8778 LongWidth = 32;
8779 LongAlign = 8;
8780 LongLongWidth = 64;
8781 LongLongAlign = 8;
8782 SuitableAlign = 8;
8783 DefaultAlignForAttributeAligned = 8;
8784 HalfWidth = 16;
8785 HalfAlign = 8;
8786 FloatWidth = 32;
8787 FloatAlign = 8;
8788 DoubleWidth = 32;
8789 DoubleAlign = 8;
8790 DoubleFormat = &llvm::APFloat::IEEEsingle();
8791 LongDoubleWidth = 32;
8792 LongDoubleAlign = 8;
8793 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8794 SizeType = UnsignedInt;
8795 PtrDiffType = SignedInt;
8796 IntPtrType = SignedInt;
8797 Char16Type = UnsignedInt;
8798 WCharType = SignedInt;
8799 WIntType = SignedInt;
8800 Char32Type = UnsignedLong;
8801 SigAtomicType = SignedChar;
8802 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8803 "-f32:32:32-f64:64:64-n8");
8804 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008805
Dylan McKay924fa3a2017-01-05 05:20:27 +00008806 void getTargetDefines(const LangOptions &Opts,
8807 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008808 Builder.defineMacro("AVR");
8809 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008810 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008811
8812 if (!this->CPU.empty()) {
8813 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8814 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8815
8816 if (It != AVRMcus.end())
8817 Builder.defineMacro(It->DefineName);
8818 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008819 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008820
Dylan McKay924fa3a2017-01-05 05:20:27 +00008821 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8822 return None;
8823 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008824
Dylan McKay924fa3a2017-01-05 05:20:27 +00008825 BuiltinVaListKind getBuiltinVaListKind() const override {
8826 return TargetInfo::VoidPtrBuiltinVaList;
8827 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008828
Dylan McKay924fa3a2017-01-05 05:20:27 +00008829 const char *getClobbers() const override {
8830 return "";
8831 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008832
Dylan McKay924fa3a2017-01-05 05:20:27 +00008833 ArrayRef<const char *> getGCCRegNames() const override {
8834 static const char * const GCCRegNames[] = {
8835 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8836 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8837 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008838 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008839 };
8840 return llvm::makeArrayRef(GCCRegNames);
8841 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008842
Dylan McKay924fa3a2017-01-05 05:20:27 +00008843 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8844 return None;
8845 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008846
Dylan McKay924fa3a2017-01-05 05:20:27 +00008847 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8848 static const TargetInfo::AddlRegName AddlRegNames[] = {
8849 { { "r26", "r27"}, 26 },
8850 { { "r28", "r29"}, 27 },
8851 { { "r30", "r31"}, 28 },
8852 { { "SPL", "SPH"}, 29 },
8853 };
8854 return llvm::makeArrayRef(AddlRegNames);
8855 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008856
Dylan McKay924fa3a2017-01-05 05:20:27 +00008857 bool validateAsmConstraint(const char *&Name,
8858 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008859 // There aren't any multi-character AVR specific constraints.
8860 if (StringRef(Name).size() > 1) return false;
8861
8862 switch (*Name) {
8863 default: return false;
8864 case 'a': // Simple upper registers
8865 case 'b': // Base pointer registers pairs
8866 case 'd': // Upper register
8867 case 'l': // Lower registers
8868 case 'e': // Pointer register pairs
8869 case 'q': // Stack pointer register
8870 case 'r': // Any register
8871 case 'w': // Special upper register pairs
8872 case 't': // Temporary register
8873 case 'x': case 'X': // Pointer register pair X
8874 case 'y': case 'Y': // Pointer register pair Y
8875 case 'z': case 'Z': // Pointer register pair Z
8876 Info.setAllowsRegister();
8877 return true;
8878 case 'I': // 6-bit positive integer constant
8879 Info.setRequiresImmediate(0, 63);
8880 return true;
8881 case 'J': // 6-bit negative integer constant
8882 Info.setRequiresImmediate(-63, 0);
8883 return true;
8884 case 'K': // Integer constant (Range: 2)
8885 Info.setRequiresImmediate(2);
8886 return true;
8887 case 'L': // Integer constant (Range: 0)
8888 Info.setRequiresImmediate(0);
8889 return true;
8890 case 'M': // 8-bit integer constant
8891 Info.setRequiresImmediate(0, 0xff);
8892 return true;
8893 case 'N': // Integer constant (Range: -1)
8894 Info.setRequiresImmediate(-1);
8895 return true;
8896 case 'O': // Integer constant (Range: 8, 16, 24)
8897 Info.setRequiresImmediate({8, 16, 24});
8898 return true;
8899 case 'P': // Integer constant (Range: 1)
8900 Info.setRequiresImmediate(1);
8901 return true;
8902 case 'R': // Integer constant (Range: -6 to 5)
8903 Info.setRequiresImmediate(-6, 5);
8904 return true;
8905 case 'G': // Floating point constant
8906 case 'Q': // A memory address based on Y or Z pointer with displacement.
8907 return true;
8908 }
8909
Dylan McKay924fa3a2017-01-05 05:20:27 +00008910 return false;
8911 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008912
Dylan McKay924fa3a2017-01-05 05:20:27 +00008913 IntType getIntTypeByWidth(unsigned BitWidth,
8914 bool IsSigned) const final {
8915 // AVR prefers int for 16-bit integers.
8916 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8917 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8918 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008919
Dylan McKay924fa3a2017-01-05 05:20:27 +00008920 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8921 bool IsSigned) const final {
8922 // AVR uses int for int_least16_t and int_fast16_t.
8923 return BitWidth == 16
8924 ? (IsSigned ? SignedInt : UnsignedInt)
8925 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8926 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008927
8928 bool setCPU(const std::string &Name) override {
8929 bool IsFamily = llvm::StringSwitch<bool>(Name)
8930 .Case("avr1", true)
8931 .Case("avr2", true)
8932 .Case("avr25", true)
8933 .Case("avr3", true)
8934 .Case("avr31", true)
8935 .Case("avr35", true)
8936 .Case("avr4", true)
8937 .Case("avr5", true)
8938 .Case("avr51", true)
8939 .Case("avr6", true)
8940 .Case("avrxmega1", true)
8941 .Case("avrxmega2", true)
8942 .Case("avrxmega3", true)
8943 .Case("avrxmega4", true)
8944 .Case("avrxmega5", true)
8945 .Case("avrxmega6", true)
8946 .Case("avrxmega7", true)
8947 .Case("avrtiny", true)
8948 .Default(false);
8949
8950 if (IsFamily) this->CPU = Name;
8951
8952 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8953 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8954
8955 if (IsMCU) this->CPU = Name;
8956
8957 return IsFamily || IsMCU;
8958 }
8959
8960protected:
8961 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008962};
8963
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008964} // end anonymous namespace
8965
Chris Lattner5ba61f02006-10-14 07:39:34 +00008966//===----------------------------------------------------------------------===//
8967// Driver code
8968//===----------------------------------------------------------------------===//
8969
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008970static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8971 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008972 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008973
Daniel Dunbar52322032009-08-18 05:47:58 +00008974 switch (Triple.getArch()) {
8975 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008976 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008977
Tim Northover2a0783d2014-05-30 14:14:07 +00008978 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008979 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008980
8981 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008982 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008983
Jacques Pienaard964cc22016-03-28 21:02:54 +00008984 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008985 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008986
Tim Northover2a0783d2014-05-30 14:14:07 +00008987 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008988 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008989 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008990
8991 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008992 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008993 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008994 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008995 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008996 case llvm::Triple::Fuchsia:
8997 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008998 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008999 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009000 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009001 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Brad Smith9aa2bf22017-02-21 23:13:09 +00009002 case llvm::Triple::OpenBSD:
9003 return new OpenBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00009004 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009005 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00009006 }
9007
Christian Pirker9b019ae2014-02-25 13:51:00 +00009008 case llvm::Triple::aarch64_be:
9009 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00009010 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009011 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009012 case llvm::Triple::Fuchsia:
9013 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009014 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009015 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009016 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009017 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00009018 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009019 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00009020 }
9021
Daniel Dunbar52322032009-08-18 05:47:58 +00009022 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00009023 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00009024 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009025 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009026
Daniel Dunbar52322032009-08-18 05:47:58 +00009027 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00009028 case llvm::Triple::CloudABI:
9029 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00009030 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009031 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009032 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009033 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009034 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009035 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009036 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009037 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009038 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009039 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009040 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009041 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009042 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009043 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009044 case llvm::Triple::Win32:
9045 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00009046 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009047 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00009048 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009049 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009050 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009051 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009052 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009053 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009054 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009055 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009056 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009057 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009058 }
9059
9060 case llvm::Triple::armeb:
9061 case llvm::Triple::thumbeb:
9062 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009063 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009064
9065 switch (os) {
9066 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009067 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009068 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009069 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009070 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009071 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009072 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009073 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009074 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009075 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009076 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009077 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009078 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009079 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009080 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009081 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009082 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009083
Dylan McKay924fa3a2017-01-05 05:20:27 +00009084 case llvm::Triple::avr:
9085 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009086 case llvm::Triple::bpfeb:
9087 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009088 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009089
Daniel Dunbar52322032009-08-18 05:47:58 +00009090 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009091 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009092
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009093 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009094 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009095 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009096 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009097 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009098 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009099 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009100 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009101 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009102 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009103 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009104 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009105 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009106
9107 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009108 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009109 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009110 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009111 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009112 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009113 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009114 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009115 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009116 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009117 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009118 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009119 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009120 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009121 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009122
Akira Hatanakabef17452011-09-20 19:21:49 +00009123 case llvm::Triple::mips64:
9124 switch (os) {
9125 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009126 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009127 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009128 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009129 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009130 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009131 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009132 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009133 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009134 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009135 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009136 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009137 }
9138
9139 case llvm::Triple::mips64el:
9140 switch (os) {
9141 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009142 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009143 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009144 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009145 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009146 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009147 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009148 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009149 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009150 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009151 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009152 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009153 }
9154
Ivan Krasindd7403e2011-08-24 20:22:22 +00009155 case llvm::Triple::le32:
9156 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009157 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009159 default:
9160 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009161 }
9162
JF Bastien643817d2014-09-12 17:52:47 +00009163 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009164 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009165
Daniel Dunbar52322032009-08-18 05:47:58 +00009166 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009167 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009168 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009169 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009170 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009172 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009173 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009174 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009175 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009176 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009177 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009178 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009179 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009180 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009181 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009182 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009183
9184 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009185 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009186 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009187 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009188 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009189 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009190 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009191 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009192 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009193 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009194 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009195 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009196 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009197 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009198 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009199
Bill Schmidt778d3872013-07-26 01:36:11 +00009200 case llvm::Triple::ppc64le:
9201 switch (os) {
9202 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009203 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009204 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009205 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009206 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009207 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009208 }
9209
Peter Collingbournec947aae2012-05-20 23:28:41 +00009210 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009211 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009212 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009213 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009214
Tom Stellardd8e38a32015-01-06 20:34:47 +00009215 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009216 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009217 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009218
Daniel Dunbar52322032009-08-18 05:47:58 +00009219 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009220 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009221 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009222 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009223 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009224 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009225 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009226 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009227 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009228 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009229 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009230 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009231 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009232 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009233 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009234
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009235 // The 'sparcel' architecture copies all the above cases except for Solaris.
9236 case llvm::Triple::sparcel:
9237 switch (os) {
9238 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009239 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009240 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009241 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009242 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009244 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009245 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009246 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009247 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009248 }
9249
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009250 case llvm::Triple::sparcv9:
9251 switch (os) {
9252 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009253 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009254 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009255 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009256 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009257 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009258 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009259 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009260 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009261 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009262 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009264 }
9265
Ulrich Weigand47445072013-05-06 16:26:41 +00009266 case llvm::Triple::systemz:
9267 switch (os) {
9268 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009270 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009272 }
9273
Eli Friedmana9c3d712009-08-19 20:47:07 +00009274 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009276
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009277 case llvm::Triple::tcele:
9278 return new TCELETargetInfo(Triple, Opts);
9279
Daniel Dunbar52322032009-08-18 05:47:58 +00009280 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009281 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009282 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009283
Daniel Dunbar52322032009-08-18 05:47:58 +00009284 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009285 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009286 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009287 case llvm::Triple::Linux: {
9288 switch (Triple.getEnvironment()) {
9289 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009290 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009291 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009292 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009293 }
9294 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009295 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009296 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009297 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009298 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009299 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009301 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009303 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009304 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009305 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009306 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009307 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009308 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009309 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009310 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009311 case llvm::Triple::Win32: {
9312 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009313 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009314 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009315 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009316 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009317 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009318 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009319 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009320 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009321 }
9322 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009323 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009324 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009325 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009327 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009328 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009329 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009330 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009331 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009332 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009333 }
9334
9335 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009336 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009337 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009338
Daniel Dunbar52322032009-08-18 05:47:58 +00009339 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009340 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009341 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009342 case llvm::Triple::Linux: {
9343 switch (Triple.getEnvironment()) {
9344 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009345 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009346 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009347 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009348 }
9349 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009350 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009351 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009352 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009353 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009354 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009355 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009356 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009357 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009358 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009359 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009360 case llvm::Triple::Fuchsia:
9361 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009362 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009363 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009364 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009365 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009366 case llvm::Triple::Win32: {
9367 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009368 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009369 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009370 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009371 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009372 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009373 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009374 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009375 }
9376 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009377 case llvm::Triple::Haiku:
9378 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009379 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009380 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009381 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009382 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009383 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009384 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009385 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009386
Douglas Katzman78d7c542015-05-12 21:18:10 +00009387 case llvm::Triple::spir: {
9388 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9389 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9390 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009391 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009392 }
9393 case llvm::Triple::spir64: {
9394 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9395 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9396 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009397 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009398 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009399 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009400 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9401 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9402 Triple.getOS() != llvm::Triple::UnknownOS ||
9403 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9404 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009405 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009406 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009407 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009408 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9409 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9410 Triple.getOS() != llvm::Triple::UnknownOS ||
9411 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9412 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009413 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009414 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009415
9416 case llvm::Triple::renderscript32:
9417 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9418 case llvm::Triple::renderscript64:
9419 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009420 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009421}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009422
9423/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009424/// options.
Alp Toker80758082014-07-06 05:26:44 +00009425TargetInfo *
9426TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009427 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009428 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009429
9430 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009431 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009432 if (!Target) {
9433 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009434 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009435 }
Alp Toker80758082014-07-06 05:26:44 +00009436 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009437
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009438 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009439 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9440 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009441 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009442 }
9443
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009444 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009445 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9446 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009447 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009448 }
9449
Rafael Espindolaeb265472013-08-21 21:59:03 +00009450 // Set the fp math unit.
9451 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9452 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009453 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009454 }
9455
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009456 // Compute the default target features, we need the target to handle this
9457 // because features may have dependencies on one another.
9458 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009459 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9460 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009461 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009462
9463 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009464 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009465 for (const auto &F : Features)
9466 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9467
Eric Christopher3ff21b32013-10-16 21:26:26 +00009468 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009469 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009470
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009471 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009472 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009473
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009474 if (!Target->validateTarget(Diags))
9475 return nullptr;
9476
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009477 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009478}