blob: 9b3281726352f3ec418d032e4adda233d035be17 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000346 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000391 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000414 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000444 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000458 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000515 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000544 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Brad Smith0561a5a2017-02-20 03:18:15 +0000548 if (this->HasFloat128)
549 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000550 }
551public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000552 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
553 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000554 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000555
Eli Friedman3715d1f2011-12-15 02:15:56 +0000556 switch (Triple.getArch()) {
Eli Friedman3715d1f2011-12-15 02:15:56 +0000557 case llvm::Triple::x86:
558 case llvm::Triple::x86_64:
Brad Smith0561a5a2017-02-20 03:18:15 +0000559 this->HasFloat128 = true;
560 // FALLTHROUGH
561 default:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000562 this->MCountName = "__mcount";
563 break;
564 case llvm::Triple::mips64:
565 case llvm::Triple::mips64el:
566 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000567 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000568 this->MCountName = "_mcount";
569 break;
570 }
571 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000572};
573
Eli Friedman9fa28852012-08-08 23:57:20 +0000574// Bitrig Target
575template<typename Target>
576class BitrigTargetInfo : public OSTargetInfo<Target> {
577protected:
Craig Topper3164f332014-03-11 03:39:26 +0000578 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
579 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000580 // Bitrig defines; list based off of gcc output
581
582 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000583 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000584 Builder.defineMacro("__ELF__");
585 if (Opts.POSIXThreads)
586 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000587
588 switch (Triple.getArch()) {
589 default:
590 break;
591 case llvm::Triple::arm:
592 case llvm::Triple::armeb:
593 case llvm::Triple::thumb:
594 case llvm::Triple::thumbeb:
595 Builder.defineMacro("__ARM_DWARF_EH__");
596 break;
597 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000598 }
599public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000600 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
601 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000602 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000603 }
604};
605
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000606// PSP Target
607template<typename Target>
608class PSPTargetInfo : public OSTargetInfo<Target> {
609protected:
Craig Topper3164f332014-03-11 03:39:26 +0000610 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
611 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000612 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000613 Builder.defineMacro("PSP");
614 Builder.defineMacro("_PSP");
615 Builder.defineMacro("__psp__");
616 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000617 }
618public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000619 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000620};
621
John Thompsone467e192009-11-19 17:18:50 +0000622// PS3 PPU Target
623template<typename Target>
624class PS3PPUTargetInfo : public OSTargetInfo<Target> {
625protected:
Craig Topper3164f332014-03-11 03:39:26 +0000626 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
627 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000628 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000629 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000630 Builder.defineMacro("__PPU__");
631 Builder.defineMacro("__CELLOS_LV2__");
632 Builder.defineMacro("__ELF__");
633 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000634 Builder.defineMacro("_ARCH_PPC64");
635 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000636 }
637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000638 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
639 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000640 this->LongWidth = this->LongAlign = 32;
641 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000642 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000643 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000644 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000645 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000646 }
647};
648
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000649template <typename Target>
650class PS4OSTargetInfo : public OSTargetInfo<Target> {
651protected:
652 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
653 MacroBuilder &Builder) const override {
654 Builder.defineMacro("__FreeBSD__", "9");
655 Builder.defineMacro("__FreeBSD_cc_version", "900001");
656 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000657 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000659 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 }
661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000662 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
663 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664 this->WCharType = this->UnsignedShort;
665
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000666 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
667 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000668
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000669 // On PS4, do not honor explicit bit field alignment,
670 // as in "__attribute__((aligned(2))) int b : 1;".
671 this->UseExplicitBitFieldAlignment = false;
672
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000673 switch (Triple.getArch()) {
674 default:
675 case llvm::Triple::x86_64:
676 this->MCountName = ".mcount";
677 break;
678 }
679 }
680};
681
Torok Edwinb2b37c62009-06-30 17:10:35 +0000682// Solaris target
683template<typename Target>
684class SolarisTargetInfo : public OSTargetInfo<Target> {
685protected:
Craig Topper3164f332014-03-11 03:39:26 +0000686 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
687 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000689 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000690 Builder.defineMacro("__ELF__");
691 Builder.defineMacro("__svr4__");
692 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000693 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
694 // newer, but to 500 for everything else. feature_test.h has a check to
695 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000696 // with a new version.
697 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("_XOPEN_SOURCE", "600");
699 else
700 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000701 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000703 Builder.defineMacro("_LARGEFILE_SOURCE");
704 Builder.defineMacro("_LARGEFILE64_SOURCE");
705 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000706 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000707 }
708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000709 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
710 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000711 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000712 // FIXME: WIntType should be SignedLong
713 }
714};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000715
716// Windows target
717template<typename Target>
718class WindowsTargetInfo : public OSTargetInfo<Target> {
719protected:
Craig Topper3164f332014-03-11 03:39:26 +0000720 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
721 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000722 Builder.defineMacro("_WIN32");
723 }
724 void getVisualStudioDefines(const LangOptions &Opts,
725 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000727 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000728 Builder.defineMacro("_CPPRTTI");
729
Reid Kleckner16514352015-01-30 21:42:55 +0000730 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000731 Builder.defineMacro("_CPPUNWIND");
732 }
733
David Majnemer6a658902015-07-22 22:36:26 +0000734 if (Opts.Bool)
735 Builder.defineMacro("__BOOL_DEFINED");
736
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000737 if (!Opts.CharIsSigned)
738 Builder.defineMacro("_CHAR_UNSIGNED");
739
740 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
741 // but it works for now.
742 if (Opts.POSIXThreads)
743 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000744
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000745 if (Opts.MSCompatibilityVersion) {
746 Builder.defineMacro("_MSC_VER",
747 Twine(Opts.MSCompatibilityVersion / 100000));
748 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000749 // FIXME We cannot encode the revision information into 32-bits
750 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000751
David Majnemerb710a932015-05-11 03:57:49 +0000752 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000753 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000754
755 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
756 if (Opts.CPlusPlus1z)
757 Builder.defineMacro("_MSVC_LANG", "201403L");
758 else if (Opts.CPlusPlus14)
759 Builder.defineMacro("_MSVC_LANG", "201402L");
760 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000761 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000762
763 if (Opts.MicrosoftExt) {
764 Builder.defineMacro("_MSC_EXTENSIONS");
765
766 if (Opts.CPlusPlus11) {
767 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
768 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
769 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
770 }
771 }
772
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000773 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774 }
775
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000777 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
778 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000779};
780
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000781template <typename Target>
782class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000783protected:
Craig Topper3164f332014-03-11 03:39:26 +0000784 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
785 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000786 if (Opts.POSIXThreads)
787 Builder.defineMacro("_REENTRANT");
788 if (Opts.CPlusPlus)
789 Builder.defineMacro("_GNU_SOURCE");
790
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000791 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000792 Builder.defineMacro("__ELF__");
793 Builder.defineMacro("__native_client__");
794 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000795
796public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000797 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
798 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000799 this->LongAlign = 32;
800 this->LongWidth = 32;
801 this->PointerAlign = 32;
802 this->PointerWidth = 32;
803 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000804 this->Int64Type = TargetInfo::SignedLongLong;
805 this->DoubleAlign = 64;
806 this->LongDoubleWidth = 64;
807 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000808 this->LongLongWidth = 64;
809 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->SizeType = TargetInfo::UnsignedInt;
811 this->PtrDiffType = TargetInfo::SignedInt;
812 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000813 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000814 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000816 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000822 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000823 } else {
824 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000825 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000826 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000827 }
828};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000829
Petr Hosek62e1d232016-10-06 06:08:09 +0000830// Fuchsia Target
831template<typename Target>
832class FuchsiaTargetInfo : public OSTargetInfo<Target> {
833protected:
834 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
835 MacroBuilder &Builder) const override {
836 Builder.defineMacro("__Fuchsia__");
837 Builder.defineMacro("__ELF__");
838 if (Opts.POSIXThreads)
839 Builder.defineMacro("_REENTRANT");
840 // Required by the libc++ locale support.
841 if (Opts.CPlusPlus)
842 Builder.defineMacro("_GNU_SOURCE");
843 }
844public:
845 FuchsiaTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
848 this->MCountName = "__mcount";
849 }
850};
851
Dan Gohmanc2853072015-09-03 22:51:53 +0000852// WebAssembly target
853template <typename Target>
854class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
855 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000856 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000857 // A common platform macro.
858 if (Opts.POSIXThreads)
859 Builder.defineMacro("_REENTRANT");
860 // Follow g++ convention and predefine _GNU_SOURCE for C++.
861 if (Opts.CPlusPlus)
862 Builder.defineMacro("_GNU_SOURCE");
863 }
864
865 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000866 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000867 return ".text.__startup";
868 }
869
870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000871 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
872 const TargetOptions &Opts)
873 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000874 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000875 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
876 }
877};
Dan Gohmanc2853072015-09-03 22:51:53 +0000878
Chris Lattner09d98f52008-10-05 21:50:58 +0000879//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000880// Specific target implementations.
881//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000882
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000883// PPC abstract base class
884class PPCTargetInfo : public TargetInfo {
885 static const Builtin::Info BuiltinInfo[];
886 static const char * const GCCRegNames[];
887 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000888 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000889
890 // Target cpu features.
891 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000892 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000893 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000894 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000895 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000896 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000897 bool HasBPERMD;
898 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000899 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000900
Ulrich Weigand8afad612014-07-28 13:17:52 +0000901protected:
902 std::string ABI;
903
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000905 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000906 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
907 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000908 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000909 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000910 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000911 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000912 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000913
Hal Finkel6b984f02012-07-03 16:51:04 +0000914 /// \brief Flags for architecture specific defines.
915 typedef enum {
916 ArchDefineNone = 0,
917 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
918 ArchDefinePpcgr = 1 << 1,
919 ArchDefinePpcsq = 1 << 2,
920 ArchDefine440 = 1 << 3,
921 ArchDefine603 = 1 << 4,
922 ArchDefine604 = 1 << 5,
923 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000924 ArchDefinePwr5 = 1 << 7,
925 ArchDefinePwr5x = 1 << 8,
926 ArchDefinePwr6 = 1 << 9,
927 ArchDefinePwr6x = 1 << 10,
928 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000929 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000930 ArchDefinePwr9 = 1 << 13,
931 ArchDefineA2 = 1 << 14,
932 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000933 } ArchDefineTypes;
934
Bill Schmidt38378a02013-02-01 20:23:10 +0000935 // Note: GCC recognizes the following additional cpus:
936 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
937 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
938 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000939 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000940 bool CPUKnown = llvm::StringSwitch<bool>(Name)
941 .Case("generic", true)
942 .Case("440", true)
943 .Case("450", true)
944 .Case("601", true)
945 .Case("602", true)
946 .Case("603", true)
947 .Case("603e", true)
948 .Case("603ev", true)
949 .Case("604", true)
950 .Case("604e", true)
951 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000952 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000953 .Case("g3", true)
954 .Case("7400", true)
955 .Case("g4", true)
956 .Case("7450", true)
957 .Case("g4+", true)
958 .Case("750", true)
959 .Case("970", true)
960 .Case("g5", true)
961 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000962 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000963 .Case("e500mc", true)
964 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000965 .Case("power3", true)
966 .Case("pwr3", true)
967 .Case("power4", true)
968 .Case("pwr4", true)
969 .Case("power5", true)
970 .Case("pwr5", true)
971 .Case("power5x", true)
972 .Case("pwr5x", true)
973 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000974 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000975 .Case("power6x", true)
976 .Case("pwr6x", true)
977 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000978 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000979 .Case("power8", true)
980 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000981 .Case("power9", true)
982 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000985 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000986 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000987 .Case("powerpc64le", true)
988 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000989 .Default(false);
990
991 if (CPUKnown)
992 CPU = Name;
993
994 return CPUKnown;
995 }
996
Ulrich Weigand8afad612014-07-28 13:17:52 +0000997
998 StringRef getABI() const override { return ABI; }
999
Craig Topper6c03a542015-10-19 04:51:35 +00001000 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1001 return llvm::makeArrayRef(BuiltinInfo,
1002 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001003 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001006
Craig Topper3164f332014-03-11 03:39:26 +00001007 void getTargetDefines(const LangOptions &Opts,
1008 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001009
Eric Christopher8c47b422015-10-09 18:39:55 +00001010 bool
1011 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1012 StringRef CPU,
1013 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001014
Craig Topper3164f332014-03-11 03:39:26 +00001015 bool handleTargetFeatures(std::vector<std::string> &Features,
1016 DiagnosticsEngine &Diags) override;
1017 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001018 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1019 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001020
Craig Topperf054e3a2015-10-19 03:52:27 +00001021 ArrayRef<const char *> getGCCRegNames() const override;
1022 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001023 bool validateAsmConstraint(const char *&Name,
1024 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001025 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001026 default: return false;
1027 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001029 case 'b': // Base register
1030 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001031 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001032 break;
1033 // FIXME: The following are added to allow parsing.
1034 // I just took a guess at what the actions should be.
1035 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 'v': // Altivec vector register
1038 Info.setAllowsRegister();
1039 break;
1040 case 'w':
1041 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001042 case 'd':// VSX vector register to hold vector double data
1043 case 'f':// VSX vector register to hold vector float data
1044 case 's':// VSX vector register to hold scalar float data
1045 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001046 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001047 break;
1048 default:
1049 return false;
1050 }
1051 Info.setAllowsRegister();
1052 Name++; // Skip over 'w'.
1053 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001054 case 'h': // `MQ', `CTR', or `LINK' register
1055 case 'q': // `MQ' register
1056 case 'c': // `CTR' register
1057 case 'l': // `LINK' register
1058 case 'x': // `CR' register (condition register) number 0
1059 case 'y': // `CR' register (condition register)
1060 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001061 Info.setAllowsRegister();
1062 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001064 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001065 // (use `L' instead for SImode constants)
1066 case 'K': // Unsigned 16-bit constant
1067 case 'L': // Signed 16-bit constant shifted left 16 bits
1068 case 'M': // Constant larger than 31
1069 case 'N': // Exact power of 2
1070 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001073 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001075 break;
1076 case 'm': // Memory operand. Note that on PowerPC targets, m can
1077 // include addresses that update the base register. It
1078 // is therefore only safe to use `m' in an asm statement
1079 // if that asm statement accesses the operand exactly once.
1080 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001081 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001084 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001085 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1086 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001087 // register to be updated.
1088 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001089 if (Name[1] != 's')
1090 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001091 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001092 // include any automodification of the base register. Unlike
1093 // `m', this constraint can be used in asm statements that
1094 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001095 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001096 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001097 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001098 break;
1099 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001100 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001101 case 'Z': // Memory operand that is an indexed or indirect from a
1102 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001104 Info.setAllowsMemory();
1105 Info.setAllowsRegister();
1106 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001108 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001109 // register (`p' is preferable for asm statements)
1110 case 'S': // Constant suitable as a 64-bit mask operand
1111 case 'T': // Constant suitable as a 32-bit mask operand
1112 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001113 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001114 // instructions
1115 case 'W': // Vector constant that does not require memory
1116 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001117 break;
1118 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
John Thompson07a61a42010-06-24 22:44:13 +00001120 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001121 }
Craig Topper3164f332014-03-11 03:39:26 +00001122 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001123 std::string R;
1124 switch (*Constraint) {
1125 case 'e':
1126 case 'w':
1127 // Two-character constraint; add "^" hint for later parsing.
1128 R = std::string("^") + std::string(Constraint, 2);
1129 Constraint++;
1130 break;
1131 default:
1132 return TargetInfo::convertConstraint(Constraint);
1133 }
1134 return R;
1135 }
Craig Topper3164f332014-03-11 03:39:26 +00001136 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001137 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001138 }
Craig Topper3164f332014-03-11 03:39:26 +00001139 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001140 if (RegNo == 0) return 3;
1141 if (RegNo == 1) return 4;
1142 return -1;
1143 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001144
1145 bool hasSjLjLowering() const override {
1146 return true;
1147 }
David Majnemer2617ea62015-06-09 18:05:33 +00001148
1149 bool useFloat128ManglingForLongDouble() const override {
1150 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001151 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001152 getTriple().isOSBinFormatELF();
1153 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154};
Anders Carlssonf511f642007-11-27 04:11:28 +00001155
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001156const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001157#define BUILTIN(ID, TYPE, ATTRS) \
1158 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1159#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1160 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001161#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001162};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001163
Eric Christopher917e9522014-11-18 22:36:15 +00001164/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001166bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001167 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001168 for (const auto &Feature : Features) {
1169 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001170 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001174 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001176 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001178 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001180 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001182 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001183 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001184 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001185 } else if (Feature == "+float128") {
1186 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001187 } else if (Feature == "+power9-vector") {
1188 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001189 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001190 // TODO: Finish this list and add an assert that we've handled them
1191 // all.
1192 }
Eric Christopher02c33352015-08-25 00:59:11 +00001193
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001194 return true;
1195}
1196
Chris Lattnerecd49032009-03-02 22:27:17 +00001197/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1198/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001199void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001201 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001203 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001205 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001207 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001209 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001211 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001213
Chris Lattnerecd49032009-03-02 22:27:17 +00001214 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1216 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 } else {
1218 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1219 getTriple().getOS() != llvm::Triple::OpenBSD)
1220 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001221 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001222
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001224 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001225 Builder.defineMacro("_CALL_ELF", "1");
1226 if (ABI == "elfv2")
1227 Builder.defineMacro("_CALL_ELF", "2");
1228
Chris Lattnerecd49032009-03-02 22:27:17 +00001229 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001230 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1231 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001232
Chris Lattnerecd49032009-03-02 22:27:17 +00001233 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001234 if (LongDoubleWidth == 128)
1235 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001236
Eric Christopher32ac5e42017-02-15 07:50:11 +00001237 // Define this for elfv2 (64-bit only) or 64-bit darwin.
1238 if (ABI == "elfv2" ||
1239 (getTriple().getOS() == llvm::Triple::Darwin && PointerWidth == 64))
1240 Builder.defineMacro("__STRUCT_PARM_ALIGN__", "16");
1241
John Thompsone467e192009-11-19 17:18:50 +00001242 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001243 Builder.defineMacro("__VEC__", "10206");
1244 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001245 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001246
1247 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001248 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1249 .Case("440", ArchDefineName)
1250 .Case("450", ArchDefineName | ArchDefine440)
1251 .Case("601", ArchDefineName)
1252 .Case("602", ArchDefineName | ArchDefinePpcgr)
1253 .Case("603", ArchDefineName | ArchDefinePpcgr)
1254 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1255 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1256 .Case("604", ArchDefineName | ArchDefinePpcgr)
1257 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1258 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001259 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001260 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1261 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1262 .Case("750", ArchDefineName | ArchDefinePpcgr)
1263 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1264 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001265 .Case("a2", ArchDefineA2)
1266 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001267 .Case("pwr3", ArchDefinePpcgr)
1268 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1269 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1272 | ArchDefinePpcgr | ArchDefinePpcsq)
1273 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1274 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1275 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1276 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1277 | ArchDefinePpcsq)
1278 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1279 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001280 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1282 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1283 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001284 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1285 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1286 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1287 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001288 .Case("power3", ArchDefinePpcgr)
1289 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1290 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1293 | ArchDefinePpcgr | ArchDefinePpcsq)
1294 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1295 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1296 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1297 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1298 | ArchDefinePpcsq)
1299 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1300 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001301 | ArchDefinePpcgr | ArchDefinePpcsq)
1302 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1303 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1304 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001305 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1306 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1307 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1308 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001309 .Default(ArchDefineNone);
1310
1311 if (defs & ArchDefineName)
1312 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1313 if (defs & ArchDefinePpcgr)
1314 Builder.defineMacro("_ARCH_PPCGR");
1315 if (defs & ArchDefinePpcsq)
1316 Builder.defineMacro("_ARCH_PPCSQ");
1317 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001318 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 if (defs & ArchDefine603)
1320 Builder.defineMacro("_ARCH_603");
1321 if (defs & ArchDefine604)
1322 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001323 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001324 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001325 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001326 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001327 if (defs & ArchDefinePwr5x)
1328 Builder.defineMacro("_ARCH_PWR5X");
1329 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001330 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001331 if (defs & ArchDefinePwr6x)
1332 Builder.defineMacro("_ARCH_PWR6X");
1333 if (defs & ArchDefinePwr7)
1334 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001335 if (defs & ArchDefinePwr8)
1336 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001337 if (defs & ArchDefinePwr9)
1338 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001339 if (defs & ArchDefineA2)
1340 Builder.defineMacro("_ARCH_A2");
1341 if (defs & ArchDefineA2q) {
1342 Builder.defineMacro("_ARCH_A2Q");
1343 Builder.defineMacro("_ARCH_QP");
1344 }
1345
1346 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1347 Builder.defineMacro("__bg__");
1348 Builder.defineMacro("__THW_BLUEGENE__");
1349 Builder.defineMacro("__bgq__");
1350 Builder.defineMacro("__TOS_BGQ__");
1351 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001352
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001353 if (HasVSX)
1354 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001355 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001356 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001357 if (HasP8Crypto)
1358 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001359 if (HasHTM)
1360 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001361 if (HasFloat128)
1362 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001363 if (HasP9Vector)
1364 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001365
1366 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1367 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1368 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1369 if (PointerWidth == 64)
1370 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001371
Bill Schmidt38378a02013-02-01 20:23:10 +00001372 // FIXME: The following are not yet generated here by Clang, but are
1373 // generated by GCC:
1374 //
1375 // _SOFT_FLOAT_
1376 // __RECIP_PRECISION__
1377 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001378 // __RECIP__
1379 // __RECIPF__
1380 // __RSQRTE__
1381 // __RSQRTEF__
1382 // _SOFT_DOUBLE_
1383 // __NO_LWSYNC__
1384 // __HAVE_BSWAP__
1385 // __LONGDOUBLE128
1386 // __CMODEL_MEDIUM__
1387 // __CMODEL_LARGE__
1388 // _CALL_SYSV
1389 // _CALL_DARWIN
1390 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001391}
1392
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001394// explicitly turned off vsx and turned on any of:
1395// - power8-vector
1396// - direct-move
1397// - float128
1398// - power9-vector
1399// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001400// set of options.
1401static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001402 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001403
1404 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1405 FeaturesVec.end()) {
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1409 << "-mno-vsx";
1410 return false;
1411 }
1412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1423 << "-mno-vsx";
1424 return false;
1425 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001426
1427 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1428 FeaturesVec.end()) {
1429 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1430 << "-mno-vsx";
1431 return false;
1432 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001433 }
1434
1435 return true;
1436}
1437
Eric Christopher8c47b422015-10-09 18:39:55 +00001438bool PPCTargetInfo::initFeatureMap(
1439 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1440 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001441 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1442 .Case("7400", true)
1443 .Case("g4", true)
1444 .Case("7450", true)
1445 .Case("g4+", true)
1446 .Case("970", true)
1447 .Case("g5", true)
1448 .Case("pwr6", true)
1449 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001450 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001452 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001453 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001454 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001455
1456 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001457 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001458 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1459 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001460 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001461 .Case("pwr8", true)
1462 .Default(false);
1463 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1464 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001465 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001466 .Case("pwr8", true)
1467 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001468 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1469 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001470 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001471 .Case("pwr8", true)
1472 .Case("pwr7", true)
1473 .Default(false);
1474 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1475 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001476 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001477 .Case("pwr8", true)
1478 .Case("pwr7", true)
1479 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001480 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1481 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001482 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001483 .Case("pwr8", true)
1484 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001485 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1486 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001487 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001488 .Case("pwr8", true)
1489 .Case("pwr7", true)
1490 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001491
Eric Christophera8a14c32015-08-31 18:39:16 +00001492 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1493 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001494
Eric Christopher007b0a02015-08-28 22:32:01 +00001495 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001496}
1497
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001498bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001499 return llvm::StringSwitch<bool>(Feature)
1500 .Case("powerpc", true)
1501 .Case("vsx", HasVSX)
1502 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001503 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001504 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001505 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001506 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001507 .Case("bpermd", HasBPERMD)
1508 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001509 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001510 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001511 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001512}
Chris Lattner17df24e2008-04-21 18:56:49 +00001513
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001514void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1515 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001516 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1517 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1518 // incompatible options.
1519 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001520 if (Name == "direct-move" ||
1521 Name == "power8-vector" ||
1522 Name == "float128" ||
1523 Name == "power9-vector") {
1524 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001525 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001526 if (Name == "power9-vector")
1527 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = true;
1530 }
1531 } else {
1532 if (Name == "vsx") {
1533 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001534 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001535 } else {
1536 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001537 }
1538 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001539}
1540
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001541const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001542 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1543 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1544 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1545 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1546 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1547 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1548 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1549 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001551 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001552 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001553 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1554 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1555 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1556 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557 "vrsave", "vscr",
1558 "spe_acc", "spefscr",
1559 "sfp"
1560};
Chris Lattner10a5b382007-01-29 05:24:35 +00001561
Craig Topperf054e3a2015-10-19 03:52:27 +00001562ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1563 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001564}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001565
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001566const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1567 // While some of these aliases do map to different registers
1568 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001569 { { "0" }, "r0" },
1570 { { "1"}, "r1" },
1571 { { "2" }, "r2" },
1572 { { "3" }, "r3" },
1573 { { "4" }, "r4" },
1574 { { "5" }, "r5" },
1575 { { "6" }, "r6" },
1576 { { "7" }, "r7" },
1577 { { "8" }, "r8" },
1578 { { "9" }, "r9" },
1579 { { "10" }, "r10" },
1580 { { "11" }, "r11" },
1581 { { "12" }, "r12" },
1582 { { "13" }, "r13" },
1583 { { "14" }, "r14" },
1584 { { "15" }, "r15" },
1585 { { "16" }, "r16" },
1586 { { "17" }, "r17" },
1587 { { "18" }, "r18" },
1588 { { "19" }, "r19" },
1589 { { "20" }, "r20" },
1590 { { "21" }, "r21" },
1591 { { "22" }, "r22" },
1592 { { "23" }, "r23" },
1593 { { "24" }, "r24" },
1594 { { "25" }, "r25" },
1595 { { "26" }, "r26" },
1596 { { "27" }, "r27" },
1597 { { "28" }, "r28" },
1598 { { "29" }, "r29" },
1599 { { "30" }, "r30" },
1600 { { "31" }, "r31" },
1601 { { "fr0" }, "f0" },
1602 { { "fr1" }, "f1" },
1603 { { "fr2" }, "f2" },
1604 { { "fr3" }, "f3" },
1605 { { "fr4" }, "f4" },
1606 { { "fr5" }, "f5" },
1607 { { "fr6" }, "f6" },
1608 { { "fr7" }, "f7" },
1609 { { "fr8" }, "f8" },
1610 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001611 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001612 { { "fr11" }, "f11" },
1613 { { "fr12" }, "f12" },
1614 { { "fr13" }, "f13" },
1615 { { "fr14" }, "f14" },
1616 { { "fr15" }, "f15" },
1617 { { "fr16" }, "f16" },
1618 { { "fr17" }, "f17" },
1619 { { "fr18" }, "f18" },
1620 { { "fr19" }, "f19" },
1621 { { "fr20" }, "f20" },
1622 { { "fr21" }, "f21" },
1623 { { "fr22" }, "f22" },
1624 { { "fr23" }, "f23" },
1625 { { "fr24" }, "f24" },
1626 { { "fr25" }, "f25" },
1627 { { "fr26" }, "f26" },
1628 { { "fr27" }, "f27" },
1629 { { "fr28" }, "f28" },
1630 { { "fr29" }, "f29" },
1631 { { "fr30" }, "f30" },
1632 { { "fr31" }, "f31" },
1633 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001634};
1635
Craig Topperf054e3a2015-10-19 03:52:27 +00001636ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1637 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001638}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001639
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001640class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001641public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001642 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1643 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001644 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001645
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001646 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001647 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001648 case llvm::Triple::FreeBSD:
1649 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001650 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001651 PtrDiffType = SignedInt;
1652 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001653 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001654 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001655 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001656 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001657
Roman Divacky3ffe7462012-03-13 19:20:17 +00001658 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1659 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001660 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001661 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001662
1663 // PPC32 supports atomics up to 4 bytes.
1664 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001665 }
1666
Craig Topper3164f332014-03-11 03:39:26 +00001667 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001668 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001669 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001670 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001671};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001672
Bill Schmidt778d3872013-07-26 01:36:11 +00001673// Note: ABI differences may eventually require us to have a separate
1674// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001675class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001677 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1678 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001679 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001680 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001681 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001682
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001683 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1684 resetDataLayout("e-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001685 ABI = "elfv2";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001686 } else {
1687 resetDataLayout("E-m:e-i64:64-n32:64");
Eric Christopher4855ba82017-02-10 03:32:34 +00001688 ABI = "elfv1";
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001689 }
Eric Christopher4855ba82017-02-10 03:32:34 +00001690
Eric Christopherf6ee1f32017-02-10 04:35:21 +00001691 switch (getTriple().getOS()) {
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001692 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001693 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001694 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001695 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001696 case llvm::Triple::NetBSD:
1697 IntMaxType = SignedLongLong;
1698 Int64Type = SignedLongLong;
1699 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001700 default:
1701 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001702 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001703
1704 // PPC64 supports atomics up to 8 bytes.
1705 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001706 }
Craig Topper3164f332014-03-11 03:39:26 +00001707 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001708 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001709 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001710 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001711 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001712 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001713 ABI = Name;
1714 return true;
1715 }
1716 return false;
1717 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001718};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001719
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001720class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001721public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001722 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1723 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001724 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001725 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001726 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001727 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001728 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001729 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001730 }
Craig Topper3164f332014-03-11 03:39:26 +00001731 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001732 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 }
1734};
1735
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001736class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001737public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001738 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1739 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001740 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001741 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001742 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001743 }
1744};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001745
Eric Christopherc48497a2015-09-18 21:26:24 +00001746static const unsigned NVPTXAddrSpaceMap[] = {
1747 1, // opencl_global
1748 3, // opencl_local
1749 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001750 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001751 0, // opencl_generic
1752 1, // cuda_device
1753 4, // cuda_constant
1754 3, // cuda_shared
1755};
1756
1757class NVPTXTargetInfo : public TargetInfo {
1758 static const char *const GCCRegNames[];
1759 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001760 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001761 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001762
Eric Christopherc48497a2015-09-18 21:26:24 +00001763public:
Justin Lebarb6626592017-01-05 16:53:21 +00001764 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1765 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001766 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001767 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1768 "NVPTX only supports 32- and 64-bit modes.");
1769
Eric Christopherc48497a2015-09-18 21:26:24 +00001770 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001771 AddrSpaceMap = &NVPTXAddrSpaceMap;
1772 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001773
Eric Christopherc48497a2015-09-18 21:26:24 +00001774 // Define available target features
1775 // These must be defined in sorted order!
1776 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001777 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001778
Justin Lebarb6626592017-01-05 16:53:21 +00001779 if (TargetPointerWidth == 32)
1780 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1781 else
1782 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1783
Justin Lebar76945b22016-04-29 23:05:19 +00001784 // If possible, get a TargetInfo for our host triple, so we can match its
1785 // types.
1786 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001787 if (!HostTriple.isNVPTX())
1788 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1789
1790 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001791 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001792 LongWidth = LongAlign = TargetPointerWidth;
1793 PointerWidth = PointerAlign = TargetPointerWidth;
1794 switch (TargetPointerWidth) {
1795 case 32:
1796 SizeType = TargetInfo::UnsignedInt;
1797 PtrDiffType = TargetInfo::SignedInt;
1798 IntPtrType = TargetInfo::SignedInt;
1799 break;
1800 case 64:
1801 SizeType = TargetInfo::UnsignedLong;
1802 PtrDiffType = TargetInfo::SignedLong;
1803 IntPtrType = TargetInfo::SignedLong;
1804 break;
1805 default:
1806 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1807 }
Justin Lebar76945b22016-04-29 23:05:19 +00001808 return;
1809 }
1810
Justin Lebarb6626592017-01-05 16:53:21 +00001811 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001812 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1813 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1814 BoolWidth = HostTarget->getBoolWidth();
1815 BoolAlign = HostTarget->getBoolAlign();
1816 IntWidth = HostTarget->getIntWidth();
1817 IntAlign = HostTarget->getIntAlign();
1818 HalfWidth = HostTarget->getHalfWidth();
1819 HalfAlign = HostTarget->getHalfAlign();
1820 FloatWidth = HostTarget->getFloatWidth();
1821 FloatAlign = HostTarget->getFloatAlign();
1822 DoubleWidth = HostTarget->getDoubleWidth();
1823 DoubleAlign = HostTarget->getDoubleAlign();
1824 LongWidth = HostTarget->getLongWidth();
1825 LongAlign = HostTarget->getLongAlign();
1826 LongLongWidth = HostTarget->getLongLongWidth();
1827 LongLongAlign = HostTarget->getLongLongAlign();
1828 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001829 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001830 DefaultAlignForAttributeAligned =
1831 HostTarget->getDefaultAlignForAttributeAligned();
1832 SizeType = HostTarget->getSizeType();
1833 IntMaxType = HostTarget->getIntMaxType();
1834 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1835 IntPtrType = HostTarget->getIntPtrType();
1836 WCharType = HostTarget->getWCharType();
1837 WIntType = HostTarget->getWIntType();
1838 Char16Type = HostTarget->getChar16Type();
1839 Char32Type = HostTarget->getChar32Type();
1840 Int64Type = HostTarget->getInt64Type();
1841 SigAtomicType = HostTarget->getSigAtomicType();
1842 ProcessIDType = HostTarget->getProcessIDType();
1843
1844 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1845 UseZeroLengthBitfieldAlignment =
1846 HostTarget->useZeroLengthBitfieldAlignment();
1847 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1848 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1849
Justin Lebar5057f172016-09-09 20:35:43 +00001850 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1851 // we need those macros to be identical on host and device, because (among
1852 // other things) they affect which standard library classes are defined, and
1853 // we need all classes to be defined on both the host and device.
1854 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1855
Justin Lebar76945b22016-04-29 23:05:19 +00001856 // Properties intentionally not copied from host:
1857 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1858 // host/device boundary.
1859 // - SuitableAlign: Not visible across the host/device boundary, and may
1860 // correctly be different on host/device, e.g. if host has wider vector
1861 // types than device.
1862 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1863 // as its double type, but that's not necessarily true on the host.
1864 // TODO: nvcc emits a warning when using long double on device; we should
1865 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001866 }
1867 void getTargetDefines(const LangOptions &Opts,
1868 MacroBuilder &Builder) const override {
1869 Builder.defineMacro("__PTX__");
1870 Builder.defineMacro("__NVPTX__");
1871 if (Opts.CUDAIsDevice) {
1872 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001873 std::string CUDAArchCode = [this] {
1874 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001875 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001876 assert(false && "No GPU arch when compiling CUDA device code.");
1877 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001878 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001879 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001880 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001881 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001882 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001883 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001884 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001885 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001886 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001887 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001888 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001889 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001890 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001891 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001892 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001893 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001894 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001895 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001896 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001898 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001899 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001900 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001901 return "620";
1902 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001903 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001904 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001905 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001906 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001907 }
Craig Topper6c03a542015-10-19 04:51:35 +00001908 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1909 return llvm::makeArrayRef(BuiltinInfo,
1910 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 }
Artem Belevichfda99052016-09-28 17:47:35 +00001912 bool
1913 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1914 StringRef CPU,
1915 const std::vector<std::string> &FeaturesVec) const override {
1916 Features["satom"] = GPU >= CudaArch::SM_60;
1917 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1918 }
1919
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001921 return llvm::StringSwitch<bool>(Feature)
1922 .Cases("ptx", "nvptx", true)
1923 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1924 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001925 }
1926
Craig Topperf054e3a2015-10-19 03:52:27 +00001927 ArrayRef<const char *> getGCCRegNames() const override;
1928 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001929 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001930 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001931 }
1932 bool validateAsmConstraint(const char *&Name,
1933 TargetInfo::ConstraintInfo &Info) const override {
1934 switch (*Name) {
1935 default:
1936 return false;
1937 case 'c':
1938 case 'h':
1939 case 'r':
1940 case 'l':
1941 case 'f':
1942 case 'd':
1943 Info.setAllowsRegister();
1944 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001945 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001946 }
1947 const char *getClobbers() const override {
1948 // FIXME: Is this really right?
1949 return "";
1950 }
1951 BuiltinVaListKind getBuiltinVaListKind() const override {
1952 // FIXME: implement
1953 return TargetInfo::CharPtrBuiltinVaList;
1954 }
1955 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001956 GPU = StringToCudaArch(Name);
1957 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001958 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001959 void setSupportedOpenCLOpts() override {
1960 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001961 Opts.support("cl_clang_storage_class_specifiers");
1962 Opts.support("cl_khr_gl_sharing");
1963 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001964
Yaxun Liu5b746652016-12-18 05:18:55 +00001965 Opts.support("cl_khr_fp64");
1966 Opts.support("cl_khr_byte_addressable_store");
1967 Opts.support("cl_khr_global_int32_base_atomics");
1968 Opts.support("cl_khr_global_int32_extended_atomics");
1969 Opts.support("cl_khr_local_int32_base_atomics");
1970 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001971 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001972
1973 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1974 // CUDA compilations support all of the host's calling conventions.
1975 //
1976 // TODO: We should warn if you apply a non-default CC to anything other than
1977 // a host function.
1978 if (HostTarget)
1979 return HostTarget->checkCallingConvention(CC);
1980 return CCCR_Warning;
1981 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001982};
1983
1984const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1985#define BUILTIN(ID, TYPE, ATTRS) \
1986 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1987#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1988 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001989#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1990 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001991#include "clang/Basic/BuiltinsNVPTX.def"
1992};
1993
1994const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1995
Craig Topperf054e3a2015-10-19 03:52:27 +00001996ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1997 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001998}
1999
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002000static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002001 1, // opencl_global
2002 3, // opencl_local
2003 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00002004 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00002005 1, // cuda_device
2006 2, // cuda_constant
2007 3 // cuda_shared
2008};
2009
Tom Stellarda96344b2014-08-21 13:58:40 +00002010// If you edit the description strings, make sure you update
2011// getPointerWidthV().
2012
Craig Topper273dbc62015-10-18 05:29:26 +00002013static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002014 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2015 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002016
Craig Topper273dbc62015-10-18 05:29:26 +00002017static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002018 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00002019 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2020 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002021
Matt Arsenault250024f2016-06-08 01:56:42 +00002022class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002023 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002024 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002025
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002026 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002027 enum GPUKind {
2028 GK_NONE,
2029 GK_R600,
2030 GK_R600_DOUBLE_OPS,
2031 GK_R700,
2032 GK_R700_DOUBLE_OPS,
2033 GK_EVERGREEN,
2034 GK_EVERGREEN_DOUBLE_OPS,
2035 GK_NORTHERN_ISLANDS,
2036 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002037 GK_GFX6,
2038 GK_GFX7,
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002039 GK_GFX8,
2040 GK_GFX9
Tom Stellardc74b1e02013-03-04 17:40:53 +00002041 } GPU;
2042
Jan Veselyeebeaea2015-05-04 19:53:36 +00002043 bool hasFP64:1;
2044 bool hasFMAF:1;
2045 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002046 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002047
Matt Arsenault250024f2016-06-08 01:56:42 +00002048 static bool isAMDGCN(const llvm::Triple &TT) {
2049 return TT.getArch() == llvm::Triple::amdgcn;
2050 }
2051
Eli Friedmand13b41e2012-10-12 23:32:00 +00002052public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002053 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002054 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002055 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002056 hasFP64(false),
2057 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002058 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002059 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002060 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002061 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002062 hasFMAF = true;
2063 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002064 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002065
2066 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2067 DataLayoutStringSI : DataLayoutStringR600);
2068
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002069 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002070 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002071 }
2072
Tom Stellarda96344b2014-08-21 13:58:40 +00002073 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2074 if (GPU <= GK_CAYMAN)
2075 return 32;
2076
2077 switch(AddrSpace) {
2078 default:
2079 return 64;
2080 case 0:
2081 case 3:
2082 case 5:
2083 return 32;
2084 }
2085 }
2086
Yaxun Liu26f75662016-08-19 05:17:25 +00002087 uint64_t getMaxPointerWidth() const override {
2088 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2089 }
2090
Craig Topper3164f332014-03-11 03:39:26 +00002091 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002092 return "";
2093 }
2094
Craig Topperf054e3a2015-10-19 03:52:27 +00002095 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002096
Craig Topperf054e3a2015-10-19 03:52:27 +00002097 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2098 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002099 }
2100
Craig Topper3164f332014-03-11 03:39:26 +00002101 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002102 TargetInfo::ConstraintInfo &Info) const override {
2103 switch (*Name) {
2104 default: break;
2105 case 'v': // vgpr
2106 case 's': // sgpr
2107 Info.setAllowsRegister();
2108 return true;
2109 }
2110 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002111 }
2112
Matt Arsenault250024f2016-06-08 01:56:42 +00002113 bool initFeatureMap(llvm::StringMap<bool> &Features,
2114 DiagnosticsEngine &Diags, StringRef CPU,
2115 const std::vector<std::string> &FeatureVec) const override;
2116
Yaxun Liu2c17e822016-08-09 19:43:38 +00002117 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2118 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002119 bool hasFP32Denormals = false;
2120 bool hasFP64Denormals = false;
2121 for (auto &I : TargetOpts.FeaturesAsWritten) {
2122 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2123 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002124 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 hasFP64Denormals = true;
2126 }
2127 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002128 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2129 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002130 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002131 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002132 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002133 }
2134
Craig Topper6c03a542015-10-19 04:51:35 +00002135 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2136 return llvm::makeArrayRef(BuiltinInfo,
2137 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002138 }
2139
Craig Topper3164f332014-03-11 03:39:26 +00002140 void getTargetDefines(const LangOptions &Opts,
2141 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002142 if (getTriple().getArch() == llvm::Triple::amdgcn)
2143 Builder.defineMacro("__AMDGCN__");
2144 else
2145 Builder.defineMacro("__R600__");
2146
Jan Veselyeebeaea2015-05-04 19:53:36 +00002147 if (hasFMAF)
2148 Builder.defineMacro("__HAS_FMAF__");
2149 if (hasLDEXPF)
2150 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002151 if (hasFP64)
2152 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002153 }
2154
Craig Topper3164f332014-03-11 03:39:26 +00002155 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002156 return TargetInfo::CharPtrBuiltinVaList;
2157 }
2158
Matt Arsenault250024f2016-06-08 01:56:42 +00002159 static GPUKind parseR600Name(StringRef Name) {
2160 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002161 .Case("r600" , GK_R600)
2162 .Case("rv610", GK_R600)
2163 .Case("rv620", GK_R600)
2164 .Case("rv630", GK_R600)
2165 .Case("rv635", GK_R600)
2166 .Case("rs780", GK_R600)
2167 .Case("rs880", GK_R600)
2168 .Case("rv670", GK_R600_DOUBLE_OPS)
2169 .Case("rv710", GK_R700)
2170 .Case("rv730", GK_R700)
2171 .Case("rv740", GK_R700_DOUBLE_OPS)
2172 .Case("rv770", GK_R700_DOUBLE_OPS)
2173 .Case("palm", GK_EVERGREEN)
2174 .Case("cedar", GK_EVERGREEN)
2175 .Case("sumo", GK_EVERGREEN)
2176 .Case("sumo2", GK_EVERGREEN)
2177 .Case("redwood", GK_EVERGREEN)
2178 .Case("juniper", GK_EVERGREEN)
2179 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2180 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2181 .Case("barts", GK_NORTHERN_ISLANDS)
2182 .Case("turks", GK_NORTHERN_ISLANDS)
2183 .Case("caicos", GK_NORTHERN_ISLANDS)
2184 .Case("cayman", GK_CAYMAN)
2185 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002186 .Default(GK_NONE);
2187 }
2188
2189 static GPUKind parseAMDGCNName(StringRef Name) {
2190 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002191 .Case("tahiti", GK_GFX6)
2192 .Case("pitcairn", GK_GFX6)
2193 .Case("verde", GK_GFX6)
2194 .Case("oland", GK_GFX6)
2195 .Case("hainan", GK_GFX6)
2196 .Case("bonaire", GK_GFX7)
2197 .Case("kabini", GK_GFX7)
2198 .Case("kaveri", GK_GFX7)
2199 .Case("hawaii", GK_GFX7)
2200 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002201 .Case("gfx700", GK_GFX7)
2202 .Case("gfx701", GK_GFX7)
2203 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002204 .Case("tonga", GK_GFX8)
2205 .Case("iceland", GK_GFX8)
2206 .Case("carrizo", GK_GFX8)
2207 .Case("fiji", GK_GFX8)
2208 .Case("stoney", GK_GFX8)
2209 .Case("polaris10", GK_GFX8)
2210 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002211 .Case("gfx800", GK_GFX8)
2212 .Case("gfx801", GK_GFX8)
2213 .Case("gfx802", GK_GFX8)
2214 .Case("gfx803", GK_GFX8)
2215 .Case("gfx804", GK_GFX8)
2216 .Case("gfx810", GK_GFX8)
Matt Arsenaulteb952fd2017-02-18 19:02:41 +00002217 .Case("gfx900", GK_GFX9)
2218 .Case("gfx901", GK_GFX9)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002219 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002220 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002221
Matt Arsenault250024f2016-06-08 01:56:42 +00002222 bool setCPU(const std::string &Name) override {
2223 if (getTriple().getArch() == llvm::Triple::amdgcn)
2224 GPU = parseAMDGCNName(Name);
2225 else
2226 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002227
Matt Arsenault250024f2016-06-08 01:56:42 +00002228 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002229 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002230
Jan Vesely211ba782016-06-17 02:25:03 +00002231 void setSupportedOpenCLOpts() override {
2232 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002233 Opts.support("cl_clang_storage_class_specifiers");
2234 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002235
Jan Vesely211ba782016-06-17 02:25:03 +00002236 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002237 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002238 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002239 Opts.support("cl_khr_byte_addressable_store");
2240 Opts.support("cl_khr_global_int32_base_atomics");
2241 Opts.support("cl_khr_global_int32_extended_atomics");
2242 Opts.support("cl_khr_local_int32_base_atomics");
2243 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002244 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002245 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002246 Opts.support("cl_khr_fp16");
2247 Opts.support("cl_khr_int64_base_atomics");
2248 Opts.support("cl_khr_int64_extended_atomics");
2249 Opts.support("cl_khr_mipmap_image");
2250 Opts.support("cl_khr_subgroups");
2251 Opts.support("cl_khr_3d_image_writes");
2252 Opts.support("cl_amd_media_ops");
2253 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002254 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002255 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002256
Yaxun Liu99444cb2016-08-03 20:38:06 +00002257 LangAS::ID getOpenCLImageAddrSpace() const override {
2258 return LangAS::opencl_constant;
2259 }
2260
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002261 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2262 switch (CC) {
2263 default:
2264 return CCCR_Warning;
2265 case CC_C:
2266 case CC_OpenCLKernel:
2267 return CCCR_OK;
2268 }
2269 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002270
2271 // In amdgcn target the null pointer in global, constant, and generic
2272 // address space has value 0 but in private and local address space has
2273 // value ~0.
2274 uint64_t getNullPointerValue(unsigned AS) const override {
2275 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2276 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002277};
2278
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002279const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002280#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002281 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002282#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2283 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002284#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002285};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002286const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002287 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2288 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2289 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2290 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2291 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2292 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2293 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2294 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2295 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2296 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2297 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2298 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2299 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2300 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2301 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2302 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2303 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2304 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2305 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2306 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2307 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2308 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2309 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2310 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2311 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2312 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2313 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2314 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2315 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2316 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2317 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2318 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2319 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2320 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2321 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2322 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2323 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2324 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2325 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2326 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2327 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2328 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2329 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2330 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2331 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2332 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2333 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002334 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002335 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2336 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002337};
2338
Craig Topperf054e3a2015-10-19 03:52:27 +00002339ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2340 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002341}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002342
Matt Arsenault250024f2016-06-08 01:56:42 +00002343bool AMDGPUTargetInfo::initFeatureMap(
2344 llvm::StringMap<bool> &Features,
2345 DiagnosticsEngine &Diags, StringRef CPU,
2346 const std::vector<std::string> &FeatureVec) const {
2347
2348 // XXX - What does the member GPU mean if device name string passed here?
2349 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2350 if (CPU.empty())
2351 CPU = "tahiti";
2352
2353 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002354 case GK_GFX6:
2355 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002356 break;
2357
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002358 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002359 Features["s-memrealtime"] = true;
2360 Features["16-bit-insts"] = true;
2361 break;
2362
2363 case GK_NONE:
2364 return false;
2365 default:
2366 llvm_unreachable("unhandled subtarget");
2367 }
2368 } else {
2369 if (CPU.empty())
2370 CPU = "r600";
2371
2372 switch (parseR600Name(CPU)) {
2373 case GK_R600:
2374 case GK_R700:
2375 case GK_EVERGREEN:
2376 case GK_NORTHERN_ISLANDS:
2377 break;
2378 case GK_R600_DOUBLE_OPS:
2379 case GK_R700_DOUBLE_OPS:
2380 case GK_EVERGREEN_DOUBLE_OPS:
2381 case GK_CAYMAN:
2382 Features["fp64"] = true;
2383 break;
2384 case GK_NONE:
2385 return false;
2386 default:
2387 llvm_unreachable("unhandled subtarget");
2388 }
2389 }
2390
2391 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2392}
2393
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002394const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002395#define BUILTIN(ID, TYPE, ATTRS) \
2396 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002397#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002398 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002399#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2400 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002401#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002402
2403#define BUILTIN(ID, TYPE, ATTRS) \
2404 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002405#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2406 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002407#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2408 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2409#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002410};
Eli Friedmanb5366062008-05-20 14:21:01 +00002411
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002412
Nuno Lopescfca1f02009-12-23 17:49:57 +00002413static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002414 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2415 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002416 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002417 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2418 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2419 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002420 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002421 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2422 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002423 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2424 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2425 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2426 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2427 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2428 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2429 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2430 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002431 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002432};
2433
Eric Christophercdd36352011-06-21 00:05:20 +00002434const TargetInfo::AddlRegName AddlRegNames[] = {
2435 { { "al", "ah", "eax", "rax" }, 0 },
2436 { { "bl", "bh", "ebx", "rbx" }, 3 },
2437 { { "cl", "ch", "ecx", "rcx" }, 2 },
2438 { { "dl", "dh", "edx", "rdx" }, 1 },
2439 { { "esi", "rsi" }, 4 },
2440 { { "edi", "rdi" }, 5 },
2441 { { "esp", "rsp" }, 7 },
2442 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002443 { { "r8d", "r8w", "r8b" }, 38 },
2444 { { "r9d", "r9w", "r9b" }, 39 },
2445 { { "r10d", "r10w", "r10b" }, 40 },
2446 { { "r11d", "r11w", "r11b" }, 41 },
2447 { { "r12d", "r12w", "r12b" }, 42 },
2448 { { "r13d", "r13w", "r13b" }, 43 },
2449 { { "r14d", "r14w", "r14b" }, 44 },
2450 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002451};
2452
2453// X86 target abstract base class; x86-32 and x86-64 are very close, so
2454// most of the implementation can be shared.
2455class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002456 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002457 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002458 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002459 enum MMX3DNowEnum {
2460 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002461 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002462 enum XOPEnum {
2463 NoXOP,
2464 SSE4A,
2465 FMA4,
2466 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002467 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002468
Craig Topper543f3bd2015-10-14 23:47:57 +00002469 bool HasAES = false;
2470 bool HasPCLMUL = false;
2471 bool HasLZCNT = false;
2472 bool HasRDRND = false;
2473 bool HasFSGSBASE = false;
2474 bool HasBMI = false;
2475 bool HasBMI2 = false;
2476 bool HasPOPCNT = false;
2477 bool HasRTM = false;
2478 bool HasPRFCHW = false;
2479 bool HasRDSEED = false;
2480 bool HasADX = false;
2481 bool HasTBM = false;
2482 bool HasFMA = false;
2483 bool HasF16C = false;
2484 bool HasAVX512CD = false;
2485 bool HasAVX512ER = false;
2486 bool HasAVX512PF = false;
2487 bool HasAVX512DQ = false;
2488 bool HasAVX512BW = false;
2489 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002490 bool HasAVX512VBMI = false;
2491 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002492 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002493 bool HasMPX = false;
2494 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002495 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002496 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002497 bool HasXSAVE = false;
2498 bool HasXSAVEOPT = false;
2499 bool HasXSAVEC = false;
2500 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002501 bool HasMWAITX = false;
Craig Topper45742262017-02-09 06:10:14 +00002502 bool HasCLZERO = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002503 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002504 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002505 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002506 bool HasMOVBE = false;
2507 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002508
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002509 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2510 ///
2511 /// Each enumeration represents a particular CPU supported by Clang. These
2512 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2513 enum CPUKind {
2514 CK_Generic,
2515
2516 /// \name i386
2517 /// i386-generation processors.
2518 //@{
2519 CK_i386,
2520 //@}
2521
2522 /// \name i486
2523 /// i486-generation processors.
2524 //@{
2525 CK_i486,
2526 CK_WinChipC6,
2527 CK_WinChip2,
2528 CK_C3,
2529 //@}
2530
2531 /// \name i586
2532 /// i586-generation processors, P5 microarchitecture based.
2533 //@{
2534 CK_i586,
2535 CK_Pentium,
2536 CK_PentiumMMX,
2537 //@}
2538
2539 /// \name i686
2540 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2541 //@{
2542 CK_i686,
2543 CK_PentiumPro,
2544 CK_Pentium2,
2545 CK_Pentium3,
2546 CK_Pentium3M,
2547 CK_PentiumM,
2548 CK_C3_2,
2549
2550 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2551 /// Clang however has some logic to suport this.
2552 // FIXME: Warn, deprecate, and potentially remove this.
2553 CK_Yonah,
2554 //@}
2555
2556 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002557 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002558 //@{
2559 CK_Pentium4,
2560 CK_Pentium4M,
2561 CK_Prescott,
2562 CK_Nocona,
2563 //@}
2564
2565 /// \name Core
2566 /// Core microarchitecture based processors.
2567 //@{
2568 CK_Core2,
2569
2570 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2571 /// codename which GCC no longer accepts as an option to -march, but Clang
2572 /// has some logic for recognizing it.
2573 // FIXME: Warn, deprecate, and potentially remove this.
2574 CK_Penryn,
2575 //@}
2576
2577 /// \name Atom
2578 /// Atom processors
2579 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002580 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002581 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002582 //@}
2583
2584 /// \name Nehalem
2585 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002586 CK_Nehalem,
2587
2588 /// \name Westmere
2589 /// Westmere microarchitecture based processors.
2590 CK_Westmere,
2591
2592 /// \name Sandy Bridge
2593 /// Sandy Bridge microarchitecture based processors.
2594 CK_SandyBridge,
2595
2596 /// \name Ivy Bridge
2597 /// Ivy Bridge microarchitecture based processors.
2598 CK_IvyBridge,
2599
2600 /// \name Haswell
2601 /// Haswell microarchitecture based processors.
2602 CK_Haswell,
2603
2604 /// \name Broadwell
2605 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002606 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002607
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002608 /// \name Skylake Client
2609 /// Skylake client microarchitecture based processors.
2610 CK_SkylakeClient,
2611
2612 /// \name Skylake Server
2613 /// Skylake server microarchitecture based processors.
2614 CK_SkylakeServer,
2615
2616 /// \name Cannonlake Client
2617 /// Cannonlake client microarchitecture based processors.
2618 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002619
Craig Topper449314e2013-08-20 07:09:39 +00002620 /// \name Knights Landing
2621 /// Knights Landing processor.
2622 CK_KNL,
2623
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002624 /// \name Lakemont
2625 /// Lakemont microarchitecture based processors.
2626 CK_Lakemont,
2627
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002628 /// \name K6
2629 /// K6 architecture processors.
2630 //@{
2631 CK_K6,
2632 CK_K6_2,
2633 CK_K6_3,
2634 //@}
2635
2636 /// \name K7
2637 /// K7 architecture processors.
2638 //@{
2639 CK_Athlon,
2640 CK_AthlonThunderbird,
2641 CK_Athlon4,
2642 CK_AthlonXP,
2643 CK_AthlonMP,
2644 //@}
2645
2646 /// \name K8
2647 /// K8 architecture processors.
2648 //@{
2649 CK_Athlon64,
2650 CK_Athlon64SSE3,
2651 CK_AthlonFX,
2652 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002653 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002654 CK_Opteron,
2655 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002656 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002657 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002658
Benjamin Kramer569f2152012-01-10 11:50:18 +00002659 /// \name Bobcat
2660 /// Bobcat architecture processors.
2661 //@{
2662 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002663 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002664 //@}
2665
2666 /// \name Bulldozer
2667 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002668 //@{
2669 CK_BDVER1,
2670 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002671 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002672 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002673 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002674
Craig Topperc45744a2017-01-10 06:02:12 +00002675 /// \name zen
2676 /// Zen architecture processors.
2677 //@{
2678 CK_ZNVER1,
2679 //@}
2680
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002681 /// This specification is deprecated and will be removed in the future.
2682 /// Users should prefer \see CK_K8.
2683 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002684 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002685 CK_x86_64,
2686 //@}
2687
2688 /// \name Geode
2689 /// Geode processors.
2690 //@{
2691 CK_Geode
2692 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002693 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002694
Eric Christopherc50738f2015-08-27 00:05:50 +00002695 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002696 return llvm::StringSwitch<CPUKind>(CPU)
2697 .Case("i386", CK_i386)
2698 .Case("i486", CK_i486)
2699 .Case("winchip-c6", CK_WinChipC6)
2700 .Case("winchip2", CK_WinChip2)
2701 .Case("c3", CK_C3)
2702 .Case("i586", CK_i586)
2703 .Case("pentium", CK_Pentium)
2704 .Case("pentium-mmx", CK_PentiumMMX)
2705 .Case("i686", CK_i686)
2706 .Case("pentiumpro", CK_PentiumPro)
2707 .Case("pentium2", CK_Pentium2)
2708 .Case("pentium3", CK_Pentium3)
2709 .Case("pentium3m", CK_Pentium3M)
2710 .Case("pentium-m", CK_PentiumM)
2711 .Case("c3-2", CK_C3_2)
2712 .Case("yonah", CK_Yonah)
2713 .Case("pentium4", CK_Pentium4)
2714 .Case("pentium4m", CK_Pentium4M)
2715 .Case("prescott", CK_Prescott)
2716 .Case("nocona", CK_Nocona)
2717 .Case("core2", CK_Core2)
2718 .Case("penryn", CK_Penryn)
2719 .Case("bonnell", CK_Bonnell)
2720 .Case("atom", CK_Bonnell) // Legacy name.
2721 .Case("silvermont", CK_Silvermont)
2722 .Case("slm", CK_Silvermont) // Legacy name.
2723 .Case("nehalem", CK_Nehalem)
2724 .Case("corei7", CK_Nehalem) // Legacy name.
2725 .Case("westmere", CK_Westmere)
2726 .Case("sandybridge", CK_SandyBridge)
2727 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2728 .Case("ivybridge", CK_IvyBridge)
2729 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2730 .Case("haswell", CK_Haswell)
2731 .Case("core-avx2", CK_Haswell) // Legacy name.
2732 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002733 .Case("skylake", CK_SkylakeClient)
2734 .Case("skylake-avx512", CK_SkylakeServer)
2735 .Case("skx", CK_SkylakeServer) // Legacy name.
2736 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002737 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002738 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002739 .Case("k6", CK_K6)
2740 .Case("k6-2", CK_K6_2)
2741 .Case("k6-3", CK_K6_3)
2742 .Case("athlon", CK_Athlon)
2743 .Case("athlon-tbird", CK_AthlonThunderbird)
2744 .Case("athlon-4", CK_Athlon4)
2745 .Case("athlon-xp", CK_AthlonXP)
2746 .Case("athlon-mp", CK_AthlonMP)
2747 .Case("athlon64", CK_Athlon64)
2748 .Case("athlon64-sse3", CK_Athlon64SSE3)
2749 .Case("athlon-fx", CK_AthlonFX)
2750 .Case("k8", CK_K8)
2751 .Case("k8-sse3", CK_K8SSE3)
2752 .Case("opteron", CK_Opteron)
2753 .Case("opteron-sse3", CK_OpteronSSE3)
2754 .Case("barcelona", CK_AMDFAM10)
2755 .Case("amdfam10", CK_AMDFAM10)
2756 .Case("btver1", CK_BTVER1)
2757 .Case("btver2", CK_BTVER2)
2758 .Case("bdver1", CK_BDVER1)
2759 .Case("bdver2", CK_BDVER2)
2760 .Case("bdver3", CK_BDVER3)
2761 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002762 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002763 .Case("x86-64", CK_x86_64)
2764 .Case("geode", CK_Geode)
2765 .Default(CK_Generic);
2766 }
2767
Rafael Espindolaeb265472013-08-21 21:59:03 +00002768 enum FPMathKind {
2769 FP_Default,
2770 FP_SSE,
2771 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002772 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002773
Eli Friedman3fd920a2008-08-20 02:34:37 +00002774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002775 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2776 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002777 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002778 }
Craig Topper3164f332014-03-11 03:39:26 +00002779 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002780 // X87 evaluates with 80 bits "long double" precision.
2781 return SSELevel == NoSSE ? 2 : 0;
2782 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002783 ArrayRef<const char *> getGCCRegNames() const override {
2784 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002785 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002786 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2787 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002788 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002789 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2790 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002791 }
Eric Christopherd9832702015-06-29 21:00:05 +00002792 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002793 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002794 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002795
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002796 bool validateGlobalRegisterVariable(StringRef RegName,
2797 unsigned RegSize,
2798 bool &HasSizeMismatch) const override {
2799 // esp and ebp are the only 32-bit registers the x86 backend can currently
2800 // handle.
2801 if (RegName.equals("esp") || RegName.equals("ebp")) {
2802 // Check that the register size is 32-bit.
2803 HasSizeMismatch = RegSize != 32;
2804 return true;
2805 }
2806
2807 return false;
2808 }
2809
Akira Hatanaka974131e2014-09-18 18:17:18 +00002810 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2811
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002812 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2813
Akira Hatanaka974131e2014-09-18 18:17:18 +00002814 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2815
Craig Topper3164f332014-03-11 03:39:26 +00002816 std::string convertConstraint(const char *&Constraint) const override;
2817 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002818 return "~{dirflag},~{fpsr},~{flags}";
2819 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002820
2821 StringRef getConstraintRegister(const StringRef &Constraint,
2822 const StringRef &Expression) const override {
2823 StringRef::iterator I, E;
2824 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2825 if (isalpha(*I))
2826 break;
2827 }
2828 if (I == E)
2829 return "";
2830 switch (*I) {
2831 // For the register constraints, return the matching register name
2832 case 'a':
2833 return "ax";
2834 case 'b':
2835 return "bx";
2836 case 'c':
2837 return "cx";
2838 case 'd':
2839 return "dx";
2840 case 'S':
2841 return "si";
2842 case 'D':
2843 return "di";
2844 // In case the constraint is 'r' we need to return Expression
2845 case 'r':
2846 return Expression;
2847 default:
2848 // Default value if there is no constraint for the register
2849 return "";
2850 }
2851 return "";
2852 }
2853
Craig Topper3164f332014-03-11 03:39:26 +00002854 void getTargetDefines(const LangOptions &Opts,
2855 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002856 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2857 bool Enabled);
2858 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2859 bool Enabled);
2860 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2861 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002862 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2863 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002864 setFeatureEnabledImpl(Features, Name, Enabled);
2865 }
2866 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002867 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002868 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2869 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002870 bool
2871 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2872 StringRef CPU,
2873 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002874 bool hasFeature(StringRef Feature) const override;
2875 bool handleTargetFeatures(std::vector<std::string> &Features,
2876 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002877 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002878 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2879 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002880 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002881 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002882 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002883 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002884 return "no-mmx";
2885 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002886 }
Craig Topper3164f332014-03-11 03:39:26 +00002887 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002888 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002889
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002890 // Perform any per-CPU checks necessary to determine if this CPU is
2891 // acceptable.
2892 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2893 // invalid without explaining *why*.
2894 switch (CPU) {
2895 case CK_Generic:
2896 // No processor selected!
2897 return false;
2898
2899 case CK_i386:
2900 case CK_i486:
2901 case CK_WinChipC6:
2902 case CK_WinChip2:
2903 case CK_C3:
2904 case CK_i586:
2905 case CK_Pentium:
2906 case CK_PentiumMMX:
2907 case CK_i686:
2908 case CK_PentiumPro:
2909 case CK_Pentium2:
2910 case CK_Pentium3:
2911 case CK_Pentium3M:
2912 case CK_PentiumM:
2913 case CK_Yonah:
2914 case CK_C3_2:
2915 case CK_Pentium4:
2916 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002917 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002918 case CK_Prescott:
2919 case CK_K6:
2920 case CK_K6_2:
2921 case CK_K6_3:
2922 case CK_Athlon:
2923 case CK_AthlonThunderbird:
2924 case CK_Athlon4:
2925 case CK_AthlonXP:
2926 case CK_AthlonMP:
2927 case CK_Geode:
2928 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002929 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002930 return false;
2931
2932 // Fallthrough
2933 case CK_Nocona:
2934 case CK_Core2:
2935 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002936 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002937 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002938 case CK_Nehalem:
2939 case CK_Westmere:
2940 case CK_SandyBridge:
2941 case CK_IvyBridge:
2942 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002943 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002944 case CK_SkylakeClient:
2945 case CK_SkylakeServer:
2946 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002947 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002948 case CK_Athlon64:
2949 case CK_Athlon64SSE3:
2950 case CK_AthlonFX:
2951 case CK_K8:
2952 case CK_K8SSE3:
2953 case CK_Opteron:
2954 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002955 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002956 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002957 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002958 case CK_BDVER1:
2959 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002960 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002961 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002962 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002963 case CK_x86_64:
2964 return true;
2965 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002966 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002967 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002968
Craig Topper3164f332014-03-11 03:39:26 +00002969 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002970
Craig Topper3164f332014-03-11 03:39:26 +00002971 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002972 // Most of the non-ARM calling conventions are i386 conventions.
2973 switch (CC) {
2974 case CC_X86ThisCall:
2975 case CC_X86FastCall:
2976 case CC_X86StdCall:
2977 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002978 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002979 case CC_C:
2980 case CC_Swift:
2981 case CC_X86Pascal:
2982 case CC_IntelOclBicc:
2983 return CCCR_OK;
2984 default:
2985 return CCCR_Warning;
2986 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002987 }
2988
Craig Topper3164f332014-03-11 03:39:26 +00002989 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002990 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002991 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002992
2993 bool hasSjLjLowering() const override {
2994 return true;
2995 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002996
2997 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00002998 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002999 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00003000};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003001
Rafael Espindolaeb265472013-08-21 21:59:03 +00003002bool X86TargetInfo::setFPMath(StringRef Name) {
3003 if (Name == "387") {
3004 FPMath = FP_387;
3005 return true;
3006 }
3007 if (Name == "sse") {
3008 FPMath = FP_SSE;
3009 return true;
3010 }
3011 return false;
3012}
3013
Eric Christopher007b0a02015-08-28 22:32:01 +00003014bool X86TargetInfo::initFeatureMap(
3015 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003016 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003017 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003018 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003019 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003020 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003021
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003022 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003023
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003024 // Enable X87 for all X86 processors but Lakemont.
3025 if (Kind != CK_Lakemont)
3026 setFeatureEnabledImpl(Features, "x87", true);
3027
3028 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003029 case CK_Generic:
3030 case CK_i386:
3031 case CK_i486:
3032 case CK_i586:
3033 case CK_Pentium:
3034 case CK_i686:
3035 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003036 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003037 break;
3038 case CK_PentiumMMX:
3039 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003040 case CK_K6:
3041 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003042 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003043 break;
3044 case CK_Pentium3:
3045 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003046 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003047 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003048 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003049 break;
3050 case CK_PentiumM:
3051 case CK_Pentium4:
3052 case CK_Pentium4M:
3053 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003054 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003055 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003056 break;
3057 case CK_Yonah:
3058 case CK_Prescott:
3059 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003060 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003061 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003062 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003063 break;
3064 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003065 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003066 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003067 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003068 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003069 break;
3070 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003071 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003072 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003073 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003074 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003075 case CK_Cannonlake:
3076 setFeatureEnabledImpl(Features, "avx512ifma", true);
3077 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3078 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003079 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003080 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003081 setFeatureEnabledImpl(Features, "avx512f", true);
3082 setFeatureEnabledImpl(Features, "avx512cd", true);
3083 setFeatureEnabledImpl(Features, "avx512dq", true);
3084 setFeatureEnabledImpl(Features, "avx512bw", true);
3085 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003086 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003087 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003088 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003089 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003090 setFeatureEnabledImpl(Features, "xsavec", true);
3091 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003092 setFeatureEnabledImpl(Features, "mpx", true);
3093 setFeatureEnabledImpl(Features, "sgx", true);
3094 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003095 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003096 case CK_Broadwell:
3097 setFeatureEnabledImpl(Features, "rdseed", true);
3098 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003099 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003100 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003101 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003102 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003103 setFeatureEnabledImpl(Features, "bmi", true);
3104 setFeatureEnabledImpl(Features, "bmi2", true);
3105 setFeatureEnabledImpl(Features, "rtm", true);
3106 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003107 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003108 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003109 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003110 setFeatureEnabledImpl(Features, "rdrnd", true);
3111 setFeatureEnabledImpl(Features, "f16c", true);
3112 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003113 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003114 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003115 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003116 setFeatureEnabledImpl(Features, "xsave", true);
3117 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003118 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003119 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003120 case CK_Silvermont:
3121 setFeatureEnabledImpl(Features, "aes", true);
3122 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003123 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003124 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003125 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003126 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003127 setFeatureEnabledImpl(Features, "cx16", true);
3128 break;
3129 case CK_KNL:
3130 setFeatureEnabledImpl(Features, "avx512f", true);
3131 setFeatureEnabledImpl(Features, "avx512cd", true);
3132 setFeatureEnabledImpl(Features, "avx512er", true);
3133 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003134 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003135 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003136 setFeatureEnabledImpl(Features, "rdseed", true);
3137 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003138 setFeatureEnabledImpl(Features, "lzcnt", true);
3139 setFeatureEnabledImpl(Features, "bmi", true);
3140 setFeatureEnabledImpl(Features, "bmi2", true);
3141 setFeatureEnabledImpl(Features, "rtm", true);
3142 setFeatureEnabledImpl(Features, "fma", true);
3143 setFeatureEnabledImpl(Features, "rdrnd", true);
3144 setFeatureEnabledImpl(Features, "f16c", true);
3145 setFeatureEnabledImpl(Features, "fsgsbase", true);
3146 setFeatureEnabledImpl(Features, "aes", true);
3147 setFeatureEnabledImpl(Features, "pclmul", true);
3148 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003149 setFeatureEnabledImpl(Features, "xsaveopt", true);
3150 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003151 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003152 break;
3153 case CK_K6_2:
3154 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003155 case CK_WinChip2:
3156 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003157 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003158 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003159 case CK_Athlon:
3160 case CK_AthlonThunderbird:
3161 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003162 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003163 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003164 case CK_Athlon4:
3165 case CK_AthlonXP:
3166 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003167 setFeatureEnabledImpl(Features, "sse", true);
3168 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003169 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003170 break;
3171 case CK_K8:
3172 case CK_Opteron:
3173 case CK_Athlon64:
3174 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003175 setFeatureEnabledImpl(Features, "sse2", true);
3176 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003177 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003178 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003179 case CK_AMDFAM10:
3180 setFeatureEnabledImpl(Features, "sse4a", true);
3181 setFeatureEnabledImpl(Features, "lzcnt", true);
3182 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003183 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003184 case CK_K8SSE3:
3185 case CK_OpteronSSE3:
3186 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003187 setFeatureEnabledImpl(Features, "sse3", true);
3188 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003189 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003190 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003191 case CK_BTVER2:
3192 setFeatureEnabledImpl(Features, "avx", true);
3193 setFeatureEnabledImpl(Features, "aes", true);
3194 setFeatureEnabledImpl(Features, "pclmul", true);
3195 setFeatureEnabledImpl(Features, "bmi", true);
3196 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003197 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003198 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003199 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003200 setFeatureEnabledImpl(Features, "ssse3", true);
3201 setFeatureEnabledImpl(Features, "sse4a", true);
3202 setFeatureEnabledImpl(Features, "lzcnt", true);
3203 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003204 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003205 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003206 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003207 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003208 case CK_ZNVER1:
3209 setFeatureEnabledImpl(Features, "adx", true);
3210 setFeatureEnabledImpl(Features, "aes", true);
3211 setFeatureEnabledImpl(Features, "avx2", true);
3212 setFeatureEnabledImpl(Features, "bmi", true);
3213 setFeatureEnabledImpl(Features, "bmi2", true);
3214 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper45742262017-02-09 06:10:14 +00003215 setFeatureEnabledImpl(Features, "clzero", true);
Craig Topperc45744a2017-01-10 06:02:12 +00003216 setFeatureEnabledImpl(Features, "cx16", true);
3217 setFeatureEnabledImpl(Features, "f16c", true);
3218 setFeatureEnabledImpl(Features, "fma", true);
3219 setFeatureEnabledImpl(Features, "fsgsbase", true);
3220 setFeatureEnabledImpl(Features, "fxsr", true);
3221 setFeatureEnabledImpl(Features, "lzcnt", true);
3222 setFeatureEnabledImpl(Features, "mwaitx", true);
3223 setFeatureEnabledImpl(Features, "movbe", true);
3224 setFeatureEnabledImpl(Features, "pclmul", true);
3225 setFeatureEnabledImpl(Features, "popcnt", true);
3226 setFeatureEnabledImpl(Features, "prfchw", true);
3227 setFeatureEnabledImpl(Features, "rdrnd", true);
3228 setFeatureEnabledImpl(Features, "rdseed", true);
3229 setFeatureEnabledImpl(Features, "sha", true);
3230 setFeatureEnabledImpl(Features, "sse4a", true);
3231 setFeatureEnabledImpl(Features, "xsave", true);
3232 setFeatureEnabledImpl(Features, "xsavec", true);
3233 setFeatureEnabledImpl(Features, "xsaveopt", true);
3234 setFeatureEnabledImpl(Features, "xsaves", true);
3235 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003236 case CK_BDVER4:
3237 setFeatureEnabledImpl(Features, "avx2", true);
3238 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003239 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003240 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003241 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003242 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003243 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003244 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003245 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003246 setFeatureEnabledImpl(Features, "bmi", true);
3247 setFeatureEnabledImpl(Features, "fma", true);
3248 setFeatureEnabledImpl(Features, "f16c", true);
3249 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003250 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003251 case CK_BDVER1:
3252 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003253 setFeatureEnabledImpl(Features, "xop", true);
3254 setFeatureEnabledImpl(Features, "lzcnt", true);
3255 setFeatureEnabledImpl(Features, "aes", true);
3256 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003257 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003258 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003259 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003260 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003261 break;
Eli Friedman33465822011-07-08 23:31:17 +00003262 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003263 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3264 return false;
3265
3266 // Can't do this earlier because we need to be able to explicitly enable
3267 // or disable these features and the things that they depend upon.
3268
3269 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3270 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003271 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003272 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3273 FeaturesVec.end())
3274 Features["popcnt"] = true;
3275
3276 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3277 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003278 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003279 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3280 FeaturesVec.end())
3281 Features["prfchw"] = true;
3282
Eric Christophera7260af2015-10-08 20:10:18 +00003283 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3284 // then enable MMX.
3285 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003286 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003287 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3288 FeaturesVec.end())
3289 Features["mmx"] = true;
3290
Eric Christopherbbd746d2015-10-08 20:10:14 +00003291 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003292}
3293
Rafael Espindolae62e2792013-08-20 13:44:29 +00003294void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003295 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003296 if (Enabled) {
3297 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003298 case AVX512F:
3299 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003300 case AVX2:
3301 Features["avx2"] = true;
3302 case AVX:
3303 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003304 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003305 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003306 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003307 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003308 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003309 case SSSE3:
3310 Features["ssse3"] = true;
3311 case SSE3:
3312 Features["sse3"] = true;
3313 case SSE2:
3314 Features["sse2"] = true;
3315 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003316 Features["sse"] = true;
3317 case NoSSE:
3318 break;
3319 }
3320 return;
3321 }
3322
3323 switch (Level) {
3324 case NoSSE:
3325 case SSE1:
3326 Features["sse"] = false;
3327 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003328 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3329 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003330 case SSE3:
3331 Features["sse3"] = false;
3332 setXOPLevel(Features, NoXOP, false);
3333 case SSSE3:
3334 Features["ssse3"] = false;
3335 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003336 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003337 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003338 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003339 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003340 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3341 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003342 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003343 case AVX2:
3344 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003345 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003346 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003347 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003348 Features["avx512vl"] = Features["avx512vbmi"] =
3349 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003350 }
3351}
3352
3353void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003354 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003355 if (Enabled) {
3356 switch (Level) {
3357 case AMD3DNowAthlon:
3358 Features["3dnowa"] = true;
3359 case AMD3DNow:
3360 Features["3dnow"] = true;
3361 case MMX:
3362 Features["mmx"] = true;
3363 case NoMMX3DNow:
3364 break;
3365 }
3366 return;
3367 }
3368
3369 switch (Level) {
3370 case NoMMX3DNow:
3371 case MMX:
3372 Features["mmx"] = false;
3373 case AMD3DNow:
3374 Features["3dnow"] = false;
3375 case AMD3DNowAthlon:
3376 Features["3dnowa"] = false;
3377 }
3378}
3379
3380void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003381 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003382 if (Enabled) {
3383 switch (Level) {
3384 case XOP:
3385 Features["xop"] = true;
3386 case FMA4:
3387 Features["fma4"] = true;
3388 setSSELevel(Features, AVX, true);
3389 case SSE4A:
3390 Features["sse4a"] = true;
3391 setSSELevel(Features, SSE3, true);
3392 case NoXOP:
3393 break;
3394 }
3395 return;
3396 }
3397
3398 switch (Level) {
3399 case NoXOP:
3400 case SSE4A:
3401 Features["sse4a"] = false;
3402 case FMA4:
3403 Features["fma4"] = false;
3404 case XOP:
3405 Features["xop"] = false;
3406 }
3407}
3408
Craig Topper86d79ef2013-09-17 04:51:29 +00003409void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3410 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003411 // This is a bit of a hack to deal with the sse4 target feature when used
3412 // as part of the target attribute. We handle sse4 correctly everywhere
3413 // else. See below for more information on how we handle the sse4 options.
3414 if (Name != "sse4")
3415 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003416
Craig Topper29561122013-09-19 01:13:07 +00003417 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003419 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003421 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003422 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003423 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003424 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003425 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003426 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003427 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003428 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003429 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003430 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003431 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003432 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003433 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003434 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003435 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003436 if (Enabled)
3437 setSSELevel(Features, SSE2, Enabled);
3438 } else if (Name == "pclmul") {
3439 if (Enabled)
3440 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003441 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003442 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003443 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003444 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003445 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003446 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003447 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3448 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3449 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003450 if (Enabled)
3451 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003452 // Enable BWI instruction if VBMI is being enabled.
3453 if (Name == "avx512vbmi" && Enabled)
3454 Features["avx512bw"] = true;
3455 // Also disable VBMI if BWI is being disabled.
3456 if (Name == "avx512bw" && !Enabled)
3457 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003458 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003459 if (Enabled)
3460 setSSELevel(Features, AVX, Enabled);
3461 } else if (Name == "fma4") {
3462 setXOPLevel(Features, FMA4, Enabled);
3463 } else if (Name == "xop") {
3464 setXOPLevel(Features, XOP, Enabled);
3465 } else if (Name == "sse4a") {
3466 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003467 } else if (Name == "f16c") {
3468 if (Enabled)
3469 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003470 } else if (Name == "sha") {
3471 if (Enabled)
3472 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003473 } else if (Name == "sse4") {
3474 // We can get here via the __target__ attribute since that's not controlled
3475 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3476 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3477 // disabled.
3478 if (Enabled)
3479 setSSELevel(Features, SSE42, Enabled);
3480 else
3481 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003482 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003483 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003484 Features["xsaveopt"] = false;
3485 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003486 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003487 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003488 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003489}
3490
Eric Christopher3ff21b32013-10-16 21:26:26 +00003491/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003492/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003493bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003494 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003495 for (const auto &Feature : Features) {
3496 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003497 continue;
3498
Eric Christopher610fe112015-08-26 08:21:55 +00003499 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003500 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003501 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003502 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003503 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003504 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003505 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003506 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003507 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003508 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003509 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003510 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003511 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003512 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003513 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003514 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003515 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003516 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003517 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003518 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003519 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003520 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003521 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003522 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003523 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003524 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003525 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003526 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003527 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003528 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003529 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003530 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003531 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003532 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003533 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003534 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003535 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003536 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003537 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003538 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003539 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003540 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003541 } else if (Feature == "+avx512vbmi") {
3542 HasAVX512VBMI = true;
3543 } else if (Feature == "+avx512ifma") {
3544 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003545 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003546 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003547 } else if (Feature == "+mpx") {
3548 HasMPX = true;
3549 } else if (Feature == "+movbe") {
3550 HasMOVBE = true;
3551 } else if (Feature == "+sgx") {
3552 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003553 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003554 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003555 } else if (Feature == "+fxsr") {
3556 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003557 } else if (Feature == "+xsave") {
3558 HasXSAVE = true;
3559 } else if (Feature == "+xsaveopt") {
3560 HasXSAVEOPT = true;
3561 } else if (Feature == "+xsavec") {
3562 HasXSAVEC = true;
3563 } else if (Feature == "+xsaves") {
3564 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003565 } else if (Feature == "+mwaitx") {
3566 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003567 } else if (Feature == "+pku") {
3568 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003569 } else if (Feature == "+clflushopt") {
3570 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003571 } else if (Feature == "+clwb") {
3572 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003573 } else if (Feature == "+prefetchwt1") {
3574 HasPREFETCHWT1 = true;
Craig Topper45742262017-02-09 06:10:14 +00003575 } else if (Feature == "+clzero") {
3576 HasCLZERO = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003577 }
3578
Benjamin Kramer27402c62012-03-05 15:10:44 +00003579 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003580 .Case("+avx512f", AVX512F)
3581 .Case("+avx2", AVX2)
3582 .Case("+avx", AVX)
3583 .Case("+sse4.2", SSE42)
3584 .Case("+sse4.1", SSE41)
3585 .Case("+ssse3", SSSE3)
3586 .Case("+sse3", SSE3)
3587 .Case("+sse2", SSE2)
3588 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003589 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003590 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003591
Eli Friedman33465822011-07-08 23:31:17 +00003592 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003593 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003594 .Case("+3dnowa", AMD3DNowAthlon)
3595 .Case("+3dnow", AMD3DNow)
3596 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003597 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003598 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003599
3600 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003601 .Case("+xop", XOP)
3602 .Case("+fma4", FMA4)
3603 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003604 .Default(NoXOP);
3605 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003606 }
Eli Friedman33465822011-07-08 23:31:17 +00003607
Rafael Espindolaeb265472013-08-21 21:59:03 +00003608 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3609 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003610 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3611 (FPMath == FP_387 && SSELevel >= SSE1)) {
3612 Diags.Report(diag::err_target_unsupported_fpmath) <<
3613 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003614 return false;
3615 }
3616
Alexey Bataev00396512015-07-02 03:40:19 +00003617 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003618 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003619 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003620}
Chris Lattnerecd49032009-03-02 22:27:17 +00003621
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003622/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3623/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003624void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003625 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003626 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003627 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003628 Builder.defineMacro("__amd64__");
3629 Builder.defineMacro("__amd64");
3630 Builder.defineMacro("__x86_64");
3631 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003632 if (getTriple().getArchName() == "x86_64h") {
3633 Builder.defineMacro("__x86_64h");
3634 Builder.defineMacro("__x86_64h__");
3635 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003636 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003637 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003638 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003639
Chris Lattnerecd49032009-03-02 22:27:17 +00003640 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003641 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3642 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003643 switch (CPU) {
3644 case CK_Generic:
3645 break;
3646 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003647 // The rest are coming from the i386 define above.
3648 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003649 break;
3650 case CK_i486:
3651 case CK_WinChipC6:
3652 case CK_WinChip2:
3653 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003654 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003655 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003656 case CK_PentiumMMX:
3657 Builder.defineMacro("__pentium_mmx__");
3658 Builder.defineMacro("__tune_pentium_mmx__");
3659 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003660 case CK_i586:
3661 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003662 defineCPUMacros(Builder, "i586");
3663 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003664 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003665 case CK_Pentium3:
3666 case CK_Pentium3M:
3667 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003668 Builder.defineMacro("__tune_pentium3__");
3669 // Fallthrough
3670 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003671 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003672 Builder.defineMacro("__tune_pentium2__");
3673 // Fallthrough
3674 case CK_PentiumPro:
3675 Builder.defineMacro("__tune_i686__");
3676 Builder.defineMacro("__tune_pentiumpro__");
3677 // Fallthrough
3678 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003679 Builder.defineMacro("__i686");
3680 Builder.defineMacro("__i686__");
3681 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3682 Builder.defineMacro("__pentiumpro");
3683 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003684 break;
3685 case CK_Pentium4:
3686 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003687 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003688 break;
3689 case CK_Yonah:
3690 case CK_Prescott:
3691 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003692 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003693 break;
3694 case CK_Core2:
3695 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003696 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003697 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003698 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003699 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003700 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003701 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003702 defineCPUMacros(Builder, "slm");
3703 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003704 case CK_Nehalem:
3705 case CK_Westmere:
3706 case CK_SandyBridge:
3707 case CK_IvyBridge:
3708 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003709 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003710 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003711 // FIXME: Historically, we defined this legacy name, it would be nice to
3712 // remove it at some point. We've never exposed fine-grained names for
3713 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003714 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003715 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003716 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003717 defineCPUMacros(Builder, "skx");
3718 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003719 case CK_Cannonlake:
3720 break;
Craig Topper449314e2013-08-20 07:09:39 +00003721 case CK_KNL:
3722 defineCPUMacros(Builder, "knl");
3723 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003724 case CK_Lakemont:
3725 Builder.defineMacro("__tune_lakemont__");
3726 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003727 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003728 Builder.defineMacro("__k6_2__");
3729 Builder.defineMacro("__tune_k6_2__");
3730 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003731 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003732 if (CPU != CK_K6_2) { // In case of fallthrough
3733 // FIXME: GCC may be enabling these in cases where some other k6
3734 // architecture is specified but -m3dnow is explicitly provided. The
3735 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003736 Builder.defineMacro("__k6_3__");
3737 Builder.defineMacro("__tune_k6_3__");
3738 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003739 // Fallthrough
3740 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003741 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003742 break;
3743 case CK_Athlon:
3744 case CK_AthlonThunderbird:
3745 case CK_Athlon4:
3746 case CK_AthlonXP:
3747 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003748 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003749 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003750 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003751 Builder.defineMacro("__tune_athlon_sse__");
3752 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003753 break;
3754 case CK_K8:
3755 case CK_K8SSE3:
3756 case CK_x86_64:
3757 case CK_Opteron:
3758 case CK_OpteronSSE3:
3759 case CK_Athlon64:
3760 case CK_Athlon64SSE3:
3761 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003762 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003763 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003764 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003765 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003766 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003767 case CK_BTVER1:
3768 defineCPUMacros(Builder, "btver1");
3769 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003770 case CK_BTVER2:
3771 defineCPUMacros(Builder, "btver2");
3772 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003773 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003774 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003775 break;
3776 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003777 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003778 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003779 case CK_BDVER3:
3780 defineCPUMacros(Builder, "bdver3");
3781 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003782 case CK_BDVER4:
3783 defineCPUMacros(Builder, "bdver4");
3784 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003785 case CK_ZNVER1:
3786 defineCPUMacros(Builder, "znver1");
3787 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003788 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003789 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003790 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003791 }
Chris Lattner96e43572009-03-02 22:40:39 +00003792
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003793 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003794 Builder.defineMacro("__REGISTER_PREFIX__", "");
3795
Chris Lattner6df41af2009-04-19 17:32:33 +00003796 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3797 // functions in glibc header files that use FP Stack inline asm which the
3798 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003799 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003800
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003801 if (HasAES)
3802 Builder.defineMacro("__AES__");
3803
Craig Topper3f122a72012-05-31 05:18:48 +00003804 if (HasPCLMUL)
3805 Builder.defineMacro("__PCLMUL__");
3806
Craig Topper22967d42011-12-25 05:06:45 +00003807 if (HasLZCNT)
3808 Builder.defineMacro("__LZCNT__");
3809
Benjamin Kramer1e250392012-07-07 09:39:18 +00003810 if (HasRDRND)
3811 Builder.defineMacro("__RDRND__");
3812
Craig Topper8c7f2512014-11-03 06:51:41 +00003813 if (HasFSGSBASE)
3814 Builder.defineMacro("__FSGSBASE__");
3815
Craig Topper22967d42011-12-25 05:06:45 +00003816 if (HasBMI)
3817 Builder.defineMacro("__BMI__");
3818
3819 if (HasBMI2)
3820 Builder.defineMacro("__BMI2__");
3821
Craig Topper1de83482011-12-29 16:10:46 +00003822 if (HasPOPCNT)
3823 Builder.defineMacro("__POPCNT__");
3824
Michael Liao625a8752012-11-10 05:17:46 +00003825 if (HasRTM)
3826 Builder.defineMacro("__RTM__");
3827
Michael Liao74f4eaf2013-03-26 17:52:08 +00003828 if (HasPRFCHW)
3829 Builder.defineMacro("__PRFCHW__");
3830
Michael Liaoffaae352013-03-29 05:17:55 +00003831 if (HasRDSEED)
3832 Builder.defineMacro("__RDSEED__");
3833
Robert Khasanov50e6f582014-09-19 09:53:48 +00003834 if (HasADX)
3835 Builder.defineMacro("__ADX__");
3836
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003837 if (HasTBM)
3838 Builder.defineMacro("__TBM__");
3839
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003840 if (HasMWAITX)
3841 Builder.defineMacro("__MWAITX__");
3842
Rafael Espindolae62e2792013-08-20 13:44:29 +00003843 switch (XOPLevel) {
3844 case XOP:
3845 Builder.defineMacro("__XOP__");
3846 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003847 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003848 case SSE4A:
3849 Builder.defineMacro("__SSE4A__");
3850 case NoXOP:
3851 break;
3852 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003853
Craig Topperbba778b2012-06-03 21:46:30 +00003854 if (HasFMA)
3855 Builder.defineMacro("__FMA__");
3856
Manman Rena45358c2012-10-11 00:59:55 +00003857 if (HasF16C)
3858 Builder.defineMacro("__F16C__");
3859
Craig Topper679b53a2013-08-21 05:29:10 +00003860 if (HasAVX512CD)
3861 Builder.defineMacro("__AVX512CD__");
3862 if (HasAVX512ER)
3863 Builder.defineMacro("__AVX512ER__");
3864 if (HasAVX512PF)
3865 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003866 if (HasAVX512DQ)
3867 Builder.defineMacro("__AVX512DQ__");
3868 if (HasAVX512BW)
3869 Builder.defineMacro("__AVX512BW__");
3870 if (HasAVX512VL)
3871 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003872 if (HasAVX512VBMI)
3873 Builder.defineMacro("__AVX512VBMI__");
3874 if (HasAVX512IFMA)
3875 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003876
Ben Langmuir58078d02013-09-19 13:22:04 +00003877 if (HasSHA)
3878 Builder.defineMacro("__SHA__");
3879
Craig Toppere33f51f2015-10-16 06:22:36 +00003880 if (HasFXSR)
3881 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003882 if (HasXSAVE)
3883 Builder.defineMacro("__XSAVE__");
3884 if (HasXSAVEOPT)
3885 Builder.defineMacro("__XSAVEOPT__");
3886 if (HasXSAVEC)
3887 Builder.defineMacro("__XSAVEC__");
3888 if (HasXSAVES)
3889 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003890 if (HasPKU)
3891 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003892 if (HasCX16)
3893 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003894 if (HasCLFLUSHOPT)
3895 Builder.defineMacro("__CLFLUSHOPT__");
Craig Topper8c708cf2017-02-08 07:36:58 +00003896 if (HasCLWB)
3897 Builder.defineMacro("__CLWB__");
Craig Topperb16cb822017-02-08 07:56:42 +00003898 if (HasMPX)
3899 Builder.defineMacro("__MPX__");
Craig Topper204ecff2017-02-08 08:23:17 +00003900 if (HasSGX)
3901 Builder.defineMacro("__SGX__");
Craig Topperd2bf7b02017-02-08 08:23:40 +00003902 if (HasPREFETCHWT1)
3903 Builder.defineMacro("__PREFETCHWT1__");
Craig Topper45742262017-02-09 06:10:14 +00003904 if (HasCLZERO)
3905 Builder.defineMacro("__CLZERO__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003906
Chris Lattner96e43572009-03-02 22:40:39 +00003907 // Each case falls through to the previous one here.
3908 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003909 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003910 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003911 case AVX2:
3912 Builder.defineMacro("__AVX2__");
3913 case AVX:
3914 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003915 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003916 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003917 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003918 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003919 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003920 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003921 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003922 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003923 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003924 Builder.defineMacro("__SSE2__");
3925 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003926 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003927 Builder.defineMacro("__SSE__");
3928 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003929 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003930 break;
3931 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003932
Derek Schuffc7dd7222012-10-11 15:52:22 +00003933 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003934 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003935 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003936 case AVX2:
3937 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003938 case SSE42:
3939 case SSE41:
3940 case SSSE3:
3941 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003942 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003943 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003944 break;
3945 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003946 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003947 break;
3948 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003949 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003950 }
3951 }
3952
Anders Carlssone437c682010-01-27 03:47:49 +00003953 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003954 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003955 case AMD3DNowAthlon:
3956 Builder.defineMacro("__3dNOW_A__");
3957 case AMD3DNow:
3958 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003959 case MMX:
3960 Builder.defineMacro("__MMX__");
3961 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003962 break;
3963 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003964
3965 if (CPU >= CK_i486) {
3966 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3967 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3968 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3969 }
3970 if (CPU >= CK_i586)
3971 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003972}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003973
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003974bool X86TargetInfo::hasFeature(StringRef Feature) const {
3975 return llvm::StringSwitch<bool>(Feature)
3976 .Case("aes", HasAES)
3977 .Case("avx", SSELevel >= AVX)
3978 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003979 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003980 .Case("avx512cd", HasAVX512CD)
3981 .Case("avx512er", HasAVX512ER)
3982 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003983 .Case("avx512dq", HasAVX512DQ)
3984 .Case("avx512bw", HasAVX512BW)
3985 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003986 .Case("avx512vbmi", HasAVX512VBMI)
3987 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003988 .Case("bmi", HasBMI)
3989 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003990 .Case("clflushopt", HasCLFLUSHOPT)
3991 .Case("clwb", HasCLWB)
Craig Topper45742262017-02-09 06:10:14 +00003992 .Case("clzero", HasCLZERO)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003993 .Case("cx16", HasCX16)
3994 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003995 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003996 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003997 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003998 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003999 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004000 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
4001 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
4002 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004003 .Case("movbe", HasMOVBE)
4004 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00004005 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004006 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004007 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004008 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00004009 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00004010 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00004011 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00004012 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004013 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00004014 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004015 .Case("sse", SSELevel >= SSE1)
4016 .Case("sse2", SSELevel >= SSE2)
4017 .Case("sse3", SSELevel >= SSE3)
4018 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004019 .Case("sse4.1", SSELevel >= SSE41)
4020 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004021 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004022 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004023 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004024 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4025 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004026 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004027 .Case("xsave", HasXSAVE)
4028 .Case("xsavec", HasXSAVEC)
4029 .Case("xsaves", HasXSAVES)
4030 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004031 .Default(false);
4032}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004033
Eric Christopherd9832702015-06-29 21:00:05 +00004034// We can't use a generic validation scheme for the features accepted here
4035// versus subtarget features accepted in the target attribute because the
4036// bitfield structure that's initialized in the runtime only supports the
4037// below currently rather than the full range of subtarget features. (See
4038// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4039bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4040 return llvm::StringSwitch<bool>(FeatureStr)
4041 .Case("cmov", true)
4042 .Case("mmx", true)
4043 .Case("popcnt", true)
4044 .Case("sse", true)
4045 .Case("sse2", true)
4046 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004047 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004048 .Case("sse4.1", true)
4049 .Case("sse4.2", true)
4050 .Case("avx", true)
4051 .Case("avx2", true)
4052 .Case("sse4a", true)
4053 .Case("fma4", true)
4054 .Case("xop", true)
4055 .Case("fma", true)
4056 .Case("avx512f", true)
4057 .Case("bmi", true)
4058 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004059 .Case("aes", true)
4060 .Case("pclmul", true)
4061 .Case("avx512vl", true)
4062 .Case("avx512bw", true)
4063 .Case("avx512dq", true)
4064 .Case("avx512cd", true)
4065 .Case("avx512er", true)
4066 .Case("avx512pf", true)
4067 .Case("avx512vbmi", true)
4068 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004069 .Default(false);
4070}
4071
Eli Friedman3fd920a2008-08-20 02:34:37 +00004072bool
Anders Carlsson58436352009-02-28 17:11:49 +00004073X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004074 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004075 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004076 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004077 // Constant constraints.
4078 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4079 // instructions.
4080 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4081 // x86_64 instructions.
4082 case 's':
4083 Info.setRequiresImmediate();
4084 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004085 case 'I':
4086 Info.setRequiresImmediate(0, 31);
4087 return true;
4088 case 'J':
4089 Info.setRequiresImmediate(0, 63);
4090 return true;
4091 case 'K':
4092 Info.setRequiresImmediate(-128, 127);
4093 return true;
4094 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004095 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004096 return true;
4097 case 'M':
4098 Info.setRequiresImmediate(0, 3);
4099 return true;
4100 case 'N':
4101 Info.setRequiresImmediate(0, 255);
4102 return true;
4103 case 'O':
4104 Info.setRequiresImmediate(0, 127);
4105 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004106 // Register constraints.
4107 case 'Y': // 'Y' is the first character for several 2-character constraints.
4108 // Shift the pointer to the second character of the constraint.
4109 Name++;
4110 switch (*Name) {
4111 default:
4112 return false;
4113 case '0': // First SSE register.
4114 case 't': // Any SSE register, when SSE2 is enabled.
4115 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4116 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004117 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004118 Info.setAllowsRegister();
4119 return true;
4120 }
4121 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004122 // Constraint 'f' cannot be used for output operands.
4123 if (Info.ConstraintStr[0] == '=')
4124 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004125 Info.setAllowsRegister();
4126 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004127 case 'a': // eax.
4128 case 'b': // ebx.
4129 case 'c': // ecx.
4130 case 'd': // edx.
4131 case 'S': // esi.
4132 case 'D': // edi.
4133 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004134 case 't': // Top of floating point stack.
4135 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004137 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004138 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004139 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004140 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4141 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004142 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004143 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4144 case 'l': // "Index" registers: any general register that can be used as an
4145 // index in a base+index memory access.
4146 Info.setAllowsRegister();
4147 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004148 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004149 case 'C': // SSE floating point constant.
4150 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004151 return true;
4152 }
4153}
4154
Akira Hatanaka974131e2014-09-18 18:17:18 +00004155bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4156 unsigned Size) const {
4157 // Strip off constraint modifiers.
4158 while (Constraint[0] == '=' ||
4159 Constraint[0] == '+' ||
4160 Constraint[0] == '&')
4161 Constraint = Constraint.substr(1);
4162
4163 return validateOperandSize(Constraint, Size);
4164}
4165
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004166bool X86TargetInfo::validateInputSize(StringRef Constraint,
4167 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004168 return validateOperandSize(Constraint, Size);
4169}
4170
4171bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4172 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004173 switch (Constraint[0]) {
4174 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004175 case 'k':
4176 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004177 case 'y':
4178 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004179 case 'f':
4180 case 't':
4181 case 'u':
4182 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004183 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004184 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004185 if (SSELevel >= AVX512F)
4186 // 512-bit zmm registers can be used if target supports AVX512F.
4187 return Size <= 512U;
4188 else if (SSELevel >= AVX)
4189 // 256-bit ymm registers can be used if target supports AVX.
4190 return Size <= 256U;
4191 return Size <= 128U;
4192 case 'Y':
4193 // 'Y' is the first character for several 2-character constraints.
4194 switch (Constraint[1]) {
4195 default: break;
4196 case 'm':
4197 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004198 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004199 return Size <= 64;
4200 case 'i':
4201 case 't':
4202 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4203 if (SSELevel >= AVX512F)
4204 return Size <= 512U;
4205 else if (SSELevel >= AVX)
4206 return Size <= 256U;
4207 return SSELevel >= SSE2 && Size <= 128U;
4208 }
4209
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004210 }
4211
4212 return true;
4213}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004214
Eli Friedman3fd920a2008-08-20 02:34:37 +00004215std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004216X86TargetInfo::convertConstraint(const char *&Constraint) const {
4217 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004218 case 'a': return std::string("{ax}");
4219 case 'b': return std::string("{bx}");
4220 case 'c': return std::string("{cx}");
4221 case 'd': return std::string("{dx}");
4222 case 'S': return std::string("{si}");
4223 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004224 case 'p': // address
4225 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004226 case 't': // top of floating point stack.
4227 return std::string("{st}");
4228 case 'u': // second from top of floating point stack.
4229 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004230 case 'Y':
4231 switch (Constraint[1]) {
4232 default:
4233 // Break from inner switch and fall through (copy single char),
4234 // continue parsing after copying the current constraint into
4235 // the return string.
4236 break;
4237 case 'k':
4238 // "^" hints llvm that this is a 2 letter constraint.
4239 // "Constraint++" is used to promote the string iterator
4240 // to the next constraint.
4241 return std::string("^") + std::string(Constraint++, 2);
4242 }
4243 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004244 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004245 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004246 }
4247}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004248
Eli Friedman3fd920a2008-08-20 02:34:37 +00004249// X86-32 generic target
4250class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004251public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004252 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4253 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004254 DoubleAlign = LongLongAlign = 32;
4255 LongDoubleWidth = 96;
4256 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004257 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004258 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004259 SizeType = UnsignedInt;
4260 PtrDiffType = SignedInt;
4261 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004262 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004263
4264 // Use fpret for all types.
4265 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4266 (1 << TargetInfo::Double) |
4267 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004268
4269 // x86-32 has atomics up to 8 bytes
4270 // FIXME: Check that we actually have cmpxchg8b before setting
4271 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4272 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004273 }
Craig Topper3164f332014-03-11 03:39:26 +00004274 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004275 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004276 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004277
Craig Topper3164f332014-03-11 03:39:26 +00004278 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004279 if (RegNo == 0) return 0;
4280 if (RegNo == 1) return 2;
4281 return -1;
4282 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004283 bool validateOperandSize(StringRef Constraint,
4284 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004285 switch (Constraint[0]) {
4286 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004287 case 'R':
4288 case 'q':
4289 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004290 case 'a':
4291 case 'b':
4292 case 'c':
4293 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004294 case 'S':
4295 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004296 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004297 case 'A':
4298 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004299 }
4300
Akira Hatanaka974131e2014-09-18 18:17:18 +00004301 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004302 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004303 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4304 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4305 Builtin::FirstTSBuiltin + 1);
4306 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004307};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004308
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004309class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4310public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004311 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4312 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004313
Craig Topper3164f332014-03-11 03:39:26 +00004314 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004315 unsigned Major, Minor, Micro;
4316 getTriple().getOSVersion(Major, Minor, Micro);
4317 // New NetBSD uses the default rounding mode.
4318 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4319 return X86_32TargetInfo::getFloatEvalMethod();
4320 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004321 return 1;
4322 }
4323};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004324
Eli Friedmane3aa4542009-07-05 18:47:56 +00004325class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4326public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004327 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4328 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004329 SizeType = UnsignedLong;
4330 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004331 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004332 }
4333};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004334
Eli Friedman9fa28852012-08-08 23:57:20 +00004335class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4336public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004337 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4338 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004339 SizeType = UnsignedLong;
4340 IntPtrType = SignedLong;
4341 PtrDiffType = SignedLong;
4342 }
4343};
Eli Friedman9fa28852012-08-08 23:57:20 +00004344
Torok Edwinb2b37c62009-06-30 17:10:35 +00004345class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004346public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004347 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4348 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004349 LongDoubleWidth = 128;
4350 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004351 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004352 MaxVectorAlign = 256;
4353 // The watchOS simulator uses the builtin bool type for Objective-C.
4354 llvm::Triple T = llvm::Triple(Triple);
4355 if (T.isWatchOS())
4356 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004357 SizeType = UnsignedLong;
4358 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004359 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004360 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004361 }
4362
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004363 bool handleTargetFeatures(std::vector<std::string> &Features,
4364 DiagnosticsEngine &Diags) override {
4365 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4366 Diags))
4367 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004368 // We now know the features we have: we can decide how to align vectors.
4369 MaxVectorAlign =
4370 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004371 return true;
4372 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004373};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004374
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004375// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004376class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004377public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004378 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4379 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004380 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004381 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004382 bool IsWinCOFF =
4383 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004384 resetDataLayout(IsWinCOFF
4385 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4386 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004387 }
Craig Topper3164f332014-03-11 03:39:26 +00004388 void getTargetDefines(const LangOptions &Opts,
4389 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004390 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4391 }
4392};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004393
4394// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004395class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004397 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4398 const TargetOptions &Opts)
4399 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004400 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004401 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004402 }
Craig Topper3164f332014-03-11 03:39:26 +00004403 void getTargetDefines(const LangOptions &Opts,
4404 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004405 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4406 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4407 // The value of the following reflects processor type.
4408 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4409 // We lost the original triple, so we use the default.
4410 Builder.defineMacro("_M_IX86", "600");
4411 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004412};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004413
David Majnemerae1ed0e2015-05-28 04:36:18 +00004414static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004415 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4416 // supports __declspec natively under -fms-extensions, but we define a no-op
4417 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004418 if (Opts.MicrosoftExt)
4419 Builder.defineMacro("__declspec", "__declspec");
4420 else
4421 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4422
4423 if (!Opts.MicrosoftExt) {
4424 // Provide macros for all the calling convention keywords. Provide both
4425 // single and double underscore prefixed variants. These are available on
4426 // x64 as well as x86, even though they have no effect.
4427 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4428 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004429 std::string GCCSpelling = "__attribute__((__";
4430 GCCSpelling += CC;
4431 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004432 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4433 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4434 }
4435 }
4436}
4437
David Majnemerae1ed0e2015-05-28 04:36:18 +00004438static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4439 Builder.defineMacro("__MSVCRT__");
4440 Builder.defineMacro("__MINGW32__");
4441 addCygMingDefines(Opts, Builder);
4442}
4443
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004444// x86-32 MinGW target
4445class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004447 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4448 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004449 void getTargetDefines(const LangOptions &Opts,
4450 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004451 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004452 DefineStd(Builder, "WIN32", Opts);
4453 DefineStd(Builder, "WINNT", Opts);
4454 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004455 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004456 }
4457};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004458
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004459// x86-32 Cygwin target
4460class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4461public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004462 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4463 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004464 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004465 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004466 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 +00004467 }
Craig Topper3164f332014-03-11 03:39:26 +00004468 void getTargetDefines(const LangOptions &Opts,
4469 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004470 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004471 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004472 Builder.defineMacro("__CYGWIN__");
4473 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004474 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004475 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004476 if (Opts.CPlusPlus)
4477 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004478 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004479};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004480
Chris Lattnerb986aba2010-04-11 19:29:39 +00004481// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004482class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004483public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004484 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004485 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004486 }
Craig Topper3164f332014-03-11 03:39:26 +00004487 void getTargetDefines(const LangOptions &Opts,
4488 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004489 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004490 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004491 }
4492};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004493
Alexey Bataevc99b0492015-11-25 09:24:26 +00004494// X86-32 MCU target
4495class MCUX86_32TargetInfo : public X86_32TargetInfo {
4496public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004497 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4498 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004499 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004500 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004501 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 +00004502 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004503 }
4504
4505 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4506 // On MCU we support only C calling convention.
4507 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4508 }
4509
4510 void getTargetDefines(const LangOptions &Opts,
4511 MacroBuilder &Builder) const override {
4512 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4513 Builder.defineMacro("__iamcu");
4514 Builder.defineMacro("__iamcu__");
4515 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004516
4517 bool allowsLargerPreferedTypeAlignment() const override {
4518 return false;
4519 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004520};
4521
Douglas Gregor9fabd852011-07-01 22:41:14 +00004522// RTEMS Target
4523template<typename Target>
4524class RTEMSTargetInfo : public OSTargetInfo<Target> {
4525protected:
Craig Topper3164f332014-03-11 03:39:26 +00004526 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4527 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004528 // RTEMS defines; list based off of gcc output
4529
Douglas Gregor9fabd852011-07-01 22:41:14 +00004530 Builder.defineMacro("__rtems__");
4531 Builder.defineMacro("__ELF__");
4532 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004533
Douglas Gregor9fabd852011-07-01 22:41:14 +00004534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004535 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4536 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004537 switch (Triple.getArch()) {
4538 default:
4539 case llvm::Triple::x86:
4540 // this->MCountName = ".mcount";
4541 break;
4542 case llvm::Triple::mips:
4543 case llvm::Triple::mipsel:
4544 case llvm::Triple::ppc:
4545 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004546 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004547 // this->MCountName = "_mcount";
4548 break;
4549 case llvm::Triple::arm:
4550 // this->MCountName = "__mcount";
4551 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004552 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004553 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004554};
4555
Douglas Gregor9fabd852011-07-01 22:41:14 +00004556// x86-32 RTEMS target
4557class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4558public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004559 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4560 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004561 SizeType = UnsignedLong;
4562 IntPtrType = SignedLong;
4563 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004564 }
Craig Topper3164f332014-03-11 03:39:26 +00004565 void getTargetDefines(const LangOptions &Opts,
4566 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004567 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4568 Builder.defineMacro("__INTEL__");
4569 Builder.defineMacro("__rtems__");
4570 }
4571};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004572
Eli Friedman3fd920a2008-08-20 02:34:37 +00004573// x86-64 generic target
4574class X86_64TargetInfo : public X86TargetInfo {
4575public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004576 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4577 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004578 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004579 bool IsWinCOFF =
4580 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004581 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004582 LongDoubleWidth = 128;
4583 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004584 LargeArrayMinWidth = 128;
4585 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004586 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004587 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4588 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4589 IntPtrType = IsX32 ? SignedInt : SignedLong;
4590 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004591 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004592 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004593
Eric Christopher917e9522014-11-18 22:36:15 +00004594 // Pointers are 32-bit in x32.
Eric Christopherf6ee1f32017-02-10 04:35:21 +00004595 resetDataLayout(IsX32
4596 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4597 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4598 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004599
4600 // Use fpret only for long double.
4601 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004602
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004603 // Use fp2ret for _Complex long double.
4604 ComplexLongDoubleUsesFP2Ret = true;
4605
Charles Davisc7d5c942015-09-17 20:55:33 +00004606 // Make __builtin_ms_va_list available.
4607 HasBuiltinMSVaList = true;
4608
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004609 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004610 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004611 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004612 }
Craig Topper3164f332014-03-11 03:39:26 +00004613 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004614 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004615 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004616
Craig Topper3164f332014-03-11 03:39:26 +00004617 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004618 if (RegNo == 0) return 0;
4619 if (RegNo == 1) return 1;
4620 return -1;
4621 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004622
Craig Topper3164f332014-03-11 03:39:26 +00004623 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004624 switch (CC) {
4625 case CC_C:
4626 case CC_Swift:
4627 case CC_X86VectorCall:
4628 case CC_IntelOclBicc:
4629 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004630 case CC_PreserveMost:
4631 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004632 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004633 return CCCR_OK;
4634 default:
4635 return CCCR_Warning;
4636 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004637 }
4638
Craig Topper3164f332014-03-11 03:39:26 +00004639 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004640 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004641 }
4642
Pavel Chupinfd223e12014-08-04 12:39:43 +00004643 // for x32 we need it here explicitly
4644 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004645 unsigned getUnwindWordWidth() const override { return 64; }
4646 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004647
4648 bool validateGlobalRegisterVariable(StringRef RegName,
4649 unsigned RegSize,
4650 bool &HasSizeMismatch) const override {
4651 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4652 // handle.
4653 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4654 // Check that the register size is 64-bit.
4655 HasSizeMismatch = RegSize != 64;
4656 return true;
4657 }
4658
4659 // Check if the register is a 32-bit register the backend can handle.
4660 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4661 HasSizeMismatch);
4662 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004663 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4664 return llvm::makeArrayRef(BuiltinInfoX86,
4665 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4666 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004667};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004668
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004669// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004670class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004672 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4673 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004674 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004675 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004676 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004677 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004678 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004679 SizeType = UnsignedLongLong;
4680 PtrDiffType = SignedLongLong;
4681 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004682 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004683
Craig Topper3164f332014-03-11 03:39:26 +00004684 void getTargetDefines(const LangOptions &Opts,
4685 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004686 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004687 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004688 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004689
Craig Topper3164f332014-03-11 03:39:26 +00004690 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004691 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004692 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004693
Craig Topper3164f332014-03-11 03:39:26 +00004694 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004695 switch (CC) {
4696 case CC_X86StdCall:
4697 case CC_X86ThisCall:
4698 case CC_X86FastCall:
4699 return CCCR_Ignore;
4700 case CC_C:
4701 case CC_X86VectorCall:
4702 case CC_IntelOclBicc:
4703 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004704 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004705 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004706 return CCCR_OK;
4707 default:
4708 return CCCR_Warning;
4709 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004710 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004711};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004712
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004713// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004714class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004715public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004716 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4717 const TargetOptions &Opts)
4718 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004719 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004720 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004721 }
Craig Topper3164f332014-03-11 03:39:26 +00004722 void getTargetDefines(const LangOptions &Opts,
4723 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004724 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4725 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004726 Builder.defineMacro("_M_X64", "100");
4727 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004728 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004729};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004730
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004731// x86-64 MinGW target
4732class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4733public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004734 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4735 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004736 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4737 // with x86 FP ops. Weird.
4738 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004739 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004740 }
4741
Craig Topper3164f332014-03-11 03:39:26 +00004742 void getTargetDefines(const LangOptions &Opts,
4743 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004744 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004745 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004746 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004747 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004748
4749 // GCC defines this macro when it is using __gxx_personality_seh0.
4750 if (!Opts.SjLjExceptions)
4751 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004752 }
4753};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004754
Yaron Kerend030d112015-07-22 17:38:19 +00004755// x86-64 Cygwin target
4756class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4757public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004758 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4759 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004760 TLSSupported = false;
4761 WCharType = UnsignedShort;
4762 }
4763 void getTargetDefines(const LangOptions &Opts,
4764 MacroBuilder &Builder) const override {
4765 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4766 Builder.defineMacro("__x86_64__");
4767 Builder.defineMacro("__CYGWIN__");
4768 Builder.defineMacro("__CYGWIN64__");
4769 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004770 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004771 if (Opts.CPlusPlus)
4772 Builder.defineMacro("_GNU_SOURCE");
4773
4774 // GCC defines this macro when it is using __gxx_personality_seh0.
4775 if (!Opts.SjLjExceptions)
4776 Builder.defineMacro("__SEH__");
4777 }
4778};
4779
Eli Friedman2857ccb2009-07-01 03:36:11 +00004780class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4781public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004782 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4783 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004784 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004785 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4786 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004787 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004788 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004789 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004790 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004791
4792 bool handleTargetFeatures(std::vector<std::string> &Features,
4793 DiagnosticsEngine &Diags) override {
4794 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4795 Diags))
4796 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004797 // We now know the features we have: we can decide how to align vectors.
4798 MaxVectorAlign =
4799 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004800 return true;
4801 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004802};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004803
Eli Friedman245f2292009-07-05 22:31:18 +00004804class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4805public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004806 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4807 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004808 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004809 Int64Type = SignedLongLong;
4810 }
4811};
Eli Friedman245f2292009-07-05 22:31:18 +00004812
Eli Friedman9fa28852012-08-08 23:57:20 +00004813class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4814public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004815 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4816 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004817 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004818 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004819 }
4820};
Tim Northover9bb857a2013-01-31 12:13:10 +00004821
Eli Friedmanf05b7722008-08-20 07:44:10 +00004822class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004823 // Possible FPU choices.
4824 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004825 VFP2FPU = (1 << 0),
4826 VFP3FPU = (1 << 1),
4827 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004828 NeonFPU = (1 << 3),
4829 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004830 };
4831
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004832 // Possible HWDiv features.
4833 enum HWDivMode {
4834 HWDivThumb = (1 << 0),
4835 HWDivARM = (1 << 1)
4836 };
4837
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004838 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004839 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004840 }
4841
4842 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4843 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004844
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004845 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004846
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 StringRef CPUProfile;
4848 StringRef CPUAttr;
4849
Rafael Espindolaeb265472013-08-21 21:59:03 +00004850 enum {
4851 FP_Default,
4852 FP_VFP,
4853 FP_Neon
4854 } FPMath;
4855
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004856 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004857 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004858 unsigned ArchProfile;
4859 unsigned ArchVersion;
4860
Bernard Ogdenda13af32013-10-24 18:32:51 +00004861 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004862
Logan Chien57086ce2012-10-10 06:56:20 +00004863 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004864 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004865
4866 // Initialized via features.
4867 unsigned SoftFloat : 1;
4868 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004869
Bernard Ogden18b57012013-10-29 09:47:51 +00004870 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004871 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004872 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004873 unsigned Unaligned : 1;
4874
4875 enum {
4876 LDREX_B = (1 << 0), /// byte (8-bit)
4877 LDREX_H = (1 << 1), /// half (16-bit)
4878 LDREX_W = (1 << 2), /// word (32-bit)
4879 LDREX_D = (1 << 3), /// double (64-bit)
4880 };
4881
4882 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004883
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004884 // ACLE 6.5.1 Hardware floating point
4885 enum {
4886 HW_FP_HP = (1 << 1), /// half (16-bit)
4887 HW_FP_SP = (1 << 2), /// single (32-bit)
4888 HW_FP_DP = (1 << 3), /// double (64-bit)
4889 };
4890 uint32_t HW_FP;
4891
Chris Lattner5cc15e02010-03-03 19:03:45 +00004892 static const Builtin::Info BuiltinInfo[];
4893
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004894 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004895 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004896
4897 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004898 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004899
Renato Golin0201a9e2016-09-22 19:28:20 +00004900 // size_t is unsigned long on MachO-derived environments, NetBSD,
4901 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004902 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004903 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004904 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004905 SizeType = UnsignedLong;
4906 else
4907 SizeType = UnsignedInt;
4908
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004909 switch (T.getOS()) {
4910 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004911 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004912 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004913 break;
4914 case llvm::Triple::Win32:
4915 WCharType = UnsignedShort;
4916 break;
4917 case llvm::Triple::Linux:
4918 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004919 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4920 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004921 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004922 }
4923
4924 UseBitFieldTypeAlignment = true;
4925
4926 ZeroLengthBitfieldBoundary = 0;
4927
Tim Northover147cd2f2014-10-14 22:12:21 +00004928 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4929 // so set preferred for small types to 32.
4930 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004931 resetDataLayout(BigEndian
4932 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4933 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004934 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004935 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004936 resetDataLayout("e"
4937 "-m:w"
4938 "-p:32:32"
4939 "-i64:64"
4940 "-v128:64:128"
4941 "-a:0:32"
4942 "-n32"
4943 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004944 } else if (T.isOSNaCl()) {
4945 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004946 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004947 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004948 resetDataLayout(BigEndian
4949 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4950 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004951 }
4952
4953 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004954 }
4955
Tim Northover5627d392015-10-30 16:30:45 +00004956 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004957 const llvm::Triple &T = getTriple();
4958
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004959 IsAAPCS = false;
4960
Tim Northover5627d392015-10-30 16:30:45 +00004961 if (IsAAPCS16)
4962 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4963 else
4964 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004965
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004966 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004967 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004968 SizeType = UnsignedInt;
4969 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004970 SizeType = UnsignedLong;
4971
4972 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4973 WCharType = SignedInt;
4974
4975 // Do not respect the alignment of bit-field types when laying out
4976 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4977 UseBitFieldTypeAlignment = false;
4978
4979 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4980 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4981 /// gcc.
4982 ZeroLengthBitfieldBoundary = 32;
4983
Tim Northover5627d392015-10-30 16:30:45 +00004984 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4985 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004986 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004987 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004988 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004989 BigEndian
4990 ? "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 +00004991 : "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 +00004992 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004993 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004994 BigEndian
4995 ? "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 +00004996 : "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 +00004997
4998 // FIXME: Override "preferred align" for double and long long.
4999 }
5000
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005001 void setArchInfo() {
5002 StringRef ArchName = getTriple().getArchName();
5003
Renato Goline84b0002015-10-08 16:43:26 +00005004 ArchISA = llvm::ARM::parseArchISA(ArchName);
5005 CPU = llvm::ARM::getDefaultCPU(ArchName);
5006 unsigned AK = llvm::ARM::parseArch(ArchName);
5007 if (AK != llvm::ARM::AK_INVALID)
5008 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005009 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005010 }
5011
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005012 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005013 StringRef SubArch;
5014
5015 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005016 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005017 SubArch = llvm::ARM::getSubArch(ArchKind);
5018 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5019 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005020
5021 // cache CPU related strings
5022 CPUAttr = getCPUAttr();
5023 CPUProfile = getCPUProfile();
5024 }
5025
5026 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005027 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005028 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005029 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005030 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5031 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005032 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005033 if (ArchProfile == llvm::ARM::PK_M) {
5034 MaxAtomicPromoteWidth = 32;
5035 if (ShouldUseInlineAtomic)
5036 MaxAtomicInlineWidth = 32;
5037 }
5038 else {
5039 MaxAtomicPromoteWidth = 64;
5040 if (ShouldUseInlineAtomic)
5041 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005042 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005043 }
5044
5045 bool isThumb() const {
5046 return (ArchISA == llvm::ARM::IK_THUMB);
5047 }
5048
5049 bool supportsThumb() const {
5050 return CPUAttr.count('T') || ArchVersion >= 6;
5051 }
5052
5053 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005054 return CPUAttr.equals("6T2") ||
5055 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005056 }
5057
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005058 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005059 // For most sub-arches, the build attribute CPU name is enough.
5060 // For Cortex variants, it's slightly different.
5061 switch(ArchKind) {
5062 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005063 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005064 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005065 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005066 case llvm::ARM::AK_ARMV7S:
5067 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005068 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005069 return "7A";
5070 case llvm::ARM::AK_ARMV7R:
5071 return "7R";
5072 case llvm::ARM::AK_ARMV7M:
5073 return "7M";
5074 case llvm::ARM::AK_ARMV7EM:
5075 return "7EM";
George Burgess IVfc970562017-02-09 23:30:10 +00005076 case llvm::ARM::AK_ARMV7VE:
5077 return "7VE";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005078 case llvm::ARM::AK_ARMV8A:
5079 return "8A";
5080 case llvm::ARM::AK_ARMV8_1A:
5081 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005082 case llvm::ARM::AK_ARMV8_2A:
5083 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005084 case llvm::ARM::AK_ARMV8MBaseline:
5085 return "8M_BASE";
5086 case llvm::ARM::AK_ARMV8MMainline:
5087 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005088 case llvm::ARM::AK_ARMV8R:
5089 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005090 }
5091 }
5092
5093 StringRef getCPUProfile() const {
5094 switch(ArchProfile) {
5095 case llvm::ARM::PK_A:
5096 return "A";
5097 case llvm::ARM::PK_R:
5098 return "R";
5099 case llvm::ARM::PK_M:
5100 return "M";
5101 default:
5102 return "";
5103 }
5104 }
5105
Chris Lattner17df24e2008-04-21 18:56:49 +00005106public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005107 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005108 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5109 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005110
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005111 switch (getTriple().getOS()) {
5112 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005113 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005114 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005115 break;
5116 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005117 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005118 break;
5119 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005120
Renato Goline84b0002015-10-08 16:43:26 +00005121 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005123
Chris Lattner1a8f3942010-04-23 16:29:58 +00005124 // {} in inline assembly are neon specifiers, not assembly variant
5125 // specifiers.
5126 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005127
Eric Christopher0e261882014-12-05 01:06:59 +00005128 // FIXME: This duplicates code from the driver that sets the -target-abi
5129 // option - this code is used if -target-abi isn't passed and should
5130 // be unified in some way.
5131 if (Triple.isOSBinFormatMachO()) {
5132 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5133 // the frontend matches that.
5134 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5135 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005136 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005137 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005138 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005139 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005140 } else {
5141 setABI("apcs-gnu");
5142 }
5143 } else if (Triple.isOSWindows()) {
5144 // FIXME: this is invalid for WindowsCE
5145 setABI("aapcs");
5146 } else {
5147 // Select the default based on the platform.
5148 switch (Triple.getEnvironment()) {
5149 case llvm::Triple::Android:
5150 case llvm::Triple::GNUEABI:
5151 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005152 case llvm::Triple::MuslEABI:
5153 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005154 setABI("aapcs-linux");
5155 break;
5156 case llvm::Triple::EABIHF:
5157 case llvm::Triple::EABI:
5158 setABI("aapcs");
5159 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005160 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005161 setABI("apcs-gnu");
5162 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005163 default:
5164 if (Triple.getOS() == llvm::Triple::NetBSD)
5165 setABI("apcs-gnu");
5166 else
5167 setABI("aapcs");
5168 break;
5169 }
5170 }
John McCall86353412010-08-21 22:46:04 +00005171
5172 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005173 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005174
Renato Golin15b86152015-07-03 16:41:13 +00005175 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005176 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005177
James Molloya7139222012-03-12 09:14:10 +00005178 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005179 // the alignment of the zero-length bitfield is greater than the member
5180 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005181 // zero length bitfield.
5182 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005183
5184 if (Triple.getOS() == llvm::Triple::Linux ||
5185 Triple.getOS() == llvm::Triple::UnknownOS)
5186 this->MCountName =
5187 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005188 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005189
Alp Toker4925ba72014-06-07 23:30:42 +00005190 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005191
Craig Topper3164f332014-03-11 03:39:26 +00005192 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005193 ABI = Name;
5194
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005195 // The defaults (above) are for AAPCS, check if we need to change them.
5196 //
5197 // FIXME: We need support for -meabi... we could just mangle it into the
5198 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005199 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005200 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005201 return true;
5202 }
5203 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5204 setABIAAPCS();
5205 return true;
5206 }
5207 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005208 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005209
Renato Golinf5c4dec2015-05-27 13:33:00 +00005210 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005211 bool
5212 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5213 StringRef CPU,
5214 const std::vector<std::string> &FeaturesVec) const override {
5215
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005216 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005217 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005218
5219 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005220 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005221 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5222
5223 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005224 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005225 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5226
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005227 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005228 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005229 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230
Eric Christopher007b0a02015-08-28 22:32:01 +00005231 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005232 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005233
Craig Topper3164f332014-03-11 03:39:26 +00005234 bool handleTargetFeatures(std::vector<std::string> &Features,
5235 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005236 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005237 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005238 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005239 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005240 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005241 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005242 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005243
Ranjeet Singhac08e532015-06-24 23:39:25 +00005244 // This does not diagnose illegal cases like having both
5245 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5246 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005247 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005248 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005249 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005250 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005251 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005252 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005253 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005254 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005255 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005256 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005257 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005258 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005259 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005260 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005261 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005262 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005263 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005264 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005265 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005266 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005267 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005268 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005269 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005270 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005271 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005272 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005273 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005274 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005275 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005276 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005277 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005278 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 } else if (Feature == "+strict-align") {
5280 Unaligned = 0;
5281 } else if (Feature == "+fp16") {
5282 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005283 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005284 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005285 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005286
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005287 switch (ArchVersion) {
5288 case 6:
5289 if (ArchProfile == llvm::ARM::PK_M)
5290 LDREX = 0;
5291 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5292 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5293 else
5294 LDREX = LDREX_W;
5295 break;
5296 case 7:
5297 if (ArchProfile == llvm::ARM::PK_M)
5298 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5299 else
5300 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5301 break;
5302 case 8:
5303 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5304 }
5305
Rafael Espindolaeb265472013-08-21 21:59:03 +00005306 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5307 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5308 return false;
5309 }
5310
5311 if (FPMath == FP_Neon)
5312 Features.push_back("+neonfp");
5313 else if (FPMath == FP_VFP)
5314 Features.push_back("-neonfp");
5315
Daniel Dunbar893d4752009-12-19 04:15:38 +00005316 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005317 auto Feature =
5318 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5319 if (Feature != Features.end())
5320 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005321
Rafael Espindolaeb265472013-08-21 21:59:03 +00005322 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005323 }
5324
Craig Topper3164f332014-03-11 03:39:26 +00005325 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005326 return llvm::StringSwitch<bool>(Feature)
5327 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005328 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005329 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005330 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005331 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005332 .Case("hwdiv", HWDiv & HWDivThumb)
5333 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005334 .Default(false);
5335 }
Renato Golin15b86152015-07-03 16:41:13 +00005336
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005337 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005338 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005339 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005340
Renato Golin15b86152015-07-03 16:41:13 +00005341 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005342 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005343 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005344 CPU = Name;
5345 return true;
5346 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005347
Craig Topper3164f332014-03-11 03:39:26 +00005348 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005349
Craig Topper3164f332014-03-11 03:39:26 +00005350 void getTargetDefines(const LangOptions &Opts,
5351 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005352 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005353 Builder.defineMacro("__arm");
5354 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005355 // For bare-metal none-eabi.
5356 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5357 getTriple().getEnvironment() == llvm::Triple::EABI)
5358 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005359
Chris Lattnerecd49032009-03-02 22:27:17 +00005360 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005361 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005362
5363 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5364 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005365 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005366 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5367
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005368 if (!CPUAttr.empty())
5369 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005370
5371 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005372 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005373 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005374
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005375 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005376 // ACLE 6.5.7 Crypto Extension
5377 if (Crypto)
5378 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5379 // ACLE 6.5.8 CRC32 Extension
5380 if (CRC)
5381 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5382 // ACLE 6.5.10 Numeric Maximum and Minimum
5383 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5384 // ACLE 6.5.9 Directed Rounding
5385 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005386 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005387
5388 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5389 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005390 // NOTE that the default profile is assumed to be 'A'
5391 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005392 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5393
Bradley Smithf4affc12016-03-03 13:52:22 +00005394 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5395 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5396 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5397 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005398 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005399 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005400 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005401 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5402
5403 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5404 // instruction set such as ARM or Thumb.
5405 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5406
5407 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5408
5409 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005410 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005411 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005412
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005413 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005414 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005415 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005416
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005417 // ACLE 6.4.4 LDREX/STREX
5418 if (LDREX)
5419 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5420
5421 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005422 if (ArchVersion == 5 ||
5423 (ArchVersion == 6 && CPUProfile != "M") ||
5424 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005425 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5426
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005427 // ACLE 6.5.1 Hardware Floating Point
5428 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005429 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005430
Yi Konga44c4d72014-06-27 21:25:42 +00005431 // ACLE predefines.
5432 Builder.defineMacro("__ARM_ACLE", "200");
5433
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005434 // FP16 support (we currently only support IEEE format).
5435 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5436 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5437
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005438 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005439 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005440 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5441
Mike Stump9d54bd72009-04-08 02:07:04 +00005442 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005443
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005444 // FIXME: It's more complicated than this and we don't really support
5445 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005446 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005447 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005448 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005449
David Tweed8f676532012-10-25 13:33:01 +00005450 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005451 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005452 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005453 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005454 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005455 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005456 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005457
Tim Northover28fc0e12016-04-28 13:59:55 +00005458 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5459 ABI == "aapcs16")
5460 Builder.defineMacro("__ARM_PCS_VFP", "1");
5461
Daniel Dunbar893d4752009-12-19 04:15:38 +00005462 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005463 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005464
Zijiao Ma56a83722016-08-17 02:13:33 +00005465 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005466 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005467
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005468 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005469 Builder.defineMacro("__THUMBEL__");
5470 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005471 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005472 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005473 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005474
5475 // ACLE 6.4.9 32-bit SIMD instructions
5476 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5477 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5478
5479 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005480 if (((HWDiv & HWDivThumb) && isThumb()) ||
5481 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005482 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005483 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005484 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005485
5486 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005487 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005488
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005489 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005490 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005491 if (FPU & VFP2FPU)
5492 Builder.defineMacro("__ARM_VFPV2__");
5493 if (FPU & VFP3FPU)
5494 Builder.defineMacro("__ARM_VFPV3__");
5495 if (FPU & VFP4FPU)
5496 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005497 if (FPU & FPARMV8)
5498 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005499 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005500
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005501 // This only gets set when Neon instructions are actually available, unlike
5502 // the VFP define, hence the soft float and arch check. This is subtly
5503 // different from gcc, we follow the intent which was that it should be set
5504 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005505 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005506 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005507 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005508 // current AArch32 NEON implementations do not support double-precision
5509 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005510 Builder.defineMacro("__ARM_NEON_FP",
5511 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005512 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005513
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005514 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5515 Opts.ShortWChar ? "2" : "4");
5516
5517 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5518 Opts.ShortEnums ? "1" : "4");
5519
Bradley Smithf4affc12016-03-03 13:52:22 +00005520 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005521 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5522 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5523 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5524 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5525 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005526
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005527 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005528 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005529 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005530 }
5531
5532 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005533 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005534 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5535 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005536 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005537 }
5538
5539 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005540 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005541 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005542
5543 if (Opts.UnsafeFPMath)
5544 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005545
5546 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5547 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005548 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005549
Craig Topper6c03a542015-10-19 04:51:35 +00005550 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5551 return llvm::makeArrayRef(BuiltinInfo,
5552 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005553 }
Craig Topper3164f332014-03-11 03:39:26 +00005554 bool isCLZForZeroUndef() const override { return false; }
5555 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005556 return IsAAPCS
5557 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005558 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5559 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005560 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005561 ArrayRef<const char *> getGCCRegNames() const override;
5562 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005563 bool validateAsmConstraint(const char *&Name,
5564 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005565 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005566 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005567 case 'l': // r0-r7
5568 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005569 case 't': // VFP Floating point register single precision
5570 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005571 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005572 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005573 case 'I':
5574 case 'J':
5575 case 'K':
5576 case 'L':
5577 case 'M':
5578 // FIXME
5579 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005580 case 'Q': // A memory address that is a single base register.
5581 Info.setAllowsMemory();
5582 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005583 case 'U': // a memory reference...
5584 switch (Name[1]) {
5585 case 'q': // ...ARMV4 ldrsb
5586 case 'v': // ...VFP load/store (reg+constant offset)
5587 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005588 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005589 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005590 case 'n': // valid address for Neon doubleword vector load/store
5591 case 'm': // valid address for Neon element and structure load/store
5592 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005593 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005594 Info.setAllowsMemory();
5595 Name++;
5596 return true;
5597 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005598 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005599 return false;
5600 }
Craig Topper3164f332014-03-11 03:39:26 +00005601 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005602 std::string R;
5603 switch (*Constraint) {
5604 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005605 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005606 Constraint++;
5607 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005608 case 'p': // 'p' should be translated to 'r' by default.
5609 R = std::string("r");
5610 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005611 default:
5612 return std::string(1, *Constraint);
5613 }
5614 return R;
5615 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005616 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005617 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005618 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005619 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005620 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005621
Bill Wendling9d1ee112012-10-25 23:28:48 +00005622 // Strip off constraint modifiers.
5623 while (Constraint[0] == '=' ||
5624 Constraint[0] == '+' ||
5625 Constraint[0] == '&')
5626 Constraint = Constraint.substr(1);
5627
5628 switch (Constraint[0]) {
5629 default: break;
5630 case 'r': {
5631 switch (Modifier) {
5632 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005633 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005634 case 'q':
5635 // A register of size 32 cannot fit a vector type.
5636 return false;
5637 }
5638 }
5639 }
5640
5641 return true;
5642 }
Craig Topper3164f332014-03-11 03:39:26 +00005643 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005644 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005645 return "";
5646 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005647
Craig Topper3164f332014-03-11 03:39:26 +00005648 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005649 switch (CC) {
5650 case CC_AAPCS:
5651 case CC_AAPCS_VFP:
5652 case CC_Swift:
5653 return CCCR_OK;
5654 default:
5655 return CCCR_Warning;
5656 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005657 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005658
Craig Topper3164f332014-03-11 03:39:26 +00005659 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005660 if (RegNo == 0) return 0;
5661 if (RegNo == 1) return 1;
5662 return -1;
5663 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005664
5665 bool hasSjLjLowering() const override {
5666 return true;
5667 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005668};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005669
Rafael Espindolaeb265472013-08-21 21:59:03 +00005670bool ARMTargetInfo::setFPMath(StringRef Name) {
5671 if (Name == "neon") {
5672 FPMath = FP_Neon;
5673 return true;
5674 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5675 Name == "vfp4") {
5676 FPMath = FP_VFP;
5677 return true;
5678 }
5679 return false;
5680}
5681
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005682const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005683 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005684 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005685 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5686
5687 // Float registers
5688 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5689 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5690 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005691 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005692
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005693 // Double registers
5694 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5695 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005696 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5697 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005698
5699 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005700 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5701 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005702};
5703
Craig Topperf054e3a2015-10-19 03:52:27 +00005704ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5705 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005706}
5707
5708const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005709 { { "a1" }, "r0" },
5710 { { "a2" }, "r1" },
5711 { { "a3" }, "r2" },
5712 { { "a4" }, "r3" },
5713 { { "v1" }, "r4" },
5714 { { "v2" }, "r5" },
5715 { { "v3" }, "r6" },
5716 { { "v4" }, "r7" },
5717 { { "v5" }, "r8" },
5718 { { "v6", "rfp" }, "r9" },
5719 { { "sl" }, "r10" },
5720 { { "fp" }, "r11" },
5721 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005722 { { "r13" }, "sp" },
5723 { { "r14" }, "lr" },
5724 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005725 // The S, D and Q registers overlap, but aren't really aliases; we
5726 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005727};
5728
Craig Topperf054e3a2015-10-19 03:52:27 +00005729ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5730 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005731}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005732
5733const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005734#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005735 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005736#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5737 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005738#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005739
Craig Topper07d3b622015-08-07 05:14:44 +00005740#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005741 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005742#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005743 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005744#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5745 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005746#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5747 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005748#include "clang/Basic/BuiltinsARM.def"
5749};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005750
5751class ARMleTargetInfo : public ARMTargetInfo {
5752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005753 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005754 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005755 void getTargetDefines(const LangOptions &Opts,
5756 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005757 Builder.defineMacro("__ARMEL__");
5758 ARMTargetInfo::getTargetDefines(Opts, Builder);
5759 }
5760};
5761
5762class ARMbeTargetInfo : public ARMTargetInfo {
5763public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005764 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005765 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005766 void getTargetDefines(const LangOptions &Opts,
5767 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005768 Builder.defineMacro("__ARMEB__");
5769 Builder.defineMacro("__ARM_BIG_ENDIAN");
5770 ARMTargetInfo::getTargetDefines(Opts, Builder);
5771 }
5772};
Chris Lattner17df24e2008-04-21 18:56:49 +00005773
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005774class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5775 const llvm::Triple Triple;
5776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005777 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5778 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005779 WCharType = UnsignedShort;
5780 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005781 }
5782 void getVisualStudioDefines(const LangOptions &Opts,
5783 MacroBuilder &Builder) const {
5784 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5785
5786 // FIXME: this is invalid for WindowsCE
5787 Builder.defineMacro("_M_ARM_NT", "1");
5788 Builder.defineMacro("_M_ARMT", "_M_ARM");
5789 Builder.defineMacro("_M_THUMB", "_M_ARM");
5790
5791 assert((Triple.getArch() == llvm::Triple::arm ||
5792 Triple.getArch() == llvm::Triple::thumb) &&
5793 "invalid architecture for Windows ARM target info");
5794 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5795 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5796
5797 // TODO map the complete set of values
5798 // 31: VFPv3 40: VFPv4
5799 Builder.defineMacro("_M_ARM_FP", "31");
5800 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005801 BuiltinVaListKind getBuiltinVaListKind() const override {
5802 return TargetInfo::CharPtrBuiltinVaList;
5803 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005804 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5805 switch (CC) {
5806 case CC_X86StdCall:
5807 case CC_X86ThisCall:
5808 case CC_X86FastCall:
5809 case CC_X86VectorCall:
5810 return CCCR_Ignore;
5811 case CC_C:
5812 return CCCR_OK;
5813 default:
5814 return CCCR_Warning;
5815 }
5816 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005817};
5818
5819// Windows ARM + Itanium C++ ABI Target
5820class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5821public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005822 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5823 const TargetOptions &Opts)
5824 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005825 TheCXXABI.set(TargetCXXABI::GenericARM);
5826 }
5827
5828 void getTargetDefines(const LangOptions &Opts,
5829 MacroBuilder &Builder) const override {
5830 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5831
5832 if (Opts.MSVCCompat)
5833 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5834 }
5835};
5836
5837// Windows ARM, MS (C++) ABI
5838class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5839public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005840 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5841 const TargetOptions &Opts)
5842 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005843 TheCXXABI.set(TargetCXXABI::Microsoft);
5844 }
5845
5846 void getTargetDefines(const LangOptions &Opts,
5847 MacroBuilder &Builder) const override {
5848 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5849 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5850 }
5851};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005852
Yaron Keren321249c2015-07-15 13:32:23 +00005853// ARM MinGW target
5854class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5855public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005856 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5857 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005858 TheCXXABI.set(TargetCXXABI::GenericARM);
5859 }
5860
5861 void getTargetDefines(const LangOptions &Opts,
5862 MacroBuilder &Builder) const override {
5863 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5864 DefineStd(Builder, "WIN32", Opts);
5865 DefineStd(Builder, "WINNT", Opts);
5866 Builder.defineMacro("_ARM_");
5867 addMinGWDefines(Opts, Builder);
5868 }
5869};
5870
5871// ARM Cygwin target
5872class CygwinARMTargetInfo : public ARMleTargetInfo {
5873public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005874 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5875 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005876 TLSSupported = false;
5877 WCharType = UnsignedShort;
5878 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005879 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005880 }
5881 void getTargetDefines(const LangOptions &Opts,
5882 MacroBuilder &Builder) const override {
5883 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5884 Builder.defineMacro("_ARM_");
5885 Builder.defineMacro("__CYGWIN__");
5886 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005887 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005888 if (Opts.CPlusPlus)
5889 Builder.defineMacro("_GNU_SOURCE");
5890 }
5891};
5892
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005893class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005894protected:
Craig Topper3164f332014-03-11 03:39:26 +00005895 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5896 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005897 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005898 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005899
Torok Edwinb2b37c62009-06-30 17:10:35 +00005900public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005901 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5902 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005903 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005904 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005905 // FIXME: This should be based off of the target features in
5906 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005907 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005908
Tim Northoverd88ecb32016-01-27 19:32:40 +00005909 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005910 // Darwin on iOS uses a variant of the ARM C++ ABI.
5911 TheCXXABI.set(TargetCXXABI::WatchOS);
5912
5913 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5914 // size_t is long, it's a bit weird for it to be int.
5915 PtrDiffType = SignedLong;
5916
5917 // BOOL should be a real boolean on the new ABI
5918 UseSignedCharForObjCBool = false;
5919 } else
5920 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005921 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005922};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005923
Tim Northover573cbee2014-05-24 12:52:07 +00005924class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005925 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005926 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5927 static const char *const GCCRegNames[];
5928
James Molloy75f5f9e2014-04-16 15:33:48 +00005929 enum FPUModeEnum {
5930 FPUMode,
5931 NeonMode
5932 };
5933
5934 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005935 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005936 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005937 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005938 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005939
Tim Northovera2ee4332014-03-29 15:09:45 +00005940 static const Builtin::Info BuiltinInfo[];
5941
5942 std::string ABI;
5943
5944public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005945 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005946 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005947 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5948 WCharType = SignedInt;
5949
5950 // NetBSD apparently prefers consistency across ARM targets to consistency
5951 // across 64-bit targets.
5952 Int64Type = SignedLongLong;
5953 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005954 } else {
5955 WCharType = UnsignedInt;
5956 Int64Type = SignedLong;
5957 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005958 }
5959
Tim Northovera2ee4332014-03-29 15:09:45 +00005960 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005961 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005962 MaxAtomicInlineWidth = 128;
5963 MaxAtomicPromoteWidth = 128;
5964
Tim Northovera6a19f12015-02-06 01:25:07 +00005965 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005966 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005967
Tim Northovera2ee4332014-03-29 15:09:45 +00005968 // {} in inline assembly are neon specifiers, not assembly variant
5969 // specifiers.
5970 NoAsmVariants = true;
5971
Tim Northover7ad87af2015-01-16 18:44:04 +00005972 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5973 // contributes to the alignment of the containing aggregate in the same way
5974 // a plain (non bit-field) member of that type would, without exception for
5975 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005976 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005977 UseZeroLengthBitfieldAlignment = true;
5978
Tim Northover573cbee2014-05-24 12:52:07 +00005979 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005980 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005981
5982 if (Triple.getOS() == llvm::Triple::Linux ||
5983 Triple.getOS() == llvm::Triple::UnknownOS)
5984 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005985 }
5986
Alp Toker4925ba72014-06-07 23:30:42 +00005987 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005988 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005989 if (Name != "aapcs" && Name != "darwinpcs")
5990 return false;
5991
5992 ABI = Name;
5993 return true;
5994 }
5995
David Blaikie1cbb9712014-11-14 19:09:44 +00005996 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005997 return Name == "generic" ||
5998 llvm::AArch64::parseCPUArch(Name) !=
5999 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00006000 }
6001
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006002 void getTargetDefines(const LangOptions &Opts,
6003 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006004 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00006005 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006006
6007 // Target properties.
6008 Builder.defineMacro("_LP64");
6009 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00006010
6011 // ACLE predefines. Many can only have one possible value on v8 AArch64.
6012 Builder.defineMacro("__ARM_ACLE", "200");
6013 Builder.defineMacro("__ARM_ARCH", "8");
6014 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
6015
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006016 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006017 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006018 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006019
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006020 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6021 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6022 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6023 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006024 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006025 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6026 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006027
6028 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6029
6030 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006031 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006032
6033 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6034 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006035 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6036 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006037
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006038 if (Opts.UnsafeFPMath)
6039 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006040
6041 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6042
6043 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6044 Opts.ShortEnums ? "1" : "4");
6045
James Molloy75f5f9e2014-04-16 15:33:48 +00006046 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006047 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006048 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006049 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006050 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006051
Bradley Smith418c5932014-05-02 15:17:51 +00006052 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006053 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006054
James Molloy75f5f9e2014-04-16 15:33:48 +00006055 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006056 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6057
6058 if (Unaligned)
6059 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006060
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006061 if (V8_1A)
6062 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6063
Reid Klecknerd167d422015-05-06 15:31:46 +00006064 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6065 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6066 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6067 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6068 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006069 }
6070
Craig Topper6c03a542015-10-19 04:51:35 +00006071 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6072 return llvm::makeArrayRef(BuiltinInfo,
6073 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006074 }
6075
David Blaikie1cbb9712014-11-14 19:09:44 +00006076 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006077 return Feature == "aarch64" ||
6078 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006079 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006080 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006081 }
6082
James Molloy5e73df52014-04-16 15:06:20 +00006083 bool handleTargetFeatures(std::vector<std::string> &Features,
6084 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006085 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006086 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006087 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006088 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006089 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006090
Eric Christopher610fe112015-08-26 08:21:55 +00006091 for (const auto &Feature : Features) {
6092 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006093 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006094 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006095 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006096 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006097 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006098 if (Feature == "+strict-align")
6099 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006100 if (Feature == "+v8.1a")
6101 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006102 }
6103
James Y Knightb214cbc2016-03-04 19:00:41 +00006104 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006105
6106 return true;
6107 }
6108
John McCall477f2bb2016-03-03 06:39:32 +00006109 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6110 switch (CC) {
6111 case CC_C:
6112 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006113 case CC_PreserveMost:
6114 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006115 return CCCR_OK;
6116 default:
6117 return CCCR_Warning;
6118 }
6119 }
6120
David Blaikie1cbb9712014-11-14 19:09:44 +00006121 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006122
David Blaikie1cbb9712014-11-14 19:09:44 +00006123 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006124 return TargetInfo::AArch64ABIBuiltinVaList;
6125 }
6126
Craig Topperf054e3a2015-10-19 03:52:27 +00006127 ArrayRef<const char *> getGCCRegNames() const override;
6128 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006129
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006130 bool validateAsmConstraint(const char *&Name,
6131 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006132 switch (*Name) {
6133 default:
6134 return false;
6135 case 'w': // Floating point and SIMD registers (V0-V31)
6136 Info.setAllowsRegister();
6137 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006138 case 'I': // Constant that can be used with an ADD instruction
6139 case 'J': // Constant that can be used with a SUB instruction
6140 case 'K': // Constant that can be used with a 32-bit logical instruction
6141 case 'L': // Constant that can be used with a 64-bit logical instruction
6142 case 'M': // Constant that can be used as a 32-bit MOV immediate
6143 case 'N': // Constant that can be used as a 64-bit MOV immediate
6144 case 'Y': // Floating point constant zero
6145 case 'Z': // Integer constant zero
6146 return true;
6147 case 'Q': // A memory reference with base register and no offset
6148 Info.setAllowsMemory();
6149 return true;
6150 case 'S': // A symbolic address
6151 Info.setAllowsRegister();
6152 return true;
6153 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006154 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6155 // Utf: A memory address suitable for ldp/stp in TF mode.
6156 // Usa: An absolute symbolic address.
6157 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6158 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006159 case 'z': // Zero register, wzr or xzr
6160 Info.setAllowsRegister();
6161 return true;
6162 case 'x': // Floating point and SIMD registers (V0-V15)
6163 Info.setAllowsRegister();
6164 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006165 }
6166 return false;
6167 }
6168
Akira Hatanaka987f1862014-08-22 06:05:21 +00006169 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006170 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006171 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006172 // Strip off constraint modifiers.
6173 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6174 Constraint = Constraint.substr(1);
6175
6176 switch (Constraint[0]) {
6177 default:
6178 return true;
6179 case 'z':
6180 case 'r': {
6181 switch (Modifier) {
6182 case 'x':
6183 case 'w':
6184 // For now assume that the person knows what they're
6185 // doing with the modifier.
6186 return true;
6187 default:
6188 // By default an 'r' constraint will be in the 'x'
6189 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006190 if (Size == 64)
6191 return true;
6192
6193 SuggestedModifier = "w";
6194 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006195 }
6196 }
6197 }
6198 }
6199
David Blaikie1cbb9712014-11-14 19:09:44 +00006200 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006201
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006202 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006203 if (RegNo == 0)
6204 return 0;
6205 if (RegNo == 1)
6206 return 1;
6207 return -1;
6208 }
6209};
6210
Tim Northover573cbee2014-05-24 12:52:07 +00006211const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006212 // 32-bit Integer registers
6213 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6214 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6215 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6216
6217 // 64-bit Integer registers
6218 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6219 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6220 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6221
6222 // 32-bit floating point regsisters
6223 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6224 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6225 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6226
6227 // 64-bit floating point regsisters
6228 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6229 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6230 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6231
6232 // Vector registers
6233 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6234 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6235 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6236};
6237
Craig Topperf054e3a2015-10-19 03:52:27 +00006238ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6239 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006240}
6241
Tim Northover573cbee2014-05-24 12:52:07 +00006242const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006243 { { "w31" }, "wsp" },
6244 { { "x29" }, "fp" },
6245 { { "x30" }, "lr" },
6246 { { "x31" }, "sp" },
6247 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6248 // don't want to substitute one of these for a different-sized one.
6249};
6250
Craig Topperf054e3a2015-10-19 03:52:27 +00006251ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6252 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006253}
6254
Tim Northover573cbee2014-05-24 12:52:07 +00006255const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006256#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006257 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006258#include "clang/Basic/BuiltinsNEON.def"
6259
6260#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006261 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006262#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006263};
James Molloy5e73df52014-04-16 15:06:20 +00006264
Tim Northover573cbee2014-05-24 12:52:07 +00006265class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006266 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006267 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006268 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006269 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006270 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006271 }
6272
6273public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006274 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6275 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006276 }
James Molloy5e73df52014-04-16 15:06:20 +00006277 void getTargetDefines(const LangOptions &Opts,
6278 MacroBuilder &Builder) const override {
6279 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006280 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006281 }
6282};
6283
Tim Northover573cbee2014-05-24 12:52:07 +00006284class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006285 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006286 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006287 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006288 }
6289
6290public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006291 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6292 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006293 void getTargetDefines(const LangOptions &Opts,
6294 MacroBuilder &Builder) const override {
6295 Builder.defineMacro("__AARCH64EB__");
6296 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6297 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006298 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006299 }
6300};
Tim Northovera2ee4332014-03-29 15:09:45 +00006301
Tim Northover573cbee2014-05-24 12:52:07 +00006302class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006303protected:
6304 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6305 MacroBuilder &Builder) const override {
6306 Builder.defineMacro("__AARCH64_SIMD__");
6307 Builder.defineMacro("__ARM64_ARCH_8__");
6308 Builder.defineMacro("__ARM_NEON__");
6309 Builder.defineMacro("__LITTLE_ENDIAN__");
6310 Builder.defineMacro("__REGISTER_PREFIX__", "");
6311 Builder.defineMacro("__arm64", "1");
6312 Builder.defineMacro("__arm64__", "1");
6313
6314 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6315 }
6316
Tim Northovera2ee4332014-03-29 15:09:45 +00006317public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006318 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6319 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006320 Int64Type = SignedLongLong;
6321 WCharType = SignedInt;
6322 UseSignedCharForObjCBool = false;
6323
Tim Northovera6a19f12015-02-06 01:25:07 +00006324 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006325 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006326
6327 TheCXXABI.set(TargetCXXABI::iOS64);
6328 }
6329
David Blaikie1cbb9712014-11-14 19:09:44 +00006330 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006331 return TargetInfo::CharPtrBuiltinVaList;
6332 }
6333};
Tim Northovera2ee4332014-03-29 15:09:45 +00006334
Tony Linthicum76329bf2011-12-12 21:14:55 +00006335// Hexagon abstract base class
6336class HexagonTargetInfo : public TargetInfo {
6337 static const Builtin::Info BuiltinInfo[];
6338 static const char * const GCCRegNames[];
6339 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6340 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006341 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006342 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343
Tony Linthicum76329bf2011-12-12 21:14:55 +00006344public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006345 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6346 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006347 // Specify the vector alignment explicitly. For v512x1, the calculated
6348 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6349 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006350 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006351 "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 +00006352 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006353 SizeType = UnsignedInt;
6354 PtrDiffType = SignedInt;
6355 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006356
6357 // {} in inline assembly are packet specifiers, not assembly variant
6358 // specifiers.
6359 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006360
6361 LargeArrayMinWidth = 64;
6362 LargeArrayAlign = 64;
6363 UseBitFieldTypeAlignment = true;
6364 ZeroLengthBitfieldBoundary = 32;
6365 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006366 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006367 }
6368
Craig Topper6c03a542015-10-19 04:51:35 +00006369 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6370 return llvm::makeArrayRef(BuiltinInfo,
6371 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006372 }
6373
Craig Topper3164f332014-03-11 03:39:26 +00006374 bool validateAsmConstraint(const char *&Name,
6375 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006376 switch (*Name) {
6377 case 'v':
6378 case 'q':
6379 if (HasHVX) {
6380 Info.setAllowsRegister();
6381 return true;
6382 }
6383 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006384 case 's':
6385 // Relocatable constant.
6386 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006387 }
6388 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006389 }
6390
Craig Topper3164f332014-03-11 03:39:26 +00006391 void getTargetDefines(const LangOptions &Opts,
6392 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006393
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006394 bool isCLZForZeroUndef() const override { return false; }
6395
Craig Topper3164f332014-03-11 03:39:26 +00006396 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006397 return llvm::StringSwitch<bool>(Feature)
6398 .Case("hexagon", true)
6399 .Case("hvx", HasHVX)
6400 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006401 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006403 }
Craig Topper3164f332014-03-11 03:39:26 +00006404
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006405 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6406 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6407 const override;
6408
6409 bool handleTargetFeatures(std::vector<std::string> &Features,
6410 DiagnosticsEngine &Diags) override;
6411
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006412 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6413 bool Enabled) const override;
6414
Craig Topper3164f332014-03-11 03:39:26 +00006415 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006416 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006417 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006418 ArrayRef<const char *> getGCCRegNames() const override;
6419 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006420 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006421 return "";
6422 }
Sebastian Pop86500282012-01-13 20:37:10 +00006423
6424 static const char *getHexagonCPUSuffix(StringRef Name) {
6425 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006426 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006427 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006428 .Case("hexagonv55", "55")
6429 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006430 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006431 }
6432
Craig Topper3164f332014-03-11 03:39:26 +00006433 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006434 if (!getHexagonCPUSuffix(Name))
6435 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006436 CPU = Name;
6437 return true;
6438 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006439
6440 int getEHDataRegisterNumber(unsigned RegNo) const override {
6441 return RegNo < 2 ? RegNo : -1;
6442 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006443};
6444
6445void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006447 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006448 Builder.defineMacro("__hexagon__", "1");
6449
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006451 Builder.defineMacro("__HEXAGON_V4__");
6452 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006453 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454 Builder.defineMacro("__QDSP6_V4__");
6455 Builder.defineMacro("__QDSP6_ARCH__", "4");
6456 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006458 Builder.defineMacro("__HEXAGON_V5__");
6459 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6460 if(Opts.HexagonQdsp6Compat) {
6461 Builder.defineMacro("__QDSP6_V5__");
6462 Builder.defineMacro("__QDSP6_ARCH__", "5");
6463 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006464 } else if (CPU == "hexagonv55") {
6465 Builder.defineMacro("__HEXAGON_V55__");
6466 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6467 Builder.defineMacro("__QDSP6_V55__");
6468 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006469 } else if (CPU == "hexagonv60") {
6470 Builder.defineMacro("__HEXAGON_V60__");
6471 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6472 Builder.defineMacro("__QDSP6_V60__");
6473 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006474 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006475
6476 if (hasFeature("hvx")) {
6477 Builder.defineMacro("__HVX__");
6478 if (hasFeature("hvx-double"))
6479 Builder.defineMacro("__HVXDBL__");
6480 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006481}
6482
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006483bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6484 DiagnosticsEngine &Diags, StringRef CPU,
6485 const std::vector<std::string> &FeaturesVec) const {
6486 // Default for v60: -hvx, -hvx-double.
6487 Features["hvx"] = false;
6488 Features["hvx-double"] = false;
6489 Features["long-calls"] = false;
6490
6491 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6492}
6493
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006494bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6495 DiagnosticsEngine &Diags) {
6496 for (auto &F : Features) {
6497 if (F == "+hvx")
6498 HasHVX = true;
6499 else if (F == "-hvx")
6500 HasHVX = HasHVXDouble = false;
6501 else if (F == "+hvx-double")
6502 HasHVX = HasHVXDouble = true;
6503 else if (F == "-hvx-double")
6504 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006505
6506 if (F == "+long-calls")
6507 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006508 else if (F == "-long-calls")
6509 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006510 }
6511 return true;
6512}
6513
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006514void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6515 StringRef Name, bool Enabled) const {
6516 if (Enabled) {
6517 if (Name == "hvx-double")
6518 Features["hvx"] = true;
6519 } else {
6520 if (Name == "hvx")
6521 Features["hvx-double"] = false;
6522 }
6523 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006524}
6525
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006526const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006527 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6528 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6529 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6530 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6531 "p0", "p1", "p2", "p3",
6532 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6533};
6534
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006535ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006536 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006537}
6538
Tony Linthicum76329bf2011-12-12 21:14:55 +00006539const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6540 { { "sp" }, "r29" },
6541 { { "fp" }, "r30" },
6542 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006543};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006544
Craig Topperf054e3a2015-10-19 03:52:27 +00006545ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6546 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006547}
6548
6549
6550const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006551#define BUILTIN(ID, TYPE, ATTRS) \
6552 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6553#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6554 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006555#include "clang/Basic/BuiltinsHexagon.def"
6556};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006557
Jacques Pienaard964cc22016-03-28 21:02:54 +00006558class LanaiTargetInfo : public TargetInfo {
6559 // Class for Lanai (32-bit).
6560 // The CPU profiles supported by the Lanai backend
6561 enum CPUKind {
6562 CK_NONE,
6563 CK_V11,
6564 } CPU;
6565
6566 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6567 static const char *const GCCRegNames[];
6568
6569public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006570 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6571 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006572 // Description string has to be kept in sync with backend.
6573 resetDataLayout("E" // Big endian
6574 "-m:e" // ELF name manging
6575 "-p:32:32" // 32 bit pointers, 32 bit aligned
6576 "-i64:64" // 64 bit integers, 64 bit aligned
6577 "-a:0:32" // 32 bit alignment of objects of aggregate type
6578 "-n32" // 32 bit native integer width
6579 "-S64" // 64 bit natural stack alignment
6580 );
6581
6582 // Setting RegParmMax equal to what mregparm was set to in the old
6583 // toolchain
6584 RegParmMax = 4;
6585
6586 // Set the default CPU to V11
6587 CPU = CK_V11;
6588
6589 // Temporary approach to make everything at least word-aligned and allow for
6590 // safely casting between pointers with different alignment requirements.
6591 // TODO: Remove this when there are no more cast align warnings on the
6592 // firmware.
6593 MinGlobalAlign = 32;
6594 }
6595
6596 void getTargetDefines(const LangOptions &Opts,
6597 MacroBuilder &Builder) const override {
6598 // Define __lanai__ when building for target lanai.
6599 Builder.defineMacro("__lanai__");
6600
6601 // Set define for the CPU specified.
6602 switch (CPU) {
6603 case CK_V11:
6604 Builder.defineMacro("__LANAI_V11__");
6605 break;
6606 case CK_NONE:
6607 llvm_unreachable("Unhandled target CPU");
6608 }
6609 }
6610
6611 bool setCPU(const std::string &Name) override {
6612 CPU = llvm::StringSwitch<CPUKind>(Name)
6613 .Case("v11", CK_V11)
6614 .Default(CK_NONE);
6615
6616 return CPU != CK_NONE;
6617 }
6618
6619 bool hasFeature(StringRef Feature) const override {
6620 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6621 }
6622
6623 ArrayRef<const char *> getGCCRegNames() const override;
6624
6625 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6626
6627 BuiltinVaListKind getBuiltinVaListKind() const override {
6628 return TargetInfo::VoidPtrBuiltinVaList;
6629 }
6630
6631 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6632
6633 bool validateAsmConstraint(const char *&Name,
6634 TargetInfo::ConstraintInfo &info) const override {
6635 return false;
6636 }
6637
6638 const char *getClobbers() const override { return ""; }
6639};
6640
6641const char *const LanaiTargetInfo::GCCRegNames[] = {
6642 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6643 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6644 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6645
6646ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6647 return llvm::makeArrayRef(GCCRegNames);
6648}
6649
6650const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6651 {{"pc"}, "r2"},
6652 {{"sp"}, "r4"},
6653 {{"fp"}, "r5"},
6654 {{"rv"}, "r8"},
6655 {{"rr1"}, "r10"},
6656 {{"rr2"}, "r11"},
6657 {{"rca"}, "r15"},
6658};
6659
6660ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6661 return llvm::makeArrayRef(GCCRegAliases);
6662}
6663
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006664// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6665class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006666 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6667 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006668 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006670 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006671 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006672
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006673 int getEHDataRegisterNumber(unsigned RegNo) const override {
6674 if (RegNo == 0) return 24;
6675 if (RegNo == 1) return 25;
6676 return -1;
6677 }
6678
Craig Topper3164f332014-03-11 03:39:26 +00006679 bool handleTargetFeatures(std::vector<std::string> &Features,
6680 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006681 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006682 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6683 if (Feature != Features.end()) {
6684 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006685 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006686 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006687 }
Craig Topper3164f332014-03-11 03:39:26 +00006688 void getTargetDefines(const LangOptions &Opts,
6689 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006690 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006691 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006692
6693 if (SoftFloat)
6694 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006695 }
Craig Topper3164f332014-03-11 03:39:26 +00006696
6697 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006698 return llvm::StringSwitch<bool>(Feature)
6699 .Case("softfloat", SoftFloat)
6700 .Case("sparc", true)
6701 .Default(false);
6702 }
Craig Topper3164f332014-03-11 03:39:26 +00006703
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006704 bool hasSjLjLowering() const override {
6705 return true;
6706 }
6707
Craig Topper6c03a542015-10-19 04:51:35 +00006708 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006709 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006710 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006711 }
Craig Topper3164f332014-03-11 03:39:26 +00006712 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006713 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006714 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006715 ArrayRef<const char *> getGCCRegNames() const override;
6716 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006717 bool validateAsmConstraint(const char *&Name,
6718 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006719 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006720 switch (*Name) {
6721 case 'I': // Signed 13-bit constant
6722 case 'J': // Zero
6723 case 'K': // 32-bit constant with the low 12 bits clear
6724 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6725 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6726 case 'N': // Same as 'K' but zext (required for SIMode)
6727 case 'O': // The constant 4096
6728 return true;
6729 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006730 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006731 }
Craig Topper3164f332014-03-11 03:39:26 +00006732 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006733 // FIXME: Implement!
6734 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006735 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006736
6737 // No Sparc V7 for now, the backend doesn't support it anyway.
6738 enum CPUKind {
6739 CK_GENERIC,
6740 CK_V8,
6741 CK_SUPERSPARC,
6742 CK_SPARCLITE,
6743 CK_F934,
6744 CK_HYPERSPARC,
6745 CK_SPARCLITE86X,
6746 CK_SPARCLET,
6747 CK_TSC701,
6748 CK_V9,
6749 CK_ULTRASPARC,
6750 CK_ULTRASPARC3,
6751 CK_NIAGARA,
6752 CK_NIAGARA2,
6753 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006754 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006755 CK_MYRIAD2100,
6756 CK_MYRIAD2150,
6757 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006758 CK_LEON2,
6759 CK_LEON2_AT697E,
6760 CK_LEON2_AT697F,
6761 CK_LEON3,
6762 CK_LEON3_UT699,
6763 CK_LEON3_GR712RC,
6764 CK_LEON4,
6765 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006766 } CPU = CK_GENERIC;
6767
6768 enum CPUGeneration {
6769 CG_V8,
6770 CG_V9,
6771 };
6772
6773 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6774 switch (Kind) {
6775 case CK_GENERIC:
6776 case CK_V8:
6777 case CK_SUPERSPARC:
6778 case CK_SPARCLITE:
6779 case CK_F934:
6780 case CK_HYPERSPARC:
6781 case CK_SPARCLITE86X:
6782 case CK_SPARCLET:
6783 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006784 case CK_MYRIAD2100:
6785 case CK_MYRIAD2150:
6786 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006787 case CK_LEON2:
6788 case CK_LEON2_AT697E:
6789 case CK_LEON2_AT697F:
6790 case CK_LEON3:
6791 case CK_LEON3_UT699:
6792 case CK_LEON3_GR712RC:
6793 case CK_LEON4:
6794 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006795 return CG_V8;
6796 case CK_V9:
6797 case CK_ULTRASPARC:
6798 case CK_ULTRASPARC3:
6799 case CK_NIAGARA:
6800 case CK_NIAGARA2:
6801 case CK_NIAGARA3:
6802 case CK_NIAGARA4:
6803 return CG_V9;
6804 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006805 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006806 }
6807
6808 CPUKind getCPUKind(StringRef Name) const {
6809 return llvm::StringSwitch<CPUKind>(Name)
6810 .Case("v8", CK_V8)
6811 .Case("supersparc", CK_SUPERSPARC)
6812 .Case("sparclite", CK_SPARCLITE)
6813 .Case("f934", CK_F934)
6814 .Case("hypersparc", CK_HYPERSPARC)
6815 .Case("sparclite86x", CK_SPARCLITE86X)
6816 .Case("sparclet", CK_SPARCLET)
6817 .Case("tsc701", CK_TSC701)
6818 .Case("v9", CK_V9)
6819 .Case("ultrasparc", CK_ULTRASPARC)
6820 .Case("ultrasparc3", CK_ULTRASPARC3)
6821 .Case("niagara", CK_NIAGARA)
6822 .Case("niagara2", CK_NIAGARA2)
6823 .Case("niagara3", CK_NIAGARA3)
6824 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006825 .Case("ma2100", CK_MYRIAD2100)
6826 .Case("ma2150", CK_MYRIAD2150)
6827 .Case("ma2450", CK_MYRIAD2450)
6828 // FIXME: the myriad2[.n] spellings are obsolete,
6829 // but a grace period is needed to allow updating dependent builds.
6830 .Case("myriad2", CK_MYRIAD2100)
6831 .Case("myriad2.1", CK_MYRIAD2100)
6832 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006833 .Case("leon2", CK_LEON2)
6834 .Case("at697e", CK_LEON2_AT697E)
6835 .Case("at697f", CK_LEON2_AT697F)
6836 .Case("leon3", CK_LEON3)
6837 .Case("ut699", CK_LEON3_UT699)
6838 .Case("gr712rc", CK_LEON3_GR712RC)
6839 .Case("leon4", CK_LEON4)
6840 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006841 .Default(CK_GENERIC);
6842 }
6843
6844 bool setCPU(const std::string &Name) override {
6845 CPU = getCPUKind(Name);
6846 return CPU != CK_GENERIC;
6847 }
Gabor Greif49991682008-02-21 16:29:08 +00006848};
6849
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006850const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006851 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6852 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6853 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6854 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6855};
6856
Craig Topperf054e3a2015-10-19 03:52:27 +00006857ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6858 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006859}
6860
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006861const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006862 { { "g0" }, "r0" },
6863 { { "g1" }, "r1" },
6864 { { "g2" }, "r2" },
6865 { { "g3" }, "r3" },
6866 { { "g4" }, "r4" },
6867 { { "g5" }, "r5" },
6868 { { "g6" }, "r6" },
6869 { { "g7" }, "r7" },
6870 { { "o0" }, "r8" },
6871 { { "o1" }, "r9" },
6872 { { "o2" }, "r10" },
6873 { { "o3" }, "r11" },
6874 { { "o4" }, "r12" },
6875 { { "o5" }, "r13" },
6876 { { "o6", "sp" }, "r14" },
6877 { { "o7" }, "r15" },
6878 { { "l0" }, "r16" },
6879 { { "l1" }, "r17" },
6880 { { "l2" }, "r18" },
6881 { { "l3" }, "r19" },
6882 { { "l4" }, "r20" },
6883 { { "l5" }, "r21" },
6884 { { "l6" }, "r22" },
6885 { { "l7" }, "r23" },
6886 { { "i0" }, "r24" },
6887 { { "i1" }, "r25" },
6888 { { "i2" }, "r26" },
6889 { { "i3" }, "r27" },
6890 { { "i4" }, "r28" },
6891 { { "i5" }, "r29" },
6892 { { "i6", "fp" }, "r30" },
6893 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006894};
6895
Craig Topperf054e3a2015-10-19 03:52:27 +00006896ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6897 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006898}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006899
6900// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6901class SparcV8TargetInfo : public SparcTargetInfo {
6902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006903 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6904 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006905 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006906 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6907 switch (getTriple().getOS()) {
6908 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006909 SizeType = UnsignedInt;
6910 IntPtrType = SignedInt;
6911 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006912 break;
6913 case llvm::Triple::NetBSD:
6914 case llvm::Triple::OpenBSD:
6915 SizeType = UnsignedLong;
6916 IntPtrType = SignedLong;
6917 PtrDiffType = SignedLong;
6918 break;
Brad Smith56495d52015-08-13 22:00:53 +00006919 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006920 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6921 // on up to 64 bits.
6922 MaxAtomicPromoteWidth = 64;
6923 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006924 }
6925
Craig Topper3164f332014-03-11 03:39:26 +00006926 void getTargetDefines(const LangOptions &Opts,
6927 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006928 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006929 switch (getCPUGeneration(CPU)) {
6930 case CG_V8:
6931 Builder.defineMacro("__sparcv8");
6932 if (getTriple().getOS() != llvm::Triple::Solaris)
6933 Builder.defineMacro("__sparcv8__");
6934 break;
6935 case CG_V9:
6936 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006937 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006938 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006939 Builder.defineMacro("__sparc_v9__");
6940 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006941 break;
6942 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006943 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006944 std::string MyriadArchValue, Myriad2Value;
6945 Builder.defineMacro("__sparc_v8__");
6946 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006947 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006948 case CK_MYRIAD2150:
6949 MyriadArchValue = "__ma2150";
6950 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006951 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006952 case CK_MYRIAD2450:
6953 MyriadArchValue = "__ma2450";
6954 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006955 break;
6956 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006957 MyriadArchValue = "__ma2100";
6958 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006959 break;
6960 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006961 Builder.defineMacro(MyriadArchValue, "1");
6962 Builder.defineMacro(MyriadArchValue+"__", "1");
6963 Builder.defineMacro("__myriad2__", Myriad2Value);
6964 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006965 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006966 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006967
6968 bool hasSjLjLowering() const override {
6969 return true;
6970 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006971};
6972
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006973// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6974class SparcV8elTargetInfo : public SparcV8TargetInfo {
6975 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006976 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6977 : SparcV8TargetInfo(Triple, Opts) {
6978 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006979 }
6980};
6981
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006982// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6983class SparcV9TargetInfo : public SparcTargetInfo {
6984public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006985 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6986 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006987 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006988 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006989 // This is an LP64 platform.
6990 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006991
6992 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006993 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006994 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006995 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006996 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006997 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006998
6999 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
7000 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
7001 LongDoubleWidth = 128;
7002 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007003 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00007004 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007005 }
7006
Craig Topper3164f332014-03-11 03:39:26 +00007007 void getTargetDefines(const LangOptions &Opts,
7008 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007009 SparcTargetInfo::getTargetDefines(Opts, Builder);
7010 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007011 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00007012 // Solaris doesn't need these variants, but the BSDs do.
7013 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00007014 Builder.defineMacro("__sparc64__");
7015 Builder.defineMacro("__sparc_v9__");
7016 Builder.defineMacro("__sparcv9__");
7017 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007018 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007019
Craig Topper3164f332014-03-11 03:39:26 +00007020 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007021 if (!SparcTargetInfo::setCPU(Name))
7022 return false;
7023 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007024 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007025};
7026
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007027class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007028 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007029 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007030 std::string CPU;
7031 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007032 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007033
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007034public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007035 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007036 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7037 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007038 IntMaxType = SignedLong;
7039 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007040 TLSSupported = true;
7041 IntWidth = IntAlign = 32;
7042 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7043 PointerWidth = PointerAlign = 64;
7044 LongDoubleWidth = 128;
7045 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007046 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007047 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007048 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007049 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 +00007050 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7051 }
7052 void getTargetDefines(const LangOptions &Opts,
7053 MacroBuilder &Builder) const override {
7054 Builder.defineMacro("__s390__");
7055 Builder.defineMacro("__s390x__");
7056 Builder.defineMacro("__zarch__");
7057 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007058
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007059 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7060 .Cases("arch8", "z10", "8")
7061 .Cases("arch9", "z196", "9")
7062 .Cases("arch10", "zEC12", "10")
7063 .Cases("arch11", "z13", "11")
7064 .Default("");
7065 if (!ISARev.empty())
7066 Builder.defineMacro("__ARCH__", ISARev);
7067
Ulrich Weigandb038a522016-02-05 21:34:28 +00007068 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7069 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7070 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7071 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7072
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007073 if (HasTransactionalExecution)
7074 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007075 if (HasVector)
7076 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007077 if (Opts.ZVector)
7078 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007079 }
Craig Topper6c03a542015-10-19 04:51:35 +00007080 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7081 return llvm::makeArrayRef(BuiltinInfo,
7082 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007083 }
7084
Craig Topperf054e3a2015-10-19 03:52:27 +00007085 ArrayRef<const char *> getGCCRegNames() const override;
7086 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007087 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007088 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007089 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007090 bool validateAsmConstraint(const char *&Name,
7091 TargetInfo::ConstraintInfo &info) const override;
7092 const char *getClobbers() const override {
7093 // FIXME: Is this really right?
7094 return "";
7095 }
7096 BuiltinVaListKind getBuiltinVaListKind() const override {
7097 return TargetInfo::SystemZBuiltinVaList;
7098 }
7099 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007100 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007101 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7102 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007103 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007104 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007105 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007106 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007107 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007108 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007109 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007110 .Default(false);
7111
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007112 return CPUKnown;
7113 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007114 bool
7115 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7116 StringRef CPU,
7117 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007118 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007119 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007120 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007121 Features["transactional-execution"] = true;
7122 Features["vector"] = true;
7123 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007124 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007125 }
7126
7127 bool handleTargetFeatures(std::vector<std::string> &Features,
7128 DiagnosticsEngine &Diags) override {
7129 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007130 for (const auto &Feature : Features) {
7131 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007132 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007133 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007134 HasVector = true;
7135 }
7136 // If we use the vector ABI, vector types are 64-bit aligned.
7137 if (HasVector) {
7138 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007139 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7140 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007141 }
7142 return true;
7143 }
7144
7145 bool hasFeature(StringRef Feature) const override {
7146 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007147 .Case("systemz", true)
7148 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007149 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007150 .Default(false);
7151 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007152
Bryan Chane3f1ed52016-04-28 13:56:43 +00007153 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7154 switch (CC) {
7155 case CC_C:
7156 case CC_Swift:
7157 return CCCR_OK;
7158 default:
7159 return CCCR_Warning;
7160 }
7161 }
7162
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007163 StringRef getABI() const override {
7164 if (HasVector)
7165 return "vector";
7166 return "";
7167 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007168
7169 bool useFloat128ManglingForLongDouble() const override {
7170 return true;
7171 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007172};
7173
7174const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7175#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007176 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007177#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7178 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007179#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007180};
7181
7182const char *const SystemZTargetInfo::GCCRegNames[] = {
7183 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7184 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7185 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7186 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7187};
7188
Craig Topperf054e3a2015-10-19 03:52:27 +00007189ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7190 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007191}
7192
7193bool SystemZTargetInfo::
7194validateAsmConstraint(const char *&Name,
7195 TargetInfo::ConstraintInfo &Info) const {
7196 switch (*Name) {
7197 default:
7198 return false;
7199
7200 case 'a': // Address register
7201 case 'd': // Data register (equivalent to 'r')
7202 case 'f': // Floating-point register
7203 Info.setAllowsRegister();
7204 return true;
7205
7206 case 'I': // Unsigned 8-bit constant
7207 case 'J': // Unsigned 12-bit constant
7208 case 'K': // Signed 16-bit constant
7209 case 'L': // Signed 20-bit displacement (on all targets we support)
7210 case 'M': // 0x7fffffff
7211 return true;
7212
7213 case 'Q': // Memory with base and unsigned 12-bit displacement
7214 case 'R': // Likewise, plus an index
7215 case 'S': // Memory with base and signed 20-bit displacement
7216 case 'T': // Likewise, plus an index
7217 Info.setAllowsMemory();
7218 return true;
7219 }
7220}
Ulrich Weigand47445072013-05-06 16:26:41 +00007221
Eric Christopherc48497a2015-09-18 21:26:24 +00007222class MSP430TargetInfo : public TargetInfo {
7223 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007224
Eric Christopherc48497a2015-09-18 21:26:24 +00007225public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007226 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7227 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007228 TLSSupported = false;
7229 IntWidth = 16;
7230 IntAlign = 16;
7231 LongWidth = 32;
7232 LongLongWidth = 64;
7233 LongAlign = LongLongAlign = 16;
7234 PointerWidth = 16;
7235 PointerAlign = 16;
7236 SuitableAlign = 16;
7237 SizeType = UnsignedInt;
7238 IntMaxType = SignedLongLong;
7239 IntPtrType = SignedInt;
7240 PtrDiffType = SignedInt;
7241 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007242 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007243 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007244 void getTargetDefines(const LangOptions &Opts,
7245 MacroBuilder &Builder) const override {
7246 Builder.defineMacro("MSP430");
7247 Builder.defineMacro("__MSP430__");
7248 // FIXME: defines for different 'flavours' of MCU
7249 }
Craig Topper6c03a542015-10-19 04:51:35 +00007250 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007251 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007252 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007253 }
7254 bool hasFeature(StringRef Feature) const override {
7255 return Feature == "msp430";
7256 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007257 ArrayRef<const char *> getGCCRegNames() const override;
7258 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007259 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007260 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007261 }
7262 bool validateAsmConstraint(const char *&Name,
7263 TargetInfo::ConstraintInfo &info) const override {
7264 // FIXME: implement
7265 switch (*Name) {
7266 case 'K': // the constant 1
7267 case 'L': // constant -1^20 .. 1^19
7268 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007269 return true;
7270 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007271 // No target constraints for now.
7272 return false;
7273 }
7274 const char *getClobbers() const override {
7275 // FIXME: Is this really right?
7276 return "";
7277 }
7278 BuiltinVaListKind getBuiltinVaListKind() const override {
7279 // FIXME: implement
7280 return TargetInfo::CharPtrBuiltinVaList;
7281 }
7282};
7283
7284const char *const MSP430TargetInfo::GCCRegNames[] = {
7285 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7286 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7287
Craig Topperf054e3a2015-10-19 03:52:27 +00007288ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7289 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007290}
7291
7292// LLVM and Clang cannot be used directly to output native binaries for
7293// target, but is used to compile C code to llvm bitcode with correct
7294// type and alignment information.
7295//
7296// TCE uses the llvm bitcode as input and uses it for generating customized
7297// target processor and program binary. TCE co-design environment is
7298// publicly available in http://tce.cs.tut.fi
7299
7300static const unsigned TCEOpenCLAddrSpaceMap[] = {
7301 3, // opencl_global
7302 4, // opencl_local
7303 5, // opencl_constant
7304 // FIXME: generic has to be added to the target
7305 0, // opencl_generic
7306 0, // cuda_device
7307 0, // cuda_constant
7308 0 // cuda_shared
7309};
7310
7311class TCETargetInfo : public TargetInfo {
7312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007313 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7314 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007315 TLSSupported = false;
7316 IntWidth = 32;
7317 LongWidth = LongLongWidth = 32;
7318 PointerWidth = 32;
7319 IntAlign = 32;
7320 LongAlign = LongLongAlign = 32;
7321 PointerAlign = 32;
7322 SuitableAlign = 32;
7323 SizeType = UnsignedInt;
7324 IntMaxType = SignedLong;
7325 IntPtrType = SignedInt;
7326 PtrDiffType = SignedInt;
7327 FloatWidth = 32;
7328 FloatAlign = 32;
7329 DoubleWidth = 32;
7330 DoubleAlign = 32;
7331 LongDoubleWidth = 32;
7332 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007333 FloatFormat = &llvm::APFloat::IEEEsingle();
7334 DoubleFormat = &llvm::APFloat::IEEEsingle();
7335 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007336 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7337 "i16:16:32-i32:32:32-i64:32:32-"
7338 "f32:32:32-f64:32:32-v64:32:32-"
7339 "v128:32:32-v256:32:32-v512:32:32-"
7340 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007341 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7342 UseAddrSpaceMapMangling = true;
7343 }
7344
7345 void getTargetDefines(const LangOptions &Opts,
7346 MacroBuilder &Builder) const override {
7347 DefineStd(Builder, "tce", Opts);
7348 Builder.defineMacro("__TCE__");
7349 Builder.defineMacro("__TCE_V1__");
7350 }
7351 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7352
Craig Topper6c03a542015-10-19 04:51:35 +00007353 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007354 const char *getClobbers() const override { return ""; }
7355 BuiltinVaListKind getBuiltinVaListKind() const override {
7356 return TargetInfo::VoidPtrBuiltinVaList;
7357 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007358 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007359 bool validateAsmConstraint(const char *&Name,
7360 TargetInfo::ConstraintInfo &info) const override {
7361 return true;
7362 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007363 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7364 return None;
7365 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007366};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007367
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007368class TCELETargetInfo : public TCETargetInfo {
7369public:
7370 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7371 : TCETargetInfo(Triple, Opts) {
7372 BigEndian = false;
7373
7374 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7375 "i16:16:32-i32:32:32-i64:32:32-"
7376 "f32:32:32-f64:32:32-v64:32:32-"
7377 "v128:32:32-v256:32:32-v512:32:32-"
7378 "v1024:32:32-a0:0:32-n32");
7379
7380 }
7381
7382 virtual void getTargetDefines(const LangOptions &Opts,
7383 MacroBuilder &Builder) const {
7384 DefineStd(Builder, "tcele", Opts);
7385 Builder.defineMacro("__TCE__");
7386 Builder.defineMacro("__TCE_V1__");
7387 Builder.defineMacro("__TCELE__");
7388 Builder.defineMacro("__TCELE_V1__");
7389 }
7390
7391};
7392
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007393class BPFTargetInfo : public TargetInfo {
7394public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007395 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7396 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007397 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7398 SizeType = UnsignedLong;
7399 PtrDiffType = SignedLong;
7400 IntPtrType = SignedLong;
7401 IntMaxType = SignedLong;
7402 Int64Type = SignedLong;
7403 RegParmMax = 5;
7404 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007405 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007406 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007407 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007408 }
7409 MaxAtomicPromoteWidth = 64;
7410 MaxAtomicInlineWidth = 64;
7411 TLSSupported = false;
7412 }
7413 void getTargetDefines(const LangOptions &Opts,
7414 MacroBuilder &Builder) const override {
7415 DefineStd(Builder, "bpf", Opts);
7416 Builder.defineMacro("__BPF__");
7417 }
7418 bool hasFeature(StringRef Feature) const override {
7419 return Feature == "bpf";
7420 }
7421
Craig Topper6c03a542015-10-19 04:51:35 +00007422 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007423 const char *getClobbers() const override {
7424 return "";
7425 }
7426 BuiltinVaListKind getBuiltinVaListKind() const override {
7427 return TargetInfo::VoidPtrBuiltinVaList;
7428 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007429 ArrayRef<const char *> getGCCRegNames() const override {
7430 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007431 }
7432 bool validateAsmConstraint(const char *&Name,
7433 TargetInfo::ConstraintInfo &info) const override {
7434 return true;
7435 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007436 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7437 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007438 }
7439};
7440
Daniel Sanders4672af62016-05-27 11:51:02 +00007441class MipsTargetInfo : public TargetInfo {
7442 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007443 StringRef Layout;
7444
7445 if (ABI == "o32")
7446 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7447 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007448 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007449 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007450 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007451 else
7452 llvm_unreachable("Invalid ABI");
7453
7454 if (BigEndian)
7455 resetDataLayout(("E-" + Layout).str());
7456 else
7457 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007458 }
7459
Akira Hatanaka9064e362013-10-29 18:30:33 +00007460
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007461 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007462 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007463 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007464 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007465 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007466 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007467 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007468 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007469 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007470 enum DspRevEnum {
7471 NoDSP, DSP1, DSP2
7472 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007473 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007474
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007475protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007476 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007477 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007478
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007479public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007480 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007481 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7482 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7483 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007484 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007485
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007486 setABI((getTriple().getArch() == llvm::Triple::mips ||
7487 getTriple().getArch() == llvm::Triple::mipsel)
7488 ? "o32"
7489 : "n64");
7490
7491 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007492 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007493
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007494 bool isNaN2008Default() const {
7495 return CPU == "mips32r6" || CPU == "mips64r6";
7496 }
7497
7498 bool isFP64Default() const {
7499 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7500 }
7501
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007502 bool isNan2008() const override {
7503 return IsNan2008;
7504 }
7505
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007506 bool processorSupportsGPR64() const {
7507 return llvm::StringSwitch<bool>(CPU)
7508 .Case("mips3", true)
7509 .Case("mips4", true)
7510 .Case("mips5", true)
7511 .Case("mips64", true)
7512 .Case("mips64r2", true)
7513 .Case("mips64r3", true)
7514 .Case("mips64r5", true)
7515 .Case("mips64r6", true)
7516 .Case("octeon", true)
7517 .Default(false);
7518 return false;
7519 }
7520
Alp Toker4925ba72014-06-07 23:30:42 +00007521 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007522 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007523 if (Name == "o32") {
7524 setO32ABITypes();
7525 ABI = Name;
7526 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007527 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007528
7529 if (Name == "n32") {
7530 setN32ABITypes();
7531 ABI = Name;
7532 return true;
7533 }
7534 if (Name == "n64") {
7535 setN64ABITypes();
7536 ABI = Name;
7537 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007538 }
7539 return false;
7540 }
7541
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007542 void setO32ABITypes() {
7543 Int64Type = SignedLongLong;
7544 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007545 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007546 LongDoubleWidth = LongDoubleAlign = 64;
7547 LongWidth = LongAlign = 32;
7548 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7549 PointerWidth = PointerAlign = 32;
7550 PtrDiffType = SignedInt;
7551 SizeType = UnsignedInt;
7552 SuitableAlign = 64;
7553 }
7554
7555 void setN32N64ABITypes() {
7556 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007557 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007558 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7559 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007560 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007561 }
7562 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7563 SuitableAlign = 128;
7564 }
7565
Daniel Sanders4672af62016-05-27 11:51:02 +00007566 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007567 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007568 Int64Type = SignedLong;
7569 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007570 LongWidth = LongAlign = 64;
7571 PointerWidth = PointerAlign = 64;
7572 PtrDiffType = SignedLong;
7573 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007574 }
7575
7576 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007577 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007578 Int64Type = SignedLongLong;
7579 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007580 LongWidth = LongAlign = 32;
7581 PointerWidth = PointerAlign = 32;
7582 PtrDiffType = SignedInt;
7583 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007584 }
7585
Craig Topper3164f332014-03-11 03:39:26 +00007586 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007587 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007588 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007589 .Case("mips1", true)
7590 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007591 .Case("mips3", true)
7592 .Case("mips4", true)
7593 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007594 .Case("mips32", true)
7595 .Case("mips32r2", true)
7596 .Case("mips32r3", true)
7597 .Case("mips32r5", true)
7598 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007599 .Case("mips64", true)
7600 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007601 .Case("mips64r3", true)
7602 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007603 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007604 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007605 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007606 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007607 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007608 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007609 bool
7610 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7611 StringRef CPU,
7612 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007613 if (CPU.empty())
7614 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007615 if (CPU == "octeon")
7616 Features["mips64r2"] = Features["cnmips"] = true;
7617 else
7618 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007619 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007620 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007621
Craig Topper3164f332014-03-11 03:39:26 +00007622 void getTargetDefines(const LangOptions &Opts,
7623 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007624 if (BigEndian) {
7625 DefineStd(Builder, "MIPSEB", Opts);
7626 Builder.defineMacro("_MIPSEB");
7627 } else {
7628 DefineStd(Builder, "MIPSEL", Opts);
7629 Builder.defineMacro("_MIPSEL");
7630 }
7631
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007632 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007633 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007634 if (Opts.GNUMode)
7635 Builder.defineMacro("mips");
7636
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007637 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007638 Builder.defineMacro("__mips", "32");
7639 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7640 } else {
7641 Builder.defineMacro("__mips", "64");
7642 Builder.defineMacro("__mips64");
7643 Builder.defineMacro("__mips64__");
7644 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7645 }
7646
7647 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7648 .Cases("mips32", "mips64", "1")
7649 .Cases("mips32r2", "mips64r2", "2")
7650 .Cases("mips32r3", "mips64r3", "3")
7651 .Cases("mips32r5", "mips64r5", "5")
7652 .Cases("mips32r6", "mips64r6", "6")
7653 .Default("");
7654 if (!ISARev.empty())
7655 Builder.defineMacro("__mips_isa_rev", ISARev);
7656
7657 if (ABI == "o32") {
7658 Builder.defineMacro("__mips_o32");
7659 Builder.defineMacro("_ABIO32", "1");
7660 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007661 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007662 Builder.defineMacro("__mips_n32");
7663 Builder.defineMacro("_ABIN32", "2");
7664 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7665 } else if (ABI == "n64") {
7666 Builder.defineMacro("__mips_n64");
7667 Builder.defineMacro("_ABI64", "3");
7668 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7669 } else
7670 llvm_unreachable("Invalid ABI.");
7671
Simon Atanasyan683535b2012-08-29 19:14:58 +00007672 Builder.defineMacro("__REGISTER_PREFIX__", "");
7673
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007674 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007675 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007676 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007677 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007678 case SoftFloat:
7679 Builder.defineMacro("__mips_soft_float", Twine(1));
7680 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007681 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007682
Simon Atanasyan16071912013-04-14 14:07:30 +00007683 if (IsSingleFloat)
7684 Builder.defineMacro("__mips_single_float", Twine(1));
7685
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007686 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7687 Builder.defineMacro("_MIPS_FPSET",
7688 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7689
Simon Atanasyan72244b62012-07-05 16:06:06 +00007690 if (IsMips16)
7691 Builder.defineMacro("__mips16", Twine(1));
7692
Simon Atanasyan60777612013-04-14 14:07:51 +00007693 if (IsMicromips)
7694 Builder.defineMacro("__mips_micromips", Twine(1));
7695
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007696 if (IsNan2008)
7697 Builder.defineMacro("__mips_nan2008", Twine(1));
7698
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007699 switch (DspRev) {
7700 default:
7701 break;
7702 case DSP1:
7703 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7704 Builder.defineMacro("__mips_dsp", Twine(1));
7705 break;
7706 case DSP2:
7707 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7708 Builder.defineMacro("__mips_dspr2", Twine(1));
7709 Builder.defineMacro("__mips_dsp", Twine(1));
7710 break;
7711 }
7712
Jack Carter44ff1e52013-08-12 17:20:29 +00007713 if (HasMSA)
7714 Builder.defineMacro("__mips_msa", Twine(1));
7715
Simon Atanasyan26f19672012-04-05 19:28:31 +00007716 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7717 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7718 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007719
7720 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7721 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007722
7723 // These shouldn't be defined for MIPS-I but there's no need to check
7724 // for that since MIPS-I isn't supported.
7725 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7726 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7727 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007728
7729 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7730 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7731 // the instructions exist but using them violates the ABI since they
7732 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7733 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007734 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007735 }
7736
Craig Topper6c03a542015-10-19 04:51:35 +00007737 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7738 return llvm::makeArrayRef(BuiltinInfo,
7739 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007740 }
Craig Topper3164f332014-03-11 03:39:26 +00007741 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007742 return llvm::StringSwitch<bool>(Feature)
7743 .Case("mips", true)
7744 .Case("fp64", HasFP64)
7745 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007746 }
Craig Topper3164f332014-03-11 03:39:26 +00007747 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007748 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007749 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007750 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007751 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007752 // CPU register names
7753 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007754 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7755 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7756 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007757 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7758 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007759 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7760 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7761 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7762 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007763 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007764 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007765 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7766 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007767 // MSA register names
7768 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7769 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7770 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7771 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7772 // MSA control register names
7773 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7774 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007775 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007776 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007777 }
Craig Topper3164f332014-03-11 03:39:26 +00007778 bool validateAsmConstraint(const char *&Name,
7779 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007780 switch (*Name) {
7781 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007782 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007783 case 'r': // CPU registers.
7784 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007785 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007786 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007787 case 'c': // $25 for indirect jumps
7788 case 'l': // lo register
7789 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007790 Info.setAllowsRegister();
7791 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007792 case 'I': // Signed 16-bit constant
7793 case 'J': // Integer 0
7794 case 'K': // Unsigned 16-bit constant
7795 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7796 case 'M': // Constants not loadable via lui, addiu, or ori
7797 case 'N': // Constant -1 to -65535
7798 case 'O': // A signed 15-bit constant
7799 case 'P': // A constant between 1 go 65535
7800 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007801 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007802 Info.setAllowsMemory();
7803 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007804 case 'Z':
7805 if (Name[1] == 'C') { // An address usable by ll, and sc.
7806 Info.setAllowsMemory();
7807 Name++; // Skip over 'Z'.
7808 return true;
7809 }
7810 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007811 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007812 }
7813
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007814 std::string convertConstraint(const char *&Constraint) const override {
7815 std::string R;
7816 switch (*Constraint) {
7817 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7818 if (Constraint[1] == 'C') {
7819 R = std::string("^") + std::string(Constraint, 2);
7820 Constraint++;
7821 return R;
7822 }
7823 break;
7824 }
7825 return TargetInfo::convertConstraint(Constraint);
7826 }
7827
Craig Topper3164f332014-03-11 03:39:26 +00007828 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007829 // In GCC, $1 is not widely used in generated code (it's used only in a few
7830 // specific situations), so there is no real need for users to add it to
7831 // the clobbers list if they want to use it in their inline assembly code.
7832 //
7833 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7834 // code generation, so using it in inline assembly without adding it to the
7835 // clobbers list can cause conflicts between the inline assembly code and
7836 // the surrounding generated code.
7837 //
7838 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7839 // operands, which will conflict with the ".set at" assembler option (which
7840 // we use only for inline assembly, in order to maintain compatibility with
7841 // GCC) and will also conflict with the user's usage of $1.
7842 //
7843 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7844 // register for generated code is to automatically clobber $1 for all inline
7845 // assembly code.
7846 //
7847 // FIXME: We should automatically clobber $1 only for inline assembly code
7848 // which actually uses it. This would allow LLVM to use $1 for inline
7849 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007850 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007851 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007852
Craig Topper3164f332014-03-11 03:39:26 +00007853 bool handleTargetFeatures(std::vector<std::string> &Features,
7854 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007855 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007856 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007857 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007858 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007859 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007860 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007861 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007862
Eric Christopher610fe112015-08-26 08:21:55 +00007863 for (const auto &Feature : Features) {
7864 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007865 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007866 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007867 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007868 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007869 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007870 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007871 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007872 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007873 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007874 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007875 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007876 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007877 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007878 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007879 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007880 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007881 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007882 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007883 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007884 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007885 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007886 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007887
James Y Knightb214cbc2016-03-04 19:00:41 +00007888 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007889
Rafael Espindolaeb265472013-08-21 21:59:03 +00007890 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007891 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007892
Craig Topper3164f332014-03-11 03:39:26 +00007893 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007894 if (RegNo == 0) return 4;
7895 if (RegNo == 1) return 5;
7896 return -1;
7897 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007898
7899 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007900
7901 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7902 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7903 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7904 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7905 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7906 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7907 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7908 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7909 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7910 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7911 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7912 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7913 {{"ra"}, "$31"}};
7914 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7915 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7916 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7917 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7918 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7919 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7920 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7921 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7922 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7923 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7924 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7925 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007926 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007927 return llvm::makeArrayRef(O32RegAliases);
7928 return llvm::makeArrayRef(NewABIRegAliases);
7929 }
7930
7931 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007932 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007933 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007934
7935 bool validateTarget(DiagnosticsEngine &Diags) const override {
7936 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7937 // this yet. It's better to fail here than on the backend assertion.
7938 if (processorSupportsGPR64() && ABI == "o32") {
7939 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7940 return false;
7941 }
7942
7943 // 64-bit ABI's require 64-bit CPU's.
7944 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7945 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7946 return false;
7947 }
7948
7949 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7950 // can't handle this yet. It's better to fail here than on the
7951 // backend assertion.
7952 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7953 getTriple().getArch() == llvm::Triple::mips64el) &&
7954 ABI == "o32") {
7955 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7956 << ABI << getTriple().str();
7957 return false;
7958 }
7959
7960 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7961 // can't handle this yet. It's better to fail here than on the
7962 // backend assertion.
7963 if ((getTriple().getArch() == llvm::Triple::mips ||
7964 getTriple().getArch() == llvm::Triple::mipsel) &&
7965 (ABI == "n32" || ABI == "n64")) {
7966 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7967 << ABI << getTriple().str();
7968 return false;
7969 }
7970
7971 return true;
7972 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007973};
7974
Daniel Sanders4672af62016-05-27 11:51:02 +00007975const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007976#define BUILTIN(ID, TYPE, ATTRS) \
7977 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7978#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7979 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007980#include "clang/Basic/BuiltinsMips.def"
7981};
7982
Ivan Krasindd7403e2011-08-24 20:22:22 +00007983class PNaClTargetInfo : public TargetInfo {
7984public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007985 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7986 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007987 this->LongAlign = 32;
7988 this->LongWidth = 32;
7989 this->PointerAlign = 32;
7990 this->PointerWidth = 32;
7991 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007992 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007993 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007994 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007995 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007996 this->SizeType = TargetInfo::UnsignedInt;
7997 this->PtrDiffType = TargetInfo::SignedInt;
7998 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007999 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00008000 }
8001
Craig Toppere6f17d02014-03-11 04:07:52 +00008002 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008003 Builder.defineMacro("__le32__");
8004 Builder.defineMacro("__pnacl__");
8005 }
Craig Topper3164f332014-03-11 03:39:26 +00008006 void getTargetDefines(const LangOptions &Opts,
8007 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008008 getArchDefines(Opts, Builder);
8009 }
Craig Topper3164f332014-03-11 03:39:26 +00008010 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00008011 return Feature == "pnacl";
8012 }
Craig Topper6c03a542015-10-19 04:51:35 +00008013 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00008014 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00008015 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008016 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008017 ArrayRef<const char *> getGCCRegNames() const override;
8018 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008019 bool validateAsmConstraint(const char *&Name,
8020 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008021 return false;
8022 }
8023
Craig Topper3164f332014-03-11 03:39:26 +00008024 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008025 return "";
8026 }
8027};
8028
Craig Topperf054e3a2015-10-19 03:52:27 +00008029ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8030 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008031}
8032
Craig Topperf054e3a2015-10-19 03:52:27 +00008033ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8034 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008035}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008036
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008037// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008038class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008039public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008040 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8041 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008042
8043 BuiltinVaListKind getBuiltinVaListKind() const override {
8044 return TargetInfo::PNaClABIBuiltinVaList;
8045 }
8046};
8047
JF Bastien643817d2014-09-12 17:52:47 +00008048class Le64TargetInfo : public TargetInfo {
8049 static const Builtin::Info BuiltinInfo[];
8050
8051public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008052 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8053 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008054 NoAsmVariants = true;
8055 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8056 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008057 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008058 }
8059
8060 void getTargetDefines(const LangOptions &Opts,
8061 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008062 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008063 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8064 Builder.defineMacro("__ELF__");
8065 }
Craig Topper6c03a542015-10-19 04:51:35 +00008066 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8067 return llvm::makeArrayRef(BuiltinInfo,
8068 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008069 }
8070 BuiltinVaListKind getBuiltinVaListKind() const override {
8071 return TargetInfo::PNaClABIBuiltinVaList;
8072 }
8073 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008074 ArrayRef<const char *> getGCCRegNames() const override {
8075 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008076 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008077 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8078 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008079 }
8080 bool validateAsmConstraint(const char *&Name,
8081 TargetInfo::ConstraintInfo &Info) const override {
8082 return false;
8083 }
8084
8085 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008086};
Dan Gohmanc2853072015-09-03 22:51:53 +00008087
8088class WebAssemblyTargetInfo : public TargetInfo {
8089 static const Builtin::Info BuiltinInfo[];
8090
8091 enum SIMDEnum {
8092 NoSIMD,
8093 SIMD128,
8094 } SIMDLevel;
8095
8096public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008097 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008098 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008099 NoAsmVariants = true;
8100 SuitableAlign = 128;
8101 LargeArrayMinWidth = 128;
8102 LargeArrayAlign = 128;
8103 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008104 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008105 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008106 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008107 SizeType = UnsignedInt;
8108 PtrDiffType = SignedInt;
8109 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008110 }
8111
8112protected:
8113 void getTargetDefines(const LangOptions &Opts,
8114 MacroBuilder &Builder) const override {
8115 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8116 if (SIMDLevel >= SIMD128)
8117 Builder.defineMacro("__wasm_simd128__");
8118 }
8119
8120private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008121 bool
8122 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8123 StringRef CPU,
8124 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008125 if (CPU == "bleeding-edge")
8126 Features["simd128"] = true;
8127 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8128 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008129 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008130 return llvm::StringSwitch<bool>(Feature)
8131 .Case("simd128", SIMDLevel >= SIMD128)
8132 .Default(false);
8133 }
8134 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008135 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008136 for (const auto &Feature : Features) {
8137 if (Feature == "+simd128") {
8138 SIMDLevel = std::max(SIMDLevel, SIMD128);
8139 continue;
8140 }
8141 if (Feature == "-simd128") {
8142 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8143 continue;
8144 }
8145
8146 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8147 << "-target-feature";
8148 return false;
8149 }
8150 return true;
8151 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008152 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008153 return llvm::StringSwitch<bool>(Name)
8154 .Case("mvp", true)
8155 .Case("bleeding-edge", true)
8156 .Case("generic", true)
8157 .Default(false);
8158 }
Craig Topper6c03a542015-10-19 04:51:35 +00008159 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8160 return llvm::makeArrayRef(BuiltinInfo,
8161 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008162 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008163 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008164 return VoidPtrBuiltinVaList;
8165 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008166 ArrayRef<const char *> getGCCRegNames() const final {
8167 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008168 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008169 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8170 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008171 }
8172 bool
8173 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008174 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008175 return false;
8176 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008177 const char *getClobbers() const final { return ""; }
8178 bool isCLZForZeroUndef() const final { return false; }
8179 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008180 IntType getIntTypeByWidth(unsigned BitWidth,
8181 bool IsSigned) const final {
8182 // WebAssembly prefers long long for explicitly 64-bit integers.
8183 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8184 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8185 }
8186 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8187 bool IsSigned) const final {
8188 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8189 return BitWidth == 64
8190 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8191 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8192 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008193};
8194
8195const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8196#define BUILTIN(ID, TYPE, ATTRS) \
8197 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8198#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8199 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8200#include "clang/Basic/BuiltinsWebAssembly.def"
8201};
8202
8203class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8204public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8206 const TargetOptions &Opts)
8207 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008208 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008209 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008210 }
8211
8212protected:
8213 void getTargetDefines(const LangOptions &Opts,
8214 MacroBuilder &Builder) const override {
8215 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8216 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8217 }
8218};
8219
8220class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8221public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008222 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8223 const TargetOptions &Opts)
8224 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008225 LongAlign = LongWidth = 64;
8226 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008227 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008228 SizeType = UnsignedLong;
8229 PtrDiffType = SignedLong;
8230 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008231 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008232 }
8233
8234protected:
8235 void getTargetDefines(const LangOptions &Opts,
8236 MacroBuilder &Builder) const override {
8237 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8238 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8239 }
8240};
8241
JF Bastien643817d2014-09-12 17:52:47 +00008242const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8243#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008244 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008245#include "clang/Basic/BuiltinsLe64.def"
8246};
8247
Eric Christopherc48497a2015-09-18 21:26:24 +00008248static const unsigned SPIRAddrSpaceMap[] = {
8249 1, // opencl_global
8250 3, // opencl_local
8251 2, // opencl_constant
8252 4, // opencl_generic
8253 0, // cuda_device
8254 0, // cuda_constant
8255 0 // cuda_shared
8256};
8257class SPIRTargetInfo : public TargetInfo {
8258public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8260 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008261 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8262 "SPIR target must use unknown OS");
8263 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8264 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008265 TLSSupported = false;
8266 LongWidth = LongAlign = 64;
8267 AddrSpaceMap = &SPIRAddrSpaceMap;
8268 UseAddrSpaceMapMangling = true;
8269 // Define available target features
8270 // These must be defined in sorted order!
8271 NoAsmVariants = true;
8272 }
8273 void getTargetDefines(const LangOptions &Opts,
8274 MacroBuilder &Builder) const override {
8275 DefineStd(Builder, "SPIR", Opts);
8276 }
8277 bool hasFeature(StringRef Feature) const override {
8278 return Feature == "spir";
8279 }
Craig Topper3164f332014-03-11 03:39:26 +00008280
Craig Topper6c03a542015-10-19 04:51:35 +00008281 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008282 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008283 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008284 bool validateAsmConstraint(const char *&Name,
8285 TargetInfo::ConstraintInfo &info) const override {
8286 return true;
8287 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008288 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8289 return None;
8290 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008291 BuiltinVaListKind getBuiltinVaListKind() const override {
8292 return TargetInfo::VoidPtrBuiltinVaList;
8293 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008294
Eric Christopherc48497a2015-09-18 21:26:24 +00008295 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008296 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8297 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008298 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008299
Eric Christopherc48497a2015-09-18 21:26:24 +00008300 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8301 return CC_SpirFunction;
8302 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008303
8304 void setSupportedOpenCLOpts() override {
8305 // Assume all OpenCL extensions and optional core features are supported
8306 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008307 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008308 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008309};
Guy Benyeib798fc92012-12-11 21:38:14 +00008310
Eric Christopherc48497a2015-09-18 21:26:24 +00008311class SPIR32TargetInfo : public SPIRTargetInfo {
8312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8314 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008315 PointerWidth = PointerAlign = 32;
8316 SizeType = TargetInfo::UnsignedInt;
8317 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008318 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8319 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008320 }
8321 void getTargetDefines(const LangOptions &Opts,
8322 MacroBuilder &Builder) const override {
8323 DefineStd(Builder, "SPIR32", Opts);
8324 }
8325};
Guy Benyeib798fc92012-12-11 21:38:14 +00008326
Eric Christopherc48497a2015-09-18 21:26:24 +00008327class SPIR64TargetInfo : public SPIRTargetInfo {
8328public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8330 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008331 PointerWidth = PointerAlign = 64;
8332 SizeType = TargetInfo::UnsignedLong;
8333 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008334 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8335 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008336 }
8337 void getTargetDefines(const LangOptions &Opts,
8338 MacroBuilder &Builder) const override {
8339 DefineStd(Builder, "SPIR64", Opts);
8340 }
8341};
Guy Benyeib798fc92012-12-11 21:38:14 +00008342
Robert Lytton0e076492013-08-13 09:43:10 +00008343class XCoreTargetInfo : public TargetInfo {
8344 static const Builtin::Info BuiltinInfo[];
8345public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8347 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008348 NoAsmVariants = true;
8349 LongLongAlign = 32;
8350 SuitableAlign = 32;
8351 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008352 SizeType = UnsignedInt;
8353 PtrDiffType = SignedInt;
8354 IntPtrType = SignedInt;
8355 WCharType = UnsignedChar;
8356 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008357 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008358 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8359 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008360 }
Craig Topper3164f332014-03-11 03:39:26 +00008361 void getTargetDefines(const LangOptions &Opts,
8362 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008363 Builder.defineMacro("__XS1B__");
8364 }
Craig Topper6c03a542015-10-19 04:51:35 +00008365 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8366 return llvm::makeArrayRef(BuiltinInfo,
8367 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008368 }
Craig Topper3164f332014-03-11 03:39:26 +00008369 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008370 return TargetInfo::VoidPtrBuiltinVaList;
8371 }
Craig Topper3164f332014-03-11 03:39:26 +00008372 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008373 return "";
8374 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008375 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008376 static const char * const GCCRegNames[] = {
8377 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8378 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8379 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008380 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008381 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008382 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8383 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008384 }
Craig Topper3164f332014-03-11 03:39:26 +00008385 bool validateAsmConstraint(const char *&Name,
8386 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008387 return false;
8388 }
Craig Topper3164f332014-03-11 03:39:26 +00008389 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008390 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8391 return (RegNo < 2)? RegNo : -1;
8392 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008393 bool allowsLargerPreferedTypeAlignment() const override {
8394 return false;
8395 }
Robert Lytton0e076492013-08-13 09:43:10 +00008396};
8397
8398const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008399#define BUILTIN(ID, TYPE, ATTRS) \
8400 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8401#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8402 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008403#include "clang/Basic/BuiltinsXCore.def"
8404};
Robert Lytton0e076492013-08-13 09:43:10 +00008405
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008406// x86_32 Android target
8407class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8408public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8410 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008411 SuitableAlign = 32;
8412 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008413 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008414 }
8415};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008416
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008417// x86_64 Android target
8418class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8419public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8421 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008422 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008423 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008424
8425 bool useFloat128ManglingForLongDouble() const override {
8426 return true;
8427 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008428};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008429
8430// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8431class RenderScript32TargetInfo : public ARMleTargetInfo {
8432public:
8433 RenderScript32TargetInfo(const llvm::Triple &Triple,
8434 const TargetOptions &Opts)
8435 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8436 Triple.getOSName(),
8437 Triple.getEnvironmentName()),
8438 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008439 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008440 LongWidth = LongAlign = 64;
8441 }
8442 void getTargetDefines(const LangOptions &Opts,
8443 MacroBuilder &Builder) const override {
8444 Builder.defineMacro("__RENDERSCRIPT__");
8445 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8446 }
8447};
8448
8449// 64-bit RenderScript is aarch64
8450class RenderScript64TargetInfo : public AArch64leTargetInfo {
8451public:
8452 RenderScript64TargetInfo(const llvm::Triple &Triple,
8453 const TargetOptions &Opts)
8454 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8455 Triple.getOSName(),
8456 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008457 Opts) {
8458 IsRenderScriptTarget = true;
8459 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008460
8461 void getTargetDefines(const LangOptions &Opts,
8462 MacroBuilder &Builder) const override {
8463 Builder.defineMacro("__RENDERSCRIPT__");
8464 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8465 }
8466};
8467
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008468/// Information about a specific microcontroller.
8469struct MCUInfo {
8470 const char *Name;
8471 const char *DefineName;
8472};
8473
8474// This list should be kept up-to-date with AVRDevices.td in LLVM.
8475static ArrayRef<MCUInfo> AVRMcus = {
8476 { "at90s1200", "__AVR_AT90S1200__" },
Dylan McKay315edb02017-02-11 21:06:07 +00008477 { "attiny11", "__AVR_ATtiny11__" },
8478 { "attiny12", "__AVR_ATtiny12__" },
8479 { "attiny15", "__AVR_ATtiny15__" },
8480 { "attiny28", "__AVR_ATtiny28__" },
8481 { "at90s2313", "__AVR_AT90S2313__" },
8482 { "at90s2323", "__AVR_AT90S2323__" },
8483 { "at90s2333", "__AVR_AT90S2333__" },
8484 { "at90s2343", "__AVR_AT90S2343__" },
8485 { "attiny22", "__AVR_ATtiny22__" },
8486 { "attiny26", "__AVR_ATtiny26__" },
8487 { "at86rf401", "__AVR_AT86RF401__" },
8488 { "at90s4414", "__AVR_AT90S4414__" },
8489 { "at90s4433", "__AVR_AT90S4433__" },
8490 { "at90s4434", "__AVR_AT90S4434__" },
8491 { "at90s8515", "__AVR_AT90S8515__" },
8492 { "at90c8534", "__AVR_AT90c8534__" },
8493 { "at90s8535", "__AVR_AT90S8535__" },
8494 { "ata5272", "__AVR_ATA5272__" },
8495 { "attiny13", "__AVR_ATtiny13__" },
8496 { "attiny13a", "__AVR_ATtiny13A__" },
8497 { "attiny2313", "__AVR_ATtiny2313__" },
8498 { "attiny2313a", "__AVR_ATtiny2313A__" },
8499 { "attiny24", "__AVR_ATtiny24__" },
8500 { "attiny24a", "__AVR_ATtiny24A__" },
8501 { "attiny4313", "__AVR_ATtiny4313__" },
8502 { "attiny44", "__AVR_ATtiny44__" },
8503 { "attiny44a", "__AVR_ATtiny44A__" },
8504 { "attiny84", "__AVR_ATtiny84__" },
8505 { "attiny84a", "__AVR_ATtiny84A__" },
8506 { "attiny25", "__AVR_ATtiny25__" },
8507 { "attiny45", "__AVR_ATtiny45__" },
8508 { "attiny85", "__AVR_ATtiny85__" },
8509 { "attiny261", "__AVR_ATtiny261__" },
8510 { "attiny261a", "__AVR_ATtiny261A__" },
8511 { "attiny461", "__AVR_ATtiny461__" },
8512 { "attiny461a", "__AVR_ATtiny461A__" },
8513 { "attiny861", "__AVR_ATtiny861__" },
8514 { "attiny861a", "__AVR_ATtiny861A__" },
8515 { "attiny87", "__AVR_ATtiny87__" },
8516 { "attiny43u", "__AVR_ATtiny43U__" },
8517 { "attiny48", "__AVR_ATtiny48__" },
8518 { "attiny88", "__AVR_ATtiny88__" },
8519 { "attiny828", "__AVR_ATtiny828__" },
8520 { "at43usb355", "__AVR_AT43USB355__" },
8521 { "at76c711", "__AVR_AT76C711__" },
8522 { "atmega103", "__AVR_ATmega103__" },
8523 { "at43usb320", "__AVR_AT43USB320__" },
8524 { "attiny167", "__AVR_ATtiny167__" },
8525 { "at90usb82", "__AVR_AT90USB82__" },
8526 { "at90usb162", "__AVR_AT90USB162__" },
8527 { "ata5505", "__AVR_ATA5505__" },
8528 { "atmega8u2", "__AVR_ATmega8U2__" },
8529 { "atmega16u2", "__AVR_ATmega16U2__" },
8530 { "atmega32u2", "__AVR_ATmega32U2__" },
8531 { "attiny1634", "__AVR_ATtiny1634__" },
8532 { "atmega8", "__AVR_ATmega8__" },
8533 { "ata6289", "__AVR_ATA6289__" },
8534 { "atmega8a", "__AVR_ATmega8A__" },
8535 { "ata6285", "__AVR_ATA6285__" },
8536 { "ata6286", "__AVR_ATA6286__" },
8537 { "atmega48", "__AVR_ATmega48__" },
8538 { "atmega48a", "__AVR_ATmega48A__" },
8539 { "atmega48pa", "__AVR_ATmega48PA__" },
8540 { "atmega48p", "__AVR_ATmega48P__" },
8541 { "atmega88", "__AVR_ATmega88__" },
8542 { "atmega88a", "__AVR_ATmega88A__" },
8543 { "atmega88p", "__AVR_ATmega88P__" },
8544 { "atmega88pa", "__AVR_ATmega88PA__" },
8545 { "atmega8515", "__AVR_ATmega8515__" },
8546 { "atmega8535", "__AVR_ATmega8535__" },
8547 { "atmega8hva", "__AVR_ATmega8HVA__" },
8548 { "at90pwm1", "__AVR_AT90PWM1__" },
8549 { "at90pwm2", "__AVR_AT90PWM2__" },
8550 { "at90pwm2b", "__AVR_AT90PWM2B__" },
8551 { "at90pwm3", "__AVR_AT90PWM3__" },
8552 { "at90pwm3b", "__AVR_AT90PWM3B__" },
8553 { "at90pwm81", "__AVR_AT90PWM81__" },
8554 { "ata5790", "__AVR_ATA5790__" },
8555 { "ata5795", "__AVR_ATA5795__" },
8556 { "atmega16", "__AVR_ATmega16__" },
8557 { "atmega16a", "__AVR_ATmega16A__" },
8558 { "atmega161", "__AVR_ATmega161__" },
8559 { "atmega162", "__AVR_ATmega162__" },
8560 { "atmega163", "__AVR_ATmega163__" },
8561 { "atmega164a", "__AVR_ATmega164A__" },
8562 { "atmega164p", "__AVR_ATmega164P__" },
8563 { "atmega164pa", "__AVR_ATmega164PA__" },
8564 { "atmega165", "__AVR_ATmega165__" },
8565 { "atmega165a", "__AVR_ATmega165A__" },
8566 { "atmega165p", "__AVR_ATmega165P__" },
8567 { "atmega165pa", "__AVR_ATmega165PA__" },
8568 { "atmega168", "__AVR_ATmega168__" },
8569 { "atmega168a", "__AVR_ATmega168A__" },
8570 { "atmega168p", "__AVR_ATmega168P__" },
8571 { "atmega168pa", "__AVR_ATmega168PA__" },
8572 { "atmega169", "__AVR_ATmega169__" },
8573 { "atmega169a", "__AVR_ATmega169A__" },
8574 { "atmega169p", "__AVR_ATmega169P__" },
8575 { "atmega169pa", "__AVR_ATmega169PA__" },
8576 { "atmega32", "__AVR_ATmega32__" },
8577 { "atmega32a", "__AVR_ATmega32A__" },
8578 { "atmega323", "__AVR_ATmega323__" },
8579 { "atmega324a", "__AVR_ATmega324A__" },
8580 { "atmega324p", "__AVR_ATmega324P__" },
8581 { "atmega324pa", "__AVR_ATmega324PA__" },
8582 { "atmega325", "__AVR_ATmega325__" },
8583 { "atmega325a", "__AVR_ATmega325A__" },
8584 { "atmega325p", "__AVR_ATmega325P__" },
8585 { "atmega325pa", "__AVR_ATmega325PA__" },
8586 { "atmega3250", "__AVR_ATmega3250__" },
8587 { "atmega3250a", "__AVR_ATmega3250A__" },
8588 { "atmega3250p", "__AVR_ATmega3250P__" },
8589 { "atmega3250pa", "__AVR_ATmega3250PA__" },
8590 { "atmega328", "__AVR_ATmega328__" },
8591 { "atmega328p", "__AVR_ATmega328P__" },
8592 { "atmega329", "__AVR_ATmega329__" },
8593 { "atmega329a", "__AVR_ATmega329A__" },
8594 { "atmega329p", "__AVR_ATmega329P__" },
8595 { "atmega329pa", "__AVR_ATmega329PA__" },
8596 { "atmega3290", "__AVR_ATmega3290__" },
8597 { "atmega3290a", "__AVR_ATmega3290A__" },
8598 { "atmega3290p", "__AVR_ATmega3290P__" },
8599 { "atmega3290pa", "__AVR_ATmega3290PA__" },
8600 { "atmega406", "__AVR_ATmega406__" },
8601 { "atmega64", "__AVR_ATmega64__" },
8602 { "atmega64a", "__AVR_ATmega64A__" },
8603 { "atmega640", "__AVR_ATmega640__" },
8604 { "atmega644", "__AVR_ATmega644__" },
8605 { "atmega644a", "__AVR_ATmega644A__" },
8606 { "atmega644p", "__AVR_ATmega644P__" },
8607 { "atmega644pa", "__AVR_ATmega644PA__" },
8608 { "atmega645", "__AVR_ATmega645__" },
8609 { "atmega645a", "__AVR_ATmega645A__" },
8610 { "atmega645p", "__AVR_ATmega645P__" },
8611 { "atmega649", "__AVR_ATmega649__" },
8612 { "atmega649a", "__AVR_ATmega649A__" },
8613 { "atmega649p", "__AVR_ATmega649P__" },
8614 { "atmega6450", "__AVR_ATmega6450__" },
8615 { "atmega6450a", "__AVR_ATmega6450A__" },
8616 { "atmega6450p", "__AVR_ATmega6450P__" },
8617 { "atmega6490", "__AVR_ATmega6490__" },
8618 { "atmega6490a", "__AVR_ATmega6490A__" },
8619 { "atmega6490p", "__AVR_ATmega6490P__" },
8620 { "atmega64rfr2", "__AVR_ATmega64RFR2__" },
8621 { "atmega644rfr2", "__AVR_ATmega644RFR2__" },
8622 { "atmega16hva", "__AVR_ATmega16HVA__" },
8623 { "atmega16hva2", "__AVR_ATmega16HVA2__" },
8624 { "atmega16hvb", "__AVR_ATmega16HVB__" },
8625 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB__" },
8626 { "atmega32hvb", "__AVR_ATmega32HVB__" },
8627 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB__" },
8628 { "atmega64hve", "__AVR_ATmega64HVE__" },
8629 { "at90can32", "__AVR_AT90CAN32__" },
8630 { "at90can64", "__AVR_AT90CAN64__" },
8631 { "at90pwm161", "__AVR_AT90PWM161__" },
8632 { "at90pwm216", "__AVR_AT90PWM216__" },
8633 { "at90pwm316", "__AVR_AT90PWM316__" },
8634 { "atmega32c1", "__AVR_ATmega32C1__" },
8635 { "atmega64c1", "__AVR_ATmega64C1__" },
8636 { "atmega16m1", "__AVR_ATmega16M1__" },
8637 { "atmega32m1", "__AVR_ATmega32M1__" },
8638 { "atmega64m1", "__AVR_ATmega64M1__" },
8639 { "atmega16u4", "__AVR_ATmega16U4__" },
8640 { "atmega32u4", "__AVR_ATmega32U4__" },
8641 { "atmega32u6", "__AVR_ATmega32U6__" },
8642 { "at90usb646", "__AVR_AT90USB646__" },
8643 { "at90usb647", "__AVR_AT90USB647__" },
8644 { "at90scr100", "__AVR_AT90SCR100__" },
8645 { "at94k", "__AVR_AT94K__" },
8646 { "m3000", "__AVR_AT000__" },
8647 { "atmega128", "__AVR_ATmega128__" },
8648 { "atmega128a", "__AVR_ATmega128A__" },
8649 { "atmega1280", "__AVR_ATmega1280__" },
8650 { "atmega1281", "__AVR_ATmega1281__" },
8651 { "atmega1284", "__AVR_ATmega1284__" },
8652 { "atmega1284p", "__AVR_ATmega1284P__" },
8653 { "atmega128rfa1", "__AVR_ATmega128RFA1__" },
8654 { "atmega128rfr2", "__AVR_ATmega128RFR2__" },
8655 { "atmega1284rfr2", "__AVR_ATmega1284RFR2__" },
8656 { "at90can128", "__AVR_AT90CAN128__" },
8657 { "at90usb1286", "__AVR_AT90USB1286__" },
8658 { "at90usb1287", "__AVR_AT90USB1287__" },
8659 { "atmega2560", "__AVR_ATmega2560__" },
8660 { "atmega2561", "__AVR_ATmega2561__" },
8661 { "atmega256rfr2", "__AVR_ATmega256RFR2__" },
8662 { "atmega2564rfr2", "__AVR_ATmega2564RFR2__" },
8663 { "atxmega16a4", "__AVR_ATxmega16A4__" },
8664 { "atxmega16a4u", "__AVR_ATxmega16a4U__" },
8665 { "atxmega16c4", "__AVR_ATxmega16C4__" },
8666 { "atxmega16d4", "__AVR_ATxmega16D4__" },
8667 { "atxmega32a4", "__AVR_ATxmega32A4__" },
8668 { "atxmega32a4u", "__AVR_ATxmega32A4U__" },
8669 { "atxmega32c4", "__AVR_ATxmega32C4__" },
8670 { "atxmega32d4", "__AVR_ATxmega32D4__" },
8671 { "atxmega32e5", "__AVR_ATxmega32E5__" },
8672 { "atxmega16e5", "__AVR_ATxmega16E5__" },
8673 { "atxmega8e5", "__AVR_ATxmega8E5__" },
8674 { "atxmega32x1", "__AVR_ATxmega32X1__" },
8675 { "atxmega64a3", "__AVR_ATxmega64A3__" },
8676 { "atxmega64a3u", "__AVR_ATxmega64A3U__" },
8677 { "atxmega64a4u", "__AVR_ATxmega64A4U__" },
8678 { "atxmega64b1", "__AVR_ATxmega64B1__" },
8679 { "atxmega64b3", "__AVR_ATxmega64B3__" },
8680 { "atxmega64c3", "__AVR_ATxmega64C3__" },
8681 { "atxmega64d3", "__AVR_ATxmega64D3__" },
8682 { "atxmega64d4", "__AVR_ATxmega64D4__" },
8683 { "atxmega64a1", "__AVR_ATxmega64A1__" },
8684 { "atxmega64a1u", "__AVR_ATxmega64A1U__" },
8685 { "atxmega128a3", "__AVR_ATxmega128A3__" },
8686 { "atxmega128a3u", "__AVR_ATxmega128A3U__" },
8687 { "atxmega128b1", "__AVR_ATxmega128B1__" },
8688 { "atxmega128b3", "__AVR_ATxmega128B3__" },
8689 { "atxmega128c3", "__AVR_ATxmega128C3__" },
8690 { "atxmega128d3", "__AVR_ATxmega128D3__" },
8691 { "atxmega128d4", "__AVR_ATxmega128D4__" },
8692 { "atxmega192a3", "__AVR_ATxmega192A3__" },
8693 { "atxmega192a3u", "__AVR_ATxmega192A3U__" },
8694 { "atxmega192c3", "__AVR_ATxmega192C3__" },
8695 { "atxmega192d3", "__AVR_ATxmega192D3__" },
8696 { "atxmega256a3", "__AVR_ATxmega256A3__" },
8697 { "atxmega256a3u", "__AVR_ATxmega256A3U__" },
8698 { "atxmega256a3b", "__AVR_ATxmega256A3B__" },
8699 { "atxmega256a3bu", "__AVR_ATxmega256A3BU__" },
8700 { "atxmega256c3", "__AVR_ATxmega256C3__" },
8701 { "atxmega256d3", "__AVR_ATxmega256D3__" },
8702 { "atxmega384c3", "__AVR_ATxmega384C3__" },
8703 { "atxmega384d3", "__AVR_ATxmega384D3__" },
8704 { "atxmega128a1", "__AVR_ATxmega128A1__" },
8705 { "atxmega128a1u", "__AVR_ATxmega128A1U__" },
8706 { "atxmega128a4u", "__AVR_ATxmega128a4U__" },
8707 { "attiny4", "__AVR_ATtiny4__" },
8708 { "attiny5", "__AVR_ATtiny5__" },
8709 { "attiny9", "__AVR_ATtiny9__" },
8710 { "attiny10", "__AVR_ATtiny10__" },
8711 { "attiny20", "__AVR_ATtiny20__" },
8712 { "attiny40", "__AVR_ATtiny40__" },
8713 { "attiny102", "__AVR_ATtiny102__" },
8714 { "attiny104", "__AVR_ATtiny104__" },
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008715};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008716
8717// AVR Target
8718class AVRTargetInfo : public TargetInfo {
8719public:
8720 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8721 : TargetInfo(Triple) {
8722 TLSSupported = false;
8723 PointerWidth = 16;
8724 PointerAlign = 8;
8725 IntWidth = 16;
8726 IntAlign = 8;
8727 LongWidth = 32;
8728 LongAlign = 8;
8729 LongLongWidth = 64;
8730 LongLongAlign = 8;
8731 SuitableAlign = 8;
8732 DefaultAlignForAttributeAligned = 8;
8733 HalfWidth = 16;
8734 HalfAlign = 8;
8735 FloatWidth = 32;
8736 FloatAlign = 8;
8737 DoubleWidth = 32;
8738 DoubleAlign = 8;
8739 DoubleFormat = &llvm::APFloat::IEEEsingle();
8740 LongDoubleWidth = 32;
8741 LongDoubleAlign = 8;
8742 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8743 SizeType = UnsignedInt;
8744 PtrDiffType = SignedInt;
8745 IntPtrType = SignedInt;
8746 Char16Type = UnsignedInt;
8747 WCharType = SignedInt;
8748 WIntType = SignedInt;
8749 Char32Type = UnsignedLong;
8750 SigAtomicType = SignedChar;
8751 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8752 "-f32:32:32-f64:64:64-n8");
8753 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008754
Dylan McKay924fa3a2017-01-05 05:20:27 +00008755 void getTargetDefines(const LangOptions &Opts,
8756 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008757 Builder.defineMacro("AVR");
8758 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008759 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008760
8761 if (!this->CPU.empty()) {
8762 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8763 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8764
8765 if (It != AVRMcus.end())
8766 Builder.defineMacro(It->DefineName);
8767 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008768 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008769
Dylan McKay924fa3a2017-01-05 05:20:27 +00008770 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8771 return None;
8772 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008773
Dylan McKay924fa3a2017-01-05 05:20:27 +00008774 BuiltinVaListKind getBuiltinVaListKind() const override {
8775 return TargetInfo::VoidPtrBuiltinVaList;
8776 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008777
Dylan McKay924fa3a2017-01-05 05:20:27 +00008778 const char *getClobbers() const override {
8779 return "";
8780 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008781
Dylan McKay924fa3a2017-01-05 05:20:27 +00008782 ArrayRef<const char *> getGCCRegNames() const override {
8783 static const char * const GCCRegNames[] = {
8784 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8785 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8786 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008787 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008788 };
8789 return llvm::makeArrayRef(GCCRegNames);
8790 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008791
Dylan McKay924fa3a2017-01-05 05:20:27 +00008792 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8793 return None;
8794 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008795
Dylan McKay924fa3a2017-01-05 05:20:27 +00008796 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8797 static const TargetInfo::AddlRegName AddlRegNames[] = {
8798 { { "r26", "r27"}, 26 },
8799 { { "r28", "r29"}, 27 },
8800 { { "r30", "r31"}, 28 },
8801 { { "SPL", "SPH"}, 29 },
8802 };
8803 return llvm::makeArrayRef(AddlRegNames);
8804 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008805
Dylan McKay924fa3a2017-01-05 05:20:27 +00008806 bool validateAsmConstraint(const char *&Name,
8807 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008808 // There aren't any multi-character AVR specific constraints.
8809 if (StringRef(Name).size() > 1) return false;
8810
8811 switch (*Name) {
8812 default: return false;
8813 case 'a': // Simple upper registers
8814 case 'b': // Base pointer registers pairs
8815 case 'd': // Upper register
8816 case 'l': // Lower registers
8817 case 'e': // Pointer register pairs
8818 case 'q': // Stack pointer register
8819 case 'r': // Any register
8820 case 'w': // Special upper register pairs
8821 case 't': // Temporary register
8822 case 'x': case 'X': // Pointer register pair X
8823 case 'y': case 'Y': // Pointer register pair Y
8824 case 'z': case 'Z': // Pointer register pair Z
8825 Info.setAllowsRegister();
8826 return true;
8827 case 'I': // 6-bit positive integer constant
8828 Info.setRequiresImmediate(0, 63);
8829 return true;
8830 case 'J': // 6-bit negative integer constant
8831 Info.setRequiresImmediate(-63, 0);
8832 return true;
8833 case 'K': // Integer constant (Range: 2)
8834 Info.setRequiresImmediate(2);
8835 return true;
8836 case 'L': // Integer constant (Range: 0)
8837 Info.setRequiresImmediate(0);
8838 return true;
8839 case 'M': // 8-bit integer constant
8840 Info.setRequiresImmediate(0, 0xff);
8841 return true;
8842 case 'N': // Integer constant (Range: -1)
8843 Info.setRequiresImmediate(-1);
8844 return true;
8845 case 'O': // Integer constant (Range: 8, 16, 24)
8846 Info.setRequiresImmediate({8, 16, 24});
8847 return true;
8848 case 'P': // Integer constant (Range: 1)
8849 Info.setRequiresImmediate(1);
8850 return true;
8851 case 'R': // Integer constant (Range: -6 to 5)
8852 Info.setRequiresImmediate(-6, 5);
8853 return true;
8854 case 'G': // Floating point constant
8855 case 'Q': // A memory address based on Y or Z pointer with displacement.
8856 return true;
8857 }
8858
Dylan McKay924fa3a2017-01-05 05:20:27 +00008859 return false;
8860 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008861
Dylan McKay924fa3a2017-01-05 05:20:27 +00008862 IntType getIntTypeByWidth(unsigned BitWidth,
8863 bool IsSigned) const final {
8864 // AVR prefers int for 16-bit integers.
8865 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8866 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8867 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008868
Dylan McKay924fa3a2017-01-05 05:20:27 +00008869 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8870 bool IsSigned) const final {
8871 // AVR uses int for int_least16_t and int_fast16_t.
8872 return BitWidth == 16
8873 ? (IsSigned ? SignedInt : UnsignedInt)
8874 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8875 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008876
8877 bool setCPU(const std::string &Name) override {
8878 bool IsFamily = llvm::StringSwitch<bool>(Name)
8879 .Case("avr1", true)
8880 .Case("avr2", true)
8881 .Case("avr25", true)
8882 .Case("avr3", true)
8883 .Case("avr31", true)
8884 .Case("avr35", true)
8885 .Case("avr4", true)
8886 .Case("avr5", true)
8887 .Case("avr51", true)
8888 .Case("avr6", true)
8889 .Case("avrxmega1", true)
8890 .Case("avrxmega2", true)
8891 .Case("avrxmega3", true)
8892 .Case("avrxmega4", true)
8893 .Case("avrxmega5", true)
8894 .Case("avrxmega6", true)
8895 .Case("avrxmega7", true)
8896 .Case("avrtiny", true)
8897 .Default(false);
8898
8899 if (IsFamily) this->CPU = Name;
8900
8901 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8902 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8903
8904 if (IsMCU) this->CPU = Name;
8905
8906 return IsFamily || IsMCU;
8907 }
8908
8909protected:
8910 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008911};
8912
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008913} // end anonymous namespace
8914
Chris Lattner5ba61f02006-10-14 07:39:34 +00008915//===----------------------------------------------------------------------===//
8916// Driver code
8917//===----------------------------------------------------------------------===//
8918
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008919static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8920 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008921 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008922
Daniel Dunbar52322032009-08-18 05:47:58 +00008923 switch (Triple.getArch()) {
8924 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008925 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008926
Tim Northover2a0783d2014-05-30 14:14:07 +00008927 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008928 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008929
8930 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008931 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008932
Jacques Pienaard964cc22016-03-28 21:02:54 +00008933 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008934 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008935
Tim Northover2a0783d2014-05-30 14:14:07 +00008936 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008937 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008938 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008939
8940 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008941 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008942 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008943 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008944 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008945 case llvm::Triple::Fuchsia:
8946 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008947 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008948 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008949 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008950 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008951 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008952 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008953 }
8954
Christian Pirker9b019ae2014-02-25 13:51:00 +00008955 case llvm::Triple::aarch64_be:
8956 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008957 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008958 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008959 case llvm::Triple::Fuchsia:
8960 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008961 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008962 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008963 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008964 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008965 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008966 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008967 }
8968
Daniel Dunbar52322032009-08-18 05:47:58 +00008969 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008970 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008971 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008972 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008973
Daniel Dunbar52322032009-08-18 05:47:58 +00008974 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008975 case llvm::Triple::CloudABI:
8976 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008977 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008978 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008979 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008980 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008981 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008982 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008983 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008984 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008985 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008986 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008987 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008988 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008989 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008990 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008991 case llvm::Triple::Win32:
8992 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008993 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008994 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008995 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008996 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008997 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008998 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008999 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009000 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009001 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00009002 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009003 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009004 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009005 }
9006
9007 case llvm::Triple::armeb:
9008 case llvm::Triple::thumbeb:
9009 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009010 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009011
9012 switch (os) {
9013 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009014 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009015 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009016 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009017 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009018 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009019 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009020 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009021 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009022 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009023 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009024 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009025 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009026 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009027 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009028 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009029 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009030
Dylan McKay924fa3a2017-01-05 05:20:27 +00009031 case llvm::Triple::avr:
9032 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009033 case llvm::Triple::bpfeb:
9034 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009035 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009036
Daniel Dunbar52322032009-08-18 05:47:58 +00009037 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009038 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009039
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009040 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009041 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009042 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009043 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009044 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009045 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009046 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009047 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009048 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009049 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009050 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009051 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009052 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009053
9054 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009055 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009056 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009057 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009058 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009059 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009060 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009061 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009062 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009063 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009064 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009065 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009066 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009067 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009068 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009069
Akira Hatanakabef17452011-09-20 19:21:49 +00009070 case llvm::Triple::mips64:
9071 switch (os) {
9072 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009073 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009074 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009075 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009076 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009077 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009078 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009079 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009080 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009081 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009082 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009083 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009084 }
9085
9086 case llvm::Triple::mips64el:
9087 switch (os) {
9088 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009089 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009090 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009091 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009092 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009093 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009094 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009095 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009096 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009097 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009098 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009099 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009100 }
9101
Ivan Krasindd7403e2011-08-24 20:22:22 +00009102 case llvm::Triple::le32:
9103 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009104 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009105 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009106 default:
9107 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009108 }
9109
JF Bastien643817d2014-09-12 17:52:47 +00009110 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009111 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009112
Daniel Dunbar52322032009-08-18 05:47:58 +00009113 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009114 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009115 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009116 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009117 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009118 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009119 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009120 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009121 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009122 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009123 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009124 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009125 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009126 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009127 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009128 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009129 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009130
9131 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009132 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009133 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009134 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009135 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009136 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009137 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009138 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009139 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009140 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009141 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009143 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009145 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009146
Bill Schmidt778d3872013-07-26 01:36:11 +00009147 case llvm::Triple::ppc64le:
9148 switch (os) {
9149 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009151 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009153 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009155 }
9156
Peter Collingbournec947aae2012-05-20 23:28:41 +00009157 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009158 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009159 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009160 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009161
Tom Stellardd8e38a32015-01-06 20:34:47 +00009162 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009163 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009164 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009165
Daniel Dunbar52322032009-08-18 05:47:58 +00009166 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009167 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009168 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009170 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009172 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009173 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009174 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009175 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009176 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009177 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009178 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009179 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009180 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009181
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009182 // The 'sparcel' architecture copies all the above cases except for Solaris.
9183 case llvm::Triple::sparcel:
9184 switch (os) {
9185 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009186 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009187 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009188 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009189 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009190 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009191 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009192 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009193 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009194 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009195 }
9196
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009197 case llvm::Triple::sparcv9:
9198 switch (os) {
9199 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009200 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009201 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009202 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009203 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009204 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009205 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009207 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009208 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009209 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009210 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009211 }
9212
Ulrich Weigand47445072013-05-06 16:26:41 +00009213 case llvm::Triple::systemz:
9214 switch (os) {
9215 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009216 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009217 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009218 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009219 }
9220
Eli Friedmana9c3d712009-08-19 20:47:07 +00009221 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009222 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009223
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009224 case llvm::Triple::tcele:
9225 return new TCELETargetInfo(Triple, Opts);
9226
Daniel Dunbar52322032009-08-18 05:47:58 +00009227 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009228 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009229 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009230
Daniel Dunbar52322032009-08-18 05:47:58 +00009231 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009232 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009233 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009234 case llvm::Triple::Linux: {
9235 switch (Triple.getEnvironment()) {
9236 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009237 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009238 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009239 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009240 }
9241 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009242 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009243 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009244 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009245 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009246 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009247 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009248 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009249 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009250 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009251 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009252 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009253 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009254 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009255 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009256 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009257 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009258 case llvm::Triple::Win32: {
9259 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009260 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009261 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009262 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009263 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009264 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009265 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009266 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009268 }
9269 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009270 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009272 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009274 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009276 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009277 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009278 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009279 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009280 }
9281
9282 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009283 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009284 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009285
Daniel Dunbar52322032009-08-18 05:47:58 +00009286 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009287 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009288 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009289 case llvm::Triple::Linux: {
9290 switch (Triple.getEnvironment()) {
9291 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009292 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009293 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009294 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009295 }
9296 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009297 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009298 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009299 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009301 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009303 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009304 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009305 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009306 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009307 case llvm::Triple::Fuchsia:
9308 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009309 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009310 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009311 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009312 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009313 case llvm::Triple::Win32: {
9314 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009315 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009316 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009317 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009318 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009319 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009320 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009321 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009322 }
9323 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009324 case llvm::Triple::Haiku:
9325 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009326 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009327 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009328 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009329 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009330 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009331 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009332 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009333
Douglas Katzman78d7c542015-05-12 21:18:10 +00009334 case llvm::Triple::spir: {
9335 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9336 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9337 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009338 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009339 }
9340 case llvm::Triple::spir64: {
9341 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9342 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9343 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009344 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009345 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009346 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009347 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9348 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9349 Triple.getOS() != llvm::Triple::UnknownOS ||
9350 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9351 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009352 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009353 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009354 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009355 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9356 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9357 Triple.getOS() != llvm::Triple::UnknownOS ||
9358 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9359 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009360 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009361 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009362
9363 case llvm::Triple::renderscript32:
9364 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9365 case llvm::Triple::renderscript64:
9366 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009367 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009368}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009369
9370/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009371/// options.
Alp Toker80758082014-07-06 05:26:44 +00009372TargetInfo *
9373TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009374 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009375 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009376
9377 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009378 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009379 if (!Target) {
9380 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009381 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009382 }
Alp Toker80758082014-07-06 05:26:44 +00009383 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009384
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009385 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009386 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9387 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009388 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009389 }
9390
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009391 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009392 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9393 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009394 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009395 }
9396
Rafael Espindolaeb265472013-08-21 21:59:03 +00009397 // Set the fp math unit.
9398 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9399 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009400 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009401 }
9402
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009403 // Compute the default target features, we need the target to handle this
9404 // because features may have dependencies on one another.
9405 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009406 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9407 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009408 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009409
9410 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009411 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009412 for (const auto &F : Features)
9413 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9414
Eric Christopher3ff21b32013-10-16 21:26:26 +00009415 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009416 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009417
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009418 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009419 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009420
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009421 if (!Target->validateTarget(Diags))
9422 return nullptr;
9423
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009424 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009425}