blob: e9f5416718ec96eefabbe93fc1b060151a728fd8 [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");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 }
549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000550 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
551 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000552 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000553
Eli Friedman3715d1f2011-12-15 02:15:56 +0000554 switch (Triple.getArch()) {
555 default:
556 case llvm::Triple::x86:
557 case llvm::Triple::x86_64:
558 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000559 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000560 this->MCountName = "__mcount";
561 break;
562 case llvm::Triple::mips64:
563 case llvm::Triple::mips64el:
564 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000565 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000566 this->MCountName = "_mcount";
567 break;
568 }
569 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000570};
571
Eli Friedman9fa28852012-08-08 23:57:20 +0000572// Bitrig Target
573template<typename Target>
574class BitrigTargetInfo : public OSTargetInfo<Target> {
575protected:
Craig Topper3164f332014-03-11 03:39:26 +0000576 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
577 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000578 // Bitrig defines; list based off of gcc output
579
580 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000581 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000582 Builder.defineMacro("__ELF__");
583 if (Opts.POSIXThreads)
584 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000585
586 switch (Triple.getArch()) {
587 default:
588 break;
589 case llvm::Triple::arm:
590 case llvm::Triple::armeb:
591 case llvm::Triple::thumb:
592 case llvm::Triple::thumbeb:
593 Builder.defineMacro("__ARM_DWARF_EH__");
594 break;
595 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000596 }
597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000598 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
599 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000600 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000601 }
602};
603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000604// PSP Target
605template<typename Target>
606class PSPTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000610 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000611 Builder.defineMacro("PSP");
612 Builder.defineMacro("_PSP");
613 Builder.defineMacro("__psp__");
614 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000615 }
616public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000617 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000618};
619
John Thompsone467e192009-11-19 17:18:50 +0000620// PS3 PPU Target
621template<typename Target>
622class PS3PPUTargetInfo : public OSTargetInfo<Target> {
623protected:
Craig Topper3164f332014-03-11 03:39:26 +0000624 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
625 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000626 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000627 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("__PPU__");
629 Builder.defineMacro("__CELLOS_LV2__");
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000632 Builder.defineMacro("_ARCH_PPC64");
633 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000634 }
635public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000636 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
637 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000638 this->LongWidth = this->LongAlign = 32;
639 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000640 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000641 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000642 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000643 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000644 }
645};
646
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647template <typename Target>
648class PS4OSTargetInfo : public OSTargetInfo<Target> {
649protected:
650 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
651 MacroBuilder &Builder) const override {
652 Builder.defineMacro("__FreeBSD__", "9");
653 Builder.defineMacro("__FreeBSD_cc_version", "900001");
654 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000655 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000657 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 }
659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000660 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
661 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000662 this->WCharType = this->UnsignedShort;
663
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000664 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
665 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000666
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000667 // On PS4, do not honor explicit bit field alignment,
668 // as in "__attribute__((aligned(2))) int b : 1;".
669 this->UseExplicitBitFieldAlignment = false;
670
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000671 switch (Triple.getArch()) {
672 default:
673 case llvm::Triple::x86_64:
674 this->MCountName = ".mcount";
675 break;
676 }
677 }
678};
679
Torok Edwinb2b37c62009-06-30 17:10:35 +0000680// Solaris target
681template<typename Target>
682class SolarisTargetInfo : public OSTargetInfo<Target> {
683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000686 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000687 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__svr4__");
690 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000691 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
692 // newer, but to 500 for everything else. feature_test.h has a check to
693 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000694 // with a new version.
695 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000696 Builder.defineMacro("_XOPEN_SOURCE", "600");
697 else
698 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000699 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000700 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000701 Builder.defineMacro("_LARGEFILE_SOURCE");
702 Builder.defineMacro("_LARGEFILE64_SOURCE");
703 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000704 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000705 }
706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000707 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
708 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000709 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000710 // FIXME: WIntType should be SignedLong
711 }
712};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713
714// Windows target
715template<typename Target>
716class WindowsTargetInfo : public OSTargetInfo<Target> {
717protected:
Craig Topper3164f332014-03-11 03:39:26 +0000718 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
719 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720 Builder.defineMacro("_WIN32");
721 }
722 void getVisualStudioDefines(const LangOptions &Opts,
723 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000725 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 Builder.defineMacro("_CPPRTTI");
727
Reid Kleckner16514352015-01-30 21:42:55 +0000728 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000729 Builder.defineMacro("_CPPUNWIND");
730 }
731
David Majnemer6a658902015-07-22 22:36:26 +0000732 if (Opts.Bool)
733 Builder.defineMacro("__BOOL_DEFINED");
734
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000735 if (!Opts.CharIsSigned)
736 Builder.defineMacro("_CHAR_UNSIGNED");
737
738 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
739 // but it works for now.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000742
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000743 if (Opts.MSCompatibilityVersion) {
744 Builder.defineMacro("_MSC_VER",
745 Twine(Opts.MSCompatibilityVersion / 100000));
746 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000747 // FIXME We cannot encode the revision information into 32-bits
748 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000749
David Majnemerb710a932015-05-11 03:57:49 +0000750 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000751 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000752
753 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
754 if (Opts.CPlusPlus1z)
755 Builder.defineMacro("_MSVC_LANG", "201403L");
756 else if (Opts.CPlusPlus14)
757 Builder.defineMacro("_MSVC_LANG", "201402L");
758 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000759 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000760
761 if (Opts.MicrosoftExt) {
762 Builder.defineMacro("_MSC_EXTENSIONS");
763
764 if (Opts.CPlusPlus11) {
765 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
766 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
767 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
768 }
769 }
770
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000771 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772 }
773
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000775 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
776 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000777};
778
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779template <typename Target>
780class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000781protected:
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
783 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000784 if (Opts.POSIXThreads)
785 Builder.defineMacro("_REENTRANT");
786 if (Opts.CPlusPlus)
787 Builder.defineMacro("_GNU_SOURCE");
788
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000789 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 Builder.defineMacro("__ELF__");
791 Builder.defineMacro("__native_client__");
792 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000793
794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000795 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
796 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongAlign = 32;
798 this->LongWidth = 32;
799 this->PointerAlign = 32;
800 this->PointerWidth = 32;
801 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000802 this->Int64Type = TargetInfo::SignedLongLong;
803 this->DoubleAlign = 64;
804 this->LongDoubleWidth = 64;
805 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000806 this->LongLongWidth = 64;
807 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000808 this->SizeType = TargetInfo::UnsignedInt;
809 this->PtrDiffType = TargetInfo::SignedInt;
810 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000811 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000812 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000814 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else {
822 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000823 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000824 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000825 }
826};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000827
Petr Hosek62e1d232016-10-06 06:08:09 +0000828// Fuchsia Target
829template<typename Target>
830class FuchsiaTargetInfo : public OSTargetInfo<Target> {
831protected:
832 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
833 MacroBuilder &Builder) const override {
834 Builder.defineMacro("__Fuchsia__");
835 Builder.defineMacro("__ELF__");
836 if (Opts.POSIXThreads)
837 Builder.defineMacro("_REENTRANT");
838 // Required by the libc++ locale support.
839 if (Opts.CPlusPlus)
840 Builder.defineMacro("_GNU_SOURCE");
841 }
842public:
843 FuchsiaTargetInfo(const llvm::Triple &Triple,
844 const TargetOptions &Opts)
845 : OSTargetInfo<Target>(Triple, Opts) {
846 this->MCountName = "__mcount";
847 }
848};
849
Dan Gohmanc2853072015-09-03 22:51:53 +0000850// WebAssembly target
851template <typename Target>
852class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
853 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000854 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000855 // A common platform macro.
856 if (Opts.POSIXThreads)
857 Builder.defineMacro("_REENTRANT");
858 // Follow g++ convention and predefine _GNU_SOURCE for C++.
859 if (Opts.CPlusPlus)
860 Builder.defineMacro("_GNU_SOURCE");
861 }
862
863 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000864 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000865 return ".text.__startup";
866 }
867
868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000869 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
870 const TargetOptions &Opts)
871 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000872 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000873 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
874 }
875};
Dan Gohmanc2853072015-09-03 22:51:53 +0000876
Chris Lattner09d98f52008-10-05 21:50:58 +0000877//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878// Specific target implementations.
879//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000880
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881// PPC abstract base class
882class PPCTargetInfo : public TargetInfo {
883 static const Builtin::Info BuiltinInfo[];
884 static const char * const GCCRegNames[];
885 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000886 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887
888 // Target cpu features.
889 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000890 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000891 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000892 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000893 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000894 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000895 bool HasBPERMD;
896 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000897 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000898
Ulrich Weigand8afad612014-07-28 13:17:52 +0000899protected:
900 std::string ABI;
901
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000903 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000904 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
905 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000906 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000907 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000908 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000909 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000910 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000911
Hal Finkel6b984f02012-07-03 16:51:04 +0000912 /// \brief Flags for architecture specific defines.
913 typedef enum {
914 ArchDefineNone = 0,
915 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
916 ArchDefinePpcgr = 1 << 1,
917 ArchDefinePpcsq = 1 << 2,
918 ArchDefine440 = 1 << 3,
919 ArchDefine603 = 1 << 4,
920 ArchDefine604 = 1 << 5,
921 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 ArchDefinePwr5 = 1 << 7,
923 ArchDefinePwr5x = 1 << 8,
924 ArchDefinePwr6 = 1 << 9,
925 ArchDefinePwr6x = 1 << 10,
926 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000927 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 ArchDefinePwr9 = 1 << 13,
929 ArchDefineA2 = 1 << 14,
930 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000931 } ArchDefineTypes;
932
Bill Schmidt38378a02013-02-01 20:23:10 +0000933 // Note: GCC recognizes the following additional cpus:
934 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
935 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
936 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000937 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 bool CPUKnown = llvm::StringSwitch<bool>(Name)
939 .Case("generic", true)
940 .Case("440", true)
941 .Case("450", true)
942 .Case("601", true)
943 .Case("602", true)
944 .Case("603", true)
945 .Case("603e", true)
946 .Case("603ev", true)
947 .Case("604", true)
948 .Case("604e", true)
949 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000950 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("g3", true)
952 .Case("7400", true)
953 .Case("g4", true)
954 .Case("7450", true)
955 .Case("g4+", true)
956 .Case("750", true)
957 .Case("970", true)
958 .Case("g5", true)
959 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000960 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000961 .Case("e500mc", true)
962 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000963 .Case("power3", true)
964 .Case("pwr3", true)
965 .Case("power4", true)
966 .Case("pwr4", true)
967 .Case("power5", true)
968 .Case("pwr5", true)
969 .Case("power5x", true)
970 .Case("pwr5x", true)
971 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000972 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("power6x", true)
974 .Case("pwr6x", true)
975 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000976 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000977 .Case("power8", true)
978 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000979 .Case("power9", true)
980 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000985 .Case("powerpc64le", true)
986 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Default(false);
988
989 if (CPUKnown)
990 CPU = Name;
991
992 return CPUKnown;
993 }
994
Ulrich Weigand8afad612014-07-28 13:17:52 +0000995
996 StringRef getABI() const override { return ABI; }
997
Craig Topper6c03a542015-10-19 04:51:35 +0000998 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
999 return llvm::makeArrayRef(BuiltinInfo,
1000 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 void getTargetDefines(const LangOptions &Opts,
1006 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001007
Eric Christopher8c47b422015-10-09 18:39:55 +00001008 bool
1009 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1010 StringRef CPU,
1011 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001012
Craig Topper3164f332014-03-11 03:39:26 +00001013 bool handleTargetFeatures(std::vector<std::string> &Features,
1014 DiagnosticsEngine &Diags) override;
1015 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001016 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1017 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001018
Craig Topperf054e3a2015-10-19 03:52:27 +00001019 ArrayRef<const char *> getGCCRegNames() const override;
1020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001021 bool validateAsmConstraint(const char *&Name,
1022 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001023 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001024 default: return false;
1025 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001026 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 case 'b': // Base register
1028 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001029 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001030 break;
1031 // FIXME: The following are added to allow parsing.
1032 // I just took a guess at what the actions should be.
1033 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001035 case 'v': // Altivec vector register
1036 Info.setAllowsRegister();
1037 break;
1038 case 'w':
1039 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001040 case 'd':// VSX vector register to hold vector double data
1041 case 'f':// VSX vector register to hold vector float data
1042 case 's':// VSX vector register to hold scalar float data
1043 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001044 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 default:
1047 return false;
1048 }
1049 Info.setAllowsRegister();
1050 Name++; // Skip over 'w'.
1051 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001052 case 'h': // `MQ', `CTR', or `LINK' register
1053 case 'q': // `MQ' register
1054 case 'c': // `CTR' register
1055 case 'l': // `LINK' register
1056 case 'x': // `CR' register (condition register) number 0
1057 case 'y': // `CR' register (condition register)
1058 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // (use `L' instead for SImode constants)
1064 case 'K': // Unsigned 16-bit constant
1065 case 'L': // Signed 16-bit constant shifted left 16 bits
1066 case 'M': // Constant larger than 31
1067 case 'N': // Exact power of 2
1068 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001073 break;
1074 case 'm': // Memory operand. Note that on PowerPC targets, m can
1075 // include addresses that update the base register. It
1076 // is therefore only safe to use `m' in an asm statement
1077 // if that asm statement accesses the operand exactly once.
1078 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001079 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1084 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001085 // register to be updated.
1086 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001087 if (Name[1] != 's')
1088 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001089 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001090 // include any automodification of the base register. Unlike
1091 // `m', this constraint can be used in asm statements that
1092 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001093 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001094 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001095 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001096 break;
1097 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001098 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001099 case 'Z': // Memory operand that is an indexed or indirect from a
1100 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001101 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001102 Info.setAllowsMemory();
1103 Info.setAllowsRegister();
1104 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001106 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 // register (`p' is preferable for asm statements)
1108 case 'S': // Constant suitable as a 64-bit mask operand
1109 case 'T': // Constant suitable as a 32-bit mask operand
1110 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001111 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // instructions
1113 case 'W': // Vector constant that does not require memory
1114 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001115 break;
1116 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
John Thompson07a61a42010-06-24 22:44:13 +00001118 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
Craig Topper3164f332014-03-11 03:39:26 +00001120 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001121 std::string R;
1122 switch (*Constraint) {
1123 case 'e':
1124 case 'w':
1125 // Two-character constraint; add "^" hint for later parsing.
1126 R = std::string("^") + std::string(Constraint, 2);
1127 Constraint++;
1128 break;
1129 default:
1130 return TargetInfo::convertConstraint(Constraint);
1131 }
1132 return R;
1133 }
Craig Topper3164f332014-03-11 03:39:26 +00001134 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001136 }
Craig Topper3164f332014-03-11 03:39:26 +00001137 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001138 if (RegNo == 0) return 3;
1139 if (RegNo == 1) return 4;
1140 return -1;
1141 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001142
1143 bool hasSjLjLowering() const override {
1144 return true;
1145 }
David Majnemer2617ea62015-06-09 18:05:33 +00001146
1147 bool useFloat128ManglingForLongDouble() const override {
1148 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001149 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001150 getTriple().isOSBinFormatELF();
1151 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152};
Anders Carlssonf511f642007-11-27 04:11:28 +00001153
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001155#define BUILTIN(ID, TYPE, ATTRS) \
1156 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1157#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1158 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001159#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001161
Eric Christopher917e9522014-11-18 22:36:15 +00001162/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001164bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001166 for (const auto &Feature : Features) {
1167 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001168 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001174 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001176 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001178 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001180 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001182 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001183 } else if (Feature == "+float128") {
1184 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001185 } else if (Feature == "+power9-vector") {
1186 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001187 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001188 // TODO: Finish this list and add an assert that we've handled them
1189 // all.
1190 }
Eric Christopher02c33352015-08-25 00:59:11 +00001191
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001192 return true;
1193}
1194
Chris Lattnerecd49032009-03-02 22:27:17 +00001195/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1196/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001197void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001199 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001201 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001203 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001207 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001209 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001211
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1214 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 } else {
1216 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1217 getTriple().getOS() != llvm::Triple::OpenBSD)
1218 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001219 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001220
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001222 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 Builder.defineMacro("_CALL_ELF", "1");
1224 if (ABI == "elfv2")
1225 Builder.defineMacro("_CALL_ELF", "2");
1226
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001228 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1229 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001230
Chris Lattnerecd49032009-03-02 22:27:17 +00001231 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001232 if (LongDoubleWidth == 128)
1233 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001234
John Thompsone467e192009-11-19 17:18:50 +00001235 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 Builder.defineMacro("__VEC__", "10206");
1237 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001238 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001239
1240 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001241 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1242 .Case("440", ArchDefineName)
1243 .Case("450", ArchDefineName | ArchDefine440)
1244 .Case("601", ArchDefineName)
1245 .Case("602", ArchDefineName | ArchDefinePpcgr)
1246 .Case("603", ArchDefineName | ArchDefinePpcgr)
1247 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1248 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1249 .Case("604", ArchDefineName | ArchDefinePpcgr)
1250 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1251 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001252 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001253 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1254 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1255 .Case("750", ArchDefineName | ArchDefinePpcgr)
1256 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001258 .Case("a2", ArchDefineA2)
1259 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("pwr3", ArchDefinePpcgr)
1261 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1263 | ArchDefinePpcsq)
1264 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1265 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1267 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1269 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1272 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001273 | ArchDefinePpcgr | ArchDefinePpcsq)
1274 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1275 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1276 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1278 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1279 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1280 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 .Case("power3", ArchDefinePpcgr)
1282 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1283 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1284 | ArchDefinePpcsq)
1285 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1286 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1289 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1290 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1293 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001294 | ArchDefinePpcgr | ArchDefinePpcsq)
1295 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1296 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1297 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001298 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1299 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1300 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1301 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001302 .Default(ArchDefineNone);
1303
1304 if (defs & ArchDefineName)
1305 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1306 if (defs & ArchDefinePpcgr)
1307 Builder.defineMacro("_ARCH_PPCGR");
1308 if (defs & ArchDefinePpcsq)
1309 Builder.defineMacro("_ARCH_PPCSQ");
1310 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001311 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001312 if (defs & ArchDefine603)
1313 Builder.defineMacro("_ARCH_603");
1314 if (defs & ArchDefine604)
1315 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001320 if (defs & ArchDefinePwr5x)
1321 Builder.defineMacro("_ARCH_PWR5X");
1322 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 if (defs & ArchDefinePwr6x)
1325 Builder.defineMacro("_ARCH_PWR6X");
1326 if (defs & ArchDefinePwr7)
1327 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001328 if (defs & ArchDefinePwr8)
1329 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001330 if (defs & ArchDefinePwr9)
1331 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001332 if (defs & ArchDefineA2)
1333 Builder.defineMacro("_ARCH_A2");
1334 if (defs & ArchDefineA2q) {
1335 Builder.defineMacro("_ARCH_A2Q");
1336 Builder.defineMacro("_ARCH_QP");
1337 }
1338
1339 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1340 Builder.defineMacro("__bg__");
1341 Builder.defineMacro("__THW_BLUEGENE__");
1342 Builder.defineMacro("__bgq__");
1343 Builder.defineMacro("__TOS_BGQ__");
1344 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001345
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001346 if (HasVSX)
1347 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001348 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001349 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001350 if (HasP8Crypto)
1351 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001352 if (HasHTM)
1353 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001354 if (HasFloat128)
1355 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001356 if (HasP9Vector)
1357 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001358
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1362 if (PointerWidth == 64)
1363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001364
Bill Schmidt38378a02013-02-01 20:23:10 +00001365 // FIXME: The following are not yet generated here by Clang, but are
1366 // generated by GCC:
1367 //
1368 // _SOFT_FLOAT_
1369 // __RECIP_PRECISION__
1370 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001371 // __RECIP__
1372 // __RECIPF__
1373 // __RSQRTE__
1374 // __RSQRTEF__
1375 // _SOFT_DOUBLE_
1376 // __NO_LWSYNC__
1377 // __HAVE_BSWAP__
1378 // __LONGDOUBLE128
1379 // __CMODEL_MEDIUM__
1380 // __CMODEL_LARGE__
1381 // _CALL_SYSV
1382 // _CALL_DARWIN
1383 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001384}
1385
Eric Christophera8a14c32015-08-31 18:39:16 +00001386// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001387// explicitly turned off vsx and turned on any of:
1388// - power8-vector
1389// - direct-move
1390// - float128
1391// - power9-vector
1392// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// set of options.
1394static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001395 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001396
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1398 FeaturesVec.end()) {
1399 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1400 FeaturesVec.end()) {
1401 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1402 << "-mno-vsx";
1403 return false;
1404 }
1405
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1409 << "-mno-vsx";
1410 return false;
1411 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1423 << "-mno-vsx";
1424 return false;
1425 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001426 }
1427
1428 return true;
1429}
1430
Eric Christopher8c47b422015-10-09 18:39:55 +00001431bool PPCTargetInfo::initFeatureMap(
1432 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1433 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001434 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1435 .Case("7400", true)
1436 .Case("g4", true)
1437 .Case("7450", true)
1438 .Case("g4+", true)
1439 .Case("970", true)
1440 .Case("g5", true)
1441 .Case("pwr6", true)
1442 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001443 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001444 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001446 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001447 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001448
1449 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001450 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001451 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1452 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001453 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001454 .Case("pwr8", true)
1455 .Default(false);
1456 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1457 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001458 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001459 .Case("pwr8", true)
1460 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001461 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1462 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001463 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001464 .Case("pwr8", true)
1465 .Case("pwr7", true)
1466 .Default(false);
1467 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001469 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001470 .Case("pwr8", true)
1471 .Case("pwr7", true)
1472 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1474 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001475 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001476 .Case("pwr8", true)
1477 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001478 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1479 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001480 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001481 .Case("pwr8", true)
1482 .Case("pwr7", true)
1483 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001484
Eric Christophera8a14c32015-08-31 18:39:16 +00001485 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1486 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001487
Eric Christopher007b0a02015-08-28 22:32:01 +00001488 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001489}
1490
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001491bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001492 return llvm::StringSwitch<bool>(Feature)
1493 .Case("powerpc", true)
1494 .Case("vsx", HasVSX)
1495 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001497 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001498 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001499 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001500 .Case("bpermd", HasBPERMD)
1501 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001502 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001504 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001505}
Chris Lattner17df24e2008-04-21 18:56:49 +00001506
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001507void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1508 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001509 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1510 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1511 // incompatible options.
1512 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001513 if (Name == "direct-move" ||
1514 Name == "power8-vector" ||
1515 Name == "float128" ||
1516 Name == "power9-vector") {
1517 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001518 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001519 if (Name == "power9-vector")
1520 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001521 } else {
1522 Features[Name] = true;
1523 }
1524 } else {
1525 if (Name == "vsx") {
1526 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001527 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530 }
1531 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001532}
1533
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001535 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1537 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1538 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1539 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1540 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1541 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1542 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001545 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001546 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1547 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1548 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1549 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "vrsave", "vscr",
1551 "spe_acc", "spefscr",
1552 "sfp"
1553};
Chris Lattner10a5b382007-01-29 05:24:35 +00001554
Craig Topperf054e3a2015-10-19 03:52:27 +00001555ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1556 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001558
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001559const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1560 // While some of these aliases do map to different registers
1561 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "0" }, "r0" },
1563 { { "1"}, "r1" },
1564 { { "2" }, "r2" },
1565 { { "3" }, "r3" },
1566 { { "4" }, "r4" },
1567 { { "5" }, "r5" },
1568 { { "6" }, "r6" },
1569 { { "7" }, "r7" },
1570 { { "8" }, "r8" },
1571 { { "9" }, "r9" },
1572 { { "10" }, "r10" },
1573 { { "11" }, "r11" },
1574 { { "12" }, "r12" },
1575 { { "13" }, "r13" },
1576 { { "14" }, "r14" },
1577 { { "15" }, "r15" },
1578 { { "16" }, "r16" },
1579 { { "17" }, "r17" },
1580 { { "18" }, "r18" },
1581 { { "19" }, "r19" },
1582 { { "20" }, "r20" },
1583 { { "21" }, "r21" },
1584 { { "22" }, "r22" },
1585 { { "23" }, "r23" },
1586 { { "24" }, "r24" },
1587 { { "25" }, "r25" },
1588 { { "26" }, "r26" },
1589 { { "27" }, "r27" },
1590 { { "28" }, "r28" },
1591 { { "29" }, "r29" },
1592 { { "30" }, "r30" },
1593 { { "31" }, "r31" },
1594 { { "fr0" }, "f0" },
1595 { { "fr1" }, "f1" },
1596 { { "fr2" }, "f2" },
1597 { { "fr3" }, "f3" },
1598 { { "fr4" }, "f4" },
1599 { { "fr5" }, "f5" },
1600 { { "fr6" }, "f6" },
1601 { { "fr7" }, "f7" },
1602 { { "fr8" }, "f8" },
1603 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001604 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001605 { { "fr11" }, "f11" },
1606 { { "fr12" }, "f12" },
1607 { { "fr13" }, "f13" },
1608 { { "fr14" }, "f14" },
1609 { { "fr15" }, "f15" },
1610 { { "fr16" }, "f16" },
1611 { { "fr17" }, "f17" },
1612 { { "fr18" }, "f18" },
1613 { { "fr19" }, "f19" },
1614 { { "fr20" }, "f20" },
1615 { { "fr21" }, "f21" },
1616 { { "fr22" }, "f22" },
1617 { { "fr23" }, "f23" },
1618 { { "fr24" }, "f24" },
1619 { { "fr25" }, "f25" },
1620 { { "fr26" }, "f26" },
1621 { { "fr27" }, "f27" },
1622 { { "fr28" }, "f28" },
1623 { { "fr29" }, "f29" },
1624 { { "fr30" }, "f30" },
1625 { { "fr31" }, "f31" },
1626 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001627};
1628
Craig Topperf054e3a2015-10-19 03:52:27 +00001629ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1630 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001632
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001633class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001635 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1636 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001638
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001640 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001641 case llvm::Triple::FreeBSD:
1642 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001643 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001644 PtrDiffType = SignedInt;
1645 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001647 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001648 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001649 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001650
Roman Divacky3ffe7462012-03-13 19:20:17 +00001651 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1652 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001653 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001654 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001655
1656 // PPC32 supports atomics up to 4 bytes.
1657 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
1659
Craig Topper3164f332014-03-11 03:39:26 +00001660 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001661 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001663 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001664};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001665
Bill Schmidt778d3872013-07-26 01:36:11 +00001666// Note: ABI differences may eventually require us to have a separate
1667// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1671 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001672 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001673 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001674 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001675
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001677 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001678 ABI = "elfv2";
1679 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001680 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001681 ABI = "elfv1";
1682 }
1683
1684 switch (getTriple().getOS()) {
1685 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001686 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001687 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001688 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001689 case llvm::Triple::NetBSD:
1690 IntMaxType = SignedLongLong;
1691 Int64Type = SignedLongLong;
1692 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001693 default:
1694 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001695 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001696
1697 // PPC64 supports atomics up to 8 bytes.
1698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001703 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001705 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001706 ABI = Name;
1707 return true;
1708 }
1709 return false;
1710 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001711};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001712
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001715 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001717 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001718 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001719 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001720 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001721 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001722 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001723 }
Craig Topper3164f332014-03-11 03:39:26 +00001724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001725 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001726 }
1727};
1728
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001730public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001731 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1732 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001734 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001735 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736 }
1737};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001738
Eric Christopherc48497a2015-09-18 21:26:24 +00001739static const unsigned NVPTXAddrSpaceMap[] = {
1740 1, // opencl_global
1741 3, // opencl_local
1742 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001743 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001744 0, // opencl_generic
1745 1, // cuda_device
1746 4, // cuda_constant
1747 3, // cuda_shared
1748};
1749
1750class NVPTXTargetInfo : public TargetInfo {
1751 static const char *const GCCRegNames[];
1752 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001753 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001754 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001755
Eric Christopherc48497a2015-09-18 21:26:24 +00001756public:
Justin Lebarb6626592017-01-05 16:53:21 +00001757 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1758 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001759 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001760 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1761 "NVPTX only supports 32- and 64-bit modes.");
1762
Eric Christopherc48497a2015-09-18 21:26:24 +00001763 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001764 AddrSpaceMap = &NVPTXAddrSpaceMap;
1765 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001766
Eric Christopherc48497a2015-09-18 21:26:24 +00001767 // Define available target features
1768 // These must be defined in sorted order!
1769 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001770 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001771
Justin Lebarb6626592017-01-05 16:53:21 +00001772 if (TargetPointerWidth == 32)
1773 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1774 else
1775 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // If possible, get a TargetInfo for our host triple, so we can match its
1778 // types.
1779 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001780 if (!HostTriple.isNVPTX())
1781 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1782
1783 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001784 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001785 LongWidth = LongAlign = TargetPointerWidth;
1786 PointerWidth = PointerAlign = TargetPointerWidth;
1787 switch (TargetPointerWidth) {
1788 case 32:
1789 SizeType = TargetInfo::UnsignedInt;
1790 PtrDiffType = TargetInfo::SignedInt;
1791 IntPtrType = TargetInfo::SignedInt;
1792 break;
1793 case 64:
1794 SizeType = TargetInfo::UnsignedLong;
1795 PtrDiffType = TargetInfo::SignedLong;
1796 IntPtrType = TargetInfo::SignedLong;
1797 break;
1798 default:
1799 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1800 }
Justin Lebar76945b22016-04-29 23:05:19 +00001801 return;
1802 }
1803
Justin Lebarb6626592017-01-05 16:53:21 +00001804 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001805 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1806 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1807 BoolWidth = HostTarget->getBoolWidth();
1808 BoolAlign = HostTarget->getBoolAlign();
1809 IntWidth = HostTarget->getIntWidth();
1810 IntAlign = HostTarget->getIntAlign();
1811 HalfWidth = HostTarget->getHalfWidth();
1812 HalfAlign = HostTarget->getHalfAlign();
1813 FloatWidth = HostTarget->getFloatWidth();
1814 FloatAlign = HostTarget->getFloatAlign();
1815 DoubleWidth = HostTarget->getDoubleWidth();
1816 DoubleAlign = HostTarget->getDoubleAlign();
1817 LongWidth = HostTarget->getLongWidth();
1818 LongAlign = HostTarget->getLongAlign();
1819 LongLongWidth = HostTarget->getLongLongWidth();
1820 LongLongAlign = HostTarget->getLongLongAlign();
1821 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001822 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001823 DefaultAlignForAttributeAligned =
1824 HostTarget->getDefaultAlignForAttributeAligned();
1825 SizeType = HostTarget->getSizeType();
1826 IntMaxType = HostTarget->getIntMaxType();
1827 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1828 IntPtrType = HostTarget->getIntPtrType();
1829 WCharType = HostTarget->getWCharType();
1830 WIntType = HostTarget->getWIntType();
1831 Char16Type = HostTarget->getChar16Type();
1832 Char32Type = HostTarget->getChar32Type();
1833 Int64Type = HostTarget->getInt64Type();
1834 SigAtomicType = HostTarget->getSigAtomicType();
1835 ProcessIDType = HostTarget->getProcessIDType();
1836
1837 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1838 UseZeroLengthBitfieldAlignment =
1839 HostTarget->useZeroLengthBitfieldAlignment();
1840 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1841 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1842
Justin Lebar5057f172016-09-09 20:35:43 +00001843 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1844 // we need those macros to be identical on host and device, because (among
1845 // other things) they affect which standard library classes are defined, and
1846 // we need all classes to be defined on both the host and device.
1847 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1848
Justin Lebar76945b22016-04-29 23:05:19 +00001849 // Properties intentionally not copied from host:
1850 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1851 // host/device boundary.
1852 // - SuitableAlign: Not visible across the host/device boundary, and may
1853 // correctly be different on host/device, e.g. if host has wider vector
1854 // types than device.
1855 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1856 // as its double type, but that's not necessarily true on the host.
1857 // TODO: nvcc emits a warning when using long double on device; we should
1858 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001859 }
1860 void getTargetDefines(const LangOptions &Opts,
1861 MacroBuilder &Builder) const override {
1862 Builder.defineMacro("__PTX__");
1863 Builder.defineMacro("__NVPTX__");
1864 if (Opts.CUDAIsDevice) {
1865 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001866 std::string CUDAArchCode = [this] {
1867 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001868 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001869 assert(false && "No GPU arch when compiling CUDA device code.");
1870 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001871 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001872 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001873 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001874 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001875 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001876 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001877 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001878 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001879 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001880 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001881 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001882 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001883 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001884 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001885 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001886 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001887 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001888 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001889 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001890 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001891 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001892 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001893 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001894 return "620";
1895 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001896 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001899 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
Craig Topper6c03a542015-10-19 04:51:35 +00001901 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1902 return llvm::makeArrayRef(BuiltinInfo,
1903 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
Artem Belevichfda99052016-09-28 17:47:35 +00001905 bool
1906 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1907 StringRef CPU,
1908 const std::vector<std::string> &FeaturesVec) const override {
1909 Features["satom"] = GPU >= CudaArch::SM_60;
1910 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1911 }
1912
Eric Christopherc48497a2015-09-18 21:26:24 +00001913 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001914 return llvm::StringSwitch<bool>(Feature)
1915 .Cases("ptx", "nvptx", true)
1916 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1917 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001918 }
1919
Craig Topperf054e3a2015-10-19 03:52:27 +00001920 ArrayRef<const char *> getGCCRegNames() const override;
1921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001923 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001924 }
1925 bool validateAsmConstraint(const char *&Name,
1926 TargetInfo::ConstraintInfo &Info) const override {
1927 switch (*Name) {
1928 default:
1929 return false;
1930 case 'c':
1931 case 'h':
1932 case 'r':
1933 case 'l':
1934 case 'f':
1935 case 'd':
1936 Info.setAllowsRegister();
1937 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001938 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 }
1940 const char *getClobbers() const override {
1941 // FIXME: Is this really right?
1942 return "";
1943 }
1944 BuiltinVaListKind getBuiltinVaListKind() const override {
1945 // FIXME: implement
1946 return TargetInfo::CharPtrBuiltinVaList;
1947 }
1948 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001949 GPU = StringToCudaArch(Name);
1950 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001951 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001952 void setSupportedOpenCLOpts() override {
1953 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001954 Opts.support("cl_clang_storage_class_specifiers");
1955 Opts.support("cl_khr_gl_sharing");
1956 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001957
Yaxun Liu5b746652016-12-18 05:18:55 +00001958 Opts.support("cl_khr_fp64");
1959 Opts.support("cl_khr_byte_addressable_store");
1960 Opts.support("cl_khr_global_int32_base_atomics");
1961 Opts.support("cl_khr_global_int32_extended_atomics");
1962 Opts.support("cl_khr_local_int32_base_atomics");
1963 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001964 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001965
1966 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1967 // CUDA compilations support all of the host's calling conventions.
1968 //
1969 // TODO: We should warn if you apply a non-default CC to anything other than
1970 // a host function.
1971 if (HostTarget)
1972 return HostTarget->checkCallingConvention(CC);
1973 return CCCR_Warning;
1974 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001975};
1976
1977const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1978#define BUILTIN(ID, TYPE, ATTRS) \
1979 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1980#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1981 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001982#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1983 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001984#include "clang/Basic/BuiltinsNVPTX.def"
1985};
1986
1987const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1988
Craig Topperf054e3a2015-10-19 03:52:27 +00001989ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1990 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001991}
1992
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001993static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994 1, // opencl_global
1995 3, // opencl_local
1996 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001997 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001998 1, // cuda_device
1999 2, // cuda_constant
2000 3 // cuda_shared
2001};
2002
Tom Stellarda96344b2014-08-21 13:58:40 +00002003// If you edit the description strings, make sure you update
2004// getPointerWidthV().
2005
Craig Topper273dbc62015-10-18 05:29:26 +00002006static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002007 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2008 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002009
Craig Topper273dbc62015-10-18 05:29:26 +00002010static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002011 "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 +00002012 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2013 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002014
Matt Arsenault250024f2016-06-08 01:56:42 +00002015class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002016 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002017 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002018
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002019 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002020 enum GPUKind {
2021 GK_NONE,
2022 GK_R600,
2023 GK_R600_DOUBLE_OPS,
2024 GK_R700,
2025 GK_R700_DOUBLE_OPS,
2026 GK_EVERGREEN,
2027 GK_EVERGREEN_DOUBLE_OPS,
2028 GK_NORTHERN_ISLANDS,
2029 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002030 GK_GFX6,
2031 GK_GFX7,
2032 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002033 } GPU;
2034
Jan Veselyeebeaea2015-05-04 19:53:36 +00002035 bool hasFP64:1;
2036 bool hasFMAF:1;
2037 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002038 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039
Matt Arsenault250024f2016-06-08 01:56:42 +00002040 static bool isAMDGCN(const llvm::Triple &TT) {
2041 return TT.getArch() == llvm::Triple::amdgcn;
2042 }
2043
Eli Friedmand13b41e2012-10-12 23:32:00 +00002044public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002045 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002046 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002047 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002048 hasFP64(false),
2049 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002050 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002051 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002052 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002053 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002054 hasFMAF = true;
2055 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002056 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002057
2058 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2059 DataLayoutStringSI : DataLayoutStringR600);
2060
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002061 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002062 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002063 }
2064
Tom Stellarda96344b2014-08-21 13:58:40 +00002065 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2066 if (GPU <= GK_CAYMAN)
2067 return 32;
2068
2069 switch(AddrSpace) {
2070 default:
2071 return 64;
2072 case 0:
2073 case 3:
2074 case 5:
2075 return 32;
2076 }
2077 }
2078
Yaxun Liu26f75662016-08-19 05:17:25 +00002079 uint64_t getMaxPointerWidth() const override {
2080 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2081 }
2082
Craig Topper3164f332014-03-11 03:39:26 +00002083 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002084 return "";
2085 }
2086
Craig Topperf054e3a2015-10-19 03:52:27 +00002087 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002088
Craig Topperf054e3a2015-10-19 03:52:27 +00002089 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2090 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002091 }
2092
Craig Topper3164f332014-03-11 03:39:26 +00002093 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002094 TargetInfo::ConstraintInfo &Info) const override {
2095 switch (*Name) {
2096 default: break;
2097 case 'v': // vgpr
2098 case 's': // sgpr
2099 Info.setAllowsRegister();
2100 return true;
2101 }
2102 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002103 }
2104
Matt Arsenault250024f2016-06-08 01:56:42 +00002105 bool initFeatureMap(llvm::StringMap<bool> &Features,
2106 DiagnosticsEngine &Diags, StringRef CPU,
2107 const std::vector<std::string> &FeatureVec) const override;
2108
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2110 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 bool hasFP32Denormals = false;
2112 bool hasFP64Denormals = false;
2113 for (auto &I : TargetOpts.FeaturesAsWritten) {
2114 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2115 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002116 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002117 hasFP64Denormals = true;
2118 }
2119 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002120 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2121 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002122 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002123 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002124 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 }
2126
Craig Topper6c03a542015-10-19 04:51:35 +00002127 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2128 return llvm::makeArrayRef(BuiltinInfo,
2129 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002130 }
2131
Craig Topper3164f332014-03-11 03:39:26 +00002132 void getTargetDefines(const LangOptions &Opts,
2133 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 Builder.defineMacro("__AMDGCN__");
2136 else
2137 Builder.defineMacro("__R600__");
2138
Jan Veselyeebeaea2015-05-04 19:53:36 +00002139 if (hasFMAF)
2140 Builder.defineMacro("__HAS_FMAF__");
2141 if (hasLDEXPF)
2142 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002143 if (hasFP64)
2144 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002145 }
2146
Craig Topper3164f332014-03-11 03:39:26 +00002147 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002148 return TargetInfo::CharPtrBuiltinVaList;
2149 }
2150
Matt Arsenault250024f2016-06-08 01:56:42 +00002151 static GPUKind parseR600Name(StringRef Name) {
2152 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002153 .Case("r600" , GK_R600)
2154 .Case("rv610", GK_R600)
2155 .Case("rv620", GK_R600)
2156 .Case("rv630", GK_R600)
2157 .Case("rv635", GK_R600)
2158 .Case("rs780", GK_R600)
2159 .Case("rs880", GK_R600)
2160 .Case("rv670", GK_R600_DOUBLE_OPS)
2161 .Case("rv710", GK_R700)
2162 .Case("rv730", GK_R700)
2163 .Case("rv740", GK_R700_DOUBLE_OPS)
2164 .Case("rv770", GK_R700_DOUBLE_OPS)
2165 .Case("palm", GK_EVERGREEN)
2166 .Case("cedar", GK_EVERGREEN)
2167 .Case("sumo", GK_EVERGREEN)
2168 .Case("sumo2", GK_EVERGREEN)
2169 .Case("redwood", GK_EVERGREEN)
2170 .Case("juniper", GK_EVERGREEN)
2171 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2172 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2173 .Case("barts", GK_NORTHERN_ISLANDS)
2174 .Case("turks", GK_NORTHERN_ISLANDS)
2175 .Case("caicos", GK_NORTHERN_ISLANDS)
2176 .Case("cayman", GK_CAYMAN)
2177 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002178 .Default(GK_NONE);
2179 }
2180
2181 static GPUKind parseAMDGCNName(StringRef Name) {
2182 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002183 .Case("tahiti", GK_GFX6)
2184 .Case("pitcairn", GK_GFX6)
2185 .Case("verde", GK_GFX6)
2186 .Case("oland", GK_GFX6)
2187 .Case("hainan", GK_GFX6)
2188 .Case("bonaire", GK_GFX7)
2189 .Case("kabini", GK_GFX7)
2190 .Case("kaveri", GK_GFX7)
2191 .Case("hawaii", GK_GFX7)
2192 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002193 .Case("gfx700", GK_GFX7)
2194 .Case("gfx701", GK_GFX7)
2195 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002196 .Case("tonga", GK_GFX8)
2197 .Case("iceland", GK_GFX8)
2198 .Case("carrizo", GK_GFX8)
2199 .Case("fiji", GK_GFX8)
2200 .Case("stoney", GK_GFX8)
2201 .Case("polaris10", GK_GFX8)
2202 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002203 .Case("gfx800", GK_GFX8)
2204 .Case("gfx801", GK_GFX8)
2205 .Case("gfx802", GK_GFX8)
2206 .Case("gfx803", GK_GFX8)
2207 .Case("gfx804", GK_GFX8)
2208 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002209 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002210 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002211
Matt Arsenault250024f2016-06-08 01:56:42 +00002212 bool setCPU(const std::string &Name) override {
2213 if (getTriple().getArch() == llvm::Triple::amdgcn)
2214 GPU = parseAMDGCNName(Name);
2215 else
2216 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002217
Matt Arsenault250024f2016-06-08 01:56:42 +00002218 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002219 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002220
Jan Vesely211ba782016-06-17 02:25:03 +00002221 void setSupportedOpenCLOpts() override {
2222 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002223 Opts.support("cl_clang_storage_class_specifiers");
2224 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002225
Jan Vesely211ba782016-06-17 02:25:03 +00002226 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002227 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002228 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002229 Opts.support("cl_khr_byte_addressable_store");
2230 Opts.support("cl_khr_global_int32_base_atomics");
2231 Opts.support("cl_khr_global_int32_extended_atomics");
2232 Opts.support("cl_khr_local_int32_base_atomics");
2233 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002234 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002235 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002236 Opts.support("cl_khr_fp16");
2237 Opts.support("cl_khr_int64_base_atomics");
2238 Opts.support("cl_khr_int64_extended_atomics");
2239 Opts.support("cl_khr_mipmap_image");
2240 Opts.support("cl_khr_subgroups");
2241 Opts.support("cl_khr_3d_image_writes");
2242 Opts.support("cl_amd_media_ops");
2243 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002244 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002245 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002246
Yaxun Liu99444cb2016-08-03 20:38:06 +00002247 LangAS::ID getOpenCLImageAddrSpace() const override {
2248 return LangAS::opencl_constant;
2249 }
2250
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002251 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2252 switch (CC) {
2253 default:
2254 return CCCR_Warning;
2255 case CC_C:
2256 case CC_OpenCLKernel:
2257 return CCCR_OK;
2258 }
2259 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002260
2261 // In amdgcn target the null pointer in global, constant, and generic
2262 // address space has value 0 but in private and local address space has
2263 // value ~0.
2264 uint64_t getNullPointerValue(unsigned AS) const override {
2265 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2266 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002267};
2268
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002269const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002270#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002271 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002272#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2273 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002274#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002275};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002276const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002277 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2278 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2279 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2280 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2281 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2282 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2283 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2284 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2285 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2286 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2287 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2288 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2289 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2290 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2291 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2292 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2293 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2294 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2295 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2296 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2297 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2298 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2299 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2300 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2301 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2302 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2303 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2304 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2305 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2306 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2307 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2308 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2309 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2310 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2311 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2312 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2313 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2314 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2315 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2316 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2317 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2318 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2319 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2320 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2321 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2322 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2323 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002324 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002325 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2326 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002327};
2328
Craig Topperf054e3a2015-10-19 03:52:27 +00002329ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2330 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002331}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002332
Matt Arsenault250024f2016-06-08 01:56:42 +00002333bool AMDGPUTargetInfo::initFeatureMap(
2334 llvm::StringMap<bool> &Features,
2335 DiagnosticsEngine &Diags, StringRef CPU,
2336 const std::vector<std::string> &FeatureVec) const {
2337
2338 // XXX - What does the member GPU mean if device name string passed here?
2339 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2340 if (CPU.empty())
2341 CPU = "tahiti";
2342
2343 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002344 case GK_GFX6:
2345 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002346 break;
2347
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002348 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002349 Features["s-memrealtime"] = true;
2350 Features["16-bit-insts"] = true;
2351 break;
2352
2353 case GK_NONE:
2354 return false;
2355 default:
2356 llvm_unreachable("unhandled subtarget");
2357 }
2358 } else {
2359 if (CPU.empty())
2360 CPU = "r600";
2361
2362 switch (parseR600Name(CPU)) {
2363 case GK_R600:
2364 case GK_R700:
2365 case GK_EVERGREEN:
2366 case GK_NORTHERN_ISLANDS:
2367 break;
2368 case GK_R600_DOUBLE_OPS:
2369 case GK_R700_DOUBLE_OPS:
2370 case GK_EVERGREEN_DOUBLE_OPS:
2371 case GK_CAYMAN:
2372 Features["fp64"] = true;
2373 break;
2374 case GK_NONE:
2375 return false;
2376 default:
2377 llvm_unreachable("unhandled subtarget");
2378 }
2379 }
2380
2381 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2382}
2383
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002384const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002385#define BUILTIN(ID, TYPE, ATTRS) \
2386 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002387#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002388 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002389#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2390 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002391#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002392
2393#define BUILTIN(ID, TYPE, ATTRS) \
2394 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002395#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2396 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002397#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2398 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2399#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002400};
Eli Friedmanb5366062008-05-20 14:21:01 +00002401
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002402
Nuno Lopescfca1f02009-12-23 17:49:57 +00002403static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002404 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2405 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002406 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002407 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2408 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2409 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002410 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002411 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2412 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002413 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2414 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2415 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2416 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2417 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2418 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2419 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2420 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002421 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002422};
2423
Eric Christophercdd36352011-06-21 00:05:20 +00002424const TargetInfo::AddlRegName AddlRegNames[] = {
2425 { { "al", "ah", "eax", "rax" }, 0 },
2426 { { "bl", "bh", "ebx", "rbx" }, 3 },
2427 { { "cl", "ch", "ecx", "rcx" }, 2 },
2428 { { "dl", "dh", "edx", "rdx" }, 1 },
2429 { { "esi", "rsi" }, 4 },
2430 { { "edi", "rdi" }, 5 },
2431 { { "esp", "rsp" }, 7 },
2432 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002433 { { "r8d", "r8w", "r8b" }, 38 },
2434 { { "r9d", "r9w", "r9b" }, 39 },
2435 { { "r10d", "r10w", "r10b" }, 40 },
2436 { { "r11d", "r11w", "r11b" }, 41 },
2437 { { "r12d", "r12w", "r12b" }, 42 },
2438 { { "r13d", "r13w", "r13b" }, 43 },
2439 { { "r14d", "r14w", "r14b" }, 44 },
2440 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002441};
2442
2443// X86 target abstract base class; x86-32 and x86-64 are very close, so
2444// most of the implementation can be shared.
2445class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002446 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002447 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002448 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002449 enum MMX3DNowEnum {
2450 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002451 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002452 enum XOPEnum {
2453 NoXOP,
2454 SSE4A,
2455 FMA4,
2456 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002457 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002458
Craig Topper543f3bd2015-10-14 23:47:57 +00002459 bool HasAES = false;
2460 bool HasPCLMUL = false;
2461 bool HasLZCNT = false;
2462 bool HasRDRND = false;
2463 bool HasFSGSBASE = false;
2464 bool HasBMI = false;
2465 bool HasBMI2 = false;
2466 bool HasPOPCNT = false;
2467 bool HasRTM = false;
2468 bool HasPRFCHW = false;
2469 bool HasRDSEED = false;
2470 bool HasADX = false;
2471 bool HasTBM = false;
2472 bool HasFMA = false;
2473 bool HasF16C = false;
2474 bool HasAVX512CD = false;
2475 bool HasAVX512ER = false;
2476 bool HasAVX512PF = false;
2477 bool HasAVX512DQ = false;
2478 bool HasAVX512BW = false;
2479 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002480 bool HasAVX512VBMI = false;
2481 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002482 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002483 bool HasMPX = false;
2484 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002485 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002486 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002487 bool HasXSAVE = false;
2488 bool HasXSAVEOPT = false;
2489 bool HasXSAVEC = false;
2490 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002491 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002492 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002493 bool HasCLFLUSHOPT = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002494 bool HasCLWB = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002495 bool HasMOVBE = false;
2496 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002497
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002498 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2499 ///
2500 /// Each enumeration represents a particular CPU supported by Clang. These
2501 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2502 enum CPUKind {
2503 CK_Generic,
2504
2505 /// \name i386
2506 /// i386-generation processors.
2507 //@{
2508 CK_i386,
2509 //@}
2510
2511 /// \name i486
2512 /// i486-generation processors.
2513 //@{
2514 CK_i486,
2515 CK_WinChipC6,
2516 CK_WinChip2,
2517 CK_C3,
2518 //@}
2519
2520 /// \name i586
2521 /// i586-generation processors, P5 microarchitecture based.
2522 //@{
2523 CK_i586,
2524 CK_Pentium,
2525 CK_PentiumMMX,
2526 //@}
2527
2528 /// \name i686
2529 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2530 //@{
2531 CK_i686,
2532 CK_PentiumPro,
2533 CK_Pentium2,
2534 CK_Pentium3,
2535 CK_Pentium3M,
2536 CK_PentiumM,
2537 CK_C3_2,
2538
2539 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2540 /// Clang however has some logic to suport this.
2541 // FIXME: Warn, deprecate, and potentially remove this.
2542 CK_Yonah,
2543 //@}
2544
2545 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002546 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002547 //@{
2548 CK_Pentium4,
2549 CK_Pentium4M,
2550 CK_Prescott,
2551 CK_Nocona,
2552 //@}
2553
2554 /// \name Core
2555 /// Core microarchitecture based processors.
2556 //@{
2557 CK_Core2,
2558
2559 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2560 /// codename which GCC no longer accepts as an option to -march, but Clang
2561 /// has some logic for recognizing it.
2562 // FIXME: Warn, deprecate, and potentially remove this.
2563 CK_Penryn,
2564 //@}
2565
2566 /// \name Atom
2567 /// Atom processors
2568 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002569 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002570 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002571 //@}
2572
2573 /// \name Nehalem
2574 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002575 CK_Nehalem,
2576
2577 /// \name Westmere
2578 /// Westmere microarchitecture based processors.
2579 CK_Westmere,
2580
2581 /// \name Sandy Bridge
2582 /// Sandy Bridge microarchitecture based processors.
2583 CK_SandyBridge,
2584
2585 /// \name Ivy Bridge
2586 /// Ivy Bridge microarchitecture based processors.
2587 CK_IvyBridge,
2588
2589 /// \name Haswell
2590 /// Haswell microarchitecture based processors.
2591 CK_Haswell,
2592
2593 /// \name Broadwell
2594 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002595 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002596
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002597 /// \name Skylake Client
2598 /// Skylake client microarchitecture based processors.
2599 CK_SkylakeClient,
2600
2601 /// \name Skylake Server
2602 /// Skylake server microarchitecture based processors.
2603 CK_SkylakeServer,
2604
2605 /// \name Cannonlake Client
2606 /// Cannonlake client microarchitecture based processors.
2607 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002608
Craig Topper449314e2013-08-20 07:09:39 +00002609 /// \name Knights Landing
2610 /// Knights Landing processor.
2611 CK_KNL,
2612
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002613 /// \name Lakemont
2614 /// Lakemont microarchitecture based processors.
2615 CK_Lakemont,
2616
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002617 /// \name K6
2618 /// K6 architecture processors.
2619 //@{
2620 CK_K6,
2621 CK_K6_2,
2622 CK_K6_3,
2623 //@}
2624
2625 /// \name K7
2626 /// K7 architecture processors.
2627 //@{
2628 CK_Athlon,
2629 CK_AthlonThunderbird,
2630 CK_Athlon4,
2631 CK_AthlonXP,
2632 CK_AthlonMP,
2633 //@}
2634
2635 /// \name K8
2636 /// K8 architecture processors.
2637 //@{
2638 CK_Athlon64,
2639 CK_Athlon64SSE3,
2640 CK_AthlonFX,
2641 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002642 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002643 CK_Opteron,
2644 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002645 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002646 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002647
Benjamin Kramer569f2152012-01-10 11:50:18 +00002648 /// \name Bobcat
2649 /// Bobcat architecture processors.
2650 //@{
2651 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002652 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002653 //@}
2654
2655 /// \name Bulldozer
2656 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002657 //@{
2658 CK_BDVER1,
2659 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002660 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002661 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002662 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002663
Craig Topperc45744a2017-01-10 06:02:12 +00002664 /// \name zen
2665 /// Zen architecture processors.
2666 //@{
2667 CK_ZNVER1,
2668 //@}
2669
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002670 /// This specification is deprecated and will be removed in the future.
2671 /// Users should prefer \see CK_K8.
2672 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002673 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002674 CK_x86_64,
2675 //@}
2676
2677 /// \name Geode
2678 /// Geode processors.
2679 //@{
2680 CK_Geode
2681 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002682 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002683
Eric Christopherc50738f2015-08-27 00:05:50 +00002684 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002685 return llvm::StringSwitch<CPUKind>(CPU)
2686 .Case("i386", CK_i386)
2687 .Case("i486", CK_i486)
2688 .Case("winchip-c6", CK_WinChipC6)
2689 .Case("winchip2", CK_WinChip2)
2690 .Case("c3", CK_C3)
2691 .Case("i586", CK_i586)
2692 .Case("pentium", CK_Pentium)
2693 .Case("pentium-mmx", CK_PentiumMMX)
2694 .Case("i686", CK_i686)
2695 .Case("pentiumpro", CK_PentiumPro)
2696 .Case("pentium2", CK_Pentium2)
2697 .Case("pentium3", CK_Pentium3)
2698 .Case("pentium3m", CK_Pentium3M)
2699 .Case("pentium-m", CK_PentiumM)
2700 .Case("c3-2", CK_C3_2)
2701 .Case("yonah", CK_Yonah)
2702 .Case("pentium4", CK_Pentium4)
2703 .Case("pentium4m", CK_Pentium4M)
2704 .Case("prescott", CK_Prescott)
2705 .Case("nocona", CK_Nocona)
2706 .Case("core2", CK_Core2)
2707 .Case("penryn", CK_Penryn)
2708 .Case("bonnell", CK_Bonnell)
2709 .Case("atom", CK_Bonnell) // Legacy name.
2710 .Case("silvermont", CK_Silvermont)
2711 .Case("slm", CK_Silvermont) // Legacy name.
2712 .Case("nehalem", CK_Nehalem)
2713 .Case("corei7", CK_Nehalem) // Legacy name.
2714 .Case("westmere", CK_Westmere)
2715 .Case("sandybridge", CK_SandyBridge)
2716 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2717 .Case("ivybridge", CK_IvyBridge)
2718 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2719 .Case("haswell", CK_Haswell)
2720 .Case("core-avx2", CK_Haswell) // Legacy name.
2721 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002722 .Case("skylake", CK_SkylakeClient)
2723 .Case("skylake-avx512", CK_SkylakeServer)
2724 .Case("skx", CK_SkylakeServer) // Legacy name.
2725 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002726 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002727 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002728 .Case("k6", CK_K6)
2729 .Case("k6-2", CK_K6_2)
2730 .Case("k6-3", CK_K6_3)
2731 .Case("athlon", CK_Athlon)
2732 .Case("athlon-tbird", CK_AthlonThunderbird)
2733 .Case("athlon-4", CK_Athlon4)
2734 .Case("athlon-xp", CK_AthlonXP)
2735 .Case("athlon-mp", CK_AthlonMP)
2736 .Case("athlon64", CK_Athlon64)
2737 .Case("athlon64-sse3", CK_Athlon64SSE3)
2738 .Case("athlon-fx", CK_AthlonFX)
2739 .Case("k8", CK_K8)
2740 .Case("k8-sse3", CK_K8SSE3)
2741 .Case("opteron", CK_Opteron)
2742 .Case("opteron-sse3", CK_OpteronSSE3)
2743 .Case("barcelona", CK_AMDFAM10)
2744 .Case("amdfam10", CK_AMDFAM10)
2745 .Case("btver1", CK_BTVER1)
2746 .Case("btver2", CK_BTVER2)
2747 .Case("bdver1", CK_BDVER1)
2748 .Case("bdver2", CK_BDVER2)
2749 .Case("bdver3", CK_BDVER3)
2750 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002751 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002752 .Case("x86-64", CK_x86_64)
2753 .Case("geode", CK_Geode)
2754 .Default(CK_Generic);
2755 }
2756
Rafael Espindolaeb265472013-08-21 21:59:03 +00002757 enum FPMathKind {
2758 FP_Default,
2759 FP_SSE,
2760 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002761 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002762
Eli Friedman3fd920a2008-08-20 02:34:37 +00002763public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002764 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2765 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002766 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002767 }
Craig Topper3164f332014-03-11 03:39:26 +00002768 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002769 // X87 evaluates with 80 bits "long double" precision.
2770 return SSELevel == NoSSE ? 2 : 0;
2771 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002772 ArrayRef<const char *> getGCCRegNames() const override {
2773 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002774 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002775 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2776 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002777 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002778 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2779 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002780 }
Eric Christopherd9832702015-06-29 21:00:05 +00002781 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002782 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002783 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002784
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002785 bool validateGlobalRegisterVariable(StringRef RegName,
2786 unsigned RegSize,
2787 bool &HasSizeMismatch) const override {
2788 // esp and ebp are the only 32-bit registers the x86 backend can currently
2789 // handle.
2790 if (RegName.equals("esp") || RegName.equals("ebp")) {
2791 // Check that the register size is 32-bit.
2792 HasSizeMismatch = RegSize != 32;
2793 return true;
2794 }
2795
2796 return false;
2797 }
2798
Akira Hatanaka974131e2014-09-18 18:17:18 +00002799 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2800
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002801 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2802
Akira Hatanaka974131e2014-09-18 18:17:18 +00002803 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2804
Craig Topper3164f332014-03-11 03:39:26 +00002805 std::string convertConstraint(const char *&Constraint) const override;
2806 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002807 return "~{dirflag},~{fpsr},~{flags}";
2808 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002809
2810 StringRef getConstraintRegister(const StringRef &Constraint,
2811 const StringRef &Expression) const override {
2812 StringRef::iterator I, E;
2813 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2814 if (isalpha(*I))
2815 break;
2816 }
2817 if (I == E)
2818 return "";
2819 switch (*I) {
2820 // For the register constraints, return the matching register name
2821 case 'a':
2822 return "ax";
2823 case 'b':
2824 return "bx";
2825 case 'c':
2826 return "cx";
2827 case 'd':
2828 return "dx";
2829 case 'S':
2830 return "si";
2831 case 'D':
2832 return "di";
2833 // In case the constraint is 'r' we need to return Expression
2834 case 'r':
2835 return Expression;
2836 default:
2837 // Default value if there is no constraint for the register
2838 return "";
2839 }
2840 return "";
2841 }
2842
Craig Topper3164f332014-03-11 03:39:26 +00002843 void getTargetDefines(const LangOptions &Opts,
2844 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002845 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2846 bool Enabled);
2847 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2848 bool Enabled);
2849 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2850 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002851 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2852 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002853 setFeatureEnabledImpl(Features, Name, Enabled);
2854 }
2855 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002856 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002857 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2858 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002859 bool
2860 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2861 StringRef CPU,
2862 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002863 bool hasFeature(StringRef Feature) const override;
2864 bool handleTargetFeatures(std::vector<std::string> &Features,
2865 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002866 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002867 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2868 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002869 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002870 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002871 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002872 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002873 return "no-mmx";
2874 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002875 }
Craig Topper3164f332014-03-11 03:39:26 +00002876 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002877 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002878
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002879 // Perform any per-CPU checks necessary to determine if this CPU is
2880 // acceptable.
2881 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2882 // invalid without explaining *why*.
2883 switch (CPU) {
2884 case CK_Generic:
2885 // No processor selected!
2886 return false;
2887
2888 case CK_i386:
2889 case CK_i486:
2890 case CK_WinChipC6:
2891 case CK_WinChip2:
2892 case CK_C3:
2893 case CK_i586:
2894 case CK_Pentium:
2895 case CK_PentiumMMX:
2896 case CK_i686:
2897 case CK_PentiumPro:
2898 case CK_Pentium2:
2899 case CK_Pentium3:
2900 case CK_Pentium3M:
2901 case CK_PentiumM:
2902 case CK_Yonah:
2903 case CK_C3_2:
2904 case CK_Pentium4:
2905 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002906 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002907 case CK_Prescott:
2908 case CK_K6:
2909 case CK_K6_2:
2910 case CK_K6_3:
2911 case CK_Athlon:
2912 case CK_AthlonThunderbird:
2913 case CK_Athlon4:
2914 case CK_AthlonXP:
2915 case CK_AthlonMP:
2916 case CK_Geode:
2917 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002918 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002919 return false;
2920
2921 // Fallthrough
2922 case CK_Nocona:
2923 case CK_Core2:
2924 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002925 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002926 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002927 case CK_Nehalem:
2928 case CK_Westmere:
2929 case CK_SandyBridge:
2930 case CK_IvyBridge:
2931 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002932 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002933 case CK_SkylakeClient:
2934 case CK_SkylakeServer:
2935 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002936 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002937 case CK_Athlon64:
2938 case CK_Athlon64SSE3:
2939 case CK_AthlonFX:
2940 case CK_K8:
2941 case CK_K8SSE3:
2942 case CK_Opteron:
2943 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002944 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002945 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002946 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002947 case CK_BDVER1:
2948 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002949 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002950 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002951 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002952 case CK_x86_64:
2953 return true;
2954 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002955 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002956 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002957
Craig Topper3164f332014-03-11 03:39:26 +00002958 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002959
Craig Topper3164f332014-03-11 03:39:26 +00002960 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002961 // Most of the non-ARM calling conventions are i386 conventions.
2962 switch (CC) {
2963 case CC_X86ThisCall:
2964 case CC_X86FastCall:
2965 case CC_X86StdCall:
2966 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002967 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002968 case CC_C:
2969 case CC_Swift:
2970 case CC_X86Pascal:
2971 case CC_IntelOclBicc:
2972 return CCCR_OK;
2973 default:
2974 return CCCR_Warning;
2975 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002976 }
2977
Craig Topper3164f332014-03-11 03:39:26 +00002978 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002979 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002980 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002981
2982 bool hasSjLjLowering() const override {
2983 return true;
2984 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002985
2986 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00002987 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002988 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002989};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002990
Rafael Espindolaeb265472013-08-21 21:59:03 +00002991bool X86TargetInfo::setFPMath(StringRef Name) {
2992 if (Name == "387") {
2993 FPMath = FP_387;
2994 return true;
2995 }
2996 if (Name == "sse") {
2997 FPMath = FP_SSE;
2998 return true;
2999 }
3000 return false;
3001}
3002
Eric Christopher007b0a02015-08-28 22:32:01 +00003003bool X86TargetInfo::initFeatureMap(
3004 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003005 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003006 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003007 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003008 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003009 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003010
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003011 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003012
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003013 // Enable X87 for all X86 processors but Lakemont.
3014 if (Kind != CK_Lakemont)
3015 setFeatureEnabledImpl(Features, "x87", true);
3016
3017 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003018 case CK_Generic:
3019 case CK_i386:
3020 case CK_i486:
3021 case CK_i586:
3022 case CK_Pentium:
3023 case CK_i686:
3024 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003025 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003026 break;
3027 case CK_PentiumMMX:
3028 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003029 case CK_K6:
3030 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003031 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003032 break;
3033 case CK_Pentium3:
3034 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003035 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003036 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003037 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003038 break;
3039 case CK_PentiumM:
3040 case CK_Pentium4:
3041 case CK_Pentium4M:
3042 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003043 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003044 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 break;
3046 case CK_Yonah:
3047 case CK_Prescott:
3048 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003049 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003050 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003051 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003052 break;
3053 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003054 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003055 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003056 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003057 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003058 break;
3059 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003060 setFeatureEnabledImpl(Features, "sse4.1", 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;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003064 case CK_Cannonlake:
3065 setFeatureEnabledImpl(Features, "avx512ifma", true);
3066 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3067 setFeatureEnabledImpl(Features, "sha", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003068 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003069 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003070 setFeatureEnabledImpl(Features, "avx512f", true);
3071 setFeatureEnabledImpl(Features, "avx512cd", true);
3072 setFeatureEnabledImpl(Features, "avx512dq", true);
3073 setFeatureEnabledImpl(Features, "avx512bw", true);
3074 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003075 setFeatureEnabledImpl(Features, "pku", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003076 setFeatureEnabledImpl(Features, "clwb", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003077 LLVM_FALLTHROUGH;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003078 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003079 setFeatureEnabledImpl(Features, "xsavec", true);
3080 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003081 setFeatureEnabledImpl(Features, "mpx", true);
3082 setFeatureEnabledImpl(Features, "sgx", true);
3083 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003084 LLVM_FALLTHROUGH;
Craig Topperdb4dc082014-11-06 05:52:19 +00003085 case CK_Broadwell:
3086 setFeatureEnabledImpl(Features, "rdseed", true);
3087 setFeatureEnabledImpl(Features, "adx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003088 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003089 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003090 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003091 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003092 setFeatureEnabledImpl(Features, "bmi", true);
3093 setFeatureEnabledImpl(Features, "bmi2", true);
3094 setFeatureEnabledImpl(Features, "rtm", true);
3095 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003096 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003097 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003098 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003099 setFeatureEnabledImpl(Features, "rdrnd", true);
3100 setFeatureEnabledImpl(Features, "f16c", true);
3101 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003102 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003103 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003104 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003105 setFeatureEnabledImpl(Features, "xsave", true);
3106 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003107 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003108 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003109 case CK_Silvermont:
3110 setFeatureEnabledImpl(Features, "aes", true);
3111 setFeatureEnabledImpl(Features, "pclmul", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003112 LLVM_FALLTHROUGH;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003113 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003114 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003115 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003116 setFeatureEnabledImpl(Features, "cx16", true);
3117 break;
3118 case CK_KNL:
3119 setFeatureEnabledImpl(Features, "avx512f", true);
3120 setFeatureEnabledImpl(Features, "avx512cd", true);
3121 setFeatureEnabledImpl(Features, "avx512er", true);
3122 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003123 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003124 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003125 setFeatureEnabledImpl(Features, "rdseed", true);
3126 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003127 setFeatureEnabledImpl(Features, "lzcnt", true);
3128 setFeatureEnabledImpl(Features, "bmi", true);
3129 setFeatureEnabledImpl(Features, "bmi2", true);
3130 setFeatureEnabledImpl(Features, "rtm", true);
3131 setFeatureEnabledImpl(Features, "fma", true);
3132 setFeatureEnabledImpl(Features, "rdrnd", true);
3133 setFeatureEnabledImpl(Features, "f16c", true);
3134 setFeatureEnabledImpl(Features, "fsgsbase", true);
3135 setFeatureEnabledImpl(Features, "aes", true);
3136 setFeatureEnabledImpl(Features, "pclmul", true);
3137 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003138 setFeatureEnabledImpl(Features, "xsaveopt", true);
3139 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003140 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003141 break;
3142 case CK_K6_2:
3143 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003144 case CK_WinChip2:
3145 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003146 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003147 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003148 case CK_Athlon:
3149 case CK_AthlonThunderbird:
3150 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003151 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003152 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003153 case CK_Athlon4:
3154 case CK_AthlonXP:
3155 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003156 setFeatureEnabledImpl(Features, "sse", true);
3157 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003158 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003159 break;
3160 case CK_K8:
3161 case CK_Opteron:
3162 case CK_Athlon64:
3163 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003164 setFeatureEnabledImpl(Features, "sse2", true);
3165 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003166 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003167 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003168 case CK_AMDFAM10:
3169 setFeatureEnabledImpl(Features, "sse4a", true);
3170 setFeatureEnabledImpl(Features, "lzcnt", true);
3171 setFeatureEnabledImpl(Features, "popcnt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003172 LLVM_FALLTHROUGH;
Chandler Carruth212334f2011-09-28 08:55:37 +00003173 case CK_K8SSE3:
3174 case CK_OpteronSSE3:
3175 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003176 setFeatureEnabledImpl(Features, "sse3", true);
3177 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003178 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003179 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003180 case CK_BTVER2:
3181 setFeatureEnabledImpl(Features, "avx", true);
3182 setFeatureEnabledImpl(Features, "aes", true);
3183 setFeatureEnabledImpl(Features, "pclmul", true);
3184 setFeatureEnabledImpl(Features, "bmi", true);
3185 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003186 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003187 LLVM_FALLTHROUGH;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003188 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003189 setFeatureEnabledImpl(Features, "ssse3", true);
3190 setFeatureEnabledImpl(Features, "sse4a", true);
3191 setFeatureEnabledImpl(Features, "lzcnt", true);
3192 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003193 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003194 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003195 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003196 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003197 case CK_ZNVER1:
3198 setFeatureEnabledImpl(Features, "adx", true);
3199 setFeatureEnabledImpl(Features, "aes", true);
3200 setFeatureEnabledImpl(Features, "avx2", true);
3201 setFeatureEnabledImpl(Features, "bmi", true);
3202 setFeatureEnabledImpl(Features, "bmi2", true);
3203 setFeatureEnabledImpl(Features, "clflushopt", true);
3204 setFeatureEnabledImpl(Features, "cx16", true);
3205 setFeatureEnabledImpl(Features, "f16c", true);
3206 setFeatureEnabledImpl(Features, "fma", true);
3207 setFeatureEnabledImpl(Features, "fsgsbase", true);
3208 setFeatureEnabledImpl(Features, "fxsr", true);
3209 setFeatureEnabledImpl(Features, "lzcnt", true);
3210 setFeatureEnabledImpl(Features, "mwaitx", true);
3211 setFeatureEnabledImpl(Features, "movbe", true);
3212 setFeatureEnabledImpl(Features, "pclmul", true);
3213 setFeatureEnabledImpl(Features, "popcnt", true);
3214 setFeatureEnabledImpl(Features, "prfchw", true);
3215 setFeatureEnabledImpl(Features, "rdrnd", true);
3216 setFeatureEnabledImpl(Features, "rdseed", true);
3217 setFeatureEnabledImpl(Features, "sha", true);
3218 setFeatureEnabledImpl(Features, "sse4a", true);
3219 setFeatureEnabledImpl(Features, "xsave", true);
3220 setFeatureEnabledImpl(Features, "xsavec", true);
3221 setFeatureEnabledImpl(Features, "xsaveopt", true);
3222 setFeatureEnabledImpl(Features, "xsaves", true);
3223 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003224 case CK_BDVER4:
3225 setFeatureEnabledImpl(Features, "avx2", true);
3226 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003227 setFeatureEnabledImpl(Features, "mwaitx", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003228 LLVM_FALLTHROUGH;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003229 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003230 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003231 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003232 LLVM_FALLTHROUGH;
Craig Topper8c7f2512014-11-03 06:51:41 +00003233 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003234 setFeatureEnabledImpl(Features, "bmi", true);
3235 setFeatureEnabledImpl(Features, "fma", true);
3236 setFeatureEnabledImpl(Features, "f16c", true);
3237 setFeatureEnabledImpl(Features, "tbm", true);
Craig Topper7d494ef2017-02-08 05:44:30 +00003238 LLVM_FALLTHROUGH;
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003239 case CK_BDVER1:
3240 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003241 setFeatureEnabledImpl(Features, "xop", true);
3242 setFeatureEnabledImpl(Features, "lzcnt", true);
3243 setFeatureEnabledImpl(Features, "aes", true);
3244 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003245 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003246 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003247 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003248 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003249 break;
Eli Friedman33465822011-07-08 23:31:17 +00003250 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003251 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3252 return false;
3253
3254 // Can't do this earlier because we need to be able to explicitly enable
3255 // or disable these features and the things that they depend upon.
3256
3257 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3258 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003259 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003260 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3261 FeaturesVec.end())
3262 Features["popcnt"] = true;
3263
3264 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3265 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003266 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003267 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3268 FeaturesVec.end())
3269 Features["prfchw"] = true;
3270
Eric Christophera7260af2015-10-08 20:10:18 +00003271 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3272 // then enable MMX.
3273 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003274 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003275 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3276 FeaturesVec.end())
3277 Features["mmx"] = true;
3278
Eric Christopherbbd746d2015-10-08 20:10:14 +00003279 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003280}
3281
Rafael Espindolae62e2792013-08-20 13:44:29 +00003282void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003283 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003284 if (Enabled) {
3285 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003286 case AVX512F:
3287 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003288 case AVX2:
3289 Features["avx2"] = true;
3290 case AVX:
3291 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003292 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003293 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003294 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003295 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003296 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 case SSSE3:
3298 Features["ssse3"] = true;
3299 case SSE3:
3300 Features["sse3"] = true;
3301 case SSE2:
3302 Features["sse2"] = true;
3303 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003304 Features["sse"] = true;
3305 case NoSSE:
3306 break;
3307 }
3308 return;
3309 }
3310
3311 switch (Level) {
3312 case NoSSE:
3313 case SSE1:
3314 Features["sse"] = false;
3315 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003316 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3317 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003318 case SSE3:
3319 Features["sse3"] = false;
3320 setXOPLevel(Features, NoXOP, false);
3321 case SSSE3:
3322 Features["ssse3"] = false;
3323 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003324 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003325 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003326 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003327 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003328 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3329 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003330 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003331 case AVX2:
3332 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003333 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003334 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003335 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003336 Features["avx512vl"] = Features["avx512vbmi"] =
3337 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003338 }
3339}
3340
3341void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003342 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003343 if (Enabled) {
3344 switch (Level) {
3345 case AMD3DNowAthlon:
3346 Features["3dnowa"] = true;
3347 case AMD3DNow:
3348 Features["3dnow"] = true;
3349 case MMX:
3350 Features["mmx"] = true;
3351 case NoMMX3DNow:
3352 break;
3353 }
3354 return;
3355 }
3356
3357 switch (Level) {
3358 case NoMMX3DNow:
3359 case MMX:
3360 Features["mmx"] = false;
3361 case AMD3DNow:
3362 Features["3dnow"] = false;
3363 case AMD3DNowAthlon:
3364 Features["3dnowa"] = false;
3365 }
3366}
3367
3368void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003369 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003370 if (Enabled) {
3371 switch (Level) {
3372 case XOP:
3373 Features["xop"] = true;
3374 case FMA4:
3375 Features["fma4"] = true;
3376 setSSELevel(Features, AVX, true);
3377 case SSE4A:
3378 Features["sse4a"] = true;
3379 setSSELevel(Features, SSE3, true);
3380 case NoXOP:
3381 break;
3382 }
3383 return;
3384 }
3385
3386 switch (Level) {
3387 case NoXOP:
3388 case SSE4A:
3389 Features["sse4a"] = false;
3390 case FMA4:
3391 Features["fma4"] = false;
3392 case XOP:
3393 Features["xop"] = false;
3394 }
3395}
3396
Craig Topper86d79ef2013-09-17 04:51:29 +00003397void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3398 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003399 // This is a bit of a hack to deal with the sse4 target feature when used
3400 // as part of the target attribute. We handle sse4 correctly everywhere
3401 // else. See below for more information on how we handle the sse4 options.
3402 if (Name != "sse4")
3403 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003404
Craig Topper29561122013-09-19 01:13:07 +00003405 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003406 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003407 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003408 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003409 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003410 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003411 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003413 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003414 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003415 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003416 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003417 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003419 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003421 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003422 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003423 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003424 if (Enabled)
3425 setSSELevel(Features, SSE2, Enabled);
3426 } else if (Name == "pclmul") {
3427 if (Enabled)
3428 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003429 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003430 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003431 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003432 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003433 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003434 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003435 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3436 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3437 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003438 if (Enabled)
3439 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003440 // Enable BWI instruction if VBMI is being enabled.
3441 if (Name == "avx512vbmi" && Enabled)
3442 Features["avx512bw"] = true;
3443 // Also disable VBMI if BWI is being disabled.
3444 if (Name == "avx512bw" && !Enabled)
3445 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003446 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003447 if (Enabled)
3448 setSSELevel(Features, AVX, Enabled);
3449 } else if (Name == "fma4") {
3450 setXOPLevel(Features, FMA4, Enabled);
3451 } else if (Name == "xop") {
3452 setXOPLevel(Features, XOP, Enabled);
3453 } else if (Name == "sse4a") {
3454 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003455 } else if (Name == "f16c") {
3456 if (Enabled)
3457 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003458 } else if (Name == "sha") {
3459 if (Enabled)
3460 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003461 } else if (Name == "sse4") {
3462 // We can get here via the __target__ attribute since that's not controlled
3463 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3464 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3465 // disabled.
3466 if (Enabled)
3467 setSSELevel(Features, SSE42, Enabled);
3468 else
3469 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003470 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003471 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003472 Features["xsaveopt"] = false;
3473 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003474 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003475 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003476 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003477}
3478
Eric Christopher3ff21b32013-10-16 21:26:26 +00003479/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003480/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003481bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003482 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003483 for (const auto &Feature : Features) {
3484 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003485 continue;
3486
Eric Christopher610fe112015-08-26 08:21:55 +00003487 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003488 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003489 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003490 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003491 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003492 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003493 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003494 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003495 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003496 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003497 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003498 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003499 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003500 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003501 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003502 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003503 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003504 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003505 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003506 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003507 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003508 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003509 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003510 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003511 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003512 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003513 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003514 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003515 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003516 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003517 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003518 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003519 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003520 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003521 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003522 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003523 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003524 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003525 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003526 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003527 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003528 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003529 } else if (Feature == "+avx512vbmi") {
3530 HasAVX512VBMI = true;
3531 } else if (Feature == "+avx512ifma") {
3532 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003533 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003534 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003535 } else if (Feature == "+mpx") {
3536 HasMPX = true;
3537 } else if (Feature == "+movbe") {
3538 HasMOVBE = true;
3539 } else if (Feature == "+sgx") {
3540 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003541 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003542 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003543 } else if (Feature == "+fxsr") {
3544 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003545 } else if (Feature == "+xsave") {
3546 HasXSAVE = true;
3547 } else if (Feature == "+xsaveopt") {
3548 HasXSAVEOPT = true;
3549 } else if (Feature == "+xsavec") {
3550 HasXSAVEC = true;
3551 } else if (Feature == "+xsaves") {
3552 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003553 } else if (Feature == "+mwaitx") {
3554 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003555 } else if (Feature == "+pku") {
3556 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003557 } else if (Feature == "+clflushopt") {
3558 HasCLFLUSHOPT = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003559 } else if (Feature == "+clwb") {
3560 HasCLWB = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003561 } else if (Feature == "+prefetchwt1") {
3562 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003563 }
3564
Benjamin Kramer27402c62012-03-05 15:10:44 +00003565 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003566 .Case("+avx512f", AVX512F)
3567 .Case("+avx2", AVX2)
3568 .Case("+avx", AVX)
3569 .Case("+sse4.2", SSE42)
3570 .Case("+sse4.1", SSE41)
3571 .Case("+ssse3", SSSE3)
3572 .Case("+sse3", SSE3)
3573 .Case("+sse2", SSE2)
3574 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003575 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003576 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003577
Eli Friedman33465822011-07-08 23:31:17 +00003578 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003579 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003580 .Case("+3dnowa", AMD3DNowAthlon)
3581 .Case("+3dnow", AMD3DNow)
3582 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003583 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003584 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003585
3586 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003587 .Case("+xop", XOP)
3588 .Case("+fma4", FMA4)
3589 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003590 .Default(NoXOP);
3591 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003592 }
Eli Friedman33465822011-07-08 23:31:17 +00003593
Rafael Espindolaeb265472013-08-21 21:59:03 +00003594 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3595 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003596 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3597 (FPMath == FP_387 && SSELevel >= SSE1)) {
3598 Diags.Report(diag::err_target_unsupported_fpmath) <<
3599 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003600 return false;
3601 }
3602
Alexey Bataev00396512015-07-02 03:40:19 +00003603 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003604 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003605 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003606}
Chris Lattnerecd49032009-03-02 22:27:17 +00003607
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003608/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3609/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003610void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003611 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003612 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003613 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003614 Builder.defineMacro("__amd64__");
3615 Builder.defineMacro("__amd64");
3616 Builder.defineMacro("__x86_64");
3617 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003618 if (getTriple().getArchName() == "x86_64h") {
3619 Builder.defineMacro("__x86_64h");
3620 Builder.defineMacro("__x86_64h__");
3621 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003622 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003623 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003624 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003625
Chris Lattnerecd49032009-03-02 22:27:17 +00003626 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003627 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3628 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003629 switch (CPU) {
3630 case CK_Generic:
3631 break;
3632 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003633 // The rest are coming from the i386 define above.
3634 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003635 break;
3636 case CK_i486:
3637 case CK_WinChipC6:
3638 case CK_WinChip2:
3639 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003640 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003641 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003642 case CK_PentiumMMX:
3643 Builder.defineMacro("__pentium_mmx__");
3644 Builder.defineMacro("__tune_pentium_mmx__");
3645 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003646 case CK_i586:
3647 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003648 defineCPUMacros(Builder, "i586");
3649 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003650 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003651 case CK_Pentium3:
3652 case CK_Pentium3M:
3653 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003654 Builder.defineMacro("__tune_pentium3__");
3655 // Fallthrough
3656 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003657 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003658 Builder.defineMacro("__tune_pentium2__");
3659 // Fallthrough
3660 case CK_PentiumPro:
3661 Builder.defineMacro("__tune_i686__");
3662 Builder.defineMacro("__tune_pentiumpro__");
3663 // Fallthrough
3664 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003665 Builder.defineMacro("__i686");
3666 Builder.defineMacro("__i686__");
3667 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3668 Builder.defineMacro("__pentiumpro");
3669 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003670 break;
3671 case CK_Pentium4:
3672 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003673 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003674 break;
3675 case CK_Yonah:
3676 case CK_Prescott:
3677 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003678 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003679 break;
3680 case CK_Core2:
3681 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003682 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003683 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003684 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003685 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003686 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003687 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003688 defineCPUMacros(Builder, "slm");
3689 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003690 case CK_Nehalem:
3691 case CK_Westmere:
3692 case CK_SandyBridge:
3693 case CK_IvyBridge:
3694 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003695 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003696 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003697 // FIXME: Historically, we defined this legacy name, it would be nice to
3698 // remove it at some point. We've never exposed fine-grained names for
3699 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003700 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003701 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003702 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003703 defineCPUMacros(Builder, "skx");
3704 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003705 case CK_Cannonlake:
3706 break;
Craig Topper449314e2013-08-20 07:09:39 +00003707 case CK_KNL:
3708 defineCPUMacros(Builder, "knl");
3709 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003710 case CK_Lakemont:
3711 Builder.defineMacro("__tune_lakemont__");
3712 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003713 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003714 Builder.defineMacro("__k6_2__");
3715 Builder.defineMacro("__tune_k6_2__");
3716 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003717 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003718 if (CPU != CK_K6_2) { // In case of fallthrough
3719 // FIXME: GCC may be enabling these in cases where some other k6
3720 // architecture is specified but -m3dnow is explicitly provided. The
3721 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003722 Builder.defineMacro("__k6_3__");
3723 Builder.defineMacro("__tune_k6_3__");
3724 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003725 // Fallthrough
3726 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003727 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003728 break;
3729 case CK_Athlon:
3730 case CK_AthlonThunderbird:
3731 case CK_Athlon4:
3732 case CK_AthlonXP:
3733 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003734 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003735 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003736 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003737 Builder.defineMacro("__tune_athlon_sse__");
3738 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003739 break;
3740 case CK_K8:
3741 case CK_K8SSE3:
3742 case CK_x86_64:
3743 case CK_Opteron:
3744 case CK_OpteronSSE3:
3745 case CK_Athlon64:
3746 case CK_Athlon64SSE3:
3747 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003748 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003749 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003750 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003751 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003752 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003753 case CK_BTVER1:
3754 defineCPUMacros(Builder, "btver1");
3755 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003756 case CK_BTVER2:
3757 defineCPUMacros(Builder, "btver2");
3758 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003759 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003760 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003761 break;
3762 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003763 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003764 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003765 case CK_BDVER3:
3766 defineCPUMacros(Builder, "bdver3");
3767 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003768 case CK_BDVER4:
3769 defineCPUMacros(Builder, "bdver4");
3770 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003771 case CK_ZNVER1:
3772 defineCPUMacros(Builder, "znver1");
3773 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003774 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003775 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003776 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003777 }
Chris Lattner96e43572009-03-02 22:40:39 +00003778
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003779 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003780 Builder.defineMacro("__REGISTER_PREFIX__", "");
3781
Chris Lattner6df41af2009-04-19 17:32:33 +00003782 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3783 // functions in glibc header files that use FP Stack inline asm which the
3784 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003785 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003786
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003787 if (HasAES)
3788 Builder.defineMacro("__AES__");
3789
Craig Topper3f122a72012-05-31 05:18:48 +00003790 if (HasPCLMUL)
3791 Builder.defineMacro("__PCLMUL__");
3792
Craig Topper22967d42011-12-25 05:06:45 +00003793 if (HasLZCNT)
3794 Builder.defineMacro("__LZCNT__");
3795
Benjamin Kramer1e250392012-07-07 09:39:18 +00003796 if (HasRDRND)
3797 Builder.defineMacro("__RDRND__");
3798
Craig Topper8c7f2512014-11-03 06:51:41 +00003799 if (HasFSGSBASE)
3800 Builder.defineMacro("__FSGSBASE__");
3801
Craig Topper22967d42011-12-25 05:06:45 +00003802 if (HasBMI)
3803 Builder.defineMacro("__BMI__");
3804
3805 if (HasBMI2)
3806 Builder.defineMacro("__BMI2__");
3807
Craig Topper1de83482011-12-29 16:10:46 +00003808 if (HasPOPCNT)
3809 Builder.defineMacro("__POPCNT__");
3810
Michael Liao625a8752012-11-10 05:17:46 +00003811 if (HasRTM)
3812 Builder.defineMacro("__RTM__");
3813
Michael Liao74f4eaf2013-03-26 17:52:08 +00003814 if (HasPRFCHW)
3815 Builder.defineMacro("__PRFCHW__");
3816
Michael Liaoffaae352013-03-29 05:17:55 +00003817 if (HasRDSEED)
3818 Builder.defineMacro("__RDSEED__");
3819
Robert Khasanov50e6f582014-09-19 09:53:48 +00003820 if (HasADX)
3821 Builder.defineMacro("__ADX__");
3822
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003823 if (HasTBM)
3824 Builder.defineMacro("__TBM__");
3825
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003826 if (HasMWAITX)
3827 Builder.defineMacro("__MWAITX__");
3828
Rafael Espindolae62e2792013-08-20 13:44:29 +00003829 switch (XOPLevel) {
3830 case XOP:
3831 Builder.defineMacro("__XOP__");
3832 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003833 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003834 case SSE4A:
3835 Builder.defineMacro("__SSE4A__");
3836 case NoXOP:
3837 break;
3838 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003839
Craig Topperbba778b2012-06-03 21:46:30 +00003840 if (HasFMA)
3841 Builder.defineMacro("__FMA__");
3842
Manman Rena45358c2012-10-11 00:59:55 +00003843 if (HasF16C)
3844 Builder.defineMacro("__F16C__");
3845
Craig Topper679b53a2013-08-21 05:29:10 +00003846 if (HasAVX512CD)
3847 Builder.defineMacro("__AVX512CD__");
3848 if (HasAVX512ER)
3849 Builder.defineMacro("__AVX512ER__");
3850 if (HasAVX512PF)
3851 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003852 if (HasAVX512DQ)
3853 Builder.defineMacro("__AVX512DQ__");
3854 if (HasAVX512BW)
3855 Builder.defineMacro("__AVX512BW__");
3856 if (HasAVX512VL)
3857 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003858 if (HasAVX512VBMI)
3859 Builder.defineMacro("__AVX512VBMI__");
3860 if (HasAVX512IFMA)
3861 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003862
Ben Langmuir58078d02013-09-19 13:22:04 +00003863 if (HasSHA)
3864 Builder.defineMacro("__SHA__");
3865
Craig Toppere33f51f2015-10-16 06:22:36 +00003866 if (HasFXSR)
3867 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003868 if (HasXSAVE)
3869 Builder.defineMacro("__XSAVE__");
3870 if (HasXSAVEOPT)
3871 Builder.defineMacro("__XSAVEOPT__");
3872 if (HasXSAVEC)
3873 Builder.defineMacro("__XSAVEC__");
3874 if (HasXSAVES)
3875 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003876 if (HasPKU)
3877 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003878 if (HasCX16)
3879 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
Craig Topper78b47872017-02-08 06:48:58 +00003880 if (HasCLFLUSHOPT)
3881 Builder.defineMacro("__CLFLUSHOPT__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003882
Chris Lattner96e43572009-03-02 22:40:39 +00003883 // Each case falls through to the previous one here.
3884 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003885 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003886 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003887 case AVX2:
3888 Builder.defineMacro("__AVX2__");
3889 case AVX:
3890 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003891 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003892 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003893 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003894 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003895 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003896 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003897 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003898 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003899 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003900 Builder.defineMacro("__SSE2__");
3901 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003902 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003903 Builder.defineMacro("__SSE__");
3904 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003905 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003906 break;
3907 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003908
Derek Schuffc7dd7222012-10-11 15:52:22 +00003909 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003910 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003911 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003912 case AVX2:
3913 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003914 case SSE42:
3915 case SSE41:
3916 case SSSE3:
3917 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003918 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003919 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003920 break;
3921 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003922 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003923 break;
3924 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003925 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003926 }
3927 }
3928
Anders Carlssone437c682010-01-27 03:47:49 +00003929 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003930 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003931 case AMD3DNowAthlon:
3932 Builder.defineMacro("__3dNOW_A__");
3933 case AMD3DNow:
3934 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003935 case MMX:
3936 Builder.defineMacro("__MMX__");
3937 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003938 break;
3939 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003940
3941 if (CPU >= CK_i486) {
3942 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3943 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3944 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3945 }
3946 if (CPU >= CK_i586)
3947 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003948}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003949
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003950bool X86TargetInfo::hasFeature(StringRef Feature) const {
3951 return llvm::StringSwitch<bool>(Feature)
3952 .Case("aes", HasAES)
3953 .Case("avx", SSELevel >= AVX)
3954 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003955 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003956 .Case("avx512cd", HasAVX512CD)
3957 .Case("avx512er", HasAVX512ER)
3958 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003959 .Case("avx512dq", HasAVX512DQ)
3960 .Case("avx512bw", HasAVX512BW)
3961 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003962 .Case("avx512vbmi", HasAVX512VBMI)
3963 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003964 .Case("bmi", HasBMI)
3965 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003966 .Case("clflushopt", HasCLFLUSHOPT)
3967 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003968 .Case("cx16", HasCX16)
3969 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003970 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003971 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003972 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003973 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003974 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003975 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3976 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3977 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003978 .Case("movbe", HasMOVBE)
3979 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003980 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003981 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003982 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003983 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003984 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003985 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003986 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003987 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003988 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003989 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003990 .Case("sse", SSELevel >= SSE1)
3991 .Case("sse2", SSELevel >= SSE2)
3992 .Case("sse3", SSELevel >= SSE3)
3993 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003994 .Case("sse4.1", SSELevel >= SSE41)
3995 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003996 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003997 .Case("tbm", HasTBM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003998 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003999 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4000 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004001 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004002 .Case("xsave", HasXSAVE)
4003 .Case("xsavec", HasXSAVEC)
4004 .Case("xsaves", HasXSAVES)
4005 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004006 .Default(false);
4007}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004008
Eric Christopherd9832702015-06-29 21:00:05 +00004009// We can't use a generic validation scheme for the features accepted here
4010// versus subtarget features accepted in the target attribute because the
4011// bitfield structure that's initialized in the runtime only supports the
4012// below currently rather than the full range of subtarget features. (See
4013// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4014bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4015 return llvm::StringSwitch<bool>(FeatureStr)
4016 .Case("cmov", true)
4017 .Case("mmx", true)
4018 .Case("popcnt", true)
4019 .Case("sse", true)
4020 .Case("sse2", true)
4021 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004022 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004023 .Case("sse4.1", true)
4024 .Case("sse4.2", true)
4025 .Case("avx", true)
4026 .Case("avx2", true)
4027 .Case("sse4a", true)
4028 .Case("fma4", true)
4029 .Case("xop", true)
4030 .Case("fma", true)
4031 .Case("avx512f", true)
4032 .Case("bmi", true)
4033 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004034 .Case("aes", true)
4035 .Case("pclmul", true)
4036 .Case("avx512vl", true)
4037 .Case("avx512bw", true)
4038 .Case("avx512dq", true)
4039 .Case("avx512cd", true)
4040 .Case("avx512er", true)
4041 .Case("avx512pf", true)
4042 .Case("avx512vbmi", true)
4043 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004044 .Default(false);
4045}
4046
Eli Friedman3fd920a2008-08-20 02:34:37 +00004047bool
Anders Carlsson58436352009-02-28 17:11:49 +00004048X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004049 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004050 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004051 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004052 // Constant constraints.
4053 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4054 // instructions.
4055 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4056 // x86_64 instructions.
4057 case 's':
4058 Info.setRequiresImmediate();
4059 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004060 case 'I':
4061 Info.setRequiresImmediate(0, 31);
4062 return true;
4063 case 'J':
4064 Info.setRequiresImmediate(0, 63);
4065 return true;
4066 case 'K':
4067 Info.setRequiresImmediate(-128, 127);
4068 return true;
4069 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004070 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004071 return true;
4072 case 'M':
4073 Info.setRequiresImmediate(0, 3);
4074 return true;
4075 case 'N':
4076 Info.setRequiresImmediate(0, 255);
4077 return true;
4078 case 'O':
4079 Info.setRequiresImmediate(0, 127);
4080 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004081 // Register constraints.
4082 case 'Y': // 'Y' is the first character for several 2-character constraints.
4083 // Shift the pointer to the second character of the constraint.
4084 Name++;
4085 switch (*Name) {
4086 default:
4087 return false;
4088 case '0': // First SSE register.
4089 case 't': // Any SSE register, when SSE2 is enabled.
4090 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4091 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004092 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004093 Info.setAllowsRegister();
4094 return true;
4095 }
4096 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004097 // Constraint 'f' cannot be used for output operands.
4098 if (Info.ConstraintStr[0] == '=')
4099 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004100 Info.setAllowsRegister();
4101 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004102 case 'a': // eax.
4103 case 'b': // ebx.
4104 case 'c': // ecx.
4105 case 'd': // edx.
4106 case 'S': // esi.
4107 case 'D': // edi.
4108 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004109 case 't': // Top of floating point stack.
4110 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004111 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004112 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004113 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004114 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004115 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4116 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004117 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004118 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4119 case 'l': // "Index" registers: any general register that can be used as an
4120 // index in a base+index memory access.
4121 Info.setAllowsRegister();
4122 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004123 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004124 case 'C': // SSE floating point constant.
4125 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004126 return true;
4127 }
4128}
4129
Akira Hatanaka974131e2014-09-18 18:17:18 +00004130bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4131 unsigned Size) const {
4132 // Strip off constraint modifiers.
4133 while (Constraint[0] == '=' ||
4134 Constraint[0] == '+' ||
4135 Constraint[0] == '&')
4136 Constraint = Constraint.substr(1);
4137
4138 return validateOperandSize(Constraint, Size);
4139}
4140
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004141bool X86TargetInfo::validateInputSize(StringRef Constraint,
4142 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004143 return validateOperandSize(Constraint, Size);
4144}
4145
4146bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4147 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004148 switch (Constraint[0]) {
4149 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004150 case 'k':
4151 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004152 case 'y':
4153 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004154 case 'f':
4155 case 't':
4156 case 'u':
4157 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004158 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004159 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004160 if (SSELevel >= AVX512F)
4161 // 512-bit zmm registers can be used if target supports AVX512F.
4162 return Size <= 512U;
4163 else if (SSELevel >= AVX)
4164 // 256-bit ymm registers can be used if target supports AVX.
4165 return Size <= 256U;
4166 return Size <= 128U;
4167 case 'Y':
4168 // 'Y' is the first character for several 2-character constraints.
4169 switch (Constraint[1]) {
4170 default: break;
4171 case 'm':
4172 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004173 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004174 return Size <= 64;
4175 case 'i':
4176 case 't':
4177 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4178 if (SSELevel >= AVX512F)
4179 return Size <= 512U;
4180 else if (SSELevel >= AVX)
4181 return Size <= 256U;
4182 return SSELevel >= SSE2 && Size <= 128U;
4183 }
4184
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004185 }
4186
4187 return true;
4188}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004189
Eli Friedman3fd920a2008-08-20 02:34:37 +00004190std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004191X86TargetInfo::convertConstraint(const char *&Constraint) const {
4192 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004193 case 'a': return std::string("{ax}");
4194 case 'b': return std::string("{bx}");
4195 case 'c': return std::string("{cx}");
4196 case 'd': return std::string("{dx}");
4197 case 'S': return std::string("{si}");
4198 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004199 case 'p': // address
4200 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004201 case 't': // top of floating point stack.
4202 return std::string("{st}");
4203 case 'u': // second from top of floating point stack.
4204 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004205 case 'Y':
4206 switch (Constraint[1]) {
4207 default:
4208 // Break from inner switch and fall through (copy single char),
4209 // continue parsing after copying the current constraint into
4210 // the return string.
4211 break;
4212 case 'k':
4213 // "^" hints llvm that this is a 2 letter constraint.
4214 // "Constraint++" is used to promote the string iterator
4215 // to the next constraint.
4216 return std::string("^") + std::string(Constraint++, 2);
4217 }
4218 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004219 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004220 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004221 }
4222}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004223
Eli Friedman3fd920a2008-08-20 02:34:37 +00004224// X86-32 generic target
4225class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004226public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004227 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4228 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004229 DoubleAlign = LongLongAlign = 32;
4230 LongDoubleWidth = 96;
4231 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004232 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004233 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004234 SizeType = UnsignedInt;
4235 PtrDiffType = SignedInt;
4236 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004237 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004238
4239 // Use fpret for all types.
4240 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4241 (1 << TargetInfo::Double) |
4242 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004243
4244 // x86-32 has atomics up to 8 bytes
4245 // FIXME: Check that we actually have cmpxchg8b before setting
4246 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4247 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004248 }
Craig Topper3164f332014-03-11 03:39:26 +00004249 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004250 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004251 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004252
Craig Topper3164f332014-03-11 03:39:26 +00004253 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004254 if (RegNo == 0) return 0;
4255 if (RegNo == 1) return 2;
4256 return -1;
4257 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004258 bool validateOperandSize(StringRef Constraint,
4259 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004260 switch (Constraint[0]) {
4261 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004262 case 'R':
4263 case 'q':
4264 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004265 case 'a':
4266 case 'b':
4267 case 'c':
4268 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004269 case 'S':
4270 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004271 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004272 case 'A':
4273 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004274 }
4275
Akira Hatanaka974131e2014-09-18 18:17:18 +00004276 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004277 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004278 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4279 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4280 Builtin::FirstTSBuiltin + 1);
4281 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004282};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004283
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004284class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004286 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4287 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004288
Craig Topper3164f332014-03-11 03:39:26 +00004289 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004290 unsigned Major, Minor, Micro;
4291 getTriple().getOSVersion(Major, Minor, Micro);
4292 // New NetBSD uses the default rounding mode.
4293 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4294 return X86_32TargetInfo::getFloatEvalMethod();
4295 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004296 return 1;
4297 }
4298};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004299
Eli Friedmane3aa4542009-07-05 18:47:56 +00004300class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4301public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004302 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4303 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004304 SizeType = UnsignedLong;
4305 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004306 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004307 }
4308};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004309
Eli Friedman9fa28852012-08-08 23:57:20 +00004310class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004312 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4313 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004314 SizeType = UnsignedLong;
4315 IntPtrType = SignedLong;
4316 PtrDiffType = SignedLong;
4317 }
4318};
Eli Friedman9fa28852012-08-08 23:57:20 +00004319
Torok Edwinb2b37c62009-06-30 17:10:35 +00004320class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004321public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004322 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4323 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004324 LongDoubleWidth = 128;
4325 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004326 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004327 MaxVectorAlign = 256;
4328 // The watchOS simulator uses the builtin bool type for Objective-C.
4329 llvm::Triple T = llvm::Triple(Triple);
4330 if (T.isWatchOS())
4331 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004332 SizeType = UnsignedLong;
4333 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004334 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004335 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004336 }
4337
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004338 bool handleTargetFeatures(std::vector<std::string> &Features,
4339 DiagnosticsEngine &Diags) override {
4340 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4341 Diags))
4342 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004343 // We now know the features we have: we can decide how to align vectors.
4344 MaxVectorAlign =
4345 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004346 return true;
4347 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004348};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004349
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004350// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004351class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004352public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004353 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4354 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004355 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004356 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004357 bool IsWinCOFF =
4358 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004359 resetDataLayout(IsWinCOFF
4360 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4361 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004362 }
Craig Topper3164f332014-03-11 03:39:26 +00004363 void getTargetDefines(const LangOptions &Opts,
4364 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004365 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4366 }
4367};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004368
4369// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004370class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004371public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004372 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4373 const TargetOptions &Opts)
4374 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004375 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004376 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004377 }
Craig Topper3164f332014-03-11 03:39:26 +00004378 void getTargetDefines(const LangOptions &Opts,
4379 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004380 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4381 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4382 // The value of the following reflects processor type.
4383 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4384 // We lost the original triple, so we use the default.
4385 Builder.defineMacro("_M_IX86", "600");
4386 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004387};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004388
David Majnemerae1ed0e2015-05-28 04:36:18 +00004389static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004390 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4391 // supports __declspec natively under -fms-extensions, but we define a no-op
4392 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004393 if (Opts.MicrosoftExt)
4394 Builder.defineMacro("__declspec", "__declspec");
4395 else
4396 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4397
4398 if (!Opts.MicrosoftExt) {
4399 // Provide macros for all the calling convention keywords. Provide both
4400 // single and double underscore prefixed variants. These are available on
4401 // x64 as well as x86, even though they have no effect.
4402 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4403 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004404 std::string GCCSpelling = "__attribute__((__";
4405 GCCSpelling += CC;
4406 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004407 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4408 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4409 }
4410 }
4411}
4412
David Majnemerae1ed0e2015-05-28 04:36:18 +00004413static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4414 Builder.defineMacro("__MSVCRT__");
4415 Builder.defineMacro("__MINGW32__");
4416 addCygMingDefines(Opts, Builder);
4417}
4418
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004419// x86-32 MinGW target
4420class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4421public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004422 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4423 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004424 void getTargetDefines(const LangOptions &Opts,
4425 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004426 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004427 DefineStd(Builder, "WIN32", Opts);
4428 DefineStd(Builder, "WINNT", Opts);
4429 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004430 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004431 }
4432};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004433
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004434// x86-32 Cygwin target
4435class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4436public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004437 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4438 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004439 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004440 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004441 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 +00004442 }
Craig Topper3164f332014-03-11 03:39:26 +00004443 void getTargetDefines(const LangOptions &Opts,
4444 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004445 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004446 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004447 Builder.defineMacro("__CYGWIN__");
4448 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004449 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004450 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004451 if (Opts.CPlusPlus)
4452 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004453 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004454};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004455
Chris Lattnerb986aba2010-04-11 19:29:39 +00004456// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004457class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004458public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004459 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004460 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004461 }
Craig Topper3164f332014-03-11 03:39:26 +00004462 void getTargetDefines(const LangOptions &Opts,
4463 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004464 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004465 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004466 }
4467};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004468
Alexey Bataevc99b0492015-11-25 09:24:26 +00004469// X86-32 MCU target
4470class MCUX86_32TargetInfo : public X86_32TargetInfo {
4471public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004472 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4473 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004474 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004475 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004476 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 +00004477 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004478 }
4479
4480 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4481 // On MCU we support only C calling convention.
4482 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4483 }
4484
4485 void getTargetDefines(const LangOptions &Opts,
4486 MacroBuilder &Builder) const override {
4487 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4488 Builder.defineMacro("__iamcu");
4489 Builder.defineMacro("__iamcu__");
4490 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004491
4492 bool allowsLargerPreferedTypeAlignment() const override {
4493 return false;
4494 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004495};
4496
Douglas Gregor9fabd852011-07-01 22:41:14 +00004497// RTEMS Target
4498template<typename Target>
4499class RTEMSTargetInfo : public OSTargetInfo<Target> {
4500protected:
Craig Topper3164f332014-03-11 03:39:26 +00004501 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4502 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004503 // RTEMS defines; list based off of gcc output
4504
Douglas Gregor9fabd852011-07-01 22:41:14 +00004505 Builder.defineMacro("__rtems__");
4506 Builder.defineMacro("__ELF__");
4507 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004508
Douglas Gregor9fabd852011-07-01 22:41:14 +00004509public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004510 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4511 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004512 switch (Triple.getArch()) {
4513 default:
4514 case llvm::Triple::x86:
4515 // this->MCountName = ".mcount";
4516 break;
4517 case llvm::Triple::mips:
4518 case llvm::Triple::mipsel:
4519 case llvm::Triple::ppc:
4520 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004521 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004522 // this->MCountName = "_mcount";
4523 break;
4524 case llvm::Triple::arm:
4525 // this->MCountName = "__mcount";
4526 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004527 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004528 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004529};
4530
Douglas Gregor9fabd852011-07-01 22:41:14 +00004531// x86-32 RTEMS target
4532class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4533public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004534 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4535 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004536 SizeType = UnsignedLong;
4537 IntPtrType = SignedLong;
4538 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004539 }
Craig Topper3164f332014-03-11 03:39:26 +00004540 void getTargetDefines(const LangOptions &Opts,
4541 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004542 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4543 Builder.defineMacro("__INTEL__");
4544 Builder.defineMacro("__rtems__");
4545 }
4546};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004547
Eli Friedman3fd920a2008-08-20 02:34:37 +00004548// x86-64 generic target
4549class X86_64TargetInfo : public X86TargetInfo {
4550public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004551 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4552 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004553 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004554 bool IsWinCOFF =
4555 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004556 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004557 LongDoubleWidth = 128;
4558 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004559 LargeArrayMinWidth = 128;
4560 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004561 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004562 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4563 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4564 IntPtrType = IsX32 ? SignedInt : SignedLong;
4565 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004566 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004567 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004568
Eric Christopher917e9522014-11-18 22:36:15 +00004569 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004570 resetDataLayout(IsX32
4571 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4572 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4573 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004574
4575 // Use fpret only for long double.
4576 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004577
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004578 // Use fp2ret for _Complex long double.
4579 ComplexLongDoubleUsesFP2Ret = true;
4580
Charles Davisc7d5c942015-09-17 20:55:33 +00004581 // Make __builtin_ms_va_list available.
4582 HasBuiltinMSVaList = true;
4583
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004584 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004585 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004586 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004587 }
Craig Topper3164f332014-03-11 03:39:26 +00004588 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004589 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004590 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004591
Craig Topper3164f332014-03-11 03:39:26 +00004592 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004593 if (RegNo == 0) return 0;
4594 if (RegNo == 1) return 1;
4595 return -1;
4596 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004597
Craig Topper3164f332014-03-11 03:39:26 +00004598 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004599 switch (CC) {
4600 case CC_C:
4601 case CC_Swift:
4602 case CC_X86VectorCall:
4603 case CC_IntelOclBicc:
4604 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004605 case CC_PreserveMost:
4606 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004607 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004608 return CCCR_OK;
4609 default:
4610 return CCCR_Warning;
4611 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004612 }
4613
Craig Topper3164f332014-03-11 03:39:26 +00004614 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004615 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004616 }
4617
Pavel Chupinfd223e12014-08-04 12:39:43 +00004618 // for x32 we need it here explicitly
4619 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004620 unsigned getUnwindWordWidth() const override { return 64; }
4621 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004622
4623 bool validateGlobalRegisterVariable(StringRef RegName,
4624 unsigned RegSize,
4625 bool &HasSizeMismatch) const override {
4626 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4627 // handle.
4628 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4629 // Check that the register size is 64-bit.
4630 HasSizeMismatch = RegSize != 64;
4631 return true;
4632 }
4633
4634 // Check if the register is a 32-bit register the backend can handle.
4635 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4636 HasSizeMismatch);
4637 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004638 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4639 return llvm::makeArrayRef(BuiltinInfoX86,
4640 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4641 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004642};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004643
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004644// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004645class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004646public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004647 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4648 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004649 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004650 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004651 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004652 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004653 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004654 SizeType = UnsignedLongLong;
4655 PtrDiffType = SignedLongLong;
4656 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004657 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004658
Craig Topper3164f332014-03-11 03:39:26 +00004659 void getTargetDefines(const LangOptions &Opts,
4660 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004661 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004662 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004663 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004664
Craig Topper3164f332014-03-11 03:39:26 +00004665 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004666 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004667 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004668
Craig Topper3164f332014-03-11 03:39:26 +00004669 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004670 switch (CC) {
4671 case CC_X86StdCall:
4672 case CC_X86ThisCall:
4673 case CC_X86FastCall:
4674 return CCCR_Ignore;
4675 case CC_C:
4676 case CC_X86VectorCall:
4677 case CC_IntelOclBicc:
4678 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004679 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004680 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004681 return CCCR_OK;
4682 default:
4683 return CCCR_Warning;
4684 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004685 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004686};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004687
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004688// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004689class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004690public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004691 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4692 const TargetOptions &Opts)
4693 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004694 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004695 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004696 }
Craig Topper3164f332014-03-11 03:39:26 +00004697 void getTargetDefines(const LangOptions &Opts,
4698 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004699 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4700 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004701 Builder.defineMacro("_M_X64", "100");
4702 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004703 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004704};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004705
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004706// x86-64 MinGW target
4707class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004709 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4710 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004711 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4712 // with x86 FP ops. Weird.
4713 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004714 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004715 }
4716
Craig Topper3164f332014-03-11 03:39:26 +00004717 void getTargetDefines(const LangOptions &Opts,
4718 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004719 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004720 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004721 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004722 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004723
4724 // GCC defines this macro when it is using __gxx_personality_seh0.
4725 if (!Opts.SjLjExceptions)
4726 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004727 }
4728};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004729
Yaron Kerend030d112015-07-22 17:38:19 +00004730// x86-64 Cygwin target
4731class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4732public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004733 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4734 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004735 TLSSupported = false;
4736 WCharType = UnsignedShort;
4737 }
4738 void getTargetDefines(const LangOptions &Opts,
4739 MacroBuilder &Builder) const override {
4740 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4741 Builder.defineMacro("__x86_64__");
4742 Builder.defineMacro("__CYGWIN__");
4743 Builder.defineMacro("__CYGWIN64__");
4744 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004745 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004746 if (Opts.CPlusPlus)
4747 Builder.defineMacro("_GNU_SOURCE");
4748
4749 // GCC defines this macro when it is using __gxx_personality_seh0.
4750 if (!Opts.SjLjExceptions)
4751 Builder.defineMacro("__SEH__");
4752 }
4753};
4754
Eli Friedman2857ccb2009-07-01 03:36:11 +00004755class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4756public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004757 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4758 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004759 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004760 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4761 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004762 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004763 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004764 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004765 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004766
4767 bool handleTargetFeatures(std::vector<std::string> &Features,
4768 DiagnosticsEngine &Diags) override {
4769 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4770 Diags))
4771 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004772 // We now know the features we have: we can decide how to align vectors.
4773 MaxVectorAlign =
4774 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004775 return true;
4776 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004777};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004778
Eli Friedman245f2292009-07-05 22:31:18 +00004779class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4780public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004781 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4782 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004783 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004784 Int64Type = SignedLongLong;
4785 }
4786};
Eli Friedman245f2292009-07-05 22:31:18 +00004787
Eli Friedman9fa28852012-08-08 23:57:20 +00004788class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4789public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004790 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4791 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004792 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004793 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004794 }
4795};
Tim Northover9bb857a2013-01-31 12:13:10 +00004796
Eli Friedmanf05b7722008-08-20 07:44:10 +00004797class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004798 // Possible FPU choices.
4799 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004800 VFP2FPU = (1 << 0),
4801 VFP3FPU = (1 << 1),
4802 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004803 NeonFPU = (1 << 3),
4804 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004805 };
4806
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004807 // Possible HWDiv features.
4808 enum HWDivMode {
4809 HWDivThumb = (1 << 0),
4810 HWDivARM = (1 << 1)
4811 };
4812
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004813 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004814 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004815 }
4816
4817 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4818 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004819
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004820 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004821
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004822 StringRef CPUProfile;
4823 StringRef CPUAttr;
4824
Rafael Espindolaeb265472013-08-21 21:59:03 +00004825 enum {
4826 FP_Default,
4827 FP_VFP,
4828 FP_Neon
4829 } FPMath;
4830
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004831 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004832 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004833 unsigned ArchProfile;
4834 unsigned ArchVersion;
4835
Bernard Ogdenda13af32013-10-24 18:32:51 +00004836 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004837
Logan Chien57086ce2012-10-10 06:56:20 +00004838 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004839 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004840
4841 // Initialized via features.
4842 unsigned SoftFloat : 1;
4843 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004844
Bernard Ogden18b57012013-10-29 09:47:51 +00004845 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004846 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004847 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004848 unsigned Unaligned : 1;
4849
4850 enum {
4851 LDREX_B = (1 << 0), /// byte (8-bit)
4852 LDREX_H = (1 << 1), /// half (16-bit)
4853 LDREX_W = (1 << 2), /// word (32-bit)
4854 LDREX_D = (1 << 3), /// double (64-bit)
4855 };
4856
4857 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004858
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004859 // ACLE 6.5.1 Hardware floating point
4860 enum {
4861 HW_FP_HP = (1 << 1), /// half (16-bit)
4862 HW_FP_SP = (1 << 2), /// single (32-bit)
4863 HW_FP_DP = (1 << 3), /// double (64-bit)
4864 };
4865 uint32_t HW_FP;
4866
Chris Lattner5cc15e02010-03-03 19:03:45 +00004867 static const Builtin::Info BuiltinInfo[];
4868
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004869 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004870 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004871
4872 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004873 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004874
Renato Golin0201a9e2016-09-22 19:28:20 +00004875 // size_t is unsigned long on MachO-derived environments, NetBSD,
4876 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004877 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004878 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004879 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004880 SizeType = UnsignedLong;
4881 else
4882 SizeType = UnsignedInt;
4883
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004884 switch (T.getOS()) {
4885 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004886 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004887 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004888 break;
4889 case llvm::Triple::Win32:
4890 WCharType = UnsignedShort;
4891 break;
4892 case llvm::Triple::Linux:
4893 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004894 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4895 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004896 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004897 }
4898
4899 UseBitFieldTypeAlignment = true;
4900
4901 ZeroLengthBitfieldBoundary = 0;
4902
Tim Northover147cd2f2014-10-14 22:12:21 +00004903 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4904 // so set preferred for small types to 32.
4905 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004906 resetDataLayout(BigEndian
4907 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4908 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004909 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004910 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004911 resetDataLayout("e"
4912 "-m:w"
4913 "-p:32:32"
4914 "-i64:64"
4915 "-v128:64:128"
4916 "-a:0:32"
4917 "-n32"
4918 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004919 } else if (T.isOSNaCl()) {
4920 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004921 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004922 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004923 resetDataLayout(BigEndian
4924 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4925 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004926 }
4927
4928 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004929 }
4930
Tim Northover5627d392015-10-30 16:30:45 +00004931 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004932 const llvm::Triple &T = getTriple();
4933
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004934 IsAAPCS = false;
4935
Tim Northover5627d392015-10-30 16:30:45 +00004936 if (IsAAPCS16)
4937 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4938 else
4939 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004940
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004941 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004942 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004943 SizeType = UnsignedInt;
4944 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004945 SizeType = UnsignedLong;
4946
4947 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4948 WCharType = SignedInt;
4949
4950 // Do not respect the alignment of bit-field types when laying out
4951 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4952 UseBitFieldTypeAlignment = false;
4953
4954 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4955 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4956 /// gcc.
4957 ZeroLengthBitfieldBoundary = 32;
4958
Tim Northover5627d392015-10-30 16:30:45 +00004959 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4960 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004961 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004962 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004963 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004964 BigEndian
4965 ? "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 +00004966 : "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 +00004967 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004968 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004969 BigEndian
4970 ? "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 +00004971 : "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 +00004972
4973 // FIXME: Override "preferred align" for double and long long.
4974 }
4975
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004976 void setArchInfo() {
4977 StringRef ArchName = getTriple().getArchName();
4978
Renato Goline84b0002015-10-08 16:43:26 +00004979 ArchISA = llvm::ARM::parseArchISA(ArchName);
4980 CPU = llvm::ARM::getDefaultCPU(ArchName);
4981 unsigned AK = llvm::ARM::parseArch(ArchName);
4982 if (AK != llvm::ARM::AK_INVALID)
4983 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004984 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004985 }
4986
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004987 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004988 StringRef SubArch;
4989
4990 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004991 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004992 SubArch = llvm::ARM::getSubArch(ArchKind);
4993 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4994 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004995
4996 // cache CPU related strings
4997 CPUAttr = getCPUAttr();
4998 CPUProfile = getCPUProfile();
4999 }
5000
5001 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005002 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005003 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005004 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005005 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5006 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005007 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005008 if (ArchProfile == llvm::ARM::PK_M) {
5009 MaxAtomicPromoteWidth = 32;
5010 if (ShouldUseInlineAtomic)
5011 MaxAtomicInlineWidth = 32;
5012 }
5013 else {
5014 MaxAtomicPromoteWidth = 64;
5015 if (ShouldUseInlineAtomic)
5016 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005017 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005018 }
5019
5020 bool isThumb() const {
5021 return (ArchISA == llvm::ARM::IK_THUMB);
5022 }
5023
5024 bool supportsThumb() const {
5025 return CPUAttr.count('T') || ArchVersion >= 6;
5026 }
5027
5028 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005029 return CPUAttr.equals("6T2") ||
5030 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005031 }
5032
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005033 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005034 // For most sub-arches, the build attribute CPU name is enough.
5035 // For Cortex variants, it's slightly different.
5036 switch(ArchKind) {
5037 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005038 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005039 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005040 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005041 case llvm::ARM::AK_ARMV7S:
5042 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005043 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005044 return "7A";
5045 case llvm::ARM::AK_ARMV7R:
5046 return "7R";
5047 case llvm::ARM::AK_ARMV7M:
5048 return "7M";
5049 case llvm::ARM::AK_ARMV7EM:
5050 return "7EM";
5051 case llvm::ARM::AK_ARMV8A:
5052 return "8A";
5053 case llvm::ARM::AK_ARMV8_1A:
5054 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005055 case llvm::ARM::AK_ARMV8_2A:
5056 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005057 case llvm::ARM::AK_ARMV8MBaseline:
5058 return "8M_BASE";
5059 case llvm::ARM::AK_ARMV8MMainline:
5060 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005061 case llvm::ARM::AK_ARMV8R:
5062 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005063 }
5064 }
5065
5066 StringRef getCPUProfile() const {
5067 switch(ArchProfile) {
5068 case llvm::ARM::PK_A:
5069 return "A";
5070 case llvm::ARM::PK_R:
5071 return "R";
5072 case llvm::ARM::PK_M:
5073 return "M";
5074 default:
5075 return "";
5076 }
5077 }
5078
Chris Lattner17df24e2008-04-21 18:56:49 +00005079public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005080 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005081 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5082 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005083
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005084 switch (getTriple().getOS()) {
5085 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005086 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005087 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005088 break;
5089 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005090 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005091 break;
5092 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005093
Renato Goline84b0002015-10-08 16:43:26 +00005094 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005095 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005096
Chris Lattner1a8f3942010-04-23 16:29:58 +00005097 // {} in inline assembly are neon specifiers, not assembly variant
5098 // specifiers.
5099 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005100
Eric Christopher0e261882014-12-05 01:06:59 +00005101 // FIXME: This duplicates code from the driver that sets the -target-abi
5102 // option - this code is used if -target-abi isn't passed and should
5103 // be unified in some way.
5104 if (Triple.isOSBinFormatMachO()) {
5105 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5106 // the frontend matches that.
5107 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5108 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005109 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005110 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005111 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005112 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005113 } else {
5114 setABI("apcs-gnu");
5115 }
5116 } else if (Triple.isOSWindows()) {
5117 // FIXME: this is invalid for WindowsCE
5118 setABI("aapcs");
5119 } else {
5120 // Select the default based on the platform.
5121 switch (Triple.getEnvironment()) {
5122 case llvm::Triple::Android:
5123 case llvm::Triple::GNUEABI:
5124 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005125 case llvm::Triple::MuslEABI:
5126 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005127 setABI("aapcs-linux");
5128 break;
5129 case llvm::Triple::EABIHF:
5130 case llvm::Triple::EABI:
5131 setABI("aapcs");
5132 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005133 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005134 setABI("apcs-gnu");
5135 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005136 default:
5137 if (Triple.getOS() == llvm::Triple::NetBSD)
5138 setABI("apcs-gnu");
5139 else
5140 setABI("aapcs");
5141 break;
5142 }
5143 }
John McCall86353412010-08-21 22:46:04 +00005144
5145 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005146 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005147
Renato Golin15b86152015-07-03 16:41:13 +00005148 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005149 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005150
James Molloya7139222012-03-12 09:14:10 +00005151 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005152 // the alignment of the zero-length bitfield is greater than the member
5153 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005154 // zero length bitfield.
5155 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005156
5157 if (Triple.getOS() == llvm::Triple::Linux ||
5158 Triple.getOS() == llvm::Triple::UnknownOS)
5159 this->MCountName =
5160 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005161 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005162
Alp Toker4925ba72014-06-07 23:30:42 +00005163 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005164
Craig Topper3164f332014-03-11 03:39:26 +00005165 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005166 ABI = Name;
5167
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005168 // The defaults (above) are for AAPCS, check if we need to change them.
5169 //
5170 // FIXME: We need support for -meabi... we could just mangle it into the
5171 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005172 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005173 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005174 return true;
5175 }
5176 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5177 setABIAAPCS();
5178 return true;
5179 }
5180 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005181 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005182
Renato Golinf5c4dec2015-05-27 13:33:00 +00005183 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005184 bool
5185 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5186 StringRef CPU,
5187 const std::vector<std::string> &FeaturesVec) const override {
5188
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005189 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005190 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005191
5192 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005193 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005194 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5195
5196 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005197 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005198 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5199
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005200 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005201 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005202 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005203
Eric Christopher007b0a02015-08-28 22:32:01 +00005204 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005205 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005206
Craig Topper3164f332014-03-11 03:39:26 +00005207 bool handleTargetFeatures(std::vector<std::string> &Features,
5208 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005209 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005210 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005211 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005212 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005213 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005214 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005215 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005216
Ranjeet Singhac08e532015-06-24 23:39:25 +00005217 // This does not diagnose illegal cases like having both
5218 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5219 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005220 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005221 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005222 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005223 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005224 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005225 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005226 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005227 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005228 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005229 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005230 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005231 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005232 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005233 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005234 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005235 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005236 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005237 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005238 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005239 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005240 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005241 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005242 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005243 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005244 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005245 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005246 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005247 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005248 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005249 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005250 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005251 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 } else if (Feature == "+strict-align") {
5253 Unaligned = 0;
5254 } else if (Feature == "+fp16") {
5255 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005256 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005257 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005258 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005259
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 switch (ArchVersion) {
5261 case 6:
5262 if (ArchProfile == llvm::ARM::PK_M)
5263 LDREX = 0;
5264 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5265 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5266 else
5267 LDREX = LDREX_W;
5268 break;
5269 case 7:
5270 if (ArchProfile == llvm::ARM::PK_M)
5271 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5272 else
5273 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5274 break;
5275 case 8:
5276 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5277 }
5278
Rafael Espindolaeb265472013-08-21 21:59:03 +00005279 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5280 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5281 return false;
5282 }
5283
5284 if (FPMath == FP_Neon)
5285 Features.push_back("+neonfp");
5286 else if (FPMath == FP_VFP)
5287 Features.push_back("-neonfp");
5288
Daniel Dunbar893d4752009-12-19 04:15:38 +00005289 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005290 auto Feature =
5291 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5292 if (Feature != Features.end())
5293 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005294
Rafael Espindolaeb265472013-08-21 21:59:03 +00005295 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005296 }
5297
Craig Topper3164f332014-03-11 03:39:26 +00005298 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005299 return llvm::StringSwitch<bool>(Feature)
5300 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005301 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005302 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005303 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005304 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005305 .Case("hwdiv", HWDiv & HWDivThumb)
5306 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005307 .Default(false);
5308 }
Renato Golin15b86152015-07-03 16:41:13 +00005309
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005310 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005311 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005312 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005313
Renato Golin15b86152015-07-03 16:41:13 +00005314 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005315 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005316 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005317 CPU = Name;
5318 return true;
5319 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005320
Craig Topper3164f332014-03-11 03:39:26 +00005321 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005322
Craig Topper3164f332014-03-11 03:39:26 +00005323 void getTargetDefines(const LangOptions &Opts,
5324 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005325 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005326 Builder.defineMacro("__arm");
5327 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005328 // For bare-metal none-eabi.
5329 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5330 getTriple().getEnvironment() == llvm::Triple::EABI)
5331 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005332
Chris Lattnerecd49032009-03-02 22:27:17 +00005333 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005334 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005335
5336 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5337 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005338 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005339 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5340
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005341 if (!CPUAttr.empty())
5342 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005343
5344 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005345 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005346 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005347
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005348 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005349 // ACLE 6.5.7 Crypto Extension
5350 if (Crypto)
5351 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5352 // ACLE 6.5.8 CRC32 Extension
5353 if (CRC)
5354 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5355 // ACLE 6.5.10 Numeric Maximum and Minimum
5356 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5357 // ACLE 6.5.9 Directed Rounding
5358 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005359 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005360
5361 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5362 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005363 // NOTE that the default profile is assumed to be 'A'
5364 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005365 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5366
Bradley Smithf4affc12016-03-03 13:52:22 +00005367 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5368 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5369 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5370 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005371 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005372 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005373 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005374 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5375
5376 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5377 // instruction set such as ARM or Thumb.
5378 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5379
5380 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5381
5382 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005383 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005384 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005385
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005386 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005387 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005388 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005389
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005390 // ACLE 6.4.4 LDREX/STREX
5391 if (LDREX)
5392 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5393
5394 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005395 if (ArchVersion == 5 ||
5396 (ArchVersion == 6 && CPUProfile != "M") ||
5397 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005398 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5399
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005400 // ACLE 6.5.1 Hardware Floating Point
5401 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005402 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005403
Yi Konga44c4d72014-06-27 21:25:42 +00005404 // ACLE predefines.
5405 Builder.defineMacro("__ARM_ACLE", "200");
5406
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005407 // FP16 support (we currently only support IEEE format).
5408 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5409 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5410
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005411 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005412 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005413 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5414
Mike Stump9d54bd72009-04-08 02:07:04 +00005415 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005416
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005417 // FIXME: It's more complicated than this and we don't really support
5418 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005419 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005420 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005421 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005422
David Tweed8f676532012-10-25 13:33:01 +00005423 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005424 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005425 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005426 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005427 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005428 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005429 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005430
Tim Northover28fc0e12016-04-28 13:59:55 +00005431 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5432 ABI == "aapcs16")
5433 Builder.defineMacro("__ARM_PCS_VFP", "1");
5434
Daniel Dunbar893d4752009-12-19 04:15:38 +00005435 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005436 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005437
Zijiao Ma56a83722016-08-17 02:13:33 +00005438 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005439 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005440
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005441 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005442 Builder.defineMacro("__THUMBEL__");
5443 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005444 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005445 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005446 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005447
5448 // ACLE 6.4.9 32-bit SIMD instructions
5449 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5450 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5451
5452 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005453 if (((HWDiv & HWDivThumb) && isThumb()) ||
5454 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005455 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005456 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005457 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005458
5459 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005460 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005461
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005462 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005463 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005464 if (FPU & VFP2FPU)
5465 Builder.defineMacro("__ARM_VFPV2__");
5466 if (FPU & VFP3FPU)
5467 Builder.defineMacro("__ARM_VFPV3__");
5468 if (FPU & VFP4FPU)
5469 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005470 if (FPU & FPARMV8)
5471 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005472 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005473
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005474 // This only gets set when Neon instructions are actually available, unlike
5475 // the VFP define, hence the soft float and arch check. This is subtly
5476 // different from gcc, we follow the intent which was that it should be set
5477 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005478 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005479 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005480 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005481 // current AArch32 NEON implementations do not support double-precision
5482 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005483 Builder.defineMacro("__ARM_NEON_FP",
5484 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005485 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005486
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005487 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5488 Opts.ShortWChar ? "2" : "4");
5489
5490 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5491 Opts.ShortEnums ? "1" : "4");
5492
Bradley Smithf4affc12016-03-03 13:52:22 +00005493 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005494 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5495 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5496 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5497 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5498 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005499
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005500 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005501 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005502 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005503 }
5504
5505 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005506 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005507 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5508 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005509 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005510 }
5511
5512 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005513 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005514 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005515
5516 if (Opts.UnsafeFPMath)
5517 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005518
5519 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5520 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005521 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005522
Craig Topper6c03a542015-10-19 04:51:35 +00005523 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5524 return llvm::makeArrayRef(BuiltinInfo,
5525 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005526 }
Craig Topper3164f332014-03-11 03:39:26 +00005527 bool isCLZForZeroUndef() const override { return false; }
5528 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005529 return IsAAPCS
5530 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005531 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5532 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005533 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005534 ArrayRef<const char *> getGCCRegNames() const override;
5535 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005536 bool validateAsmConstraint(const char *&Name,
5537 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005538 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005539 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005540 case 'l': // r0-r7
5541 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005542 case 't': // VFP Floating point register single precision
5543 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005544 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005545 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005546 case 'I':
5547 case 'J':
5548 case 'K':
5549 case 'L':
5550 case 'M':
5551 // FIXME
5552 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005553 case 'Q': // A memory address that is a single base register.
5554 Info.setAllowsMemory();
5555 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005556 case 'U': // a memory reference...
5557 switch (Name[1]) {
5558 case 'q': // ...ARMV4 ldrsb
5559 case 'v': // ...VFP load/store (reg+constant offset)
5560 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005561 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005562 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005563 case 'n': // valid address for Neon doubleword vector load/store
5564 case 'm': // valid address for Neon element and structure load/store
5565 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005566 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005567 Info.setAllowsMemory();
5568 Name++;
5569 return true;
5570 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005571 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005572 return false;
5573 }
Craig Topper3164f332014-03-11 03:39:26 +00005574 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005575 std::string R;
5576 switch (*Constraint) {
5577 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005578 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005579 Constraint++;
5580 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005581 case 'p': // 'p' should be translated to 'r' by default.
5582 R = std::string("r");
5583 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005584 default:
5585 return std::string(1, *Constraint);
5586 }
5587 return R;
5588 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005589 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005590 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005591 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005592 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005593 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005594
Bill Wendling9d1ee112012-10-25 23:28:48 +00005595 // Strip off constraint modifiers.
5596 while (Constraint[0] == '=' ||
5597 Constraint[0] == '+' ||
5598 Constraint[0] == '&')
5599 Constraint = Constraint.substr(1);
5600
5601 switch (Constraint[0]) {
5602 default: break;
5603 case 'r': {
5604 switch (Modifier) {
5605 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005606 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005607 case 'q':
5608 // A register of size 32 cannot fit a vector type.
5609 return false;
5610 }
5611 }
5612 }
5613
5614 return true;
5615 }
Craig Topper3164f332014-03-11 03:39:26 +00005616 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005617 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005618 return "";
5619 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005620
Craig Topper3164f332014-03-11 03:39:26 +00005621 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005622 switch (CC) {
5623 case CC_AAPCS:
5624 case CC_AAPCS_VFP:
5625 case CC_Swift:
5626 return CCCR_OK;
5627 default:
5628 return CCCR_Warning;
5629 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005630 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005631
Craig Topper3164f332014-03-11 03:39:26 +00005632 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005633 if (RegNo == 0) return 0;
5634 if (RegNo == 1) return 1;
5635 return -1;
5636 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005637
5638 bool hasSjLjLowering() const override {
5639 return true;
5640 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005641};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005642
Rafael Espindolaeb265472013-08-21 21:59:03 +00005643bool ARMTargetInfo::setFPMath(StringRef Name) {
5644 if (Name == "neon") {
5645 FPMath = FP_Neon;
5646 return true;
5647 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5648 Name == "vfp4") {
5649 FPMath = FP_VFP;
5650 return true;
5651 }
5652 return false;
5653}
5654
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005655const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005656 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005657 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005658 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5659
5660 // Float registers
5661 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5662 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5663 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005664 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005665
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005666 // Double registers
5667 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5668 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005669 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5670 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005671
5672 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005673 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5674 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005675};
5676
Craig Topperf054e3a2015-10-19 03:52:27 +00005677ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5678 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005679}
5680
5681const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005682 { { "a1" }, "r0" },
5683 { { "a2" }, "r1" },
5684 { { "a3" }, "r2" },
5685 { { "a4" }, "r3" },
5686 { { "v1" }, "r4" },
5687 { { "v2" }, "r5" },
5688 { { "v3" }, "r6" },
5689 { { "v4" }, "r7" },
5690 { { "v5" }, "r8" },
5691 { { "v6", "rfp" }, "r9" },
5692 { { "sl" }, "r10" },
5693 { { "fp" }, "r11" },
5694 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005695 { { "r13" }, "sp" },
5696 { { "r14" }, "lr" },
5697 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005698 // The S, D and Q registers overlap, but aren't really aliases; we
5699 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005700};
5701
Craig Topperf054e3a2015-10-19 03:52:27 +00005702ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5703 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005704}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005705
5706const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005707#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005708 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005709#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5710 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005711#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005712
Craig Topper07d3b622015-08-07 05:14:44 +00005713#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005714 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005715#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005716 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005717#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5718 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005719#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5720 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005721#include "clang/Basic/BuiltinsARM.def"
5722};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005723
5724class ARMleTargetInfo : public ARMTargetInfo {
5725public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005726 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005727 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005728 void getTargetDefines(const LangOptions &Opts,
5729 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005730 Builder.defineMacro("__ARMEL__");
5731 ARMTargetInfo::getTargetDefines(Opts, Builder);
5732 }
5733};
5734
5735class ARMbeTargetInfo : public ARMTargetInfo {
5736public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005737 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005738 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005739 void getTargetDefines(const LangOptions &Opts,
5740 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005741 Builder.defineMacro("__ARMEB__");
5742 Builder.defineMacro("__ARM_BIG_ENDIAN");
5743 ARMTargetInfo::getTargetDefines(Opts, Builder);
5744 }
5745};
Chris Lattner17df24e2008-04-21 18:56:49 +00005746
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005747class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5748 const llvm::Triple Triple;
5749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005750 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5751 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005752 WCharType = UnsignedShort;
5753 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005754 }
5755 void getVisualStudioDefines(const LangOptions &Opts,
5756 MacroBuilder &Builder) const {
5757 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5758
5759 // FIXME: this is invalid for WindowsCE
5760 Builder.defineMacro("_M_ARM_NT", "1");
5761 Builder.defineMacro("_M_ARMT", "_M_ARM");
5762 Builder.defineMacro("_M_THUMB", "_M_ARM");
5763
5764 assert((Triple.getArch() == llvm::Triple::arm ||
5765 Triple.getArch() == llvm::Triple::thumb) &&
5766 "invalid architecture for Windows ARM target info");
5767 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5768 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5769
5770 // TODO map the complete set of values
5771 // 31: VFPv3 40: VFPv4
5772 Builder.defineMacro("_M_ARM_FP", "31");
5773 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005774 BuiltinVaListKind getBuiltinVaListKind() const override {
5775 return TargetInfo::CharPtrBuiltinVaList;
5776 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005777 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5778 switch (CC) {
5779 case CC_X86StdCall:
5780 case CC_X86ThisCall:
5781 case CC_X86FastCall:
5782 case CC_X86VectorCall:
5783 return CCCR_Ignore;
5784 case CC_C:
5785 return CCCR_OK;
5786 default:
5787 return CCCR_Warning;
5788 }
5789 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005790};
5791
5792// Windows ARM + Itanium C++ ABI Target
5793class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005795 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5796 const TargetOptions &Opts)
5797 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005798 TheCXXABI.set(TargetCXXABI::GenericARM);
5799 }
5800
5801 void getTargetDefines(const LangOptions &Opts,
5802 MacroBuilder &Builder) const override {
5803 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5804
5805 if (Opts.MSVCCompat)
5806 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5807 }
5808};
5809
5810// Windows ARM, MS (C++) ABI
5811class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5812public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005813 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5814 const TargetOptions &Opts)
5815 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005816 TheCXXABI.set(TargetCXXABI::Microsoft);
5817 }
5818
5819 void getTargetDefines(const LangOptions &Opts,
5820 MacroBuilder &Builder) const override {
5821 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5822 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5823 }
5824};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005825
Yaron Keren321249c2015-07-15 13:32:23 +00005826// ARM MinGW target
5827class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5828public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005829 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5830 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005831 TheCXXABI.set(TargetCXXABI::GenericARM);
5832 }
5833
5834 void getTargetDefines(const LangOptions &Opts,
5835 MacroBuilder &Builder) const override {
5836 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5837 DefineStd(Builder, "WIN32", Opts);
5838 DefineStd(Builder, "WINNT", Opts);
5839 Builder.defineMacro("_ARM_");
5840 addMinGWDefines(Opts, Builder);
5841 }
5842};
5843
5844// ARM Cygwin target
5845class CygwinARMTargetInfo : public ARMleTargetInfo {
5846public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005847 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5848 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005849 TLSSupported = false;
5850 WCharType = UnsignedShort;
5851 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005852 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005853 }
5854 void getTargetDefines(const LangOptions &Opts,
5855 MacroBuilder &Builder) const override {
5856 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5857 Builder.defineMacro("_ARM_");
5858 Builder.defineMacro("__CYGWIN__");
5859 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005860 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005861 if (Opts.CPlusPlus)
5862 Builder.defineMacro("_GNU_SOURCE");
5863 }
5864};
5865
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005866class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005867protected:
Craig Topper3164f332014-03-11 03:39:26 +00005868 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5869 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005870 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005871 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005872
Torok Edwinb2b37c62009-06-30 17:10:35 +00005873public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005874 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5875 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005876 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005877 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005878 // FIXME: This should be based off of the target features in
5879 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005880 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005881
Tim Northoverd88ecb32016-01-27 19:32:40 +00005882 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005883 // Darwin on iOS uses a variant of the ARM C++ ABI.
5884 TheCXXABI.set(TargetCXXABI::WatchOS);
5885
5886 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5887 // size_t is long, it's a bit weird for it to be int.
5888 PtrDiffType = SignedLong;
5889
5890 // BOOL should be a real boolean on the new ABI
5891 UseSignedCharForObjCBool = false;
5892 } else
5893 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005894 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005895};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005896
Tim Northover573cbee2014-05-24 12:52:07 +00005897class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005898 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005899 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5900 static const char *const GCCRegNames[];
5901
James Molloy75f5f9e2014-04-16 15:33:48 +00005902 enum FPUModeEnum {
5903 FPUMode,
5904 NeonMode
5905 };
5906
5907 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005908 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005909 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005910 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005911 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005912
Tim Northovera2ee4332014-03-29 15:09:45 +00005913 static const Builtin::Info BuiltinInfo[];
5914
5915 std::string ABI;
5916
5917public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005918 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005919 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005920 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5921 WCharType = SignedInt;
5922
5923 // NetBSD apparently prefers consistency across ARM targets to consistency
5924 // across 64-bit targets.
5925 Int64Type = SignedLongLong;
5926 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005927 } else {
5928 WCharType = UnsignedInt;
5929 Int64Type = SignedLong;
5930 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005931 }
5932
Tim Northovera2ee4332014-03-29 15:09:45 +00005933 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005934 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005935 MaxAtomicInlineWidth = 128;
5936 MaxAtomicPromoteWidth = 128;
5937
Tim Northovera6a19f12015-02-06 01:25:07 +00005938 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005939 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005940
Tim Northovera2ee4332014-03-29 15:09:45 +00005941 // {} in inline assembly are neon specifiers, not assembly variant
5942 // specifiers.
5943 NoAsmVariants = true;
5944
Tim Northover7ad87af2015-01-16 18:44:04 +00005945 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5946 // contributes to the alignment of the containing aggregate in the same way
5947 // a plain (non bit-field) member of that type would, without exception for
5948 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005949 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005950 UseZeroLengthBitfieldAlignment = true;
5951
Tim Northover573cbee2014-05-24 12:52:07 +00005952 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005953 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005954
5955 if (Triple.getOS() == llvm::Triple::Linux ||
5956 Triple.getOS() == llvm::Triple::UnknownOS)
5957 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005958 }
5959
Alp Toker4925ba72014-06-07 23:30:42 +00005960 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005961 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005962 if (Name != "aapcs" && Name != "darwinpcs")
5963 return false;
5964
5965 ABI = Name;
5966 return true;
5967 }
5968
David Blaikie1cbb9712014-11-14 19:09:44 +00005969 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005970 return Name == "generic" ||
5971 llvm::AArch64::parseCPUArch(Name) !=
5972 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005973 }
5974
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005975 void getTargetDefines(const LangOptions &Opts,
5976 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005977 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005978 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005979
5980 // Target properties.
5981 Builder.defineMacro("_LP64");
5982 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005983
5984 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5985 Builder.defineMacro("__ARM_ACLE", "200");
5986 Builder.defineMacro("__ARM_ARCH", "8");
5987 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5988
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005989 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005990 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005991 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005992
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005993 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5994 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5995 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5996 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005997 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005998 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5999 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006000
6001 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6002
6003 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006004 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006005
6006 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6007 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006008 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6009 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006010
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006011 if (Opts.UnsafeFPMath)
6012 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006013
6014 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6015
6016 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6017 Opts.ShortEnums ? "1" : "4");
6018
James Molloy75f5f9e2014-04-16 15:33:48 +00006019 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006020 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006021 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006022 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006023 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006024
Bradley Smith418c5932014-05-02 15:17:51 +00006025 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006026 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006027
James Molloy75f5f9e2014-04-16 15:33:48 +00006028 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006029 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6030
6031 if (Unaligned)
6032 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006033
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006034 if (V8_1A)
6035 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6036
Reid Klecknerd167d422015-05-06 15:31:46 +00006037 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6038 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6039 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6040 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6041 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006042 }
6043
Craig Topper6c03a542015-10-19 04:51:35 +00006044 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6045 return llvm::makeArrayRef(BuiltinInfo,
6046 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006047 }
6048
David Blaikie1cbb9712014-11-14 19:09:44 +00006049 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006050 return Feature == "aarch64" ||
6051 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006052 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006053 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006054 }
6055
James Molloy5e73df52014-04-16 15:06:20 +00006056 bool handleTargetFeatures(std::vector<std::string> &Features,
6057 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006058 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006059 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006060 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006061 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006062 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006063
Eric Christopher610fe112015-08-26 08:21:55 +00006064 for (const auto &Feature : Features) {
6065 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006066 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006067 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006068 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006069 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006070 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006071 if (Feature == "+strict-align")
6072 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006073 if (Feature == "+v8.1a")
6074 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006075 }
6076
James Y Knightb214cbc2016-03-04 19:00:41 +00006077 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006078
6079 return true;
6080 }
6081
John McCall477f2bb2016-03-03 06:39:32 +00006082 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6083 switch (CC) {
6084 case CC_C:
6085 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006086 case CC_PreserveMost:
6087 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006088 return CCCR_OK;
6089 default:
6090 return CCCR_Warning;
6091 }
6092 }
6093
David Blaikie1cbb9712014-11-14 19:09:44 +00006094 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006095
David Blaikie1cbb9712014-11-14 19:09:44 +00006096 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006097 return TargetInfo::AArch64ABIBuiltinVaList;
6098 }
6099
Craig Topperf054e3a2015-10-19 03:52:27 +00006100 ArrayRef<const char *> getGCCRegNames() const override;
6101 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006102
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006103 bool validateAsmConstraint(const char *&Name,
6104 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006105 switch (*Name) {
6106 default:
6107 return false;
6108 case 'w': // Floating point and SIMD registers (V0-V31)
6109 Info.setAllowsRegister();
6110 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006111 case 'I': // Constant that can be used with an ADD instruction
6112 case 'J': // Constant that can be used with a SUB instruction
6113 case 'K': // Constant that can be used with a 32-bit logical instruction
6114 case 'L': // Constant that can be used with a 64-bit logical instruction
6115 case 'M': // Constant that can be used as a 32-bit MOV immediate
6116 case 'N': // Constant that can be used as a 64-bit MOV immediate
6117 case 'Y': // Floating point constant zero
6118 case 'Z': // Integer constant zero
6119 return true;
6120 case 'Q': // A memory reference with base register and no offset
6121 Info.setAllowsMemory();
6122 return true;
6123 case 'S': // A symbolic address
6124 Info.setAllowsRegister();
6125 return true;
6126 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006127 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6128 // Utf: A memory address suitable for ldp/stp in TF mode.
6129 // Usa: An absolute symbolic address.
6130 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6131 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006132 case 'z': // Zero register, wzr or xzr
6133 Info.setAllowsRegister();
6134 return true;
6135 case 'x': // Floating point and SIMD registers (V0-V15)
6136 Info.setAllowsRegister();
6137 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006138 }
6139 return false;
6140 }
6141
Akira Hatanaka987f1862014-08-22 06:05:21 +00006142 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006143 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006144 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006145 // Strip off constraint modifiers.
6146 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6147 Constraint = Constraint.substr(1);
6148
6149 switch (Constraint[0]) {
6150 default:
6151 return true;
6152 case 'z':
6153 case 'r': {
6154 switch (Modifier) {
6155 case 'x':
6156 case 'w':
6157 // For now assume that the person knows what they're
6158 // doing with the modifier.
6159 return true;
6160 default:
6161 // By default an 'r' constraint will be in the 'x'
6162 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006163 if (Size == 64)
6164 return true;
6165
6166 SuggestedModifier = "w";
6167 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006168 }
6169 }
6170 }
6171 }
6172
David Blaikie1cbb9712014-11-14 19:09:44 +00006173 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006174
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006175 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006176 if (RegNo == 0)
6177 return 0;
6178 if (RegNo == 1)
6179 return 1;
6180 return -1;
6181 }
6182};
6183
Tim Northover573cbee2014-05-24 12:52:07 +00006184const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006185 // 32-bit Integer registers
6186 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6187 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6188 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6189
6190 // 64-bit Integer registers
6191 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6192 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6193 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6194
6195 // 32-bit floating point regsisters
6196 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6197 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6198 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6199
6200 // 64-bit floating point regsisters
6201 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6202 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6203 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6204
6205 // Vector registers
6206 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6207 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6208 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6209};
6210
Craig Topperf054e3a2015-10-19 03:52:27 +00006211ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6212 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006213}
6214
Tim Northover573cbee2014-05-24 12:52:07 +00006215const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006216 { { "w31" }, "wsp" },
6217 { { "x29" }, "fp" },
6218 { { "x30" }, "lr" },
6219 { { "x31" }, "sp" },
6220 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6221 // don't want to substitute one of these for a different-sized one.
6222};
6223
Craig Topperf054e3a2015-10-19 03:52:27 +00006224ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6225 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006226}
6227
Tim Northover573cbee2014-05-24 12:52:07 +00006228const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006229#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006230 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006231#include "clang/Basic/BuiltinsNEON.def"
6232
6233#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006234 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006235#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006236};
James Molloy5e73df52014-04-16 15:06:20 +00006237
Tim Northover573cbee2014-05-24 12:52:07 +00006238class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006239 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006240 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006241 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006242 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006243 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006244 }
6245
6246public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006247 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6248 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006249 }
James Molloy5e73df52014-04-16 15:06:20 +00006250 void getTargetDefines(const LangOptions &Opts,
6251 MacroBuilder &Builder) const override {
6252 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006253 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006254 }
6255};
6256
Tim Northover573cbee2014-05-24 12:52:07 +00006257class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006258 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006259 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006260 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006261 }
6262
6263public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006264 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6265 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006266 void getTargetDefines(const LangOptions &Opts,
6267 MacroBuilder &Builder) const override {
6268 Builder.defineMacro("__AARCH64EB__");
6269 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6270 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006271 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006272 }
6273};
Tim Northovera2ee4332014-03-29 15:09:45 +00006274
Tim Northover573cbee2014-05-24 12:52:07 +00006275class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006276protected:
6277 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6278 MacroBuilder &Builder) const override {
6279 Builder.defineMacro("__AARCH64_SIMD__");
6280 Builder.defineMacro("__ARM64_ARCH_8__");
6281 Builder.defineMacro("__ARM_NEON__");
6282 Builder.defineMacro("__LITTLE_ENDIAN__");
6283 Builder.defineMacro("__REGISTER_PREFIX__", "");
6284 Builder.defineMacro("__arm64", "1");
6285 Builder.defineMacro("__arm64__", "1");
6286
6287 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6288 }
6289
Tim Northovera2ee4332014-03-29 15:09:45 +00006290public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006291 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6292 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006293 Int64Type = SignedLongLong;
6294 WCharType = SignedInt;
6295 UseSignedCharForObjCBool = false;
6296
Tim Northovera6a19f12015-02-06 01:25:07 +00006297 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006298 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006299
6300 TheCXXABI.set(TargetCXXABI::iOS64);
6301 }
6302
David Blaikie1cbb9712014-11-14 19:09:44 +00006303 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006304 return TargetInfo::CharPtrBuiltinVaList;
6305 }
6306};
Tim Northovera2ee4332014-03-29 15:09:45 +00006307
Tony Linthicum76329bf2011-12-12 21:14:55 +00006308// Hexagon abstract base class
6309class HexagonTargetInfo : public TargetInfo {
6310 static const Builtin::Info BuiltinInfo[];
6311 static const char * const GCCRegNames[];
6312 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6313 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006314 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006315 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006316
Tony Linthicum76329bf2011-12-12 21:14:55 +00006317public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006318 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6319 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006320 // Specify the vector alignment explicitly. For v512x1, the calculated
6321 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6322 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006323 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006324 "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 +00006325 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006326 SizeType = UnsignedInt;
6327 PtrDiffType = SignedInt;
6328 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329
6330 // {} in inline assembly are packet specifiers, not assembly variant
6331 // specifiers.
6332 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006333
6334 LargeArrayMinWidth = 64;
6335 LargeArrayAlign = 64;
6336 UseBitFieldTypeAlignment = true;
6337 ZeroLengthBitfieldBoundary = 32;
6338 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006339 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006340 }
6341
Craig Topper6c03a542015-10-19 04:51:35 +00006342 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6343 return llvm::makeArrayRef(BuiltinInfo,
6344 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006345 }
6346
Craig Topper3164f332014-03-11 03:39:26 +00006347 bool validateAsmConstraint(const char *&Name,
6348 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006349 switch (*Name) {
6350 case 'v':
6351 case 'q':
6352 if (HasHVX) {
6353 Info.setAllowsRegister();
6354 return true;
6355 }
6356 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006357 case 's':
6358 // Relocatable constant.
6359 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006360 }
6361 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006362 }
6363
Craig Topper3164f332014-03-11 03:39:26 +00006364 void getTargetDefines(const LangOptions &Opts,
6365 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006366
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006367 bool isCLZForZeroUndef() const override { return false; }
6368
Craig Topper3164f332014-03-11 03:39:26 +00006369 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006370 return llvm::StringSwitch<bool>(Feature)
6371 .Case("hexagon", true)
6372 .Case("hvx", HasHVX)
6373 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006374 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006375 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006376 }
Craig Topper3164f332014-03-11 03:39:26 +00006377
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006378 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6379 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6380 const override;
6381
6382 bool handleTargetFeatures(std::vector<std::string> &Features,
6383 DiagnosticsEngine &Diags) override;
6384
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006385 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6386 bool Enabled) const override;
6387
Craig Topper3164f332014-03-11 03:39:26 +00006388 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006389 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006390 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006391 ArrayRef<const char *> getGCCRegNames() const override;
6392 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006393 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006394 return "";
6395 }
Sebastian Pop86500282012-01-13 20:37:10 +00006396
6397 static const char *getHexagonCPUSuffix(StringRef Name) {
6398 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006399 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006400 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006401 .Case("hexagonv55", "55")
6402 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006403 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006404 }
6405
Craig Topper3164f332014-03-11 03:39:26 +00006406 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006407 if (!getHexagonCPUSuffix(Name))
6408 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006409 CPU = Name;
6410 return true;
6411 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412
6413 int getEHDataRegisterNumber(unsigned RegNo) const override {
6414 return RegNo < 2 ? RegNo : -1;
6415 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006416};
6417
6418void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006419 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006420 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006421 Builder.defineMacro("__hexagon__", "1");
6422
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006423 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006424 Builder.defineMacro("__HEXAGON_V4__");
6425 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006426 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006427 Builder.defineMacro("__QDSP6_V4__");
6428 Builder.defineMacro("__QDSP6_ARCH__", "4");
6429 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006430 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006431 Builder.defineMacro("__HEXAGON_V5__");
6432 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6433 if(Opts.HexagonQdsp6Compat) {
6434 Builder.defineMacro("__QDSP6_V5__");
6435 Builder.defineMacro("__QDSP6_ARCH__", "5");
6436 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006437 } else if (CPU == "hexagonv55") {
6438 Builder.defineMacro("__HEXAGON_V55__");
6439 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6440 Builder.defineMacro("__QDSP6_V55__");
6441 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006442 } else if (CPU == "hexagonv60") {
6443 Builder.defineMacro("__HEXAGON_V60__");
6444 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6445 Builder.defineMacro("__QDSP6_V60__");
6446 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006447 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006448
6449 if (hasFeature("hvx")) {
6450 Builder.defineMacro("__HVX__");
6451 if (hasFeature("hvx-double"))
6452 Builder.defineMacro("__HVXDBL__");
6453 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454}
6455
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006456bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6457 DiagnosticsEngine &Diags, StringRef CPU,
6458 const std::vector<std::string> &FeaturesVec) const {
6459 // Default for v60: -hvx, -hvx-double.
6460 Features["hvx"] = false;
6461 Features["hvx-double"] = false;
6462 Features["long-calls"] = false;
6463
6464 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6465}
6466
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006467bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6468 DiagnosticsEngine &Diags) {
6469 for (auto &F : Features) {
6470 if (F == "+hvx")
6471 HasHVX = true;
6472 else if (F == "-hvx")
6473 HasHVX = HasHVXDouble = false;
6474 else if (F == "+hvx-double")
6475 HasHVX = HasHVXDouble = true;
6476 else if (F == "-hvx-double")
6477 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006478
6479 if (F == "+long-calls")
6480 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006481 else if (F == "-long-calls")
6482 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006483 }
6484 return true;
6485}
6486
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006487void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6488 StringRef Name, bool Enabled) const {
6489 if (Enabled) {
6490 if (Name == "hvx-double")
6491 Features["hvx"] = true;
6492 } else {
6493 if (Name == "hvx")
6494 Features["hvx-double"] = false;
6495 }
6496 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006497}
6498
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006499const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006500 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6501 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6502 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6503 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6504 "p0", "p1", "p2", "p3",
6505 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6506};
6507
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006508ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006509 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006510}
6511
Tony Linthicum76329bf2011-12-12 21:14:55 +00006512const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6513 { { "sp" }, "r29" },
6514 { { "fp" }, "r30" },
6515 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006517
Craig Topperf054e3a2015-10-19 03:52:27 +00006518ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6519 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006520}
6521
6522
6523const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006524#define BUILTIN(ID, TYPE, ATTRS) \
6525 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6526#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6527 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006528#include "clang/Basic/BuiltinsHexagon.def"
6529};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006530
Jacques Pienaard964cc22016-03-28 21:02:54 +00006531class LanaiTargetInfo : public TargetInfo {
6532 // Class for Lanai (32-bit).
6533 // The CPU profiles supported by the Lanai backend
6534 enum CPUKind {
6535 CK_NONE,
6536 CK_V11,
6537 } CPU;
6538
6539 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6540 static const char *const GCCRegNames[];
6541
6542public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006543 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6544 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006545 // Description string has to be kept in sync with backend.
6546 resetDataLayout("E" // Big endian
6547 "-m:e" // ELF name manging
6548 "-p:32:32" // 32 bit pointers, 32 bit aligned
6549 "-i64:64" // 64 bit integers, 64 bit aligned
6550 "-a:0:32" // 32 bit alignment of objects of aggregate type
6551 "-n32" // 32 bit native integer width
6552 "-S64" // 64 bit natural stack alignment
6553 );
6554
6555 // Setting RegParmMax equal to what mregparm was set to in the old
6556 // toolchain
6557 RegParmMax = 4;
6558
6559 // Set the default CPU to V11
6560 CPU = CK_V11;
6561
6562 // Temporary approach to make everything at least word-aligned and allow for
6563 // safely casting between pointers with different alignment requirements.
6564 // TODO: Remove this when there are no more cast align warnings on the
6565 // firmware.
6566 MinGlobalAlign = 32;
6567 }
6568
6569 void getTargetDefines(const LangOptions &Opts,
6570 MacroBuilder &Builder) const override {
6571 // Define __lanai__ when building for target lanai.
6572 Builder.defineMacro("__lanai__");
6573
6574 // Set define for the CPU specified.
6575 switch (CPU) {
6576 case CK_V11:
6577 Builder.defineMacro("__LANAI_V11__");
6578 break;
6579 case CK_NONE:
6580 llvm_unreachable("Unhandled target CPU");
6581 }
6582 }
6583
6584 bool setCPU(const std::string &Name) override {
6585 CPU = llvm::StringSwitch<CPUKind>(Name)
6586 .Case("v11", CK_V11)
6587 .Default(CK_NONE);
6588
6589 return CPU != CK_NONE;
6590 }
6591
6592 bool hasFeature(StringRef Feature) const override {
6593 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6594 }
6595
6596 ArrayRef<const char *> getGCCRegNames() const override;
6597
6598 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6599
6600 BuiltinVaListKind getBuiltinVaListKind() const override {
6601 return TargetInfo::VoidPtrBuiltinVaList;
6602 }
6603
6604 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6605
6606 bool validateAsmConstraint(const char *&Name,
6607 TargetInfo::ConstraintInfo &info) const override {
6608 return false;
6609 }
6610
6611 const char *getClobbers() const override { return ""; }
6612};
6613
6614const char *const LanaiTargetInfo::GCCRegNames[] = {
6615 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6616 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6617 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6618
6619ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6620 return llvm::makeArrayRef(GCCRegNames);
6621}
6622
6623const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6624 {{"pc"}, "r2"},
6625 {{"sp"}, "r4"},
6626 {{"fp"}, "r5"},
6627 {{"rv"}, "r8"},
6628 {{"rr1"}, "r10"},
6629 {{"rr2"}, "r11"},
6630 {{"rca"}, "r15"},
6631};
6632
6633ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6634 return llvm::makeArrayRef(GCCRegAliases);
6635}
6636
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006637// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6638class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006639 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6640 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006641 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006642public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006643 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006644 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006645
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006646 int getEHDataRegisterNumber(unsigned RegNo) const override {
6647 if (RegNo == 0) return 24;
6648 if (RegNo == 1) return 25;
6649 return -1;
6650 }
6651
Craig Topper3164f332014-03-11 03:39:26 +00006652 bool handleTargetFeatures(std::vector<std::string> &Features,
6653 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006654 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006655 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6656 if (Feature != Features.end()) {
6657 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006658 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006659 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006660 }
Craig Topper3164f332014-03-11 03:39:26 +00006661 void getTargetDefines(const LangOptions &Opts,
6662 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006663 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006664 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006665
6666 if (SoftFloat)
6667 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006668 }
Craig Topper3164f332014-03-11 03:39:26 +00006669
6670 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006671 return llvm::StringSwitch<bool>(Feature)
6672 .Case("softfloat", SoftFloat)
6673 .Case("sparc", true)
6674 .Default(false);
6675 }
Craig Topper3164f332014-03-11 03:39:26 +00006676
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006677 bool hasSjLjLowering() const override {
6678 return true;
6679 }
6680
Craig Topper6c03a542015-10-19 04:51:35 +00006681 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006682 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006683 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006684 }
Craig Topper3164f332014-03-11 03:39:26 +00006685 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006686 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006687 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006688 ArrayRef<const char *> getGCCRegNames() const override;
6689 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006690 bool validateAsmConstraint(const char *&Name,
6691 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006692 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006693 switch (*Name) {
6694 case 'I': // Signed 13-bit constant
6695 case 'J': // Zero
6696 case 'K': // 32-bit constant with the low 12 bits clear
6697 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6698 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6699 case 'N': // Same as 'K' but zext (required for SIMode)
6700 case 'O': // The constant 4096
6701 return true;
6702 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006703 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006704 }
Craig Topper3164f332014-03-11 03:39:26 +00006705 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006706 // FIXME: Implement!
6707 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006708 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006709
6710 // No Sparc V7 for now, the backend doesn't support it anyway.
6711 enum CPUKind {
6712 CK_GENERIC,
6713 CK_V8,
6714 CK_SUPERSPARC,
6715 CK_SPARCLITE,
6716 CK_F934,
6717 CK_HYPERSPARC,
6718 CK_SPARCLITE86X,
6719 CK_SPARCLET,
6720 CK_TSC701,
6721 CK_V9,
6722 CK_ULTRASPARC,
6723 CK_ULTRASPARC3,
6724 CK_NIAGARA,
6725 CK_NIAGARA2,
6726 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006727 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006728 CK_MYRIAD2100,
6729 CK_MYRIAD2150,
6730 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006731 CK_LEON2,
6732 CK_LEON2_AT697E,
6733 CK_LEON2_AT697F,
6734 CK_LEON3,
6735 CK_LEON3_UT699,
6736 CK_LEON3_GR712RC,
6737 CK_LEON4,
6738 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006739 } CPU = CK_GENERIC;
6740
6741 enum CPUGeneration {
6742 CG_V8,
6743 CG_V9,
6744 };
6745
6746 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6747 switch (Kind) {
6748 case CK_GENERIC:
6749 case CK_V8:
6750 case CK_SUPERSPARC:
6751 case CK_SPARCLITE:
6752 case CK_F934:
6753 case CK_HYPERSPARC:
6754 case CK_SPARCLITE86X:
6755 case CK_SPARCLET:
6756 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006757 case CK_MYRIAD2100:
6758 case CK_MYRIAD2150:
6759 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006760 case CK_LEON2:
6761 case CK_LEON2_AT697E:
6762 case CK_LEON2_AT697F:
6763 case CK_LEON3:
6764 case CK_LEON3_UT699:
6765 case CK_LEON3_GR712RC:
6766 case CK_LEON4:
6767 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006768 return CG_V8;
6769 case CK_V9:
6770 case CK_ULTRASPARC:
6771 case CK_ULTRASPARC3:
6772 case CK_NIAGARA:
6773 case CK_NIAGARA2:
6774 case CK_NIAGARA3:
6775 case CK_NIAGARA4:
6776 return CG_V9;
6777 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006778 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006779 }
6780
6781 CPUKind getCPUKind(StringRef Name) const {
6782 return llvm::StringSwitch<CPUKind>(Name)
6783 .Case("v8", CK_V8)
6784 .Case("supersparc", CK_SUPERSPARC)
6785 .Case("sparclite", CK_SPARCLITE)
6786 .Case("f934", CK_F934)
6787 .Case("hypersparc", CK_HYPERSPARC)
6788 .Case("sparclite86x", CK_SPARCLITE86X)
6789 .Case("sparclet", CK_SPARCLET)
6790 .Case("tsc701", CK_TSC701)
6791 .Case("v9", CK_V9)
6792 .Case("ultrasparc", CK_ULTRASPARC)
6793 .Case("ultrasparc3", CK_ULTRASPARC3)
6794 .Case("niagara", CK_NIAGARA)
6795 .Case("niagara2", CK_NIAGARA2)
6796 .Case("niagara3", CK_NIAGARA3)
6797 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006798 .Case("ma2100", CK_MYRIAD2100)
6799 .Case("ma2150", CK_MYRIAD2150)
6800 .Case("ma2450", CK_MYRIAD2450)
6801 // FIXME: the myriad2[.n] spellings are obsolete,
6802 // but a grace period is needed to allow updating dependent builds.
6803 .Case("myriad2", CK_MYRIAD2100)
6804 .Case("myriad2.1", CK_MYRIAD2100)
6805 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006806 .Case("leon2", CK_LEON2)
6807 .Case("at697e", CK_LEON2_AT697E)
6808 .Case("at697f", CK_LEON2_AT697F)
6809 .Case("leon3", CK_LEON3)
6810 .Case("ut699", CK_LEON3_UT699)
6811 .Case("gr712rc", CK_LEON3_GR712RC)
6812 .Case("leon4", CK_LEON4)
6813 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006814 .Default(CK_GENERIC);
6815 }
6816
6817 bool setCPU(const std::string &Name) override {
6818 CPU = getCPUKind(Name);
6819 return CPU != CK_GENERIC;
6820 }
Gabor Greif49991682008-02-21 16:29:08 +00006821};
6822
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006823const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006824 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6825 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6826 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6827 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6828};
6829
Craig Topperf054e3a2015-10-19 03:52:27 +00006830ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6831 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006832}
6833
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006834const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006835 { { "g0" }, "r0" },
6836 { { "g1" }, "r1" },
6837 { { "g2" }, "r2" },
6838 { { "g3" }, "r3" },
6839 { { "g4" }, "r4" },
6840 { { "g5" }, "r5" },
6841 { { "g6" }, "r6" },
6842 { { "g7" }, "r7" },
6843 { { "o0" }, "r8" },
6844 { { "o1" }, "r9" },
6845 { { "o2" }, "r10" },
6846 { { "o3" }, "r11" },
6847 { { "o4" }, "r12" },
6848 { { "o5" }, "r13" },
6849 { { "o6", "sp" }, "r14" },
6850 { { "o7" }, "r15" },
6851 { { "l0" }, "r16" },
6852 { { "l1" }, "r17" },
6853 { { "l2" }, "r18" },
6854 { { "l3" }, "r19" },
6855 { { "l4" }, "r20" },
6856 { { "l5" }, "r21" },
6857 { { "l6" }, "r22" },
6858 { { "l7" }, "r23" },
6859 { { "i0" }, "r24" },
6860 { { "i1" }, "r25" },
6861 { { "i2" }, "r26" },
6862 { { "i3" }, "r27" },
6863 { { "i4" }, "r28" },
6864 { { "i5" }, "r29" },
6865 { { "i6", "fp" }, "r30" },
6866 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006867};
6868
Craig Topperf054e3a2015-10-19 03:52:27 +00006869ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6870 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006871}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006872
6873// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6874class SparcV8TargetInfo : public SparcTargetInfo {
6875public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006876 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6877 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006878 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006879 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6880 switch (getTriple().getOS()) {
6881 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006882 SizeType = UnsignedInt;
6883 IntPtrType = SignedInt;
6884 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006885 break;
6886 case llvm::Triple::NetBSD:
6887 case llvm::Triple::OpenBSD:
6888 SizeType = UnsignedLong;
6889 IntPtrType = SignedLong;
6890 PtrDiffType = SignedLong;
6891 break;
Brad Smith56495d52015-08-13 22:00:53 +00006892 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006893 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6894 // on up to 64 bits.
6895 MaxAtomicPromoteWidth = 64;
6896 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006897 }
6898
Craig Topper3164f332014-03-11 03:39:26 +00006899 void getTargetDefines(const LangOptions &Opts,
6900 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006901 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006902 switch (getCPUGeneration(CPU)) {
6903 case CG_V8:
6904 Builder.defineMacro("__sparcv8");
6905 if (getTriple().getOS() != llvm::Triple::Solaris)
6906 Builder.defineMacro("__sparcv8__");
6907 break;
6908 case CG_V9:
6909 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006910 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006911 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006912 Builder.defineMacro("__sparc_v9__");
6913 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006914 break;
6915 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006916 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006917 std::string MyriadArchValue, Myriad2Value;
6918 Builder.defineMacro("__sparc_v8__");
6919 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006920 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006921 case CK_MYRIAD2150:
6922 MyriadArchValue = "__ma2150";
6923 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006924 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006925 case CK_MYRIAD2450:
6926 MyriadArchValue = "__ma2450";
6927 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006928 break;
6929 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006930 MyriadArchValue = "__ma2100";
6931 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006932 break;
6933 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006934 Builder.defineMacro(MyriadArchValue, "1");
6935 Builder.defineMacro(MyriadArchValue+"__", "1");
6936 Builder.defineMacro("__myriad2__", Myriad2Value);
6937 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006938 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006939 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006940
6941 bool hasSjLjLowering() const override {
6942 return true;
6943 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006944};
6945
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006946// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6947class SparcV8elTargetInfo : public SparcV8TargetInfo {
6948 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006949 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6950 : SparcV8TargetInfo(Triple, Opts) {
6951 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006952 }
6953};
6954
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006955// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6956class SparcV9TargetInfo : public SparcTargetInfo {
6957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006958 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6959 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006960 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006961 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006962 // This is an LP64 platform.
6963 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006964
6965 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006966 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006967 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006968 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006969 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006970 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006971
6972 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6973 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6974 LongDoubleWidth = 128;
6975 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006976 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006977 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006978 }
6979
Craig Topper3164f332014-03-11 03:39:26 +00006980 void getTargetDefines(const LangOptions &Opts,
6981 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006982 SparcTargetInfo::getTargetDefines(Opts, Builder);
6983 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006984 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006985 // Solaris doesn't need these variants, but the BSDs do.
6986 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006987 Builder.defineMacro("__sparc64__");
6988 Builder.defineMacro("__sparc_v9__");
6989 Builder.defineMacro("__sparcv9__");
6990 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006991 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006992
Craig Topper3164f332014-03-11 03:39:26 +00006993 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006994 if (!SparcTargetInfo::setCPU(Name))
6995 return false;
6996 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006997 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006998};
6999
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007000class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007001 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007002 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007003 std::string CPU;
7004 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007005 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007006
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007007public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007008 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007009 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7010 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007011 IntMaxType = SignedLong;
7012 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007013 TLSSupported = true;
7014 IntWidth = IntAlign = 32;
7015 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7016 PointerWidth = PointerAlign = 64;
7017 LongDoubleWidth = 128;
7018 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007019 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007020 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007021 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007022 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 +00007023 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7024 }
7025 void getTargetDefines(const LangOptions &Opts,
7026 MacroBuilder &Builder) const override {
7027 Builder.defineMacro("__s390__");
7028 Builder.defineMacro("__s390x__");
7029 Builder.defineMacro("__zarch__");
7030 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007031
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007032 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7033 .Cases("arch8", "z10", "8")
7034 .Cases("arch9", "z196", "9")
7035 .Cases("arch10", "zEC12", "10")
7036 .Cases("arch11", "z13", "11")
7037 .Default("");
7038 if (!ISARev.empty())
7039 Builder.defineMacro("__ARCH__", ISARev);
7040
Ulrich Weigandb038a522016-02-05 21:34:28 +00007041 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7042 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7043 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7044 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7045
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007046 if (HasTransactionalExecution)
7047 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007048 if (HasVector)
7049 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007050 if (Opts.ZVector)
7051 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007052 }
Craig Topper6c03a542015-10-19 04:51:35 +00007053 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7054 return llvm::makeArrayRef(BuiltinInfo,
7055 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007056 }
7057
Craig Topperf054e3a2015-10-19 03:52:27 +00007058 ArrayRef<const char *> getGCCRegNames() const override;
7059 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007060 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007061 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007062 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007063 bool validateAsmConstraint(const char *&Name,
7064 TargetInfo::ConstraintInfo &info) const override;
7065 const char *getClobbers() const override {
7066 // FIXME: Is this really right?
7067 return "";
7068 }
7069 BuiltinVaListKind getBuiltinVaListKind() const override {
7070 return TargetInfo::SystemZBuiltinVaList;
7071 }
7072 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007073 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007074 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7075 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007076 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007077 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007078 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007079 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007080 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007081 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007082 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007083 .Default(false);
7084
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007085 return CPUKnown;
7086 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007087 bool
7088 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7089 StringRef CPU,
7090 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007091 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007092 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007093 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007094 Features["transactional-execution"] = true;
7095 Features["vector"] = true;
7096 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007097 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007098 }
7099
7100 bool handleTargetFeatures(std::vector<std::string> &Features,
7101 DiagnosticsEngine &Diags) override {
7102 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007103 for (const auto &Feature : Features) {
7104 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007105 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007106 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007107 HasVector = true;
7108 }
7109 // If we use the vector ABI, vector types are 64-bit aligned.
7110 if (HasVector) {
7111 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007112 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7113 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007114 }
7115 return true;
7116 }
7117
7118 bool hasFeature(StringRef Feature) const override {
7119 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007120 .Case("systemz", true)
7121 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007122 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007123 .Default(false);
7124 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007125
Bryan Chane3f1ed52016-04-28 13:56:43 +00007126 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7127 switch (CC) {
7128 case CC_C:
7129 case CC_Swift:
7130 return CCCR_OK;
7131 default:
7132 return CCCR_Warning;
7133 }
7134 }
7135
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007136 StringRef getABI() const override {
7137 if (HasVector)
7138 return "vector";
7139 return "";
7140 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007141
7142 bool useFloat128ManglingForLongDouble() const override {
7143 return true;
7144 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007145};
7146
7147const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7148#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007149 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007150#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7151 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007152#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007153};
7154
7155const char *const SystemZTargetInfo::GCCRegNames[] = {
7156 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7157 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7158 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7159 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7160};
7161
Craig Topperf054e3a2015-10-19 03:52:27 +00007162ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7163 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007164}
7165
7166bool SystemZTargetInfo::
7167validateAsmConstraint(const char *&Name,
7168 TargetInfo::ConstraintInfo &Info) const {
7169 switch (*Name) {
7170 default:
7171 return false;
7172
7173 case 'a': // Address register
7174 case 'd': // Data register (equivalent to 'r')
7175 case 'f': // Floating-point register
7176 Info.setAllowsRegister();
7177 return true;
7178
7179 case 'I': // Unsigned 8-bit constant
7180 case 'J': // Unsigned 12-bit constant
7181 case 'K': // Signed 16-bit constant
7182 case 'L': // Signed 20-bit displacement (on all targets we support)
7183 case 'M': // 0x7fffffff
7184 return true;
7185
7186 case 'Q': // Memory with base and unsigned 12-bit displacement
7187 case 'R': // Likewise, plus an index
7188 case 'S': // Memory with base and signed 20-bit displacement
7189 case 'T': // Likewise, plus an index
7190 Info.setAllowsMemory();
7191 return true;
7192 }
7193}
Ulrich Weigand47445072013-05-06 16:26:41 +00007194
Eric Christopherc48497a2015-09-18 21:26:24 +00007195class MSP430TargetInfo : public TargetInfo {
7196 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007197
Eric Christopherc48497a2015-09-18 21:26:24 +00007198public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007199 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7200 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007201 TLSSupported = false;
7202 IntWidth = 16;
7203 IntAlign = 16;
7204 LongWidth = 32;
7205 LongLongWidth = 64;
7206 LongAlign = LongLongAlign = 16;
7207 PointerWidth = 16;
7208 PointerAlign = 16;
7209 SuitableAlign = 16;
7210 SizeType = UnsignedInt;
7211 IntMaxType = SignedLongLong;
7212 IntPtrType = SignedInt;
7213 PtrDiffType = SignedInt;
7214 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007215 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007216 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007217 void getTargetDefines(const LangOptions &Opts,
7218 MacroBuilder &Builder) const override {
7219 Builder.defineMacro("MSP430");
7220 Builder.defineMacro("__MSP430__");
7221 // FIXME: defines for different 'flavours' of MCU
7222 }
Craig Topper6c03a542015-10-19 04:51:35 +00007223 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007224 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007225 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007226 }
7227 bool hasFeature(StringRef Feature) const override {
7228 return Feature == "msp430";
7229 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007230 ArrayRef<const char *> getGCCRegNames() const override;
7231 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007232 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007233 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007234 }
7235 bool validateAsmConstraint(const char *&Name,
7236 TargetInfo::ConstraintInfo &info) const override {
7237 // FIXME: implement
7238 switch (*Name) {
7239 case 'K': // the constant 1
7240 case 'L': // constant -1^20 .. 1^19
7241 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007242 return true;
7243 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007244 // No target constraints for now.
7245 return false;
7246 }
7247 const char *getClobbers() const override {
7248 // FIXME: Is this really right?
7249 return "";
7250 }
7251 BuiltinVaListKind getBuiltinVaListKind() const override {
7252 // FIXME: implement
7253 return TargetInfo::CharPtrBuiltinVaList;
7254 }
7255};
7256
7257const char *const MSP430TargetInfo::GCCRegNames[] = {
7258 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7259 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7260
Craig Topperf054e3a2015-10-19 03:52:27 +00007261ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7262 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007263}
7264
7265// LLVM and Clang cannot be used directly to output native binaries for
7266// target, but is used to compile C code to llvm bitcode with correct
7267// type and alignment information.
7268//
7269// TCE uses the llvm bitcode as input and uses it for generating customized
7270// target processor and program binary. TCE co-design environment is
7271// publicly available in http://tce.cs.tut.fi
7272
7273static const unsigned TCEOpenCLAddrSpaceMap[] = {
7274 3, // opencl_global
7275 4, // opencl_local
7276 5, // opencl_constant
7277 // FIXME: generic has to be added to the target
7278 0, // opencl_generic
7279 0, // cuda_device
7280 0, // cuda_constant
7281 0 // cuda_shared
7282};
7283
7284class TCETargetInfo : public TargetInfo {
7285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007286 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7287 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007288 TLSSupported = false;
7289 IntWidth = 32;
7290 LongWidth = LongLongWidth = 32;
7291 PointerWidth = 32;
7292 IntAlign = 32;
7293 LongAlign = LongLongAlign = 32;
7294 PointerAlign = 32;
7295 SuitableAlign = 32;
7296 SizeType = UnsignedInt;
7297 IntMaxType = SignedLong;
7298 IntPtrType = SignedInt;
7299 PtrDiffType = SignedInt;
7300 FloatWidth = 32;
7301 FloatAlign = 32;
7302 DoubleWidth = 32;
7303 DoubleAlign = 32;
7304 LongDoubleWidth = 32;
7305 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007306 FloatFormat = &llvm::APFloat::IEEEsingle();
7307 DoubleFormat = &llvm::APFloat::IEEEsingle();
7308 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007309 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7310 "i16:16:32-i32:32:32-i64:32:32-"
7311 "f32:32:32-f64:32:32-v64:32:32-"
7312 "v128:32:32-v256:32:32-v512:32:32-"
7313 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007314 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7315 UseAddrSpaceMapMangling = true;
7316 }
7317
7318 void getTargetDefines(const LangOptions &Opts,
7319 MacroBuilder &Builder) const override {
7320 DefineStd(Builder, "tce", Opts);
7321 Builder.defineMacro("__TCE__");
7322 Builder.defineMacro("__TCE_V1__");
7323 }
7324 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7325
Craig Topper6c03a542015-10-19 04:51:35 +00007326 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007327 const char *getClobbers() const override { return ""; }
7328 BuiltinVaListKind getBuiltinVaListKind() const override {
7329 return TargetInfo::VoidPtrBuiltinVaList;
7330 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007331 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007332 bool validateAsmConstraint(const char *&Name,
7333 TargetInfo::ConstraintInfo &info) const override {
7334 return true;
7335 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007336 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7337 return None;
7338 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007339};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007340
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007341class TCELETargetInfo : public TCETargetInfo {
7342public:
7343 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7344 : TCETargetInfo(Triple, Opts) {
7345 BigEndian = false;
7346
7347 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7348 "i16:16:32-i32:32:32-i64:32:32-"
7349 "f32:32:32-f64:32:32-v64:32:32-"
7350 "v128:32:32-v256:32:32-v512:32:32-"
7351 "v1024:32:32-a0:0:32-n32");
7352
7353 }
7354
7355 virtual void getTargetDefines(const LangOptions &Opts,
7356 MacroBuilder &Builder) const {
7357 DefineStd(Builder, "tcele", Opts);
7358 Builder.defineMacro("__TCE__");
7359 Builder.defineMacro("__TCE_V1__");
7360 Builder.defineMacro("__TCELE__");
7361 Builder.defineMacro("__TCELE_V1__");
7362 }
7363
7364};
7365
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007366class BPFTargetInfo : public TargetInfo {
7367public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007368 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7369 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007370 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7371 SizeType = UnsignedLong;
7372 PtrDiffType = SignedLong;
7373 IntPtrType = SignedLong;
7374 IntMaxType = SignedLong;
7375 Int64Type = SignedLong;
7376 RegParmMax = 5;
7377 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007378 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007379 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007380 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007381 }
7382 MaxAtomicPromoteWidth = 64;
7383 MaxAtomicInlineWidth = 64;
7384 TLSSupported = false;
7385 }
7386 void getTargetDefines(const LangOptions &Opts,
7387 MacroBuilder &Builder) const override {
7388 DefineStd(Builder, "bpf", Opts);
7389 Builder.defineMacro("__BPF__");
7390 }
7391 bool hasFeature(StringRef Feature) const override {
7392 return Feature == "bpf";
7393 }
7394
Craig Topper6c03a542015-10-19 04:51:35 +00007395 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007396 const char *getClobbers() const override {
7397 return "";
7398 }
7399 BuiltinVaListKind getBuiltinVaListKind() const override {
7400 return TargetInfo::VoidPtrBuiltinVaList;
7401 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007402 ArrayRef<const char *> getGCCRegNames() const override {
7403 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007404 }
7405 bool validateAsmConstraint(const char *&Name,
7406 TargetInfo::ConstraintInfo &info) const override {
7407 return true;
7408 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007409 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7410 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007411 }
7412};
7413
Daniel Sanders4672af62016-05-27 11:51:02 +00007414class MipsTargetInfo : public TargetInfo {
7415 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007416 StringRef Layout;
7417
7418 if (ABI == "o32")
7419 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7420 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007421 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007422 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007423 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007424 else
7425 llvm_unreachable("Invalid ABI");
7426
7427 if (BigEndian)
7428 resetDataLayout(("E-" + Layout).str());
7429 else
7430 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007431 }
7432
Akira Hatanaka9064e362013-10-29 18:30:33 +00007433
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007434 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007435 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007436 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007437 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007438 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007439 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007440 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007441 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007442 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007443 enum DspRevEnum {
7444 NoDSP, DSP1, DSP2
7445 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007446 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007447
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007448protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007449 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007450 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007451
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007452public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007453 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007454 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7455 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7456 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007457 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007458
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007459 setABI((getTriple().getArch() == llvm::Triple::mips ||
7460 getTriple().getArch() == llvm::Triple::mipsel)
7461 ? "o32"
7462 : "n64");
7463
7464 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007465 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007466
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007467 bool isNaN2008Default() const {
7468 return CPU == "mips32r6" || CPU == "mips64r6";
7469 }
7470
7471 bool isFP64Default() const {
7472 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7473 }
7474
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007475 bool isNan2008() const override {
7476 return IsNan2008;
7477 }
7478
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007479 bool processorSupportsGPR64() const {
7480 return llvm::StringSwitch<bool>(CPU)
7481 .Case("mips3", true)
7482 .Case("mips4", true)
7483 .Case("mips5", true)
7484 .Case("mips64", true)
7485 .Case("mips64r2", true)
7486 .Case("mips64r3", true)
7487 .Case("mips64r5", true)
7488 .Case("mips64r6", true)
7489 .Case("octeon", true)
7490 .Default(false);
7491 return false;
7492 }
7493
Alp Toker4925ba72014-06-07 23:30:42 +00007494 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007495 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007496 if (Name == "o32") {
7497 setO32ABITypes();
7498 ABI = Name;
7499 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007500 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007501
7502 if (Name == "n32") {
7503 setN32ABITypes();
7504 ABI = Name;
7505 return true;
7506 }
7507 if (Name == "n64") {
7508 setN64ABITypes();
7509 ABI = Name;
7510 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007511 }
7512 return false;
7513 }
7514
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007515 void setO32ABITypes() {
7516 Int64Type = SignedLongLong;
7517 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007518 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007519 LongDoubleWidth = LongDoubleAlign = 64;
7520 LongWidth = LongAlign = 32;
7521 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7522 PointerWidth = PointerAlign = 32;
7523 PtrDiffType = SignedInt;
7524 SizeType = UnsignedInt;
7525 SuitableAlign = 64;
7526 }
7527
7528 void setN32N64ABITypes() {
7529 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007530 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007531 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7532 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007533 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007534 }
7535 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7536 SuitableAlign = 128;
7537 }
7538
Daniel Sanders4672af62016-05-27 11:51:02 +00007539 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007540 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007541 Int64Type = SignedLong;
7542 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007543 LongWidth = LongAlign = 64;
7544 PointerWidth = PointerAlign = 64;
7545 PtrDiffType = SignedLong;
7546 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007547 }
7548
7549 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007550 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007551 Int64Type = SignedLongLong;
7552 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007553 LongWidth = LongAlign = 32;
7554 PointerWidth = PointerAlign = 32;
7555 PtrDiffType = SignedInt;
7556 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007557 }
7558
Craig Topper3164f332014-03-11 03:39:26 +00007559 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007560 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007561 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007562 .Case("mips1", true)
7563 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007564 .Case("mips3", true)
7565 .Case("mips4", true)
7566 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007567 .Case("mips32", true)
7568 .Case("mips32r2", true)
7569 .Case("mips32r3", true)
7570 .Case("mips32r5", true)
7571 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007572 .Case("mips64", true)
7573 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007574 .Case("mips64r3", true)
7575 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007576 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007577 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007578 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007579 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007580 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007581 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007582 bool
7583 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7584 StringRef CPU,
7585 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007586 if (CPU.empty())
7587 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007588 if (CPU == "octeon")
7589 Features["mips64r2"] = Features["cnmips"] = true;
7590 else
7591 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007592 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007593 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007594
Craig Topper3164f332014-03-11 03:39:26 +00007595 void getTargetDefines(const LangOptions &Opts,
7596 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007597 if (BigEndian) {
7598 DefineStd(Builder, "MIPSEB", Opts);
7599 Builder.defineMacro("_MIPSEB");
7600 } else {
7601 DefineStd(Builder, "MIPSEL", Opts);
7602 Builder.defineMacro("_MIPSEL");
7603 }
7604
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007605 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007606 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007607 if (Opts.GNUMode)
7608 Builder.defineMacro("mips");
7609
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007610 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007611 Builder.defineMacro("__mips", "32");
7612 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7613 } else {
7614 Builder.defineMacro("__mips", "64");
7615 Builder.defineMacro("__mips64");
7616 Builder.defineMacro("__mips64__");
7617 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7618 }
7619
7620 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7621 .Cases("mips32", "mips64", "1")
7622 .Cases("mips32r2", "mips64r2", "2")
7623 .Cases("mips32r3", "mips64r3", "3")
7624 .Cases("mips32r5", "mips64r5", "5")
7625 .Cases("mips32r6", "mips64r6", "6")
7626 .Default("");
7627 if (!ISARev.empty())
7628 Builder.defineMacro("__mips_isa_rev", ISARev);
7629
7630 if (ABI == "o32") {
7631 Builder.defineMacro("__mips_o32");
7632 Builder.defineMacro("_ABIO32", "1");
7633 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007634 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007635 Builder.defineMacro("__mips_n32");
7636 Builder.defineMacro("_ABIN32", "2");
7637 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7638 } else if (ABI == "n64") {
7639 Builder.defineMacro("__mips_n64");
7640 Builder.defineMacro("_ABI64", "3");
7641 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7642 } else
7643 llvm_unreachable("Invalid ABI.");
7644
Simon Atanasyan683535b2012-08-29 19:14:58 +00007645 Builder.defineMacro("__REGISTER_PREFIX__", "");
7646
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007647 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007648 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007649 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007650 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007651 case SoftFloat:
7652 Builder.defineMacro("__mips_soft_float", Twine(1));
7653 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007654 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007655
Simon Atanasyan16071912013-04-14 14:07:30 +00007656 if (IsSingleFloat)
7657 Builder.defineMacro("__mips_single_float", Twine(1));
7658
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007659 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7660 Builder.defineMacro("_MIPS_FPSET",
7661 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7662
Simon Atanasyan72244b62012-07-05 16:06:06 +00007663 if (IsMips16)
7664 Builder.defineMacro("__mips16", Twine(1));
7665
Simon Atanasyan60777612013-04-14 14:07:51 +00007666 if (IsMicromips)
7667 Builder.defineMacro("__mips_micromips", Twine(1));
7668
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007669 if (IsNan2008)
7670 Builder.defineMacro("__mips_nan2008", Twine(1));
7671
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007672 switch (DspRev) {
7673 default:
7674 break;
7675 case DSP1:
7676 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7677 Builder.defineMacro("__mips_dsp", Twine(1));
7678 break;
7679 case DSP2:
7680 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7681 Builder.defineMacro("__mips_dspr2", Twine(1));
7682 Builder.defineMacro("__mips_dsp", Twine(1));
7683 break;
7684 }
7685
Jack Carter44ff1e52013-08-12 17:20:29 +00007686 if (HasMSA)
7687 Builder.defineMacro("__mips_msa", Twine(1));
7688
Simon Atanasyan26f19672012-04-05 19:28:31 +00007689 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7690 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7691 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007692
7693 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7694 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007695
7696 // These shouldn't be defined for MIPS-I but there's no need to check
7697 // for that since MIPS-I isn't supported.
7698 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7699 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7700 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007701
7702 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7703 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7704 // the instructions exist but using them violates the ABI since they
7705 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7706 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007707 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007708 }
7709
Craig Topper6c03a542015-10-19 04:51:35 +00007710 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7711 return llvm::makeArrayRef(BuiltinInfo,
7712 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007713 }
Craig Topper3164f332014-03-11 03:39:26 +00007714 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007715 return llvm::StringSwitch<bool>(Feature)
7716 .Case("mips", true)
7717 .Case("fp64", HasFP64)
7718 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007719 }
Craig Topper3164f332014-03-11 03:39:26 +00007720 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007721 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007722 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007723 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007724 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007725 // CPU register names
7726 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007727 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7728 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7729 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007730 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7731 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007732 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7733 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7734 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7735 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007736 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007737 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007738 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7739 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007740 // MSA register names
7741 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7742 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7743 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7744 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7745 // MSA control register names
7746 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7747 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007748 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007749 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007750 }
Craig Topper3164f332014-03-11 03:39:26 +00007751 bool validateAsmConstraint(const char *&Name,
7752 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007753 switch (*Name) {
7754 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007755 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007756 case 'r': // CPU registers.
7757 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007758 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007759 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007760 case 'c': // $25 for indirect jumps
7761 case 'l': // lo register
7762 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007763 Info.setAllowsRegister();
7764 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007765 case 'I': // Signed 16-bit constant
7766 case 'J': // Integer 0
7767 case 'K': // Unsigned 16-bit constant
7768 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7769 case 'M': // Constants not loadable via lui, addiu, or ori
7770 case 'N': // Constant -1 to -65535
7771 case 'O': // A signed 15-bit constant
7772 case 'P': // A constant between 1 go 65535
7773 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007774 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007775 Info.setAllowsMemory();
7776 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007777 case 'Z':
7778 if (Name[1] == 'C') { // An address usable by ll, and sc.
7779 Info.setAllowsMemory();
7780 Name++; // Skip over 'Z'.
7781 return true;
7782 }
7783 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007784 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007785 }
7786
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007787 std::string convertConstraint(const char *&Constraint) const override {
7788 std::string R;
7789 switch (*Constraint) {
7790 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7791 if (Constraint[1] == 'C') {
7792 R = std::string("^") + std::string(Constraint, 2);
7793 Constraint++;
7794 return R;
7795 }
7796 break;
7797 }
7798 return TargetInfo::convertConstraint(Constraint);
7799 }
7800
Craig Topper3164f332014-03-11 03:39:26 +00007801 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007802 // In GCC, $1 is not widely used in generated code (it's used only in a few
7803 // specific situations), so there is no real need for users to add it to
7804 // the clobbers list if they want to use it in their inline assembly code.
7805 //
7806 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7807 // code generation, so using it in inline assembly without adding it to the
7808 // clobbers list can cause conflicts between the inline assembly code and
7809 // the surrounding generated code.
7810 //
7811 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7812 // operands, which will conflict with the ".set at" assembler option (which
7813 // we use only for inline assembly, in order to maintain compatibility with
7814 // GCC) and will also conflict with the user's usage of $1.
7815 //
7816 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7817 // register for generated code is to automatically clobber $1 for all inline
7818 // assembly code.
7819 //
7820 // FIXME: We should automatically clobber $1 only for inline assembly code
7821 // which actually uses it. This would allow LLVM to use $1 for inline
7822 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007823 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007824 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007825
Craig Topper3164f332014-03-11 03:39:26 +00007826 bool handleTargetFeatures(std::vector<std::string> &Features,
7827 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007828 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007829 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007830 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007831 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007832 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007833 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007834 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007835
Eric Christopher610fe112015-08-26 08:21:55 +00007836 for (const auto &Feature : Features) {
7837 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007838 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007839 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007840 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007841 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007842 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007843 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007844 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007845 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007846 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007847 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007848 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007849 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007850 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007851 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007852 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007853 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007854 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007855 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007856 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007857 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007858 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007859 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007860
James Y Knightb214cbc2016-03-04 19:00:41 +00007861 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007862
Rafael Espindolaeb265472013-08-21 21:59:03 +00007863 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007864 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007865
Craig Topper3164f332014-03-11 03:39:26 +00007866 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007867 if (RegNo == 0) return 4;
7868 if (RegNo == 1) return 5;
7869 return -1;
7870 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007871
7872 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007873
7874 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7875 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7876 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7877 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7878 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7879 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7880 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7881 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7882 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7883 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7884 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7885 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7886 {{"ra"}, "$31"}};
7887 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7888 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7889 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7890 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7891 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7892 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7893 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7894 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7895 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7896 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7897 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7898 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007899 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007900 return llvm::makeArrayRef(O32RegAliases);
7901 return llvm::makeArrayRef(NewABIRegAliases);
7902 }
7903
7904 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007905 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007906 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007907
7908 bool validateTarget(DiagnosticsEngine &Diags) const override {
7909 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7910 // this yet. It's better to fail here than on the backend assertion.
7911 if (processorSupportsGPR64() && ABI == "o32") {
7912 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7913 return false;
7914 }
7915
7916 // 64-bit ABI's require 64-bit CPU's.
7917 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7918 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7919 return false;
7920 }
7921
7922 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7923 // can't handle this yet. It's better to fail here than on the
7924 // backend assertion.
7925 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7926 getTriple().getArch() == llvm::Triple::mips64el) &&
7927 ABI == "o32") {
7928 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7929 << ABI << getTriple().str();
7930 return false;
7931 }
7932
7933 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7934 // can't handle this yet. It's better to fail here than on the
7935 // backend assertion.
7936 if ((getTriple().getArch() == llvm::Triple::mips ||
7937 getTriple().getArch() == llvm::Triple::mipsel) &&
7938 (ABI == "n32" || ABI == "n64")) {
7939 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7940 << ABI << getTriple().str();
7941 return false;
7942 }
7943
7944 return true;
7945 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007946};
7947
Daniel Sanders4672af62016-05-27 11:51:02 +00007948const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007949#define BUILTIN(ID, TYPE, ATTRS) \
7950 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7951#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7952 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007953#include "clang/Basic/BuiltinsMips.def"
7954};
7955
Ivan Krasindd7403e2011-08-24 20:22:22 +00007956class PNaClTargetInfo : public TargetInfo {
7957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007958 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7959 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007960 this->LongAlign = 32;
7961 this->LongWidth = 32;
7962 this->PointerAlign = 32;
7963 this->PointerWidth = 32;
7964 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007965 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007966 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007967 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007968 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007969 this->SizeType = TargetInfo::UnsignedInt;
7970 this->PtrDiffType = TargetInfo::SignedInt;
7971 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007972 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007973 }
7974
Craig Toppere6f17d02014-03-11 04:07:52 +00007975 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007976 Builder.defineMacro("__le32__");
7977 Builder.defineMacro("__pnacl__");
7978 }
Craig Topper3164f332014-03-11 03:39:26 +00007979 void getTargetDefines(const LangOptions &Opts,
7980 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007981 getArchDefines(Opts, Builder);
7982 }
Craig Topper3164f332014-03-11 03:39:26 +00007983 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007984 return Feature == "pnacl";
7985 }
Craig Topper6c03a542015-10-19 04:51:35 +00007986 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007987 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007988 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007989 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007990 ArrayRef<const char *> getGCCRegNames() const override;
7991 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007992 bool validateAsmConstraint(const char *&Name,
7993 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007994 return false;
7995 }
7996
Craig Topper3164f332014-03-11 03:39:26 +00007997 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007998 return "";
7999 }
8000};
8001
Craig Topperf054e3a2015-10-19 03:52:27 +00008002ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8003 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008004}
8005
Craig Topperf054e3a2015-10-19 03:52:27 +00008006ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8007 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008008}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008009
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008010// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008011class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008012public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008013 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8014 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008015
8016 BuiltinVaListKind getBuiltinVaListKind() const override {
8017 return TargetInfo::PNaClABIBuiltinVaList;
8018 }
8019};
8020
JF Bastien643817d2014-09-12 17:52:47 +00008021class Le64TargetInfo : public TargetInfo {
8022 static const Builtin::Info BuiltinInfo[];
8023
8024public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008025 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8026 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008027 NoAsmVariants = true;
8028 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8029 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008030 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008031 }
8032
8033 void getTargetDefines(const LangOptions &Opts,
8034 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008035 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008036 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8037 Builder.defineMacro("__ELF__");
8038 }
Craig Topper6c03a542015-10-19 04:51:35 +00008039 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8040 return llvm::makeArrayRef(BuiltinInfo,
8041 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008042 }
8043 BuiltinVaListKind getBuiltinVaListKind() const override {
8044 return TargetInfo::PNaClABIBuiltinVaList;
8045 }
8046 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008047 ArrayRef<const char *> getGCCRegNames() const override {
8048 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008049 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008050 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8051 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008052 }
8053 bool validateAsmConstraint(const char *&Name,
8054 TargetInfo::ConstraintInfo &Info) const override {
8055 return false;
8056 }
8057
8058 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008059};
Dan Gohmanc2853072015-09-03 22:51:53 +00008060
8061class WebAssemblyTargetInfo : public TargetInfo {
8062 static const Builtin::Info BuiltinInfo[];
8063
8064 enum SIMDEnum {
8065 NoSIMD,
8066 SIMD128,
8067 } SIMDLevel;
8068
8069public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008071 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008072 NoAsmVariants = true;
8073 SuitableAlign = 128;
8074 LargeArrayMinWidth = 128;
8075 LargeArrayAlign = 128;
8076 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008077 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008078 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008079 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008080 SizeType = UnsignedInt;
8081 PtrDiffType = SignedInt;
8082 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008083 }
8084
8085protected:
8086 void getTargetDefines(const LangOptions &Opts,
8087 MacroBuilder &Builder) const override {
8088 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8089 if (SIMDLevel >= SIMD128)
8090 Builder.defineMacro("__wasm_simd128__");
8091 }
8092
8093private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008094 bool
8095 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8096 StringRef CPU,
8097 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008098 if (CPU == "bleeding-edge")
8099 Features["simd128"] = true;
8100 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8101 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008102 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008103 return llvm::StringSwitch<bool>(Feature)
8104 .Case("simd128", SIMDLevel >= SIMD128)
8105 .Default(false);
8106 }
8107 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008108 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008109 for (const auto &Feature : Features) {
8110 if (Feature == "+simd128") {
8111 SIMDLevel = std::max(SIMDLevel, SIMD128);
8112 continue;
8113 }
8114 if (Feature == "-simd128") {
8115 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8116 continue;
8117 }
8118
8119 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8120 << "-target-feature";
8121 return false;
8122 }
8123 return true;
8124 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008125 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008126 return llvm::StringSwitch<bool>(Name)
8127 .Case("mvp", true)
8128 .Case("bleeding-edge", true)
8129 .Case("generic", true)
8130 .Default(false);
8131 }
Craig Topper6c03a542015-10-19 04:51:35 +00008132 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8133 return llvm::makeArrayRef(BuiltinInfo,
8134 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008135 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008136 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008137 return VoidPtrBuiltinVaList;
8138 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008139 ArrayRef<const char *> getGCCRegNames() const final {
8140 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008141 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008142 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8143 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008144 }
8145 bool
8146 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008147 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008148 return false;
8149 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008150 const char *getClobbers() const final { return ""; }
8151 bool isCLZForZeroUndef() const final { return false; }
8152 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008153 IntType getIntTypeByWidth(unsigned BitWidth,
8154 bool IsSigned) const final {
8155 // WebAssembly prefers long long for explicitly 64-bit integers.
8156 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8157 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8158 }
8159 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8160 bool IsSigned) const final {
8161 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8162 return BitWidth == 64
8163 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8164 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8165 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008166};
8167
8168const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8169#define BUILTIN(ID, TYPE, ATTRS) \
8170 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8171#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8172 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8173#include "clang/Basic/BuiltinsWebAssembly.def"
8174};
8175
8176class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8177public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008178 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8179 const TargetOptions &Opts)
8180 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008181 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008182 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008183 }
8184
8185protected:
8186 void getTargetDefines(const LangOptions &Opts,
8187 MacroBuilder &Builder) const override {
8188 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8189 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8190 }
8191};
8192
8193class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8194public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8196 const TargetOptions &Opts)
8197 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008198 LongAlign = LongWidth = 64;
8199 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008200 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008201 SizeType = UnsignedLong;
8202 PtrDiffType = SignedLong;
8203 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008204 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008205 }
8206
8207protected:
8208 void getTargetDefines(const LangOptions &Opts,
8209 MacroBuilder &Builder) const override {
8210 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8211 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8212 }
8213};
8214
JF Bastien643817d2014-09-12 17:52:47 +00008215const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8216#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008217 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008218#include "clang/Basic/BuiltinsLe64.def"
8219};
8220
Eric Christopherc48497a2015-09-18 21:26:24 +00008221static const unsigned SPIRAddrSpaceMap[] = {
8222 1, // opencl_global
8223 3, // opencl_local
8224 2, // opencl_constant
8225 4, // opencl_generic
8226 0, // cuda_device
8227 0, // cuda_constant
8228 0 // cuda_shared
8229};
8230class SPIRTargetInfo : public TargetInfo {
8231public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008232 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8233 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008234 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8235 "SPIR target must use unknown OS");
8236 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8237 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008238 TLSSupported = false;
8239 LongWidth = LongAlign = 64;
8240 AddrSpaceMap = &SPIRAddrSpaceMap;
8241 UseAddrSpaceMapMangling = true;
8242 // Define available target features
8243 // These must be defined in sorted order!
8244 NoAsmVariants = true;
8245 }
8246 void getTargetDefines(const LangOptions &Opts,
8247 MacroBuilder &Builder) const override {
8248 DefineStd(Builder, "SPIR", Opts);
8249 }
8250 bool hasFeature(StringRef Feature) const override {
8251 return Feature == "spir";
8252 }
Craig Topper3164f332014-03-11 03:39:26 +00008253
Craig Topper6c03a542015-10-19 04:51:35 +00008254 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008255 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008256 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008257 bool validateAsmConstraint(const char *&Name,
8258 TargetInfo::ConstraintInfo &info) const override {
8259 return true;
8260 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008261 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8262 return None;
8263 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008264 BuiltinVaListKind getBuiltinVaListKind() const override {
8265 return TargetInfo::VoidPtrBuiltinVaList;
8266 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008267
Eric Christopherc48497a2015-09-18 21:26:24 +00008268 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008269 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8270 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008271 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008272
Eric Christopherc48497a2015-09-18 21:26:24 +00008273 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8274 return CC_SpirFunction;
8275 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008276
8277 void setSupportedOpenCLOpts() override {
8278 // Assume all OpenCL extensions and optional core features are supported
8279 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008280 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008281 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008282};
Guy Benyeib798fc92012-12-11 21:38:14 +00008283
Eric Christopherc48497a2015-09-18 21:26:24 +00008284class SPIR32TargetInfo : public SPIRTargetInfo {
8285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8287 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008288 PointerWidth = PointerAlign = 32;
8289 SizeType = TargetInfo::UnsignedInt;
8290 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008291 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8292 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008293 }
8294 void getTargetDefines(const LangOptions &Opts,
8295 MacroBuilder &Builder) const override {
8296 DefineStd(Builder, "SPIR32", Opts);
8297 }
8298};
Guy Benyeib798fc92012-12-11 21:38:14 +00008299
Eric Christopherc48497a2015-09-18 21:26:24 +00008300class SPIR64TargetInfo : public SPIRTargetInfo {
8301public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008302 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8303 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008304 PointerWidth = PointerAlign = 64;
8305 SizeType = TargetInfo::UnsignedLong;
8306 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008307 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8308 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008309 }
8310 void getTargetDefines(const LangOptions &Opts,
8311 MacroBuilder &Builder) const override {
8312 DefineStd(Builder, "SPIR64", Opts);
8313 }
8314};
Guy Benyeib798fc92012-12-11 21:38:14 +00008315
Robert Lytton0e076492013-08-13 09:43:10 +00008316class XCoreTargetInfo : public TargetInfo {
8317 static const Builtin::Info BuiltinInfo[];
8318public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8320 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008321 NoAsmVariants = true;
8322 LongLongAlign = 32;
8323 SuitableAlign = 32;
8324 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008325 SizeType = UnsignedInt;
8326 PtrDiffType = SignedInt;
8327 IntPtrType = SignedInt;
8328 WCharType = UnsignedChar;
8329 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008330 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008331 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8332 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008333 }
Craig Topper3164f332014-03-11 03:39:26 +00008334 void getTargetDefines(const LangOptions &Opts,
8335 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008336 Builder.defineMacro("__XS1B__");
8337 }
Craig Topper6c03a542015-10-19 04:51:35 +00008338 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8339 return llvm::makeArrayRef(BuiltinInfo,
8340 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008341 }
Craig Topper3164f332014-03-11 03:39:26 +00008342 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008343 return TargetInfo::VoidPtrBuiltinVaList;
8344 }
Craig Topper3164f332014-03-11 03:39:26 +00008345 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008346 return "";
8347 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008348 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008349 static const char * const GCCRegNames[] = {
8350 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8351 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8352 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008353 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008354 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008355 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8356 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008357 }
Craig Topper3164f332014-03-11 03:39:26 +00008358 bool validateAsmConstraint(const char *&Name,
8359 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008360 return false;
8361 }
Craig Topper3164f332014-03-11 03:39:26 +00008362 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008363 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8364 return (RegNo < 2)? RegNo : -1;
8365 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008366 bool allowsLargerPreferedTypeAlignment() const override {
8367 return false;
8368 }
Robert Lytton0e076492013-08-13 09:43:10 +00008369};
8370
8371const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008372#define BUILTIN(ID, TYPE, ATTRS) \
8373 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8374#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8375 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008376#include "clang/Basic/BuiltinsXCore.def"
8377};
Robert Lytton0e076492013-08-13 09:43:10 +00008378
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008379// x86_32 Android target
8380class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8383 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008384 SuitableAlign = 32;
8385 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008386 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008387 }
8388};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008389
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008390// x86_64 Android target
8391class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8392public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8394 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008395 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008396 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008397
8398 bool useFloat128ManglingForLongDouble() const override {
8399 return true;
8400 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008401};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008402
8403// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8404class RenderScript32TargetInfo : public ARMleTargetInfo {
8405public:
8406 RenderScript32TargetInfo(const llvm::Triple &Triple,
8407 const TargetOptions &Opts)
8408 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8409 Triple.getOSName(),
8410 Triple.getEnvironmentName()),
8411 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008412 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008413 LongWidth = LongAlign = 64;
8414 }
8415 void getTargetDefines(const LangOptions &Opts,
8416 MacroBuilder &Builder) const override {
8417 Builder.defineMacro("__RENDERSCRIPT__");
8418 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8419 }
8420};
8421
8422// 64-bit RenderScript is aarch64
8423class RenderScript64TargetInfo : public AArch64leTargetInfo {
8424public:
8425 RenderScript64TargetInfo(const llvm::Triple &Triple,
8426 const TargetOptions &Opts)
8427 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8428 Triple.getOSName(),
8429 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008430 Opts) {
8431 IsRenderScriptTarget = true;
8432 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008433
8434 void getTargetDefines(const LangOptions &Opts,
8435 MacroBuilder &Builder) const override {
8436 Builder.defineMacro("__RENDERSCRIPT__");
8437 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8438 }
8439};
8440
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008441/// Information about a specific microcontroller.
8442struct MCUInfo {
8443 const char *Name;
8444 const char *DefineName;
8445};
8446
8447// This list should be kept up-to-date with AVRDevices.td in LLVM.
8448static ArrayRef<MCUInfo> AVRMcus = {
8449 { "at90s1200", "__AVR_AT90S1200__" },
8450 { "attiny11", "__AVR_ATtiny11" },
8451 { "attiny12", "__AVR_ATtiny12" },
8452 { "attiny15", "__AVR_ATtiny15" },
8453 { "attiny28", "__AVR_ATtiny28" },
8454 { "at90s2313", "__AVR_AT90S2313" },
8455 { "at90s2323", "__AVR_AT90S2323" },
8456 { "at90s2333", "__AVR_AT90S2333" },
8457 { "at90s2343", "__AVR_AT90S2343" },
8458 { "attiny22", "__AVR_ATtiny22" },
8459 { "attiny26", "__AVR_ATtiny26" },
8460 { "at86rf401", "__AVR_AT86RF401" },
8461 { "at90s4414", "__AVR_AT90S4414" },
8462 { "at90s4433", "__AVR_AT90S4433" },
8463 { "at90s4434", "__AVR_AT90S4434" },
8464 { "at90s8515", "__AVR_AT90S8515" },
8465 { "at90c8534", "__AVR_AT90c8534" },
8466 { "at90s8535", "__AVR_AT90S8535" },
8467 { "ata5272", "__AVR_ATA5272" },
8468 { "attiny13", "__AVR_ATtiny13" },
8469 { "attiny13a", "__AVR_ATtiny13A" },
8470 { "attiny2313", "__AVR_ATtiny2313" },
8471 { "attiny2313a", "__AVR_ATtiny2313A" },
8472 { "attiny24", "__AVR_ATtiny24" },
8473 { "attiny24a", "__AVR_ATtiny24A" },
8474 { "attiny4313", "__AVR_ATtiny4313" },
8475 { "attiny44", "__AVR_ATtiny44" },
8476 { "attiny44a", "__AVR_ATtiny44A" },
8477 { "attiny84", "__AVR_ATtiny84" },
8478 { "attiny84a", "__AVR_ATtiny84A" },
8479 { "attiny25", "__AVR_ATtiny25" },
8480 { "attiny45", "__AVR_ATtiny45" },
8481 { "attiny85", "__AVR_ATtiny85" },
8482 { "attiny261", "__AVR_ATtiny261" },
8483 { "attiny261a", "__AVR_ATtiny261A" },
8484 { "attiny461", "__AVR_ATtiny461" },
8485 { "attiny461a", "__AVR_ATtiny461A" },
8486 { "attiny861", "__AVR_ATtiny861" },
8487 { "attiny861a", "__AVR_ATtiny861A" },
8488 { "attiny87", "__AVR_ATtiny87" },
8489 { "attiny43u", "__AVR_ATtiny43U" },
8490 { "attiny48", "__AVR_ATtiny48" },
8491 { "attiny88", "__AVR_ATtiny88" },
8492 { "attiny828", "__AVR_ATtiny828" },
8493 { "at43usb355", "__AVR_AT43USB355" },
8494 { "at76c711", "__AVR_AT76C711" },
8495 { "atmega103", "__AVR_ATmega103" },
8496 { "at43usb320", "__AVR_AT43USB320" },
8497 { "attiny167", "__AVR_ATtiny167" },
8498 { "at90usb82", "__AVR_AT90USB82" },
8499 { "at90usb162", "__AVR_AT90USB162" },
8500 { "ata5505", "__AVR_ATA5505" },
8501 { "atmega8u2", "__AVR_ATmega8U2" },
8502 { "atmega16u2", "__AVR_ATmega16U2" },
8503 { "atmega32u2", "__AVR_ATmega32U2" },
8504 { "attiny1634", "__AVR_ATtiny1634" },
8505 { "atmega8", "__AVR_ATmega8" },
8506 { "ata6289", "__AVR_ATA6289" },
8507 { "atmega8a", "__AVR_ATmega8A" },
8508 { "ata6285", "__AVR_ATA6285" },
8509 { "ata6286", "__AVR_ATA6286" },
8510 { "atmega48", "__AVR_ATmega48" },
8511 { "atmega48a", "__AVR_ATmega48A" },
8512 { "atmega48pa", "__AVR_ATmega48PA" },
8513 { "atmega48p", "__AVR_ATmega48P" },
8514 { "atmega88", "__AVR_ATmega88" },
8515 { "atmega88a", "__AVR_ATmega88A" },
8516 { "atmega88p", "__AVR_ATmega88P" },
8517 { "atmega88pa", "__AVR_ATmega88PA" },
8518 { "atmega8515", "__AVR_ATmega8515" },
8519 { "atmega8535", "__AVR_ATmega8535" },
8520 { "atmega8hva", "__AVR_ATmega8HVA" },
8521 { "at90pwm1", "__AVR_AT90PWM1" },
8522 { "at90pwm2", "__AVR_AT90PWM2" },
8523 { "at90pwm2b", "__AVR_AT90PWM2B" },
8524 { "at90pwm3", "__AVR_AT90PWM3" },
8525 { "at90pwm3b", "__AVR_AT90PWM3B" },
8526 { "at90pwm81", "__AVR_AT90PWM81" },
8527 { "ata5790", "__AVR_ATA5790" },
8528 { "ata5795", "__AVR_ATA5795" },
8529 { "atmega16", "__AVR_ATmega16" },
8530 { "atmega16a", "__AVR_ATmega16A" },
8531 { "atmega161", "__AVR_ATmega161" },
8532 { "atmega162", "__AVR_ATmega162" },
8533 { "atmega163", "__AVR_ATmega163" },
8534 { "atmega164a", "__AVR_ATmega164A" },
8535 { "atmega164p", "__AVR_ATmega164P" },
8536 { "atmega164pa", "__AVR_ATmega164PA" },
8537 { "atmega165", "__AVR_ATmega165" },
8538 { "atmega165a", "__AVR_ATmega165A" },
8539 { "atmega165p", "__AVR_ATmega165P" },
8540 { "atmega165pa", "__AVR_ATmega165PA" },
8541 { "atmega168", "__AVR_ATmega168" },
8542 { "atmega168a", "__AVR_ATmega168A" },
8543 { "atmega168p", "__AVR_ATmega168P" },
8544 { "atmega168pa", "__AVR_ATmega168PA" },
8545 { "atmega169", "__AVR_ATmega169" },
8546 { "atmega169a", "__AVR_ATmega169A" },
8547 { "atmega169p", "__AVR_ATmega169P" },
8548 { "atmega169pa", "__AVR_ATmega169PA" },
8549 { "atmega32", "__AVR_ATmega32" },
8550 { "atmega32a", "__AVR_ATmega32A" },
8551 { "atmega323", "__AVR_ATmega323" },
8552 { "atmega324a", "__AVR_ATmega324A" },
8553 { "atmega324p", "__AVR_ATmega324P" },
8554 { "atmega324pa", "__AVR_ATmega324PA" },
8555 { "atmega325", "__AVR_ATmega325" },
8556 { "atmega325a", "__AVR_ATmega325A" },
8557 { "atmega325p", "__AVR_ATmega325P" },
8558 { "atmega325pa", "__AVR_ATmega325PA" },
8559 { "atmega3250", "__AVR_ATmega3250" },
8560 { "atmega3250a", "__AVR_ATmega3250A" },
8561 { "atmega3250p", "__AVR_ATmega3250P" },
8562 { "atmega3250pa", "__AVR_ATmega3250PA" },
8563 { "atmega328", "__AVR_ATmega328" },
8564 { "atmega328p", "__AVR_ATmega328P" },
8565 { "atmega329", "__AVR_ATmega329" },
8566 { "atmega329a", "__AVR_ATmega329A" },
8567 { "atmega329p", "__AVR_ATmega329P" },
8568 { "atmega329pa", "__AVR_ATmega329PA" },
8569 { "atmega3290", "__AVR_ATmega3290" },
8570 { "atmega3290a", "__AVR_ATmega3290A" },
8571 { "atmega3290p", "__AVR_ATmega3290P" },
8572 { "atmega3290pa", "__AVR_ATmega3290PA" },
8573 { "atmega406", "__AVR_ATmega406" },
8574 { "atmega64", "__AVR_ATmega64" },
8575 { "atmega64a", "__AVR_ATmega64A" },
8576 { "atmega640", "__AVR_ATmega640" },
8577 { "atmega644", "__AVR_ATmega644" },
8578 { "atmega644a", "__AVR_ATmega644A" },
8579 { "atmega644p", "__AVR_ATmega644P" },
8580 { "atmega644pa", "__AVR_ATmega644PA" },
8581 { "atmega645", "__AVR_ATmega645" },
8582 { "atmega645a", "__AVR_ATmega645A" },
8583 { "atmega645p", "__AVR_ATmega645P" },
8584 { "atmega649", "__AVR_ATmega649" },
8585 { "atmega649a", "__AVR_ATmega649A" },
8586 { "atmega649p", "__AVR_ATmega649P" },
8587 { "atmega6450", "__AVR_ATmega6450" },
8588 { "atmega6450a", "__AVR_ATmega6450A" },
8589 { "atmega6450p", "__AVR_ATmega6450P" },
8590 { "atmega6490", "__AVR_ATmega6490" },
8591 { "atmega6490a", "__AVR_ATmega6490A" },
8592 { "atmega6490p", "__AVR_ATmega6490P" },
8593 { "atmega64rfr2", "__AVR_ATmega64RFR2" },
8594 { "atmega644rfr2", "__AVR_ATmega644RFR2" },
8595 { "atmega16hva", "__AVR_ATmega16HVA" },
8596 { "atmega16hva2", "__AVR_ATmega16HVA2" },
8597 { "atmega16hvb", "__AVR_ATmega16HVB" },
8598 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB" },
8599 { "atmega32hvb", "__AVR_ATmega32HVB" },
8600 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB" },
8601 { "atmega64hve", "__AVR_ATmega64HVE" },
8602 { "at90can32", "__AVR_AT90CAN32" },
8603 { "at90can64", "__AVR_AT90CAN64" },
8604 { "at90pwm161", "__AVR_AT90PWM161" },
8605 { "at90pwm216", "__AVR_AT90PWM216" },
8606 { "at90pwm316", "__AVR_AT90PWM316" },
8607 { "atmega32c1", "__AVR_ATmega32C1" },
8608 { "atmega64c1", "__AVR_ATmega64C1" },
8609 { "atmega16m1", "__AVR_ATmega16M1" },
8610 { "atmega32m1", "__AVR_ATmega32M1" },
8611 { "atmega64m1", "__AVR_ATmega64M1" },
8612 { "atmega16u4", "__AVR_ATmega16U4" },
8613 { "atmega32u4", "__AVR_ATmega32U4" },
8614 { "atmega32u6", "__AVR_ATmega32U6" },
8615 { "at90usb646", "__AVR_AT90USB646" },
8616 { "at90usb647", "__AVR_AT90USB647" },
8617 { "at90scr100", "__AVR_AT90SCR100" },
8618 { "at94k", "__AVR_AT94K" },
8619 { "m3000", "__AVR_AT000" },
8620 { "atmega128", "__AVR_ATmega128" },
8621 { "atmega128a", "__AVR_ATmega128A" },
8622 { "atmega1280", "__AVR_ATmega1280" },
8623 { "atmega1281", "__AVR_ATmega1281" },
8624 { "atmega1284", "__AVR_ATmega1284" },
8625 { "atmega1284p", "__AVR_ATmega1284P" },
8626 { "atmega128rfa1", "__AVR_ATmega128RFA1" },
8627 { "atmega128rfr2", "__AVR_ATmega128RFR2" },
8628 { "atmega1284rfr2", "__AVR_ATmega1284RFR2" },
8629 { "at90can128", "__AVR_AT90CAN128" },
8630 { "at90usb1286", "__AVR_AT90USB1286" },
8631 { "at90usb1287", "__AVR_AT90USB1287" },
8632 { "atmega2560", "__AVR_ATmega2560" },
8633 { "atmega2561", "__AVR_ATmega2561" },
8634 { "atmega256rfr2", "__AVR_ATmega256RFR2" },
8635 { "atmega2564rfr2", "__AVR_ATmega2564RFR2" },
8636 { "atxmega16a4", "__AVR_ATxmega16A4" },
8637 { "atxmega16a4u", "__AVR_ATxmega16a4U" },
8638 { "atxmega16c4", "__AVR_ATxmega16C4" },
8639 { "atxmega16d4", "__AVR_ATxmega16D4" },
8640 { "atxmega32a4", "__AVR_ATxmega32A4" },
8641 { "atxmega32a4u", "__AVR_ATxmega32A4U" },
8642 { "atxmega32c4", "__AVR_ATxmega32C4" },
8643 { "atxmega32d4", "__AVR_ATxmega32D4" },
8644 { "atxmega32e5", "__AVR_ATxmega32E5" },
8645 { "atxmega16e5", "__AVR_ATxmega16E5" },
8646 { "atxmega8e5", "__AVR_ATxmega8E5" },
8647 { "atxmega32x1", "__AVR_ATxmega32X1" },
8648 { "atxmega64a3", "__AVR_ATxmega64A3" },
8649 { "atxmega64a3u", "__AVR_ATxmega64A3U" },
8650 { "atxmega64a4u", "__AVR_ATxmega64A4U" },
8651 { "atxmega64b1", "__AVR_ATxmega64B1" },
8652 { "atxmega64b3", "__AVR_ATxmega64B3" },
8653 { "atxmega64c3", "__AVR_ATxmega64C3" },
8654 { "atxmega64d3", "__AVR_ATxmega64D3" },
8655 { "atxmega64d4", "__AVR_ATxmega64D4" },
8656 { "atxmega64a1", "__AVR_ATxmega64A1" },
8657 { "atxmega64a1u", "__AVR_ATxmega64A1U" },
8658 { "atxmega128a3", "__AVR_ATxmega128A3" },
8659 { "atxmega128a3u", "__AVR_ATxmega128A3U" },
8660 { "atxmega128b1", "__AVR_ATxmega128B1" },
8661 { "atxmega128b3", "__AVR_ATxmega128B3" },
8662 { "atxmega128c3", "__AVR_ATxmega128C3" },
8663 { "atxmega128d3", "__AVR_ATxmega128D3" },
8664 { "atxmega128d4", "__AVR_ATxmega128D4" },
8665 { "atxmega192a3", "__AVR_ATxmega192A3" },
8666 { "atxmega192a3u", "__AVR_ATxmega192A3U" },
8667 { "atxmega192c3", "__AVR_ATxmega192C3" },
8668 { "atxmega192d3", "__AVR_ATxmega192D3" },
8669 { "atxmega256a3", "__AVR_ATxmega256A3" },
8670 { "atxmega256a3u", "__AVR_ATxmega256A3U" },
8671 { "atxmega256a3b", "__AVR_ATxmega256A3B" },
8672 { "atxmega256a3bu", "__AVR_ATxmega256A3BU" },
8673 { "atxmega256c3", "__AVR_ATxmega256C3" },
8674 { "atxmega256d3", "__AVR_ATxmega256D3" },
8675 { "atxmega384c3", "__AVR_ATxmega384C3" },
8676 { "atxmega384d3", "__AVR_ATxmega384D3" },
8677 { "atxmega128a1", "__AVR_ATxmega128A1" },
8678 { "atxmega128a1u", "__AVR_ATxmega128A1U" },
8679 { "atxmega128a4u", "__AVR_ATxmega128a4U" },
8680 { "attiny4", "__AVR_ATtiny4" },
8681 { "attiny5", "__AVR_ATtiny5" },
8682 { "attiny9", "__AVR_ATtiny9" },
8683 { "attiny10", "__AVR_ATtiny10" },
8684 { "attiny20", "__AVR_ATtiny20" },
8685 { "attiny40", "__AVR_ATtiny40" },
8686 { "attiny102", "__AVR_ATtiny102" },
8687 { "attiny104", "__AVR_ATtiny104" },
8688};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008689
8690// AVR Target
8691class AVRTargetInfo : public TargetInfo {
8692public:
8693 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8694 : TargetInfo(Triple) {
8695 TLSSupported = false;
8696 PointerWidth = 16;
8697 PointerAlign = 8;
8698 IntWidth = 16;
8699 IntAlign = 8;
8700 LongWidth = 32;
8701 LongAlign = 8;
8702 LongLongWidth = 64;
8703 LongLongAlign = 8;
8704 SuitableAlign = 8;
8705 DefaultAlignForAttributeAligned = 8;
8706 HalfWidth = 16;
8707 HalfAlign = 8;
8708 FloatWidth = 32;
8709 FloatAlign = 8;
8710 DoubleWidth = 32;
8711 DoubleAlign = 8;
8712 DoubleFormat = &llvm::APFloat::IEEEsingle();
8713 LongDoubleWidth = 32;
8714 LongDoubleAlign = 8;
8715 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8716 SizeType = UnsignedInt;
8717 PtrDiffType = SignedInt;
8718 IntPtrType = SignedInt;
8719 Char16Type = UnsignedInt;
8720 WCharType = SignedInt;
8721 WIntType = SignedInt;
8722 Char32Type = UnsignedLong;
8723 SigAtomicType = SignedChar;
8724 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8725 "-f32:32:32-f64:64:64-n8");
8726 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008727
Dylan McKay924fa3a2017-01-05 05:20:27 +00008728 void getTargetDefines(const LangOptions &Opts,
8729 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008730 Builder.defineMacro("AVR");
8731 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008732 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008733
8734 if (!this->CPU.empty()) {
8735 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8736 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8737
8738 if (It != AVRMcus.end())
8739 Builder.defineMacro(It->DefineName);
8740 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008741 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008742
Dylan McKay924fa3a2017-01-05 05:20:27 +00008743 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8744 return None;
8745 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008746
Dylan McKay924fa3a2017-01-05 05:20:27 +00008747 BuiltinVaListKind getBuiltinVaListKind() const override {
8748 return TargetInfo::VoidPtrBuiltinVaList;
8749 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008750
Dylan McKay924fa3a2017-01-05 05:20:27 +00008751 const char *getClobbers() const override {
8752 return "";
8753 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008754
Dylan McKay924fa3a2017-01-05 05:20:27 +00008755 ArrayRef<const char *> getGCCRegNames() const override {
8756 static const char * const GCCRegNames[] = {
8757 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8758 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8759 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008760 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008761 };
8762 return llvm::makeArrayRef(GCCRegNames);
8763 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008764
Dylan McKay924fa3a2017-01-05 05:20:27 +00008765 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8766 return None;
8767 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008768
Dylan McKay924fa3a2017-01-05 05:20:27 +00008769 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8770 static const TargetInfo::AddlRegName AddlRegNames[] = {
8771 { { "r26", "r27"}, 26 },
8772 { { "r28", "r29"}, 27 },
8773 { { "r30", "r31"}, 28 },
8774 { { "SPL", "SPH"}, 29 },
8775 };
8776 return llvm::makeArrayRef(AddlRegNames);
8777 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008778
Dylan McKay924fa3a2017-01-05 05:20:27 +00008779 bool validateAsmConstraint(const char *&Name,
8780 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008781 // There aren't any multi-character AVR specific constraints.
8782 if (StringRef(Name).size() > 1) return false;
8783
8784 switch (*Name) {
8785 default: return false;
8786 case 'a': // Simple upper registers
8787 case 'b': // Base pointer registers pairs
8788 case 'd': // Upper register
8789 case 'l': // Lower registers
8790 case 'e': // Pointer register pairs
8791 case 'q': // Stack pointer register
8792 case 'r': // Any register
8793 case 'w': // Special upper register pairs
8794 case 't': // Temporary register
8795 case 'x': case 'X': // Pointer register pair X
8796 case 'y': case 'Y': // Pointer register pair Y
8797 case 'z': case 'Z': // Pointer register pair Z
8798 Info.setAllowsRegister();
8799 return true;
8800 case 'I': // 6-bit positive integer constant
8801 Info.setRequiresImmediate(0, 63);
8802 return true;
8803 case 'J': // 6-bit negative integer constant
8804 Info.setRequiresImmediate(-63, 0);
8805 return true;
8806 case 'K': // Integer constant (Range: 2)
8807 Info.setRequiresImmediate(2);
8808 return true;
8809 case 'L': // Integer constant (Range: 0)
8810 Info.setRequiresImmediate(0);
8811 return true;
8812 case 'M': // 8-bit integer constant
8813 Info.setRequiresImmediate(0, 0xff);
8814 return true;
8815 case 'N': // Integer constant (Range: -1)
8816 Info.setRequiresImmediate(-1);
8817 return true;
8818 case 'O': // Integer constant (Range: 8, 16, 24)
8819 Info.setRequiresImmediate({8, 16, 24});
8820 return true;
8821 case 'P': // Integer constant (Range: 1)
8822 Info.setRequiresImmediate(1);
8823 return true;
8824 case 'R': // Integer constant (Range: -6 to 5)
8825 Info.setRequiresImmediate(-6, 5);
8826 return true;
8827 case 'G': // Floating point constant
8828 case 'Q': // A memory address based on Y or Z pointer with displacement.
8829 return true;
8830 }
8831
Dylan McKay924fa3a2017-01-05 05:20:27 +00008832 return false;
8833 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008834
Dylan McKay924fa3a2017-01-05 05:20:27 +00008835 IntType getIntTypeByWidth(unsigned BitWidth,
8836 bool IsSigned) const final {
8837 // AVR prefers int for 16-bit integers.
8838 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8839 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8840 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008841
Dylan McKay924fa3a2017-01-05 05:20:27 +00008842 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8843 bool IsSigned) const final {
8844 // AVR uses int for int_least16_t and int_fast16_t.
8845 return BitWidth == 16
8846 ? (IsSigned ? SignedInt : UnsignedInt)
8847 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8848 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008849
8850 bool setCPU(const std::string &Name) override {
8851 bool IsFamily = llvm::StringSwitch<bool>(Name)
8852 .Case("avr1", true)
8853 .Case("avr2", true)
8854 .Case("avr25", true)
8855 .Case("avr3", true)
8856 .Case("avr31", true)
8857 .Case("avr35", true)
8858 .Case("avr4", true)
8859 .Case("avr5", true)
8860 .Case("avr51", true)
8861 .Case("avr6", true)
8862 .Case("avrxmega1", true)
8863 .Case("avrxmega2", true)
8864 .Case("avrxmega3", true)
8865 .Case("avrxmega4", true)
8866 .Case("avrxmega5", true)
8867 .Case("avrxmega6", true)
8868 .Case("avrxmega7", true)
8869 .Case("avrtiny", true)
8870 .Default(false);
8871
8872 if (IsFamily) this->CPU = Name;
8873
8874 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8875 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8876
8877 if (IsMCU) this->CPU = Name;
8878
8879 return IsFamily || IsMCU;
8880 }
8881
8882protected:
8883 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008884};
8885
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008886} // end anonymous namespace
8887
Chris Lattner5ba61f02006-10-14 07:39:34 +00008888//===----------------------------------------------------------------------===//
8889// Driver code
8890//===----------------------------------------------------------------------===//
8891
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008892static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8893 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008894 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008895
Daniel Dunbar52322032009-08-18 05:47:58 +00008896 switch (Triple.getArch()) {
8897 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008898 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008899
Tim Northover2a0783d2014-05-30 14:14:07 +00008900 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008901 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008902
8903 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008904 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008905
Jacques Pienaard964cc22016-03-28 21:02:54 +00008906 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008907 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008908
Tim Northover2a0783d2014-05-30 14:14:07 +00008909 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008910 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008911 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008912
8913 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008914 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008915 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008916 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008917 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008918 case llvm::Triple::Fuchsia:
8919 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008920 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008921 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008922 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008923 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008924 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008925 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008926 }
8927
Christian Pirker9b019ae2014-02-25 13:51:00 +00008928 case llvm::Triple::aarch64_be:
8929 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008930 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008931 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008932 case llvm::Triple::Fuchsia:
8933 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008934 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008935 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008936 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008937 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008938 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008939 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008940 }
8941
Daniel Dunbar52322032009-08-18 05:47:58 +00008942 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008943 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008944 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008945 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008946
Daniel Dunbar52322032009-08-18 05:47:58 +00008947 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008948 case llvm::Triple::CloudABI:
8949 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008950 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008951 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008952 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008953 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008954 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008955 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008956 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008957 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008958 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008959 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008960 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008961 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008962 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008963 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008964 case llvm::Triple::Win32:
8965 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008966 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008967 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008968 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008969 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008970 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008971 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008972 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008973 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008974 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008975 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008976 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008977 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008978 }
8979
8980 case llvm::Triple::armeb:
8981 case llvm::Triple::thumbeb:
8982 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008983 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008984
8985 switch (os) {
8986 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008987 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008988 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008989 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008990 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008991 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008992 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008993 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008994 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008995 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008996 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008997 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008998 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008999 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009000 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009001 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009002 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009003
Dylan McKay924fa3a2017-01-05 05:20:27 +00009004 case llvm::Triple::avr:
9005 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009006 case llvm::Triple::bpfeb:
9007 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009008 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009009
Daniel Dunbar52322032009-08-18 05:47:58 +00009010 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009011 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009012
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009013 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009014 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009015 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009016 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009017 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009018 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009019 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009020 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009021 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009022 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009023 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009024 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009025 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009026
9027 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009028 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009029 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009030 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009031 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009032 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009033 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009034 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009035 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009036 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009037 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009038 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009039 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009040 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009041 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009042
Akira Hatanakabef17452011-09-20 19:21:49 +00009043 case llvm::Triple::mips64:
9044 switch (os) {
9045 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009046 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009047 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009048 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009049 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009050 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009051 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009052 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009053 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009054 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009055 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009056 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009057 }
9058
9059 case llvm::Triple::mips64el:
9060 switch (os) {
9061 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009062 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009063 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009064 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009065 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009066 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009067 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009068 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009069 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009070 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009071 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009072 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009073 }
9074
Ivan Krasindd7403e2011-08-24 20:22:22 +00009075 case llvm::Triple::le32:
9076 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009077 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009078 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009079 default:
9080 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009081 }
9082
JF Bastien643817d2014-09-12 17:52:47 +00009083 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009084 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009085
Daniel Dunbar52322032009-08-18 05:47:58 +00009086 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009087 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009088 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009089 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009090 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009091 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009092 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009093 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009094 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009095 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009096 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009097 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009098 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009099 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009100 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009102 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009103
9104 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009105 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009106 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009107 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009108 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009109 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009110 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009111 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009112 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009113 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009114 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009115 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009116 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009117 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009118 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009119
Bill Schmidt778d3872013-07-26 01:36:11 +00009120 case llvm::Triple::ppc64le:
9121 switch (os) {
9122 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009123 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009124 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009125 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009126 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009127 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009128 }
9129
Peter Collingbournec947aae2012-05-20 23:28:41 +00009130 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009131 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009132 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009133 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009134
Tom Stellardd8e38a32015-01-06 20:34:47 +00009135 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009136 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009137 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009138
Daniel Dunbar52322032009-08-18 05:47:58 +00009139 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009140 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009141 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009142 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009143 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009144 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009145 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009146 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009147 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009148 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009149 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009151 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009153 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009154
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009155 // The 'sparcel' architecture copies all the above cases except for Solaris.
9156 case llvm::Triple::sparcel:
9157 switch (os) {
9158 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009159 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009160 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009161 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009162 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009163 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009164 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009165 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009166 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009167 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009168 }
9169
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009170 case llvm::Triple::sparcv9:
9171 switch (os) {
9172 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009173 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009174 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009175 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009176 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009177 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009178 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009179 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009180 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009181 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009182 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009183 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009184 }
9185
Ulrich Weigand47445072013-05-06 16:26:41 +00009186 case llvm::Triple::systemz:
9187 switch (os) {
9188 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009189 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009190 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009191 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009192 }
9193
Eli Friedmana9c3d712009-08-19 20:47:07 +00009194 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009195 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009196
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009197 case llvm::Triple::tcele:
9198 return new TCELETargetInfo(Triple, Opts);
9199
Daniel Dunbar52322032009-08-18 05:47:58 +00009200 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009201 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009202 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009203
Daniel Dunbar52322032009-08-18 05:47:58 +00009204 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009205 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009206 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009207 case llvm::Triple::Linux: {
9208 switch (Triple.getEnvironment()) {
9209 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009210 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009211 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009212 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009213 }
9214 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009215 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009216 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009217 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009218 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009219 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009220 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009221 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009222 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009223 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009224 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009225 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009226 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009227 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009228 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009229 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009230 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009231 case llvm::Triple::Win32: {
9232 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009233 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009234 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009235 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009236 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009237 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009238 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009239 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009240 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009241 }
9242 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009243 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009244 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009245 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009246 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009247 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009248 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009249 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009250 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009251 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009253 }
9254
9255 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009256 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009257 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009258
Daniel Dunbar52322032009-08-18 05:47:58 +00009259 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009260 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009261 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009262 case llvm::Triple::Linux: {
9263 switch (Triple.getEnvironment()) {
9264 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009265 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009266 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009267 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009268 }
9269 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009270 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009271 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009272 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009274 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009276 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009277 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009278 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009279 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009280 case llvm::Triple::Fuchsia:
9281 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009282 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009284 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009285 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009286 case llvm::Triple::Win32: {
9287 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009288 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009289 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009290 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009292 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009293 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009294 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009295 }
9296 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009297 case llvm::Triple::Haiku:
9298 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009299 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009300 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009301 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009303 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009304 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009305 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009306
Douglas Katzman78d7c542015-05-12 21:18:10 +00009307 case llvm::Triple::spir: {
9308 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9309 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9310 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009311 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009312 }
9313 case llvm::Triple::spir64: {
9314 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9315 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9316 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009317 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009318 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009319 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009320 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9321 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9322 Triple.getOS() != llvm::Triple::UnknownOS ||
9323 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9324 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009325 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009326 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009327 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009328 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9329 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9330 Triple.getOS() != llvm::Triple::UnknownOS ||
9331 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9332 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009333 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009335
9336 case llvm::Triple::renderscript32:
9337 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9338 case llvm::Triple::renderscript64:
9339 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009340 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009341}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009342
9343/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009344/// options.
Alp Toker80758082014-07-06 05:26:44 +00009345TargetInfo *
9346TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009347 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009348 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009349
9350 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009351 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009352 if (!Target) {
9353 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009354 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009355 }
Alp Toker80758082014-07-06 05:26:44 +00009356 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009357
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009358 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009359 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9360 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009361 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009362 }
9363
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009364 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009365 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9366 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009367 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009368 }
9369
Rafael Espindolaeb265472013-08-21 21:59:03 +00009370 // Set the fp math unit.
9371 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9372 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009373 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009374 }
9375
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009376 // Compute the default target features, we need the target to handle this
9377 // because features may have dependencies on one another.
9378 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009379 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9380 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009381 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009382
9383 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009384 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009385 for (const auto &F : Features)
9386 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9387
Eric Christopher3ff21b32013-10-16 21:26:26 +00009388 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009389 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009390
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009391 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009392 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009393
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009394 if (!Target->validateTarget(Diags))
9395 return nullptr;
9396
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009397 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009398}