blob: cbda245218c59484e3c64d399552110c89dc8204 [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__");
309 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__");
346 DefineStd(Builder, "unix", Opts);
347 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
391 DefineStd(Builder, "unix", Opts);
392 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__");
414 DefineStd(Builder, "unix", Opts);
415 }
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__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
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
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 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);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000809 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000873
Ulrich Weigand8afad612014-07-28 13:17:52 +0000874protected:
875 std::string ABI;
876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000878 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000879 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
880 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000881 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000882 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001161 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001162 // TODO: Finish this list and add an assert that we've handled them
1163 // all.
1164 }
Eric Christopher02c33352015-08-25 00:59:11 +00001165
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001166 return true;
1167}
1168
Chris Lattnerecd49032009-03-02 22:27:17 +00001169/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1170/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001171void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001172 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001173 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001175 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001177 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001179 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001181 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001183 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001184 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001185
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001187 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1188 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 } else {
1190 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1191 getTriple().getOS() != llvm::Triple::OpenBSD)
1192 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001193 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194
Ulrich Weigand8afad612014-07-28 13:17:52 +00001195 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001196 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 Builder.defineMacro("_CALL_ELF", "1");
1198 if (ABI == "elfv2")
1199 Builder.defineMacro("_CALL_ELF", "2");
1200
Chris Lattnerecd49032009-03-02 22:27:17 +00001201 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1203 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001204
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001206 if (LongDoubleWidth == 128)
1207 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001208
John Thompsone467e192009-11-19 17:18:50 +00001209 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__VEC__", "10206");
1211 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001212 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001213
1214 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1216 .Case("440", ArchDefineName)
1217 .Case("450", ArchDefineName | ArchDefine440)
1218 .Case("601", ArchDefineName)
1219 .Case("602", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603", ArchDefineName | ArchDefinePpcgr)
1221 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1223 .Case("604", ArchDefineName | ArchDefinePpcgr)
1224 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1225 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001226 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001227 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1228 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1229 .Case("750", ArchDefineName | ArchDefinePpcgr)
1230 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001232 .Case("a2", ArchDefineA2)
1233 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001234 .Case("pwr3", ArchDefinePpcgr)
1235 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1237 | ArchDefinePpcsq)
1238 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1239 | ArchDefinePpcgr | ArchDefinePpcsq)
1240 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1241 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1243 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1244 | ArchDefinePpcsq)
1245 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1246 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001247 | ArchDefinePpcgr | ArchDefinePpcsq)
1248 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1249 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1250 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001251 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1252 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1253 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1254 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power3", ArchDefinePpcgr)
1256 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1257 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1258 | ArchDefinePpcsq)
1259 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1260 | ArchDefinePpcgr | ArchDefinePpcsq)
1261 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1262 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1264 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1265 | ArchDefinePpcsq)
1266 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1267 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001268 | ArchDefinePpcgr | ArchDefinePpcsq)
1269 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1270 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1271 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001272 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1273 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1274 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1275 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001276 .Default(ArchDefineNone);
1277
1278 if (defs & ArchDefineName)
1279 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1280 if (defs & ArchDefinePpcgr)
1281 Builder.defineMacro("_ARCH_PPCGR");
1282 if (defs & ArchDefinePpcsq)
1283 Builder.defineMacro("_ARCH_PPCSQ");
1284 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001285 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001286 if (defs & ArchDefine603)
1287 Builder.defineMacro("_ARCH_603");
1288 if (defs & ArchDefine604)
1289 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001290 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001291 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5x)
1295 Builder.defineMacro("_ARCH_PWR5X");
1296 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001297 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001298 if (defs & ArchDefinePwr6x)
1299 Builder.defineMacro("_ARCH_PWR6X");
1300 if (defs & ArchDefinePwr7)
1301 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001302 if (defs & ArchDefinePwr8)
1303 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001304 if (defs & ArchDefinePwr9)
1305 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001306 if (defs & ArchDefineA2)
1307 Builder.defineMacro("_ARCH_A2");
1308 if (defs & ArchDefineA2q) {
1309 Builder.defineMacro("_ARCH_A2Q");
1310 Builder.defineMacro("_ARCH_QP");
1311 }
1312
1313 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1314 Builder.defineMacro("__bg__");
1315 Builder.defineMacro("__THW_BLUEGENE__");
1316 Builder.defineMacro("__bgq__");
1317 Builder.defineMacro("__TOS_BGQ__");
1318 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001319
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001320 if (HasVSX)
1321 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001322 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001323 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001324 if (HasP8Crypto)
1325 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001326 if (HasHTM)
1327 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001328 if (HasFloat128)
1329 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001330
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1334 if (PointerWidth == 64)
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001336
Bill Schmidt38378a02013-02-01 20:23:10 +00001337 // FIXME: The following are not yet generated here by Clang, but are
1338 // generated by GCC:
1339 //
1340 // _SOFT_FLOAT_
1341 // __RECIP_PRECISION__
1342 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001343 // __RECIP__
1344 // __RECIPF__
1345 // __RSQRTE__
1346 // __RSQRTEF__
1347 // _SOFT_DOUBLE_
1348 // __NO_LWSYNC__
1349 // __HAVE_BSWAP__
1350 // __LONGDOUBLE128
1351 // __CMODEL_MEDIUM__
1352 // __CMODEL_LARGE__
1353 // _CALL_SYSV
1354 // _CALL_DARWIN
1355 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001356}
1357
Eric Christophera8a14c32015-08-31 18:39:16 +00001358// Handle explicit options being passed to the compiler here: if we've
1359// explicitly turned off vsx and turned on power8-vector or direct-move then
1360// go ahead and error since the customer has expressed a somewhat incompatible
1361// set of options.
1362static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001363 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001364
1365 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1366 FeaturesVec.end()) {
1367 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1368 FeaturesVec.end()) {
1369 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1370 << "-mno-vsx";
1371 return false;
1372 }
1373
1374 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1375 FeaturesVec.end()) {
1376 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1377 << "-mno-vsx";
1378 return false;
1379 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001380
1381 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1382 FeaturesVec.end()) {
1383 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1384 << "-mno-vsx";
1385 return false;
1386 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001387 }
1388
1389 return true;
1390}
1391
Eric Christopher8c47b422015-10-09 18:39:55 +00001392bool PPCTargetInfo::initFeatureMap(
1393 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1394 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001395 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1396 .Case("7400", true)
1397 .Case("g4", true)
1398 .Case("7450", true)
1399 .Case("g4+", true)
1400 .Case("970", true)
1401 .Case("g5", true)
1402 .Case("pwr6", true)
1403 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001404 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001405 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001406 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001407 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001408 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001409
1410 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001411 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001414 .Case("pwr8", true)
1415 .Default(false);
1416 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1417 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001418 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001419 .Case("pwr8", true)
1420 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001421 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1422 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001423 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001424 .Case("pwr8", true)
1425 .Case("pwr7", true)
1426 .Default(false);
1427 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001430 .Case("pwr8", true)
1431 .Case("pwr7", true)
1432 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001433 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1434 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001435 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001436 .Case("pwr8", true)
1437 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001438 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1439 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001440 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001441 .Case("pwr8", true)
1442 .Case("pwr7", true)
1443 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001444
Eric Christophera8a14c32015-08-31 18:39:16 +00001445 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1446 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001447
Eric Christopher007b0a02015-08-28 22:32:01 +00001448 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001449}
1450
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001451bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001452 return llvm::StringSwitch<bool>(Feature)
1453 .Case("powerpc", true)
1454 .Case("vsx", HasVSX)
1455 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001456 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001457 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001458 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001459 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001460 .Case("bpermd", HasBPERMD)
1461 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001462 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001463 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001464}
Chris Lattner17df24e2008-04-21 18:56:49 +00001465
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001466void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1467 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001468 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1469 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1470 // incompatible options.
1471 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001472 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001473 Features[Name] = Features["vsx"] = true;
1474 } else if (Name == "power8-vector") {
1475 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001476 } else if (Name == "float128") {
1477 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001478 } else {
1479 Features[Name] = true;
1480 }
1481 } else {
1482 if (Name == "vsx") {
1483 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001484 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 } else {
1486 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001487 }
1488 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001489}
1490
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001491const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1494 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1495 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1496 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1497 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1498 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1499 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001500 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001501 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001502 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001503 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1504 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1505 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1506 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507 "vrsave", "vscr",
1508 "spe_acc", "spefscr",
1509 "sfp"
1510};
Chris Lattner10a5b382007-01-29 05:24:35 +00001511
Craig Topperf054e3a2015-10-19 03:52:27 +00001512ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1513 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001514}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001515
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001516const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1517 // While some of these aliases do map to different registers
1518 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001519 { { "0" }, "r0" },
1520 { { "1"}, "r1" },
1521 { { "2" }, "r2" },
1522 { { "3" }, "r3" },
1523 { { "4" }, "r4" },
1524 { { "5" }, "r5" },
1525 { { "6" }, "r6" },
1526 { { "7" }, "r7" },
1527 { { "8" }, "r8" },
1528 { { "9" }, "r9" },
1529 { { "10" }, "r10" },
1530 { { "11" }, "r11" },
1531 { { "12" }, "r12" },
1532 { { "13" }, "r13" },
1533 { { "14" }, "r14" },
1534 { { "15" }, "r15" },
1535 { { "16" }, "r16" },
1536 { { "17" }, "r17" },
1537 { { "18" }, "r18" },
1538 { { "19" }, "r19" },
1539 { { "20" }, "r20" },
1540 { { "21" }, "r21" },
1541 { { "22" }, "r22" },
1542 { { "23" }, "r23" },
1543 { { "24" }, "r24" },
1544 { { "25" }, "r25" },
1545 { { "26" }, "r26" },
1546 { { "27" }, "r27" },
1547 { { "28" }, "r28" },
1548 { { "29" }, "r29" },
1549 { { "30" }, "r30" },
1550 { { "31" }, "r31" },
1551 { { "fr0" }, "f0" },
1552 { { "fr1" }, "f1" },
1553 { { "fr2" }, "f2" },
1554 { { "fr3" }, "f3" },
1555 { { "fr4" }, "f4" },
1556 { { "fr5" }, "f5" },
1557 { { "fr6" }, "f6" },
1558 { { "fr7" }, "f7" },
1559 { { "fr8" }, "f8" },
1560 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001561 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "fr11" }, "f11" },
1563 { { "fr12" }, "f12" },
1564 { { "fr13" }, "f13" },
1565 { { "fr14" }, "f14" },
1566 { { "fr15" }, "f15" },
1567 { { "fr16" }, "f16" },
1568 { { "fr17" }, "f17" },
1569 { { "fr18" }, "f18" },
1570 { { "fr19" }, "f19" },
1571 { { "fr20" }, "f20" },
1572 { { "fr21" }, "f21" },
1573 { { "fr22" }, "f22" },
1574 { { "fr23" }, "f23" },
1575 { { "fr24" }, "f24" },
1576 { { "fr25" }, "f25" },
1577 { { "fr26" }, "f26" },
1578 { { "fr27" }, "f27" },
1579 { { "fr28" }, "f28" },
1580 { { "fr29" }, "f29" },
1581 { { "fr30" }, "f30" },
1582 { { "fr31" }, "f31" },
1583 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001584};
1585
Craig Topperf054e3a2015-10-19 03:52:27 +00001586ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1587 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001588}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001589
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001590class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001592 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1593 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001594 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001595
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001596 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001597 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001598 case llvm::Triple::FreeBSD:
1599 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001600 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001601 PtrDiffType = SignedInt;
1602 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001603 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001604 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001605 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001606 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001607
Roman Divacky3ffe7462012-03-13 19:20:17 +00001608 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1609 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001610 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001611 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001612
1613 // PPC32 supports atomics up to 4 bytes.
1614 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001615 }
1616
Craig Topper3164f332014-03-11 03:39:26 +00001617 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001618 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001619 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001620 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001622
Bill Schmidt778d3872013-07-26 01:36:11 +00001623// Note: ABI differences may eventually require us to have a separate
1624// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001626public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001627 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1628 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001631 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001632
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001633 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001634 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001635 ABI = "elfv2";
1636 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001638 ABI = "elfv1";
1639 }
1640
1641 switch (getTriple().getOS()) {
1642 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001643 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001644 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001645 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001646 case llvm::Triple::NetBSD:
1647 IntMaxType = SignedLongLong;
1648 Int64Type = SignedLongLong;
1649 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001650 default:
1651 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC64 supports atomics up to 8 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001656 }
Craig Topper3164f332014-03-11 03:39:26 +00001657 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001658 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001660 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001661 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001662 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001663 ABI = Name;
1664 return true;
1665 }
1666 return false;
1667 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001669
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001672 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1673 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001674 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001675 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001676 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001677 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001678 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001680 }
Craig Topper3164f332014-03-11 03:39:26 +00001681 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001682 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001683 }
1684};
1685
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001686class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001687public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001688 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1689 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001691 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001692 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 }
1694};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001695
Eric Christopherc48497a2015-09-18 21:26:24 +00001696static const unsigned NVPTXAddrSpaceMap[] = {
1697 1, // opencl_global
1698 3, // opencl_local
1699 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001700 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001701 0, // opencl_generic
1702 1, // cuda_device
1703 4, // cuda_constant
1704 3, // cuda_shared
1705};
1706
1707class NVPTXTargetInfo : public TargetInfo {
1708 static const char *const GCCRegNames[];
1709 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001710 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001711
Eric Christopherc48497a2015-09-18 21:26:24 +00001712public:
Justin Lebar76945b22016-04-29 23:05:19 +00001713 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001714 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001715 BigEndian = false;
1716 TLSSupported = false;
1717 LongWidth = LongAlign = 64;
1718 AddrSpaceMap = &NVPTXAddrSpaceMap;
1719 UseAddrSpaceMapMangling = true;
1720 // Define available target features
1721 // These must be defined in sorted order!
1722 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001723 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001724
1725 // If possible, get a TargetInfo for our host triple, so we can match its
1726 // types.
1727 llvm::Triple HostTriple(Opts.HostTriple);
1728 if (HostTriple.isNVPTX())
1729 return;
1730 std::unique_ptr<TargetInfo> HostTarget(
1731 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1732 if (!HostTarget) {
1733 return;
1734 }
1735
1736 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1737 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1738 BoolWidth = HostTarget->getBoolWidth();
1739 BoolAlign = HostTarget->getBoolAlign();
1740 IntWidth = HostTarget->getIntWidth();
1741 IntAlign = HostTarget->getIntAlign();
1742 HalfWidth = HostTarget->getHalfWidth();
1743 HalfAlign = HostTarget->getHalfAlign();
1744 FloatWidth = HostTarget->getFloatWidth();
1745 FloatAlign = HostTarget->getFloatAlign();
1746 DoubleWidth = HostTarget->getDoubleWidth();
1747 DoubleAlign = HostTarget->getDoubleAlign();
1748 LongWidth = HostTarget->getLongWidth();
1749 LongAlign = HostTarget->getLongAlign();
1750 LongLongWidth = HostTarget->getLongLongWidth();
1751 LongLongAlign = HostTarget->getLongLongAlign();
1752 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1753 DefaultAlignForAttributeAligned =
1754 HostTarget->getDefaultAlignForAttributeAligned();
1755 SizeType = HostTarget->getSizeType();
1756 IntMaxType = HostTarget->getIntMaxType();
1757 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1758 IntPtrType = HostTarget->getIntPtrType();
1759 WCharType = HostTarget->getWCharType();
1760 WIntType = HostTarget->getWIntType();
1761 Char16Type = HostTarget->getChar16Type();
1762 Char32Type = HostTarget->getChar32Type();
1763 Int64Type = HostTarget->getInt64Type();
1764 SigAtomicType = HostTarget->getSigAtomicType();
1765 ProcessIDType = HostTarget->getProcessIDType();
1766
1767 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1768 UseZeroLengthBitfieldAlignment =
1769 HostTarget->useZeroLengthBitfieldAlignment();
1770 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1771 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1772
1773 // Properties intentionally not copied from host:
1774 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1775 // host/device boundary.
1776 // - SuitableAlign: Not visible across the host/device boundary, and may
1777 // correctly be different on host/device, e.g. if host has wider vector
1778 // types than device.
1779 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1780 // as its double type, but that's not necessarily true on the host.
1781 // TODO: nvcc emits a warning when using long double on device; we should
1782 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 }
1784 void getTargetDefines(const LangOptions &Opts,
1785 MacroBuilder &Builder) const override {
1786 Builder.defineMacro("__PTX__");
1787 Builder.defineMacro("__NVPTX__");
1788 if (Opts.CUDAIsDevice) {
1789 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001790 std::string CUDAArchCode = [this] {
1791 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001792 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001793 assert(false && "No GPU arch when compiling CUDA device code.");
1794 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001795 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001796 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001797 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001798 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "620";
1819 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001820 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001821 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001822 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001823 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001824 }
Craig Topper6c03a542015-10-19 04:51:35 +00001825 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1826 return llvm::makeArrayRef(BuiltinInfo,
1827 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
1829 bool hasFeature(StringRef Feature) const override {
1830 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001831 }
1832
Craig Topperf054e3a2015-10-19 03:52:27 +00001833 ArrayRef<const char *> getGCCRegNames() const override;
1834 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001835 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001836 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001837 }
1838 bool validateAsmConstraint(const char *&Name,
1839 TargetInfo::ConstraintInfo &Info) const override {
1840 switch (*Name) {
1841 default:
1842 return false;
1843 case 'c':
1844 case 'h':
1845 case 'r':
1846 case 'l':
1847 case 'f':
1848 case 'd':
1849 Info.setAllowsRegister();
1850 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001851 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
1853 const char *getClobbers() const override {
1854 // FIXME: Is this really right?
1855 return "";
1856 }
1857 BuiltinVaListKind getBuiltinVaListKind() const override {
1858 // FIXME: implement
1859 return TargetInfo::CharPtrBuiltinVaList;
1860 }
1861 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001862 GPU = StringToCudaArch(Name);
1863 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001864 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001865 void setSupportedOpenCLOpts() override {
1866 auto &Opts = getSupportedOpenCLOpts();
1867 Opts.cl_clang_storage_class_specifiers = 1;
1868 Opts.cl_khr_gl_sharing = 1;
1869 Opts.cl_khr_icd = 1;
1870
1871 Opts.cl_khr_fp64 = 1;
1872 Opts.cl_khr_byte_addressable_store = 1;
1873 Opts.cl_khr_global_int32_base_atomics = 1;
1874 Opts.cl_khr_global_int32_extended_atomics = 1;
1875 Opts.cl_khr_local_int32_base_atomics = 1;
1876 Opts.cl_khr_local_int32_extended_atomics = 1;
1877 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001878};
1879
1880const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1881#define BUILTIN(ID, TYPE, ATTRS) \
1882 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1884 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1885#include "clang/Basic/BuiltinsNVPTX.def"
1886};
1887
1888const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1889
Craig Topperf054e3a2015-10-19 03:52:27 +00001890ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1891 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001892}
1893
1894class NVPTX32TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001898 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 PointerWidth = PointerAlign = 32;
1900 SizeType = TargetInfo::UnsignedInt;
1901 PtrDiffType = TargetInfo::SignedInt;
1902 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001903 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
1905};
1906
1907class NVPTX64TargetInfo : public NVPTXTargetInfo {
1908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001909 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1910 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 PointerWidth = PointerAlign = 64;
1912 SizeType = TargetInfo::UnsignedLong;
1913 PtrDiffType = TargetInfo::SignedLong;
1914 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001915 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001916 }
1917};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001918
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001919static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001920 1, // opencl_global
1921 3, // opencl_local
1922 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001923 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // cuda_device
1925 2, // cuda_constant
1926 3 // cuda_shared
1927};
1928
Tom Stellarda96344b2014-08-21 13:58:40 +00001929// If you edit the description strings, make sure you update
1930// getPointerWidthV().
1931
Craig Topper273dbc62015-10-18 05:29:26 +00001932static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001933 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1934 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001937 "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 +00001938 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1939 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001940
Matt Arsenault250024f2016-06-08 01:56:42 +00001941class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001942 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001943 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001944
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001945 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 enum GPUKind {
1947 GK_NONE,
1948 GK_R600,
1949 GK_R600_DOUBLE_OPS,
1950 GK_R700,
1951 GK_R700_DOUBLE_OPS,
1952 GK_EVERGREEN,
1953 GK_EVERGREEN_DOUBLE_OPS,
1954 GK_NORTHERN_ISLANDS,
1955 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001956 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001957 GK_SEA_ISLANDS,
1958 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959 } GPU;
1960
Jan Veselyeebeaea2015-05-04 19:53:36 +00001961 bool hasFP64:1;
1962 bool hasFMAF:1;
1963 bool hasLDEXPF:1;
Yaxun Liu2c17e822016-08-09 19:43:38 +00001964 bool hasDenormSupport:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001965
Matt Arsenault250024f2016-06-08 01:56:42 +00001966 static bool isAMDGCN(const llvm::Triple &TT) {
1967 return TT.getArch() == llvm::Triple::amdgcn;
1968 }
1969
Eli Friedmand13b41e2012-10-12 23:32:00 +00001970public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001971 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001972 : TargetInfo(Triple) ,
1973 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1974 hasFP64(false),
1975 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001976 hasLDEXPF(false),
1977 hasDenormSupport(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001979 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001980 hasFMAF = true;
1981 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001982 }
Yaxun Liu2c17e822016-08-09 19:43:38 +00001983 if (Opts.CPU == "fiji")
1984 hasDenormSupport = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00001985
1986 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1987 DataLayoutStringSI : DataLayoutStringR600);
1988
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001989 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001990 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 }
1992
Tom Stellarda96344b2014-08-21 13:58:40 +00001993 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1994 if (GPU <= GK_CAYMAN)
1995 return 32;
1996
1997 switch(AddrSpace) {
1998 default:
1999 return 64;
2000 case 0:
2001 case 3:
2002 case 5:
2003 return 32;
2004 }
2005 }
2006
Craig Topper3164f332014-03-11 03:39:26 +00002007 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002008 return "";
2009 }
2010
Craig Topperf054e3a2015-10-19 03:52:27 +00002011 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002012
Craig Topperf054e3a2015-10-19 03:52:27 +00002013 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2014 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002015 }
2016
Craig Topper3164f332014-03-11 03:39:26 +00002017 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002018 TargetInfo::ConstraintInfo &Info) const override {
2019 switch (*Name) {
2020 default: break;
2021 case 'v': // vgpr
2022 case 's': // sgpr
2023 Info.setAllowsRegister();
2024 return true;
2025 }
2026 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002027 }
2028
Matt Arsenault250024f2016-06-08 01:56:42 +00002029 bool initFeatureMap(llvm::StringMap<bool> &Features,
2030 DiagnosticsEngine &Diags, StringRef CPU,
2031 const std::vector<std::string> &FeatureVec) const override;
2032
Yaxun Liu2c17e822016-08-09 19:43:38 +00002033 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2034 TargetOptions &TargetOpts) const override {
2035 if (!hasDenormSupport)
2036 return;
2037 bool hasFP32Denormals = false;
2038 bool hasFP64Denormals = false;
2039 for (auto &I : TargetOpts.FeaturesAsWritten) {
2040 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2041 hasFP32Denormals = true;
2042 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2043 hasFP64Denormals = true;
2044 }
2045 if (!hasFP32Denormals)
2046 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2047 Twine("fp32-denormals")).str());
2048 if (!hasFP64Denormals && hasFP64)
2049 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2050 Twine("fp64-denormals")).str());
2051 }
2052
Craig Topper6c03a542015-10-19 04:51:35 +00002053 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2054 return llvm::makeArrayRef(BuiltinInfo,
2055 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002056 }
2057
Craig Topper3164f332014-03-11 03:39:26 +00002058 void getTargetDefines(const LangOptions &Opts,
2059 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002060 if (getTriple().getArch() == llvm::Triple::amdgcn)
2061 Builder.defineMacro("__AMDGCN__");
2062 else
2063 Builder.defineMacro("__R600__");
2064
Jan Veselyeebeaea2015-05-04 19:53:36 +00002065 if (hasFMAF)
2066 Builder.defineMacro("__HAS_FMAF__");
2067 if (hasLDEXPF)
2068 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002069 if (hasFP64)
2070 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002071 }
2072
Craig Topper3164f332014-03-11 03:39:26 +00002073 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074 return TargetInfo::CharPtrBuiltinVaList;
2075 }
2076
Matt Arsenault250024f2016-06-08 01:56:42 +00002077 static GPUKind parseR600Name(StringRef Name) {
2078 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002079 .Case("r600" , GK_R600)
2080 .Case("rv610", GK_R600)
2081 .Case("rv620", GK_R600)
2082 .Case("rv630", GK_R600)
2083 .Case("rv635", GK_R600)
2084 .Case("rs780", GK_R600)
2085 .Case("rs880", GK_R600)
2086 .Case("rv670", GK_R600_DOUBLE_OPS)
2087 .Case("rv710", GK_R700)
2088 .Case("rv730", GK_R700)
2089 .Case("rv740", GK_R700_DOUBLE_OPS)
2090 .Case("rv770", GK_R700_DOUBLE_OPS)
2091 .Case("palm", GK_EVERGREEN)
2092 .Case("cedar", GK_EVERGREEN)
2093 .Case("sumo", GK_EVERGREEN)
2094 .Case("sumo2", GK_EVERGREEN)
2095 .Case("redwood", GK_EVERGREEN)
2096 .Case("juniper", GK_EVERGREEN)
2097 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2098 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2099 .Case("barts", GK_NORTHERN_ISLANDS)
2100 .Case("turks", GK_NORTHERN_ISLANDS)
2101 .Case("caicos", GK_NORTHERN_ISLANDS)
2102 .Case("cayman", GK_CAYMAN)
2103 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002104 .Default(GK_NONE);
2105 }
2106
2107 static GPUKind parseAMDGCNName(StringRef Name) {
2108 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002109 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002110 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2111 .Case("verde", GK_SOUTHERN_ISLANDS)
2112 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002113 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002114 .Case("bonaire", GK_SEA_ISLANDS)
2115 .Case("kabini", GK_SEA_ISLANDS)
2116 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002117 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002118 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002119 .Case("tonga", GK_VOLCANIC_ISLANDS)
2120 .Case("iceland", GK_VOLCANIC_ISLANDS)
2121 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002122 .Case("fiji", GK_VOLCANIC_ISLANDS)
2123 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002124 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002125 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002126
Matt Arsenault250024f2016-06-08 01:56:42 +00002127 bool setCPU(const std::string &Name) override {
2128 if (getTriple().getArch() == llvm::Triple::amdgcn)
2129 GPU = parseAMDGCNName(Name);
2130 else
2131 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002132
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002134 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002135
Jan Vesely211ba782016-06-17 02:25:03 +00002136 void setSupportedOpenCLOpts() override {
2137 auto &Opts = getSupportedOpenCLOpts();
2138 Opts.cl_clang_storage_class_specifiers = 1;
2139 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002140
Jan Vesely211ba782016-06-17 02:25:03 +00002141 if (hasFP64)
2142 Opts.cl_khr_fp64 = 1;
2143 if (GPU >= GK_EVERGREEN) {
2144 Opts.cl_khr_byte_addressable_store = 1;
2145 Opts.cl_khr_global_int32_base_atomics = 1;
2146 Opts.cl_khr_global_int32_extended_atomics = 1;
2147 Opts.cl_khr_local_int32_base_atomics = 1;
2148 Opts.cl_khr_local_int32_extended_atomics = 1;
2149 }
2150 if (GPU >= GK_SOUTHERN_ISLANDS) {
2151 Opts.cl_khr_fp16 = 1;
2152 Opts.cl_khr_int64_base_atomics = 1;
2153 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002154 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002155 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002156 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002157 Opts.cl_amd_media_ops = 1;
2158 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002159 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002160 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002161
Yaxun Liu99444cb2016-08-03 20:38:06 +00002162 LangAS::ID getOpenCLImageAddrSpace() const override {
2163 return LangAS::opencl_constant;
2164 }
2165
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002166 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2167 switch (CC) {
2168 default:
2169 return CCCR_Warning;
2170 case CC_C:
2171 case CC_OpenCLKernel:
2172 return CCCR_OK;
2173 }
2174 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002175};
2176
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002177const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002178#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002179 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002180#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2181 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002182#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002183};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002184const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002185 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2186 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2187 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2188 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2189 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2190 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2191 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2192 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2193 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2194 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2195 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2196 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2197 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2198 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2199 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2200 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2201 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2202 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2203 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2204 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2205 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2206 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2207 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2208 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2209 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2210 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2211 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2212 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2213 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2214 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2215 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2216 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2217 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2218 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2219 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2220 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2221 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2222 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2223 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2224 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2225 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2226 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2227 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2228 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2229 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2230 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2231 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002232 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002233 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2234 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002235};
2236
Craig Topperf054e3a2015-10-19 03:52:27 +00002237ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2238 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002239}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002240
Matt Arsenault250024f2016-06-08 01:56:42 +00002241bool AMDGPUTargetInfo::initFeatureMap(
2242 llvm::StringMap<bool> &Features,
2243 DiagnosticsEngine &Diags, StringRef CPU,
2244 const std::vector<std::string> &FeatureVec) const {
2245
2246 // XXX - What does the member GPU mean if device name string passed here?
2247 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2248 if (CPU.empty())
2249 CPU = "tahiti";
2250
2251 switch (parseAMDGCNName(CPU)) {
2252 case GK_SOUTHERN_ISLANDS:
2253 case GK_SEA_ISLANDS:
2254 break;
2255
2256 case GK_VOLCANIC_ISLANDS:
2257 Features["s-memrealtime"] = true;
2258 Features["16-bit-insts"] = true;
2259 break;
2260
2261 case GK_NONE:
2262 return false;
2263 default:
2264 llvm_unreachable("unhandled subtarget");
2265 }
2266 } else {
2267 if (CPU.empty())
2268 CPU = "r600";
2269
2270 switch (parseR600Name(CPU)) {
2271 case GK_R600:
2272 case GK_R700:
2273 case GK_EVERGREEN:
2274 case GK_NORTHERN_ISLANDS:
2275 break;
2276 case GK_R600_DOUBLE_OPS:
2277 case GK_R700_DOUBLE_OPS:
2278 case GK_EVERGREEN_DOUBLE_OPS:
2279 case GK_CAYMAN:
2280 Features["fp64"] = true;
2281 break;
2282 case GK_NONE:
2283 return false;
2284 default:
2285 llvm_unreachable("unhandled subtarget");
2286 }
2287 }
2288
2289 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2290}
2291
Eli Friedman3fd920a2008-08-20 02:34:37 +00002292// Namespace for x86 abstract base class
2293const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002294#define BUILTIN(ID, TYPE, ATTRS) \
2295 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002296#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002297 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002298#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002299 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002300#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002301};
Eli Friedmanb5366062008-05-20 14:21:01 +00002302
Nuno Lopescfca1f02009-12-23 17:49:57 +00002303static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002304 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2305 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002306 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002307 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2308 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2309 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002310 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002311 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2312 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002313 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2314 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2315 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2316 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2317 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2318 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2319 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2320 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002321};
2322
Eric Christophercdd36352011-06-21 00:05:20 +00002323const TargetInfo::AddlRegName AddlRegNames[] = {
2324 { { "al", "ah", "eax", "rax" }, 0 },
2325 { { "bl", "bh", "ebx", "rbx" }, 3 },
2326 { { "cl", "ch", "ecx", "rcx" }, 2 },
2327 { { "dl", "dh", "edx", "rdx" }, 1 },
2328 { { "esi", "rsi" }, 4 },
2329 { { "edi", "rdi" }, 5 },
2330 { { "esp", "rsp" }, 7 },
2331 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002332 { { "r8d", "r8w", "r8b" }, 38 },
2333 { { "r9d", "r9w", "r9b" }, 39 },
2334 { { "r10d", "r10w", "r10b" }, 40 },
2335 { { "r11d", "r11w", "r11b" }, 41 },
2336 { { "r12d", "r12w", "r12b" }, 42 },
2337 { { "r13d", "r13w", "r13b" }, 43 },
2338 { { "r14d", "r14w", "r14b" }, 44 },
2339 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002340};
2341
2342// X86 target abstract base class; x86-32 and x86-64 are very close, so
2343// most of the implementation can be shared.
2344class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002345 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002346 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002347 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002348 enum MMX3DNowEnum {
2349 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002350 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002351 enum XOPEnum {
2352 NoXOP,
2353 SSE4A,
2354 FMA4,
2355 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002356 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002357
Craig Topper543f3bd2015-10-14 23:47:57 +00002358 bool HasAES = false;
2359 bool HasPCLMUL = false;
2360 bool HasLZCNT = false;
2361 bool HasRDRND = false;
2362 bool HasFSGSBASE = false;
2363 bool HasBMI = false;
2364 bool HasBMI2 = false;
2365 bool HasPOPCNT = false;
2366 bool HasRTM = false;
2367 bool HasPRFCHW = false;
2368 bool HasRDSEED = false;
2369 bool HasADX = false;
2370 bool HasTBM = false;
2371 bool HasFMA = false;
2372 bool HasF16C = false;
2373 bool HasAVX512CD = false;
2374 bool HasAVX512ER = false;
2375 bool HasAVX512PF = false;
2376 bool HasAVX512DQ = false;
2377 bool HasAVX512BW = false;
2378 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002379 bool HasAVX512VBMI = false;
2380 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002381 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002382 bool HasMPX = false;
2383 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002384 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002385 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002386 bool HasXSAVE = false;
2387 bool HasXSAVEOPT = false;
2388 bool HasXSAVEC = false;
2389 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002390 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002391 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002392 bool HasCLFLUSHOPT = false;
2393 bool HasPCOMMIT = false;
2394 bool HasCLWB = false;
2395 bool HasUMIP = false;
2396 bool HasMOVBE = false;
2397 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002398
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002399 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2400 ///
2401 /// Each enumeration represents a particular CPU supported by Clang. These
2402 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2403 enum CPUKind {
2404 CK_Generic,
2405
2406 /// \name i386
2407 /// i386-generation processors.
2408 //@{
2409 CK_i386,
2410 //@}
2411
2412 /// \name i486
2413 /// i486-generation processors.
2414 //@{
2415 CK_i486,
2416 CK_WinChipC6,
2417 CK_WinChip2,
2418 CK_C3,
2419 //@}
2420
2421 /// \name i586
2422 /// i586-generation processors, P5 microarchitecture based.
2423 //@{
2424 CK_i586,
2425 CK_Pentium,
2426 CK_PentiumMMX,
2427 //@}
2428
2429 /// \name i686
2430 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2431 //@{
2432 CK_i686,
2433 CK_PentiumPro,
2434 CK_Pentium2,
2435 CK_Pentium3,
2436 CK_Pentium3M,
2437 CK_PentiumM,
2438 CK_C3_2,
2439
2440 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2441 /// Clang however has some logic to suport this.
2442 // FIXME: Warn, deprecate, and potentially remove this.
2443 CK_Yonah,
2444 //@}
2445
2446 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002447 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002448 //@{
2449 CK_Pentium4,
2450 CK_Pentium4M,
2451 CK_Prescott,
2452 CK_Nocona,
2453 //@}
2454
2455 /// \name Core
2456 /// Core microarchitecture based processors.
2457 //@{
2458 CK_Core2,
2459
2460 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2461 /// codename which GCC no longer accepts as an option to -march, but Clang
2462 /// has some logic for recognizing it.
2463 // FIXME: Warn, deprecate, and potentially remove this.
2464 CK_Penryn,
2465 //@}
2466
2467 /// \name Atom
2468 /// Atom processors
2469 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002470 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002471 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002472 //@}
2473
2474 /// \name Nehalem
2475 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002476 CK_Nehalem,
2477
2478 /// \name Westmere
2479 /// Westmere microarchitecture based processors.
2480 CK_Westmere,
2481
2482 /// \name Sandy Bridge
2483 /// Sandy Bridge microarchitecture based processors.
2484 CK_SandyBridge,
2485
2486 /// \name Ivy Bridge
2487 /// Ivy Bridge microarchitecture based processors.
2488 CK_IvyBridge,
2489
2490 /// \name Haswell
2491 /// Haswell microarchitecture based processors.
2492 CK_Haswell,
2493
2494 /// \name Broadwell
2495 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002496 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002497
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002498 /// \name Skylake Client
2499 /// Skylake client microarchitecture based processors.
2500 CK_SkylakeClient,
2501
2502 /// \name Skylake Server
2503 /// Skylake server microarchitecture based processors.
2504 CK_SkylakeServer,
2505
2506 /// \name Cannonlake Client
2507 /// Cannonlake client microarchitecture based processors.
2508 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002509
Craig Topper449314e2013-08-20 07:09:39 +00002510 /// \name Knights Landing
2511 /// Knights Landing processor.
2512 CK_KNL,
2513
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002514 /// \name Lakemont
2515 /// Lakemont microarchitecture based processors.
2516 CK_Lakemont,
2517
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002518 /// \name K6
2519 /// K6 architecture processors.
2520 //@{
2521 CK_K6,
2522 CK_K6_2,
2523 CK_K6_3,
2524 //@}
2525
2526 /// \name K7
2527 /// K7 architecture processors.
2528 //@{
2529 CK_Athlon,
2530 CK_AthlonThunderbird,
2531 CK_Athlon4,
2532 CK_AthlonXP,
2533 CK_AthlonMP,
2534 //@}
2535
2536 /// \name K8
2537 /// K8 architecture processors.
2538 //@{
2539 CK_Athlon64,
2540 CK_Athlon64SSE3,
2541 CK_AthlonFX,
2542 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002543 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002544 CK_Opteron,
2545 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002546 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002547 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002548
Benjamin Kramer569f2152012-01-10 11:50:18 +00002549 /// \name Bobcat
2550 /// Bobcat architecture processors.
2551 //@{
2552 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002553 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002554 //@}
2555
2556 /// \name Bulldozer
2557 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002558 //@{
2559 CK_BDVER1,
2560 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002561 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002562 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002563 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002564
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002565 /// This specification is deprecated and will be removed in the future.
2566 /// Users should prefer \see CK_K8.
2567 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002568 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002569 CK_x86_64,
2570 //@}
2571
2572 /// \name Geode
2573 /// Geode processors.
2574 //@{
2575 CK_Geode
2576 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002577 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002578
Eric Christopherc50738f2015-08-27 00:05:50 +00002579 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002580 return llvm::StringSwitch<CPUKind>(CPU)
2581 .Case("i386", CK_i386)
2582 .Case("i486", CK_i486)
2583 .Case("winchip-c6", CK_WinChipC6)
2584 .Case("winchip2", CK_WinChip2)
2585 .Case("c3", CK_C3)
2586 .Case("i586", CK_i586)
2587 .Case("pentium", CK_Pentium)
2588 .Case("pentium-mmx", CK_PentiumMMX)
2589 .Case("i686", CK_i686)
2590 .Case("pentiumpro", CK_PentiumPro)
2591 .Case("pentium2", CK_Pentium2)
2592 .Case("pentium3", CK_Pentium3)
2593 .Case("pentium3m", CK_Pentium3M)
2594 .Case("pentium-m", CK_PentiumM)
2595 .Case("c3-2", CK_C3_2)
2596 .Case("yonah", CK_Yonah)
2597 .Case("pentium4", CK_Pentium4)
2598 .Case("pentium4m", CK_Pentium4M)
2599 .Case("prescott", CK_Prescott)
2600 .Case("nocona", CK_Nocona)
2601 .Case("core2", CK_Core2)
2602 .Case("penryn", CK_Penryn)
2603 .Case("bonnell", CK_Bonnell)
2604 .Case("atom", CK_Bonnell) // Legacy name.
2605 .Case("silvermont", CK_Silvermont)
2606 .Case("slm", CK_Silvermont) // Legacy name.
2607 .Case("nehalem", CK_Nehalem)
2608 .Case("corei7", CK_Nehalem) // Legacy name.
2609 .Case("westmere", CK_Westmere)
2610 .Case("sandybridge", CK_SandyBridge)
2611 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2612 .Case("ivybridge", CK_IvyBridge)
2613 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2614 .Case("haswell", CK_Haswell)
2615 .Case("core-avx2", CK_Haswell) // Legacy name.
2616 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002617 .Case("skylake", CK_SkylakeClient)
2618 .Case("skylake-avx512", CK_SkylakeServer)
2619 .Case("skx", CK_SkylakeServer) // Legacy name.
2620 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002621 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002622 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002623 .Case("k6", CK_K6)
2624 .Case("k6-2", CK_K6_2)
2625 .Case("k6-3", CK_K6_3)
2626 .Case("athlon", CK_Athlon)
2627 .Case("athlon-tbird", CK_AthlonThunderbird)
2628 .Case("athlon-4", CK_Athlon4)
2629 .Case("athlon-xp", CK_AthlonXP)
2630 .Case("athlon-mp", CK_AthlonMP)
2631 .Case("athlon64", CK_Athlon64)
2632 .Case("athlon64-sse3", CK_Athlon64SSE3)
2633 .Case("athlon-fx", CK_AthlonFX)
2634 .Case("k8", CK_K8)
2635 .Case("k8-sse3", CK_K8SSE3)
2636 .Case("opteron", CK_Opteron)
2637 .Case("opteron-sse3", CK_OpteronSSE3)
2638 .Case("barcelona", CK_AMDFAM10)
2639 .Case("amdfam10", CK_AMDFAM10)
2640 .Case("btver1", CK_BTVER1)
2641 .Case("btver2", CK_BTVER2)
2642 .Case("bdver1", CK_BDVER1)
2643 .Case("bdver2", CK_BDVER2)
2644 .Case("bdver3", CK_BDVER3)
2645 .Case("bdver4", CK_BDVER4)
2646 .Case("x86-64", CK_x86_64)
2647 .Case("geode", CK_Geode)
2648 .Default(CK_Generic);
2649 }
2650
Rafael Espindolaeb265472013-08-21 21:59:03 +00002651 enum FPMathKind {
2652 FP_Default,
2653 FP_SSE,
2654 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002655 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002656
Eli Friedman3fd920a2008-08-20 02:34:37 +00002657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002658 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2659 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002660 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002661 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002662 }
Craig Topper3164f332014-03-11 03:39:26 +00002663 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002664 // X87 evaluates with 80 bits "long double" precision.
2665 return SSELevel == NoSSE ? 2 : 0;
2666 }
Craig Topper6c03a542015-10-19 04:51:35 +00002667 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2668 return llvm::makeArrayRef(BuiltinInfo,
2669 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002670 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002671 ArrayRef<const char *> getGCCRegNames() const override {
2672 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002673 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002674 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2675 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002676 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002677 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2678 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002679 }
Eric Christopherd9832702015-06-29 21:00:05 +00002680 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002681 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002682 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002683
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002684 bool validateGlobalRegisterVariable(StringRef RegName,
2685 unsigned RegSize,
2686 bool &HasSizeMismatch) const override {
2687 // esp and ebp are the only 32-bit registers the x86 backend can currently
2688 // handle.
2689 if (RegName.equals("esp") || RegName.equals("ebp")) {
2690 // Check that the register size is 32-bit.
2691 HasSizeMismatch = RegSize != 32;
2692 return true;
2693 }
2694
2695 return false;
2696 }
2697
Akira Hatanaka974131e2014-09-18 18:17:18 +00002698 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2699
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002700 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2701
Akira Hatanaka974131e2014-09-18 18:17:18 +00002702 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2703
Craig Topper3164f332014-03-11 03:39:26 +00002704 std::string convertConstraint(const char *&Constraint) const override;
2705 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002706 return "~{dirflag},~{fpsr},~{flags}";
2707 }
Craig Topper3164f332014-03-11 03:39:26 +00002708 void getTargetDefines(const LangOptions &Opts,
2709 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002710 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2711 bool Enabled);
2712 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2713 bool Enabled);
2714 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2715 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002716 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2717 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002718 setFeatureEnabledImpl(Features, Name, Enabled);
2719 }
2720 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002721 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002722 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2723 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002724 bool
2725 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2726 StringRef CPU,
2727 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002728 bool hasFeature(StringRef Feature) const override;
2729 bool handleTargetFeatures(std::vector<std::string> &Features,
2730 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002731 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002732 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2733 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002734 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002735 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002736 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002737 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002738 return "no-mmx";
2739 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002740 }
Craig Topper3164f332014-03-11 03:39:26 +00002741 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002742 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002743
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002744 // Perform any per-CPU checks necessary to determine if this CPU is
2745 // acceptable.
2746 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2747 // invalid without explaining *why*.
2748 switch (CPU) {
2749 case CK_Generic:
2750 // No processor selected!
2751 return false;
2752
2753 case CK_i386:
2754 case CK_i486:
2755 case CK_WinChipC6:
2756 case CK_WinChip2:
2757 case CK_C3:
2758 case CK_i586:
2759 case CK_Pentium:
2760 case CK_PentiumMMX:
2761 case CK_i686:
2762 case CK_PentiumPro:
2763 case CK_Pentium2:
2764 case CK_Pentium3:
2765 case CK_Pentium3M:
2766 case CK_PentiumM:
2767 case CK_Yonah:
2768 case CK_C3_2:
2769 case CK_Pentium4:
2770 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002771 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002772 case CK_Prescott:
2773 case CK_K6:
2774 case CK_K6_2:
2775 case CK_K6_3:
2776 case CK_Athlon:
2777 case CK_AthlonThunderbird:
2778 case CK_Athlon4:
2779 case CK_AthlonXP:
2780 case CK_AthlonMP:
2781 case CK_Geode:
2782 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002783 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002784 return false;
2785
2786 // Fallthrough
2787 case CK_Nocona:
2788 case CK_Core2:
2789 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002790 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002791 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002792 case CK_Nehalem:
2793 case CK_Westmere:
2794 case CK_SandyBridge:
2795 case CK_IvyBridge:
2796 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002797 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002798 case CK_SkylakeClient:
2799 case CK_SkylakeServer:
2800 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002801 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002802 case CK_Athlon64:
2803 case CK_Athlon64SSE3:
2804 case CK_AthlonFX:
2805 case CK_K8:
2806 case CK_K8SSE3:
2807 case CK_Opteron:
2808 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002809 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002810 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002811 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002812 case CK_BDVER1:
2813 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002814 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002815 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002816 case CK_x86_64:
2817 return true;
2818 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002819 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002820 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002821
Craig Topper3164f332014-03-11 03:39:26 +00002822 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002823
Craig Topper3164f332014-03-11 03:39:26 +00002824 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002825 // Most of the non-ARM calling conventions are i386 conventions.
2826 switch (CC) {
2827 case CC_X86ThisCall:
2828 case CC_X86FastCall:
2829 case CC_X86StdCall:
2830 case CC_X86VectorCall:
2831 case CC_C:
2832 case CC_Swift:
2833 case CC_X86Pascal:
2834 case CC_IntelOclBicc:
2835 return CCCR_OK;
2836 default:
2837 return CCCR_Warning;
2838 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002839 }
2840
Craig Topper3164f332014-03-11 03:39:26 +00002841 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002842 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002843 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002844
2845 bool hasSjLjLowering() const override {
2846 return true;
2847 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002848
2849 void setSupportedOpenCLOpts() override {
2850 getSupportedOpenCLOpts().setAll();
2851 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002852};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002853
Rafael Espindolaeb265472013-08-21 21:59:03 +00002854bool X86TargetInfo::setFPMath(StringRef Name) {
2855 if (Name == "387") {
2856 FPMath = FP_387;
2857 return true;
2858 }
2859 if (Name == "sse") {
2860 FPMath = FP_SSE;
2861 return true;
2862 }
2863 return false;
2864}
2865
Eric Christopher007b0a02015-08-28 22:32:01 +00002866bool X86TargetInfo::initFeatureMap(
2867 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002868 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002869 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002870 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002871 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002872 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002873
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002874 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002875
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002876 // Enable X87 for all X86 processors but Lakemont.
2877 if (Kind != CK_Lakemont)
2878 setFeatureEnabledImpl(Features, "x87", true);
2879
2880 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002881 case CK_Generic:
2882 case CK_i386:
2883 case CK_i486:
2884 case CK_i586:
2885 case CK_Pentium:
2886 case CK_i686:
2887 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002888 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002889 break;
2890 case CK_PentiumMMX:
2891 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002892 case CK_K6:
2893 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002894 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002895 break;
2896 case CK_Pentium3:
2897 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002898 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002899 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002900 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002901 break;
2902 case CK_PentiumM:
2903 case CK_Pentium4:
2904 case CK_Pentium4M:
2905 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002906 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002907 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 break;
2909 case CK_Yonah:
2910 case CK_Prescott:
2911 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002912 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002913 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002914 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002915 break;
2916 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002917 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002918 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002919 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002920 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002921 break;
2922 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002923 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002924 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002925 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002926 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002927 case CK_Cannonlake:
2928 setFeatureEnabledImpl(Features, "avx512ifma", true);
2929 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2930 setFeatureEnabledImpl(Features, "sha", true);
2931 setFeatureEnabledImpl(Features, "umip", true);
2932 // FALLTHROUGH
2933 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002934 setFeatureEnabledImpl(Features, "avx512f", true);
2935 setFeatureEnabledImpl(Features, "avx512cd", true);
2936 setFeatureEnabledImpl(Features, "avx512dq", true);
2937 setFeatureEnabledImpl(Features, "avx512bw", true);
2938 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002939 setFeatureEnabledImpl(Features, "pku", true);
2940 setFeatureEnabledImpl(Features, "pcommit", true);
2941 setFeatureEnabledImpl(Features, "clwb", true);
2942 // FALLTHROUGH
2943 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002944 setFeatureEnabledImpl(Features, "xsavec", true);
2945 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002946 setFeatureEnabledImpl(Features, "mpx", true);
2947 setFeatureEnabledImpl(Features, "sgx", true);
2948 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002949 // FALLTHROUGH
2950 case CK_Broadwell:
2951 setFeatureEnabledImpl(Features, "rdseed", true);
2952 setFeatureEnabledImpl(Features, "adx", true);
2953 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002954 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002955 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002956 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002957 setFeatureEnabledImpl(Features, "bmi", true);
2958 setFeatureEnabledImpl(Features, "bmi2", true);
2959 setFeatureEnabledImpl(Features, "rtm", true);
2960 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002961 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002962 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002963 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002964 setFeatureEnabledImpl(Features, "rdrnd", true);
2965 setFeatureEnabledImpl(Features, "f16c", true);
2966 setFeatureEnabledImpl(Features, "fsgsbase", true);
2967 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002968 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002969 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002970 setFeatureEnabledImpl(Features, "xsave", true);
2971 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002972 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002973 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002974 case CK_Silvermont:
2975 setFeatureEnabledImpl(Features, "aes", true);
2976 setFeatureEnabledImpl(Features, "pclmul", true);
2977 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002978 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002979 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002980 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002981 setFeatureEnabledImpl(Features, "cx16", true);
2982 break;
2983 case CK_KNL:
2984 setFeatureEnabledImpl(Features, "avx512f", true);
2985 setFeatureEnabledImpl(Features, "avx512cd", true);
2986 setFeatureEnabledImpl(Features, "avx512er", true);
2987 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002988 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002990 setFeatureEnabledImpl(Features, "rdseed", true);
2991 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002992 setFeatureEnabledImpl(Features, "lzcnt", true);
2993 setFeatureEnabledImpl(Features, "bmi", true);
2994 setFeatureEnabledImpl(Features, "bmi2", true);
2995 setFeatureEnabledImpl(Features, "rtm", true);
2996 setFeatureEnabledImpl(Features, "fma", true);
2997 setFeatureEnabledImpl(Features, "rdrnd", true);
2998 setFeatureEnabledImpl(Features, "f16c", true);
2999 setFeatureEnabledImpl(Features, "fsgsbase", true);
3000 setFeatureEnabledImpl(Features, "aes", true);
3001 setFeatureEnabledImpl(Features, "pclmul", true);
3002 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003003 setFeatureEnabledImpl(Features, "xsaveopt", true);
3004 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003005 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003006 break;
3007 case CK_K6_2:
3008 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003009 case CK_WinChip2:
3010 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003011 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003012 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003013 case CK_Athlon:
3014 case CK_AthlonThunderbird:
3015 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003016 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003017 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003018 case CK_Athlon4:
3019 case CK_AthlonXP:
3020 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003021 setFeatureEnabledImpl(Features, "sse", true);
3022 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003023 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003024 break;
3025 case CK_K8:
3026 case CK_Opteron:
3027 case CK_Athlon64:
3028 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003029 setFeatureEnabledImpl(Features, "sse2", true);
3030 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003031 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003032 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003033 case CK_AMDFAM10:
3034 setFeatureEnabledImpl(Features, "sse4a", true);
3035 setFeatureEnabledImpl(Features, "lzcnt", true);
3036 setFeatureEnabledImpl(Features, "popcnt", true);
3037 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003038 case CK_K8SSE3:
3039 case CK_OpteronSSE3:
3040 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003041 setFeatureEnabledImpl(Features, "sse3", true);
3042 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003043 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003044 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003045 case CK_BTVER2:
3046 setFeatureEnabledImpl(Features, "avx", true);
3047 setFeatureEnabledImpl(Features, "aes", true);
3048 setFeatureEnabledImpl(Features, "pclmul", true);
3049 setFeatureEnabledImpl(Features, "bmi", true);
3050 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003051 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003052 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003053 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003054 setFeatureEnabledImpl(Features, "ssse3", true);
3055 setFeatureEnabledImpl(Features, "sse4a", true);
3056 setFeatureEnabledImpl(Features, "lzcnt", true);
3057 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003058 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003059 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003060 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003061 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003062 case CK_BDVER4:
3063 setFeatureEnabledImpl(Features, "avx2", true);
3064 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003065 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003066 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003067 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003068 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003069 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003070 // FALLTHROUGH
3071 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003072 setFeatureEnabledImpl(Features, "bmi", true);
3073 setFeatureEnabledImpl(Features, "fma", true);
3074 setFeatureEnabledImpl(Features, "f16c", true);
3075 setFeatureEnabledImpl(Features, "tbm", true);
3076 // FALLTHROUGH
3077 case CK_BDVER1:
3078 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003079 setFeatureEnabledImpl(Features, "xop", true);
3080 setFeatureEnabledImpl(Features, "lzcnt", true);
3081 setFeatureEnabledImpl(Features, "aes", true);
3082 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003083 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003084 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003085 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003086 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003087 break;
Eli Friedman33465822011-07-08 23:31:17 +00003088 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003089 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3090 return false;
3091
3092 // Can't do this earlier because we need to be able to explicitly enable
3093 // or disable these features and the things that they depend upon.
3094
3095 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3096 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003097 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003098 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3099 FeaturesVec.end())
3100 Features["popcnt"] = true;
3101
3102 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3103 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003104 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003105 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3106 FeaturesVec.end())
3107 Features["prfchw"] = true;
3108
Eric Christophera7260af2015-10-08 20:10:18 +00003109 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3110 // then enable MMX.
3111 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003112 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003113 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3114 FeaturesVec.end())
3115 Features["mmx"] = true;
3116
Eric Christopherbbd746d2015-10-08 20:10:14 +00003117 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003118}
3119
Rafael Espindolae62e2792013-08-20 13:44:29 +00003120void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003121 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003122 if (Enabled) {
3123 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003124 case AVX512F:
3125 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003126 case AVX2:
3127 Features["avx2"] = true;
3128 case AVX:
3129 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003130 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003132 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003133 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003134 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003135 case SSSE3:
3136 Features["ssse3"] = true;
3137 case SSE3:
3138 Features["sse3"] = true;
3139 case SSE2:
3140 Features["sse2"] = true;
3141 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 Features["sse"] = true;
3143 case NoSSE:
3144 break;
3145 }
3146 return;
3147 }
3148
3149 switch (Level) {
3150 case NoSSE:
3151 case SSE1:
3152 Features["sse"] = false;
3153 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003154 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3155 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003156 case SSE3:
3157 Features["sse3"] = false;
3158 setXOPLevel(Features, NoXOP, false);
3159 case SSSE3:
3160 Features["ssse3"] = false;
3161 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003162 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003164 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003165 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003166 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3167 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003168 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003169 case AVX2:
3170 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003171 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003172 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003173 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003174 Features["avx512vl"] = Features["avx512vbmi"] =
3175 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003176 }
3177}
3178
3179void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003180 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003181 if (Enabled) {
3182 switch (Level) {
3183 case AMD3DNowAthlon:
3184 Features["3dnowa"] = true;
3185 case AMD3DNow:
3186 Features["3dnow"] = true;
3187 case MMX:
3188 Features["mmx"] = true;
3189 case NoMMX3DNow:
3190 break;
3191 }
3192 return;
3193 }
3194
3195 switch (Level) {
3196 case NoMMX3DNow:
3197 case MMX:
3198 Features["mmx"] = false;
3199 case AMD3DNow:
3200 Features["3dnow"] = false;
3201 case AMD3DNowAthlon:
3202 Features["3dnowa"] = false;
3203 }
3204}
3205
3206void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003207 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003208 if (Enabled) {
3209 switch (Level) {
3210 case XOP:
3211 Features["xop"] = true;
3212 case FMA4:
3213 Features["fma4"] = true;
3214 setSSELevel(Features, AVX, true);
3215 case SSE4A:
3216 Features["sse4a"] = true;
3217 setSSELevel(Features, SSE3, true);
3218 case NoXOP:
3219 break;
3220 }
3221 return;
3222 }
3223
3224 switch (Level) {
3225 case NoXOP:
3226 case SSE4A:
3227 Features["sse4a"] = false;
3228 case FMA4:
3229 Features["fma4"] = false;
3230 case XOP:
3231 Features["xop"] = false;
3232 }
3233}
3234
Craig Topper86d79ef2013-09-17 04:51:29 +00003235void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3236 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003237 // This is a bit of a hack to deal with the sse4 target feature when used
3238 // as part of the target attribute. We handle sse4 correctly everywhere
3239 // else. See below for more information on how we handle the sse4 options.
3240 if (Name != "sse4")
3241 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003242
Craig Topper29561122013-09-19 01:13:07 +00003243 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003244 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003245 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003246 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003247 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003248 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003249 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003251 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003252 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003253 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003255 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003256 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003257 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003258 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003259 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003260 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003261 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003262 if (Enabled)
3263 setSSELevel(Features, SSE2, Enabled);
3264 } else if (Name == "pclmul") {
3265 if (Enabled)
3266 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003267 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003268 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003269 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003270 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003271 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003272 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003273 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3274 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3275 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003276 if (Enabled)
3277 setSSELevel(Features, AVX512F, Enabled);
3278 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003279 if (Enabled)
3280 setSSELevel(Features, AVX, Enabled);
3281 } else if (Name == "fma4") {
3282 setXOPLevel(Features, FMA4, Enabled);
3283 } else if (Name == "xop") {
3284 setXOPLevel(Features, XOP, Enabled);
3285 } else if (Name == "sse4a") {
3286 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003287 } else if (Name == "f16c") {
3288 if (Enabled)
3289 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003290 } else if (Name == "sha") {
3291 if (Enabled)
3292 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003293 } else if (Name == "sse4") {
3294 // We can get here via the __target__ attribute since that's not controlled
3295 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3296 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3297 // disabled.
3298 if (Enabled)
3299 setSSELevel(Features, SSE42, Enabled);
3300 else
3301 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003302 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003303 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003304 Features["xsaveopt"] = false;
3305 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003306 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003307 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003308 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003309}
3310
Eric Christopher3ff21b32013-10-16 21:26:26 +00003311/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003312/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003313bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003314 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003315 for (const auto &Feature : Features) {
3316 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003317 continue;
3318
Eric Christopher610fe112015-08-26 08:21:55 +00003319 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003320 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003321 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003322 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003323 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003324 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003325 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003326 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003327 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003328 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003329 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003330 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003331 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003332 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003333 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003334 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003335 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003336 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003337 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003338 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003339 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003340 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003341 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003342 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003343 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003344 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003345 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003346 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003347 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003348 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003349 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003350 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003351 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003352 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003353 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003354 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003355 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003356 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003357 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003358 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003359 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003360 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003361 } else if (Feature == "+avx512vbmi") {
3362 HasAVX512VBMI = true;
3363 } else if (Feature == "+avx512ifma") {
3364 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003365 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003366 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003367 } else if (Feature == "+mpx") {
3368 HasMPX = true;
3369 } else if (Feature == "+movbe") {
3370 HasMOVBE = true;
3371 } else if (Feature == "+sgx") {
3372 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003373 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003374 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003375 } else if (Feature == "+fxsr") {
3376 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003377 } else if (Feature == "+xsave") {
3378 HasXSAVE = true;
3379 } else if (Feature == "+xsaveopt") {
3380 HasXSAVEOPT = true;
3381 } else if (Feature == "+xsavec") {
3382 HasXSAVEC = true;
3383 } else if (Feature == "+xsaves") {
3384 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003385 } else if (Feature == "+mwaitx") {
3386 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003387 } else if (Feature == "+pku") {
3388 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003389 } else if (Feature == "+clflushopt") {
3390 HasCLFLUSHOPT = true;
3391 } else if (Feature == "+pcommit") {
3392 HasPCOMMIT = true;
3393 } else if (Feature == "+clwb") {
3394 HasCLWB = true;
3395 } else if (Feature == "+umip") {
3396 HasUMIP = true;
3397 } else if (Feature == "+prefetchwt1") {
3398 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003399 }
3400
Benjamin Kramer27402c62012-03-05 15:10:44 +00003401 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003402 .Case("+avx512f", AVX512F)
3403 .Case("+avx2", AVX2)
3404 .Case("+avx", AVX)
3405 .Case("+sse4.2", SSE42)
3406 .Case("+sse4.1", SSE41)
3407 .Case("+ssse3", SSSE3)
3408 .Case("+sse3", SSE3)
3409 .Case("+sse2", SSE2)
3410 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003411 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003412 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003413
Eli Friedman33465822011-07-08 23:31:17 +00003414 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003415 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003416 .Case("+3dnowa", AMD3DNowAthlon)
3417 .Case("+3dnow", AMD3DNow)
3418 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003419 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003420 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003421
3422 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003423 .Case("+xop", XOP)
3424 .Case("+fma4", FMA4)
3425 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003426 .Default(NoXOP);
3427 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003428 }
Eli Friedman33465822011-07-08 23:31:17 +00003429
Rafael Espindolaeb265472013-08-21 21:59:03 +00003430 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3431 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003432 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3433 (FPMath == FP_387 && SSELevel >= SSE1)) {
3434 Diags.Report(diag::err_target_unsupported_fpmath) <<
3435 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003436 return false;
3437 }
3438
Alexey Bataev00396512015-07-02 03:40:19 +00003439 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003440 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003441 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003442}
Chris Lattnerecd49032009-03-02 22:27:17 +00003443
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003444/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3445/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003446void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003447 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003448 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003449 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003450 Builder.defineMacro("__amd64__");
3451 Builder.defineMacro("__amd64");
3452 Builder.defineMacro("__x86_64");
3453 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003454 if (getTriple().getArchName() == "x86_64h") {
3455 Builder.defineMacro("__x86_64h");
3456 Builder.defineMacro("__x86_64h__");
3457 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003458 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003459 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003460 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003461
Chris Lattnerecd49032009-03-02 22:27:17 +00003462 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003463 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3464 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003465 switch (CPU) {
3466 case CK_Generic:
3467 break;
3468 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003469 // The rest are coming from the i386 define above.
3470 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003471 break;
3472 case CK_i486:
3473 case CK_WinChipC6:
3474 case CK_WinChip2:
3475 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003476 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003477 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003478 case CK_PentiumMMX:
3479 Builder.defineMacro("__pentium_mmx__");
3480 Builder.defineMacro("__tune_pentium_mmx__");
3481 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003482 case CK_i586:
3483 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003484 defineCPUMacros(Builder, "i586");
3485 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003486 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003487 case CK_Pentium3:
3488 case CK_Pentium3M:
3489 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003490 Builder.defineMacro("__tune_pentium3__");
3491 // Fallthrough
3492 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003494 Builder.defineMacro("__tune_pentium2__");
3495 // Fallthrough
3496 case CK_PentiumPro:
3497 Builder.defineMacro("__tune_i686__");
3498 Builder.defineMacro("__tune_pentiumpro__");
3499 // Fallthrough
3500 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003501 Builder.defineMacro("__i686");
3502 Builder.defineMacro("__i686__");
3503 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3504 Builder.defineMacro("__pentiumpro");
3505 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003506 break;
3507 case CK_Pentium4:
3508 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003509 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003510 break;
3511 case CK_Yonah:
3512 case CK_Prescott:
3513 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003514 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003515 break;
3516 case CK_Core2:
3517 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003518 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003519 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003520 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003521 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003522 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003523 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003524 defineCPUMacros(Builder, "slm");
3525 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003526 case CK_Nehalem:
3527 case CK_Westmere:
3528 case CK_SandyBridge:
3529 case CK_IvyBridge:
3530 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003531 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003532 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003533 // FIXME: Historically, we defined this legacy name, it would be nice to
3534 // remove it at some point. We've never exposed fine-grained names for
3535 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003536 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003537 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003538 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003539 defineCPUMacros(Builder, "skx");
3540 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003541 case CK_Cannonlake:
3542 break;
Craig Topper449314e2013-08-20 07:09:39 +00003543 case CK_KNL:
3544 defineCPUMacros(Builder, "knl");
3545 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003546 case CK_Lakemont:
3547 Builder.defineMacro("__tune_lakemont__");
3548 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003549 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003550 Builder.defineMacro("__k6_2__");
3551 Builder.defineMacro("__tune_k6_2__");
3552 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003553 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003554 if (CPU != CK_K6_2) { // In case of fallthrough
3555 // FIXME: GCC may be enabling these in cases where some other k6
3556 // architecture is specified but -m3dnow is explicitly provided. The
3557 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003558 Builder.defineMacro("__k6_3__");
3559 Builder.defineMacro("__tune_k6_3__");
3560 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003561 // Fallthrough
3562 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003563 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003564 break;
3565 case CK_Athlon:
3566 case CK_AthlonThunderbird:
3567 case CK_Athlon4:
3568 case CK_AthlonXP:
3569 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003570 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003571 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003572 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003573 Builder.defineMacro("__tune_athlon_sse__");
3574 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003575 break;
3576 case CK_K8:
3577 case CK_K8SSE3:
3578 case CK_x86_64:
3579 case CK_Opteron:
3580 case CK_OpteronSSE3:
3581 case CK_Athlon64:
3582 case CK_Athlon64SSE3:
3583 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003584 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003585 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003586 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003587 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003588 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003589 case CK_BTVER1:
3590 defineCPUMacros(Builder, "btver1");
3591 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003592 case CK_BTVER2:
3593 defineCPUMacros(Builder, "btver2");
3594 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003595 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003596 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003597 break;
3598 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003599 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003600 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003601 case CK_BDVER3:
3602 defineCPUMacros(Builder, "bdver3");
3603 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003604 case CK_BDVER4:
3605 defineCPUMacros(Builder, "bdver4");
3606 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003607 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003608 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003609 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003610 }
Chris Lattner96e43572009-03-02 22:40:39 +00003611
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003612 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003613 Builder.defineMacro("__REGISTER_PREFIX__", "");
3614
Chris Lattner6df41af2009-04-19 17:32:33 +00003615 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3616 // functions in glibc header files that use FP Stack inline asm which the
3617 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003618 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003619
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003620 if (HasAES)
3621 Builder.defineMacro("__AES__");
3622
Craig Topper3f122a72012-05-31 05:18:48 +00003623 if (HasPCLMUL)
3624 Builder.defineMacro("__PCLMUL__");
3625
Craig Topper22967d42011-12-25 05:06:45 +00003626 if (HasLZCNT)
3627 Builder.defineMacro("__LZCNT__");
3628
Benjamin Kramer1e250392012-07-07 09:39:18 +00003629 if (HasRDRND)
3630 Builder.defineMacro("__RDRND__");
3631
Craig Topper8c7f2512014-11-03 06:51:41 +00003632 if (HasFSGSBASE)
3633 Builder.defineMacro("__FSGSBASE__");
3634
Craig Topper22967d42011-12-25 05:06:45 +00003635 if (HasBMI)
3636 Builder.defineMacro("__BMI__");
3637
3638 if (HasBMI2)
3639 Builder.defineMacro("__BMI2__");
3640
Craig Topper1de83482011-12-29 16:10:46 +00003641 if (HasPOPCNT)
3642 Builder.defineMacro("__POPCNT__");
3643
Michael Liao625a8752012-11-10 05:17:46 +00003644 if (HasRTM)
3645 Builder.defineMacro("__RTM__");
3646
Michael Liao74f4eaf2013-03-26 17:52:08 +00003647 if (HasPRFCHW)
3648 Builder.defineMacro("__PRFCHW__");
3649
Michael Liaoffaae352013-03-29 05:17:55 +00003650 if (HasRDSEED)
3651 Builder.defineMacro("__RDSEED__");
3652
Robert Khasanov50e6f582014-09-19 09:53:48 +00003653 if (HasADX)
3654 Builder.defineMacro("__ADX__");
3655
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003656 if (HasTBM)
3657 Builder.defineMacro("__TBM__");
3658
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003659 if (HasMWAITX)
3660 Builder.defineMacro("__MWAITX__");
3661
Rafael Espindolae62e2792013-08-20 13:44:29 +00003662 switch (XOPLevel) {
3663 case XOP:
3664 Builder.defineMacro("__XOP__");
3665 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003666 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003667 case SSE4A:
3668 Builder.defineMacro("__SSE4A__");
3669 case NoXOP:
3670 break;
3671 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003672
Craig Topperbba778b2012-06-03 21:46:30 +00003673 if (HasFMA)
3674 Builder.defineMacro("__FMA__");
3675
Manman Rena45358c2012-10-11 00:59:55 +00003676 if (HasF16C)
3677 Builder.defineMacro("__F16C__");
3678
Craig Topper679b53a2013-08-21 05:29:10 +00003679 if (HasAVX512CD)
3680 Builder.defineMacro("__AVX512CD__");
3681 if (HasAVX512ER)
3682 Builder.defineMacro("__AVX512ER__");
3683 if (HasAVX512PF)
3684 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003685 if (HasAVX512DQ)
3686 Builder.defineMacro("__AVX512DQ__");
3687 if (HasAVX512BW)
3688 Builder.defineMacro("__AVX512BW__");
3689 if (HasAVX512VL)
3690 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003691 if (HasAVX512VBMI)
3692 Builder.defineMacro("__AVX512VBMI__");
3693 if (HasAVX512IFMA)
3694 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003695
Ben Langmuir58078d02013-09-19 13:22:04 +00003696 if (HasSHA)
3697 Builder.defineMacro("__SHA__");
3698
Craig Toppere33f51f2015-10-16 06:22:36 +00003699 if (HasFXSR)
3700 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003701 if (HasXSAVE)
3702 Builder.defineMacro("__XSAVE__");
3703 if (HasXSAVEOPT)
3704 Builder.defineMacro("__XSAVEOPT__");
3705 if (HasXSAVEC)
3706 Builder.defineMacro("__XSAVEC__");
3707 if (HasXSAVES)
3708 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003709 if (HasPKU)
3710 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003711 if (HasCX16)
3712 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3713
Chris Lattner96e43572009-03-02 22:40:39 +00003714 // Each case falls through to the previous one here.
3715 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003716 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003717 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003718 case AVX2:
3719 Builder.defineMacro("__AVX2__");
3720 case AVX:
3721 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003722 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003723 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003724 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003725 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003726 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003727 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003728 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003729 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003730 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003731 Builder.defineMacro("__SSE2__");
3732 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003733 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 Builder.defineMacro("__SSE__");
3735 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003736 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003737 break;
3738 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003739
Derek Schuffc7dd7222012-10-11 15:52:22 +00003740 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003741 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003742 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003743 case AVX2:
3744 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003745 case SSE42:
3746 case SSE41:
3747 case SSSE3:
3748 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003749 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003750 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003751 break;
3752 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003753 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003754 break;
3755 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003756 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003757 }
3758 }
3759
Anders Carlssone437c682010-01-27 03:47:49 +00003760 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003761 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003762 case AMD3DNowAthlon:
3763 Builder.defineMacro("__3dNOW_A__");
3764 case AMD3DNow:
3765 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003766 case MMX:
3767 Builder.defineMacro("__MMX__");
3768 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003769 break;
3770 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003771
3772 if (CPU >= CK_i486) {
3773 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3774 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3775 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3776 }
3777 if (CPU >= CK_i586)
3778 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003779}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003780
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003781bool X86TargetInfo::hasFeature(StringRef Feature) const {
3782 return llvm::StringSwitch<bool>(Feature)
3783 .Case("aes", HasAES)
3784 .Case("avx", SSELevel >= AVX)
3785 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003786 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003787 .Case("avx512cd", HasAVX512CD)
3788 .Case("avx512er", HasAVX512ER)
3789 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003790 .Case("avx512dq", HasAVX512DQ)
3791 .Case("avx512bw", HasAVX512BW)
3792 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003793 .Case("avx512vbmi", HasAVX512VBMI)
3794 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003795 .Case("bmi", HasBMI)
3796 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003797 .Case("clflushopt", HasCLFLUSHOPT)
3798 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003799 .Case("cx16", HasCX16)
3800 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003801 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003802 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003803 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003804 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003805 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003806 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3807 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3808 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003809 .Case("movbe", HasMOVBE)
3810 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003811 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003812 .Case("pcommit", HasPCOMMIT)
3813 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003814 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003815 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003816 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003817 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003818 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003819 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003820 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003821 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003822 .Case("sse", SSELevel >= SSE1)
3823 .Case("sse2", SSELevel >= SSE2)
3824 .Case("sse3", SSELevel >= SSE3)
3825 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003826 .Case("sse4.1", SSELevel >= SSE41)
3827 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003828 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003829 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003830 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003831 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003832 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3833 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003834 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003835 .Case("xsave", HasXSAVE)
3836 .Case("xsavec", HasXSAVEC)
3837 .Case("xsaves", HasXSAVES)
3838 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003839 .Default(false);
3840}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003841
Eric Christopherd9832702015-06-29 21:00:05 +00003842// We can't use a generic validation scheme for the features accepted here
3843// versus subtarget features accepted in the target attribute because the
3844// bitfield structure that's initialized in the runtime only supports the
3845// below currently rather than the full range of subtarget features. (See
3846// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3847bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3848 return llvm::StringSwitch<bool>(FeatureStr)
3849 .Case("cmov", true)
3850 .Case("mmx", true)
3851 .Case("popcnt", true)
3852 .Case("sse", true)
3853 .Case("sse2", true)
3854 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003855 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003856 .Case("sse4.1", true)
3857 .Case("sse4.2", true)
3858 .Case("avx", true)
3859 .Case("avx2", true)
3860 .Case("sse4a", true)
3861 .Case("fma4", true)
3862 .Case("xop", true)
3863 .Case("fma", true)
3864 .Case("avx512f", true)
3865 .Case("bmi", true)
3866 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003867 .Case("aes", true)
3868 .Case("pclmul", true)
3869 .Case("avx512vl", true)
3870 .Case("avx512bw", true)
3871 .Case("avx512dq", true)
3872 .Case("avx512cd", true)
3873 .Case("avx512er", true)
3874 .Case("avx512pf", true)
3875 .Case("avx512vbmi", true)
3876 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003877 .Default(false);
3878}
3879
Eli Friedman3fd920a2008-08-20 02:34:37 +00003880bool
Anders Carlsson58436352009-02-28 17:11:49 +00003881X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003882 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003883 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003884 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003885 // Constant constraints.
3886 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3887 // instructions.
3888 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3889 // x86_64 instructions.
3890 case 's':
3891 Info.setRequiresImmediate();
3892 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003893 case 'I':
3894 Info.setRequiresImmediate(0, 31);
3895 return true;
3896 case 'J':
3897 Info.setRequiresImmediate(0, 63);
3898 return true;
3899 case 'K':
3900 Info.setRequiresImmediate(-128, 127);
3901 return true;
3902 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003903 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003904 return true;
3905 case 'M':
3906 Info.setRequiresImmediate(0, 3);
3907 return true;
3908 case 'N':
3909 Info.setRequiresImmediate(0, 255);
3910 return true;
3911 case 'O':
3912 Info.setRequiresImmediate(0, 127);
3913 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003914 // Register constraints.
3915 case 'Y': // 'Y' is the first character for several 2-character constraints.
3916 // Shift the pointer to the second character of the constraint.
3917 Name++;
3918 switch (*Name) {
3919 default:
3920 return false;
3921 case '0': // First SSE register.
3922 case 't': // Any SSE register, when SSE2 is enabled.
3923 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3924 case 'm': // Any MMX register, when inter-unit moves enabled.
3925 Info.setAllowsRegister();
3926 return true;
3927 }
3928 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003929 // Constraint 'f' cannot be used for output operands.
3930 if (Info.ConstraintStr[0] == '=')
3931 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003932 Info.setAllowsRegister();
3933 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003934 case 'a': // eax.
3935 case 'b': // ebx.
3936 case 'c': // ecx.
3937 case 'd': // edx.
3938 case 'S': // esi.
3939 case 'D': // edi.
3940 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003941 case 't': // Top of floating point stack.
3942 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003943 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003944 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003945 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003946 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003947 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3948 case 'l': // "Index" registers: any general register that can be used as an
3949 // index in a base+index memory access.
3950 Info.setAllowsRegister();
3951 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003952 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003953 case 'C': // SSE floating point constant.
3954 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003955 return true;
3956 }
3957}
3958
Akira Hatanaka974131e2014-09-18 18:17:18 +00003959bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3960 unsigned Size) const {
3961 // Strip off constraint modifiers.
3962 while (Constraint[0] == '=' ||
3963 Constraint[0] == '+' ||
3964 Constraint[0] == '&')
3965 Constraint = Constraint.substr(1);
3966
3967 return validateOperandSize(Constraint, Size);
3968}
3969
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003970bool X86TargetInfo::validateInputSize(StringRef Constraint,
3971 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003972 return validateOperandSize(Constraint, Size);
3973}
3974
3975bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3976 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003977 switch (Constraint[0]) {
3978 default: break;
3979 case 'y':
3980 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003981 case 'f':
3982 case 't':
3983 case 'u':
3984 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003985 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003986 if (SSELevel >= AVX512F)
3987 // 512-bit zmm registers can be used if target supports AVX512F.
3988 return Size <= 512U;
3989 else if (SSELevel >= AVX)
3990 // 256-bit ymm registers can be used if target supports AVX.
3991 return Size <= 256U;
3992 return Size <= 128U;
3993 case 'Y':
3994 // 'Y' is the first character for several 2-character constraints.
3995 switch (Constraint[1]) {
3996 default: break;
3997 case 'm':
3998 // 'Ym' is synonymous with 'y'.
3999 return Size <= 64;
4000 case 'i':
4001 case 't':
4002 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4003 if (SSELevel >= AVX512F)
4004 return Size <= 512U;
4005 else if (SSELevel >= AVX)
4006 return Size <= 256U;
4007 return SSELevel >= SSE2 && Size <= 128U;
4008 }
4009
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004010 }
4011
4012 return true;
4013}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004014
Eli Friedman3fd920a2008-08-20 02:34:37 +00004015std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004016X86TargetInfo::convertConstraint(const char *&Constraint) const {
4017 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004018 case 'a': return std::string("{ax}");
4019 case 'b': return std::string("{bx}");
4020 case 'c': return std::string("{cx}");
4021 case 'd': return std::string("{dx}");
4022 case 'S': return std::string("{si}");
4023 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004024 case 'p': // address
4025 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004026 case 't': // top of floating point stack.
4027 return std::string("{st}");
4028 case 'u': // second from top of floating point stack.
4029 return std::string("{st(1)}"); // second from top of floating point stack.
4030 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004031 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004032 }
4033}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004034
Eli Friedman3fd920a2008-08-20 02:34:37 +00004035// X86-32 generic target
4036class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004037public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004038 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4039 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004040 DoubleAlign = LongLongAlign = 32;
4041 LongDoubleWidth = 96;
4042 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004043 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004044 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004045 SizeType = UnsignedInt;
4046 PtrDiffType = SignedInt;
4047 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004048 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004049
4050 // Use fpret for all types.
4051 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4052 (1 << TargetInfo::Double) |
4053 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004054
4055 // x86-32 has atomics up to 8 bytes
4056 // FIXME: Check that we actually have cmpxchg8b before setting
4057 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4058 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004059 }
Craig Topper3164f332014-03-11 03:39:26 +00004060 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004061 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004062 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004063
Craig Topper3164f332014-03-11 03:39:26 +00004064 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004065 if (RegNo == 0) return 0;
4066 if (RegNo == 1) return 2;
4067 return -1;
4068 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004069 bool validateOperandSize(StringRef Constraint,
4070 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004071 switch (Constraint[0]) {
4072 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004073 case 'R':
4074 case 'q':
4075 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004076 case 'a':
4077 case 'b':
4078 case 'c':
4079 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004080 case 'S':
4081 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004082 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004083 case 'A':
4084 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004085 }
4086
Akira Hatanaka974131e2014-09-18 18:17:18 +00004087 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004088 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004089};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004090
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004091class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4092public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004093 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4094 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004095
Craig Topper3164f332014-03-11 03:39:26 +00004096 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004097 unsigned Major, Minor, Micro;
4098 getTriple().getOSVersion(Major, Minor, Micro);
4099 // New NetBSD uses the default rounding mode.
4100 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4101 return X86_32TargetInfo::getFloatEvalMethod();
4102 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004103 return 1;
4104 }
4105};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004106
Eli Friedmane3aa4542009-07-05 18:47:56 +00004107class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4108public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004109 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4110 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004111 SizeType = UnsignedLong;
4112 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004113 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004114 }
4115};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004116
Eli Friedman9fa28852012-08-08 23:57:20 +00004117class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4118public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004119 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4120 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004121 SizeType = UnsignedLong;
4122 IntPtrType = SignedLong;
4123 PtrDiffType = SignedLong;
4124 }
4125};
Eli Friedman9fa28852012-08-08 23:57:20 +00004126
Torok Edwinb2b37c62009-06-30 17:10:35 +00004127class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004128public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004129 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4130 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004131 LongDoubleWidth = 128;
4132 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004133 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004134 MaxVectorAlign = 256;
4135 // The watchOS simulator uses the builtin bool type for Objective-C.
4136 llvm::Triple T = llvm::Triple(Triple);
4137 if (T.isWatchOS())
4138 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004139 SizeType = UnsignedLong;
4140 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004141 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004142 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004143 }
4144
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004145 bool handleTargetFeatures(std::vector<std::string> &Features,
4146 DiagnosticsEngine &Diags) override {
4147 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4148 Diags))
4149 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004150 // We now know the features we have: we can decide how to align vectors.
4151 MaxVectorAlign =
4152 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004153 return true;
4154 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004155};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004156
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004157// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004158class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004159public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004160 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4161 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004162 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004163 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004164 bool IsWinCOFF =
4165 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004166 resetDataLayout(IsWinCOFF
4167 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4168 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004169 }
Craig Topper3164f332014-03-11 03:39:26 +00004170 void getTargetDefines(const LangOptions &Opts,
4171 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004172 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4173 }
4174};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004175
4176// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004177class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004178public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004179 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4180 const TargetOptions &Opts)
4181 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004182 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004183 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4184 }
Craig Topper3164f332014-03-11 03:39:26 +00004185 void getTargetDefines(const LangOptions &Opts,
4186 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004187 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4188 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4189 // The value of the following reflects processor type.
4190 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4191 // We lost the original triple, so we use the default.
4192 Builder.defineMacro("_M_IX86", "600");
4193 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004194};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004195
David Majnemerae1ed0e2015-05-28 04:36:18 +00004196static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004197 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4198 // supports __declspec natively under -fms-extensions, but we define a no-op
4199 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004200 if (Opts.MicrosoftExt)
4201 Builder.defineMacro("__declspec", "__declspec");
4202 else
4203 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4204
4205 if (!Opts.MicrosoftExt) {
4206 // Provide macros for all the calling convention keywords. Provide both
4207 // single and double underscore prefixed variants. These are available on
4208 // x64 as well as x86, even though they have no effect.
4209 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4210 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004211 std::string GCCSpelling = "__attribute__((__";
4212 GCCSpelling += CC;
4213 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004214 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4215 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4216 }
4217 }
4218}
4219
David Majnemerae1ed0e2015-05-28 04:36:18 +00004220static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4221 Builder.defineMacro("__MSVCRT__");
4222 Builder.defineMacro("__MINGW32__");
4223 addCygMingDefines(Opts, Builder);
4224}
4225
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004226// x86-32 MinGW target
4227class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4228public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004229 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4230 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004231 void getTargetDefines(const LangOptions &Opts,
4232 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004233 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004234 DefineStd(Builder, "WIN32", Opts);
4235 DefineStd(Builder, "WINNT", Opts);
4236 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004237 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004238 }
4239};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004240
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004241// x86-32 Cygwin target
4242class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004244 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4245 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004246 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004247 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004248 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 +00004249 }
Craig Topper3164f332014-03-11 03:39:26 +00004250 void getTargetDefines(const LangOptions &Opts,
4251 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004252 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004253 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004254 Builder.defineMacro("__CYGWIN__");
4255 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004256 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004257 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004258 if (Opts.CPlusPlus)
4259 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004260 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004261};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004262
Chris Lattnerb986aba2010-04-11 19:29:39 +00004263// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004264class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004265public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004266 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004267 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004268 }
Craig Topper3164f332014-03-11 03:39:26 +00004269 void getTargetDefines(const LangOptions &Opts,
4270 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004271 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004272 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004273 }
4274};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004275
Alexey Bataevc99b0492015-11-25 09:24:26 +00004276// X86-32 MCU target
4277class MCUX86_32TargetInfo : public X86_32TargetInfo {
4278public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004279 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4280 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004281 LongDoubleWidth = 64;
4282 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004283 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 +00004284 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004285 }
4286
4287 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4288 // On MCU we support only C calling convention.
4289 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4290 }
4291
4292 void getTargetDefines(const LangOptions &Opts,
4293 MacroBuilder &Builder) const override {
4294 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4295 Builder.defineMacro("__iamcu");
4296 Builder.defineMacro("__iamcu__");
4297 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004298
4299 bool allowsLargerPreferedTypeAlignment() const override {
4300 return false;
4301 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004302};
4303
Douglas Gregor9fabd852011-07-01 22:41:14 +00004304// RTEMS Target
4305template<typename Target>
4306class RTEMSTargetInfo : public OSTargetInfo<Target> {
4307protected:
Craig Topper3164f332014-03-11 03:39:26 +00004308 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4309 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004310 // RTEMS defines; list based off of gcc output
4311
Douglas Gregor9fabd852011-07-01 22:41:14 +00004312 Builder.defineMacro("__rtems__");
4313 Builder.defineMacro("__ELF__");
4314 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004315
Douglas Gregor9fabd852011-07-01 22:41:14 +00004316public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004317 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4318 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004319 switch (Triple.getArch()) {
4320 default:
4321 case llvm::Triple::x86:
4322 // this->MCountName = ".mcount";
4323 break;
4324 case llvm::Triple::mips:
4325 case llvm::Triple::mipsel:
4326 case llvm::Triple::ppc:
4327 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004328 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004329 // this->MCountName = "_mcount";
4330 break;
4331 case llvm::Triple::arm:
4332 // this->MCountName = "__mcount";
4333 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004334 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004335 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004336};
4337
Douglas Gregor9fabd852011-07-01 22:41:14 +00004338// x86-32 RTEMS target
4339class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4340public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004341 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4342 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004343 SizeType = UnsignedLong;
4344 IntPtrType = SignedLong;
4345 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004346 }
Craig Topper3164f332014-03-11 03:39:26 +00004347 void getTargetDefines(const LangOptions &Opts,
4348 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004349 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4350 Builder.defineMacro("__INTEL__");
4351 Builder.defineMacro("__rtems__");
4352 }
4353};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004354
Eli Friedman3fd920a2008-08-20 02:34:37 +00004355// x86-64 generic target
4356class X86_64TargetInfo : public X86TargetInfo {
4357public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004358 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4359 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004360 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004361 bool IsWinCOFF =
4362 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004363 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004364 LongDoubleWidth = 128;
4365 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004366 LargeArrayMinWidth = 128;
4367 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004368 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004369 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4370 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4371 IntPtrType = IsX32 ? SignedInt : SignedLong;
4372 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004373 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004374 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004375
Eric Christopher917e9522014-11-18 22:36:15 +00004376 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004377 resetDataLayout(IsX32
4378 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4379 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4380 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004381
4382 // Use fpret only for long double.
4383 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004384
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004385 // Use fp2ret for _Complex long double.
4386 ComplexLongDoubleUsesFP2Ret = true;
4387
Charles Davisc7d5c942015-09-17 20:55:33 +00004388 // Make __builtin_ms_va_list available.
4389 HasBuiltinMSVaList = true;
4390
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004391 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004392 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004393 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004394 }
Craig Topper3164f332014-03-11 03:39:26 +00004395 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004396 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004397 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004398
Craig Topper3164f332014-03-11 03:39:26 +00004399 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004400 if (RegNo == 0) return 0;
4401 if (RegNo == 1) return 1;
4402 return -1;
4403 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004404
Craig Topper3164f332014-03-11 03:39:26 +00004405 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004406 switch (CC) {
4407 case CC_C:
4408 case CC_Swift:
4409 case CC_X86VectorCall:
4410 case CC_IntelOclBicc:
4411 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004412 case CC_PreserveMost:
4413 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004414 return CCCR_OK;
4415 default:
4416 return CCCR_Warning;
4417 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004418 }
4419
Craig Topper3164f332014-03-11 03:39:26 +00004420 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004421 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004422 }
4423
Pavel Chupinfd223e12014-08-04 12:39:43 +00004424 // for x32 we need it here explicitly
4425 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004426 unsigned getUnwindWordWidth() const override { return 64; }
4427 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004428
4429 bool validateGlobalRegisterVariable(StringRef RegName,
4430 unsigned RegSize,
4431 bool &HasSizeMismatch) const override {
4432 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4433 // handle.
4434 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4435 // Check that the register size is 64-bit.
4436 HasSizeMismatch = RegSize != 64;
4437 return true;
4438 }
4439
4440 // Check if the register is a 32-bit register the backend can handle.
4441 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4442 HasSizeMismatch);
4443 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004444};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004445
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004446// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004447class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004449 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4450 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004451 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004452 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004453 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004454 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004455 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004456 SizeType = UnsignedLongLong;
4457 PtrDiffType = SignedLongLong;
4458 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004459 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004460
Craig Topper3164f332014-03-11 03:39:26 +00004461 void getTargetDefines(const LangOptions &Opts,
4462 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004463 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004464 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004465 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004466
Craig Topper3164f332014-03-11 03:39:26 +00004467 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004468 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004469 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004470
Craig Topper3164f332014-03-11 03:39:26 +00004471 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004472 switch (CC) {
4473 case CC_X86StdCall:
4474 case CC_X86ThisCall:
4475 case CC_X86FastCall:
4476 return CCCR_Ignore;
4477 case CC_C:
4478 case CC_X86VectorCall:
4479 case CC_IntelOclBicc:
4480 case CC_X86_64SysV:
4481 return CCCR_OK;
4482 default:
4483 return CCCR_Warning;
4484 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004485 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004486};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004487
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004488// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004489class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004490public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004491 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4492 const TargetOptions &Opts)
4493 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004494 LongDoubleWidth = LongDoubleAlign = 64;
4495 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004496 }
Craig Topper3164f332014-03-11 03:39:26 +00004497 void getTargetDefines(const LangOptions &Opts,
4498 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004499 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4500 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004501 Builder.defineMacro("_M_X64", "100");
4502 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004503 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004504};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004505
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004506// x86-64 MinGW target
4507class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4508public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004509 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4510 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004511 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4512 // with x86 FP ops. Weird.
4513 LongDoubleWidth = LongDoubleAlign = 128;
4514 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4515 }
4516
Craig Topper3164f332014-03-11 03:39:26 +00004517 void getTargetDefines(const LangOptions &Opts,
4518 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004519 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004520 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004521 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004522 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004523
4524 // GCC defines this macro when it is using __gxx_personality_seh0.
4525 if (!Opts.SjLjExceptions)
4526 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004527 }
4528};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004529
Yaron Kerend030d112015-07-22 17:38:19 +00004530// x86-64 Cygwin target
4531class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4532public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004533 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4534 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004535 TLSSupported = false;
4536 WCharType = UnsignedShort;
4537 }
4538 void getTargetDefines(const LangOptions &Opts,
4539 MacroBuilder &Builder) const override {
4540 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4541 Builder.defineMacro("__x86_64__");
4542 Builder.defineMacro("__CYGWIN__");
4543 Builder.defineMacro("__CYGWIN64__");
4544 addCygMingDefines(Opts, Builder);
4545 DefineStd(Builder, "unix", Opts);
4546 if (Opts.CPlusPlus)
4547 Builder.defineMacro("_GNU_SOURCE");
4548
4549 // GCC defines this macro when it is using __gxx_personality_seh0.
4550 if (!Opts.SjLjExceptions)
4551 Builder.defineMacro("__SEH__");
4552 }
4553};
4554
Eli Friedman2857ccb2009-07-01 03:36:11 +00004555class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4556public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004557 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4558 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004559 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004560 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4561 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004562 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004563 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004564 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004565 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004566
4567 bool handleTargetFeatures(std::vector<std::string> &Features,
4568 DiagnosticsEngine &Diags) override {
4569 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4570 Diags))
4571 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004572 // We now know the features we have: we can decide how to align vectors.
4573 MaxVectorAlign =
4574 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004575 return true;
4576 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004577};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004578
Eli Friedman245f2292009-07-05 22:31:18 +00004579class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4580public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004581 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4582 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004583 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004584 Int64Type = SignedLongLong;
4585 }
4586};
Eli Friedman245f2292009-07-05 22:31:18 +00004587
Eli Friedman9fa28852012-08-08 23:57:20 +00004588class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4589public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004590 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4591 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004592 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004593 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004594 }
4595};
Tim Northover9bb857a2013-01-31 12:13:10 +00004596
Eli Friedmanf05b7722008-08-20 07:44:10 +00004597class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004598 // Possible FPU choices.
4599 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004600 VFP2FPU = (1 << 0),
4601 VFP3FPU = (1 << 1),
4602 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004603 NeonFPU = (1 << 3),
4604 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004605 };
4606
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004607 // Possible HWDiv features.
4608 enum HWDivMode {
4609 HWDivThumb = (1 << 0),
4610 HWDivARM = (1 << 1)
4611 };
4612
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004613 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004614 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004615 }
4616
4617 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4618 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004619
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004620 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004621
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004622 StringRef CPUProfile;
4623 StringRef CPUAttr;
4624
Rafael Espindolaeb265472013-08-21 21:59:03 +00004625 enum {
4626 FP_Default,
4627 FP_VFP,
4628 FP_Neon
4629 } FPMath;
4630
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004631 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004632 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004633 unsigned ArchProfile;
4634 unsigned ArchVersion;
4635
Bernard Ogdenda13af32013-10-24 18:32:51 +00004636 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004637
Logan Chien57086ce2012-10-10 06:56:20 +00004638 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004639 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004640
4641 // Initialized via features.
4642 unsigned SoftFloat : 1;
4643 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004644
Bernard Ogden18b57012013-10-29 09:47:51 +00004645 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004646 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004647 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004648 unsigned Unaligned : 1;
4649
4650 enum {
4651 LDREX_B = (1 << 0), /// byte (8-bit)
4652 LDREX_H = (1 << 1), /// half (16-bit)
4653 LDREX_W = (1 << 2), /// word (32-bit)
4654 LDREX_D = (1 << 3), /// double (64-bit)
4655 };
4656
4657 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004658
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004659 // ACLE 6.5.1 Hardware floating point
4660 enum {
4661 HW_FP_HP = (1 << 1), /// half (16-bit)
4662 HW_FP_SP = (1 << 2), /// single (32-bit)
4663 HW_FP_DP = (1 << 3), /// double (64-bit)
4664 };
4665 uint32_t HW_FP;
4666
Chris Lattner5cc15e02010-03-03 19:03:45 +00004667 static const Builtin::Info BuiltinInfo[];
4668
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004669 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004670 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004671
4672 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004673 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004674
Renato Golin9ba39232015-02-27 16:35:48 +00004675 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4676 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4677 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004678 SizeType = UnsignedLong;
4679 else
4680 SizeType = UnsignedInt;
4681
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004682 switch (T.getOS()) {
4683 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004684 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004685 break;
4686 case llvm::Triple::Win32:
4687 WCharType = UnsignedShort;
4688 break;
4689 case llvm::Triple::Linux:
4690 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004691 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4692 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004693 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004694 }
4695
4696 UseBitFieldTypeAlignment = true;
4697
4698 ZeroLengthBitfieldBoundary = 0;
4699
Tim Northover147cd2f2014-10-14 22:12:21 +00004700 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4701 // so set preferred for small types to 32.
4702 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004703 resetDataLayout(BigEndian
4704 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4705 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004706 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004707 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004708 resetDataLayout("e"
4709 "-m:w"
4710 "-p:32:32"
4711 "-i64:64"
4712 "-v128:64:128"
4713 "-a:0:32"
4714 "-n32"
4715 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004716 } else if (T.isOSNaCl()) {
4717 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004718 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004719 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004720 resetDataLayout(BigEndian
4721 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4722 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004723 }
4724
4725 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004726 }
4727
Tim Northover5627d392015-10-30 16:30:45 +00004728 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004729 const llvm::Triple &T = getTriple();
4730
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004731 IsAAPCS = false;
4732
Tim Northover5627d392015-10-30 16:30:45 +00004733 if (IsAAPCS16)
4734 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4735 else
4736 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004737
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004738 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004739 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004740 SizeType = UnsignedInt;
4741 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004742 SizeType = UnsignedLong;
4743
4744 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4745 WCharType = SignedInt;
4746
4747 // Do not respect the alignment of bit-field types when laying out
4748 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4749 UseBitFieldTypeAlignment = false;
4750
4751 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4752 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4753 /// gcc.
4754 ZeroLengthBitfieldBoundary = 32;
4755
Tim Northover5627d392015-10-30 16:30:45 +00004756 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4757 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004758 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004759 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004760 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004761 BigEndian
4762 ? "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 +00004763 : "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 +00004764 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004765 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004766 BigEndian
4767 ? "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 +00004768 : "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 +00004769
4770 // FIXME: Override "preferred align" for double and long long.
4771 }
4772
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004773 void setArchInfo() {
4774 StringRef ArchName = getTriple().getArchName();
4775
Renato Goline84b0002015-10-08 16:43:26 +00004776 ArchISA = llvm::ARM::parseArchISA(ArchName);
4777 CPU = llvm::ARM::getDefaultCPU(ArchName);
4778 unsigned AK = llvm::ARM::parseArch(ArchName);
4779 if (AK != llvm::ARM::AK_INVALID)
4780 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004781 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 }
4783
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004784 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004785 StringRef SubArch;
4786
4787 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004788 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004789 SubArch = llvm::ARM::getSubArch(ArchKind);
4790 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4791 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792
4793 // cache CPU related strings
4794 CPUAttr = getCPUAttr();
4795 CPUProfile = getCPUProfile();
4796 }
4797
4798 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004799 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004800 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004801 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004802 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4803 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004804 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004805 if (ArchProfile == llvm::ARM::PK_M) {
4806 MaxAtomicPromoteWidth = 32;
4807 if (ShouldUseInlineAtomic)
4808 MaxAtomicInlineWidth = 32;
4809 }
4810 else {
4811 MaxAtomicPromoteWidth = 64;
4812 if (ShouldUseInlineAtomic)
4813 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004814 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004815 }
4816
4817 bool isThumb() const {
4818 return (ArchISA == llvm::ARM::IK_THUMB);
4819 }
4820
4821 bool supportsThumb() const {
4822 return CPUAttr.count('T') || ArchVersion >= 6;
4823 }
4824
4825 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004826 return CPUAttr.equals("6T2") ||
4827 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004828 }
4829
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004830 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004831 // For most sub-arches, the build attribute CPU name is enough.
4832 // For Cortex variants, it's slightly different.
4833 switch(ArchKind) {
4834 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004835 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004838 case llvm::ARM::AK_ARMV7S:
4839 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 return "7A";
4842 case llvm::ARM::AK_ARMV7R:
4843 return "7R";
4844 case llvm::ARM::AK_ARMV7M:
4845 return "7M";
4846 case llvm::ARM::AK_ARMV7EM:
4847 return "7EM";
4848 case llvm::ARM::AK_ARMV8A:
4849 return "8A";
4850 case llvm::ARM::AK_ARMV8_1A:
4851 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004852 case llvm::ARM::AK_ARMV8_2A:
4853 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004854 case llvm::ARM::AK_ARMV8MBaseline:
4855 return "8M_BASE";
4856 case llvm::ARM::AK_ARMV8MMainline:
4857 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004858 }
4859 }
4860
4861 StringRef getCPUProfile() const {
4862 switch(ArchProfile) {
4863 case llvm::ARM::PK_A:
4864 return "A";
4865 case llvm::ARM::PK_R:
4866 return "R";
4867 case llvm::ARM::PK_M:
4868 return "M";
4869 default:
4870 return "";
4871 }
4872 }
4873
Chris Lattner17df24e2008-04-21 18:56:49 +00004874public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004875 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4876 bool IsBigEndian)
4877 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4878 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004879 BigEndian = IsBigEndian;
4880
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004881 switch (getTriple().getOS()) {
4882 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004883 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004884 break;
4885 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004886 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004887 break;
4888 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004889
Renato Goline84b0002015-10-08 16:43:26 +00004890 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004891 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004892
Chris Lattner1a8f3942010-04-23 16:29:58 +00004893 // {} in inline assembly are neon specifiers, not assembly variant
4894 // specifiers.
4895 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004896
Eric Christopher0e261882014-12-05 01:06:59 +00004897 // FIXME: This duplicates code from the driver that sets the -target-abi
4898 // option - this code is used if -target-abi isn't passed and should
4899 // be unified in some way.
4900 if (Triple.isOSBinFormatMachO()) {
4901 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4902 // the frontend matches that.
4903 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4904 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004905 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004906 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004907 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004908 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004909 } else {
4910 setABI("apcs-gnu");
4911 }
4912 } else if (Triple.isOSWindows()) {
4913 // FIXME: this is invalid for WindowsCE
4914 setABI("aapcs");
4915 } else {
4916 // Select the default based on the platform.
4917 switch (Triple.getEnvironment()) {
4918 case llvm::Triple::Android:
4919 case llvm::Triple::GNUEABI:
4920 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004921 case llvm::Triple::MuslEABI:
4922 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004923 setABI("aapcs-linux");
4924 break;
4925 case llvm::Triple::EABIHF:
4926 case llvm::Triple::EABI:
4927 setABI("aapcs");
4928 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004929 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004930 setABI("apcs-gnu");
4931 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004932 default:
4933 if (Triple.getOS() == llvm::Triple::NetBSD)
4934 setABI("apcs-gnu");
4935 else
4936 setABI("aapcs");
4937 break;
4938 }
4939 }
John McCall86353412010-08-21 22:46:04 +00004940
4941 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004942 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004943
Renato Golin15b86152015-07-03 16:41:13 +00004944 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004945 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004946
James Molloya7139222012-03-12 09:14:10 +00004947 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004948 // the alignment of the zero-length bitfield is greater than the member
4949 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004950 // zero length bitfield.
4951 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004952
4953 if (Triple.getOS() == llvm::Triple::Linux ||
4954 Triple.getOS() == llvm::Triple::UnknownOS)
4955 this->MCountName =
4956 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004957 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004958
Alp Toker4925ba72014-06-07 23:30:42 +00004959 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004960
Craig Topper3164f332014-03-11 03:39:26 +00004961 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004962 ABI = Name;
4963
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004964 // The defaults (above) are for AAPCS, check if we need to change them.
4965 //
4966 // FIXME: We need support for -meabi... we could just mangle it into the
4967 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004968 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004969 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004970 return true;
4971 }
4972 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4973 setABIAAPCS();
4974 return true;
4975 }
4976 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004977 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004978
Renato Golinf5c4dec2015-05-27 13:33:00 +00004979 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004980 bool
4981 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4982 StringRef CPU,
4983 const std::vector<std::string> &FeaturesVec) const override {
4984
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004985 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004986 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004987
4988 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004989 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004990 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4991
4992 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004993 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004994 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4995
4996 for (const char *Feature : TargetFeatures)
4997 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004998 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004999
Eric Christopher007b0a02015-08-28 22:32:01 +00005000 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005001 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005002
Craig Topper3164f332014-03-11 03:39:26 +00005003 bool handleTargetFeatures(std::vector<std::string> &Features,
5004 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005005 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005006 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005007 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005008 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005009 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005010 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005011 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005012
Ranjeet Singhac08e532015-06-24 23:39:25 +00005013 // This does not diagnose illegal cases like having both
5014 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5015 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005016 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005017 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005018 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005019 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005020 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005021 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005022 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005023 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005024 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005025 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005026 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005027 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005028 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005029 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005030 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005031 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005032 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005033 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005034 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005035 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005036 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005037 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005038 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005039 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005040 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005041 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005042 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005043 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005044 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005045 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005046 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005047 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005048 } else if (Feature == "+strict-align") {
5049 Unaligned = 0;
5050 } else if (Feature == "+fp16") {
5051 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005052 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005053 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005054 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005055
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005056 switch (ArchVersion) {
5057 case 6:
5058 if (ArchProfile == llvm::ARM::PK_M)
5059 LDREX = 0;
5060 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5061 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5062 else
5063 LDREX = LDREX_W;
5064 break;
5065 case 7:
5066 if (ArchProfile == llvm::ARM::PK_M)
5067 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5068 else
5069 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5070 break;
5071 case 8:
5072 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5073 }
5074
Rafael Espindolaeb265472013-08-21 21:59:03 +00005075 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5076 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5077 return false;
5078 }
5079
5080 if (FPMath == FP_Neon)
5081 Features.push_back("+neonfp");
5082 else if (FPMath == FP_VFP)
5083 Features.push_back("-neonfp");
5084
Daniel Dunbar893d4752009-12-19 04:15:38 +00005085 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005086 auto Feature =
5087 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5088 if (Feature != Features.end())
5089 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005090
Rafael Espindolaeb265472013-08-21 21:59:03 +00005091 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005092 }
5093
Craig Topper3164f332014-03-11 03:39:26 +00005094 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005095 return llvm::StringSwitch<bool>(Feature)
5096 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005097 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005098 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005099 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005100 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005101 .Case("hwdiv", HWDiv & HWDivThumb)
5102 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005103 .Default(false);
5104 }
Renato Golin15b86152015-07-03 16:41:13 +00005105
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005106 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005107 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005108 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005109
Renato Golin15b86152015-07-03 16:41:13 +00005110 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005111 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005113 CPU = Name;
5114 return true;
5115 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005116
Craig Topper3164f332014-03-11 03:39:26 +00005117 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005118
Craig Topper3164f332014-03-11 03:39:26 +00005119 void getTargetDefines(const LangOptions &Opts,
5120 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005121 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005122 Builder.defineMacro("__arm");
5123 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005124 // For bare-metal none-eabi.
5125 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5126 getTriple().getEnvironment() == llvm::Triple::EABI)
5127 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005128
Chris Lattnerecd49032009-03-02 22:27:17 +00005129 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005130 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005131
5132 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5133 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005134 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005135 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5136
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005137 if (!CPUAttr.empty())
5138 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005139
5140 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005141 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005142 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005143
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005144 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005145 // ACLE 6.5.7 Crypto Extension
5146 if (Crypto)
5147 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5148 // ACLE 6.5.8 CRC32 Extension
5149 if (CRC)
5150 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5151 // ACLE 6.5.10 Numeric Maximum and Minimum
5152 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5153 // ACLE 6.5.9 Directed Rounding
5154 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005155 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005156
5157 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5158 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005159 // NOTE that the default profile is assumed to be 'A'
5160 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005161 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5162
Bradley Smithf4affc12016-03-03 13:52:22 +00005163 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5164 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5165 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5166 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005167 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005168 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005169 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005170 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5171
5172 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5173 // instruction set such as ARM or Thumb.
5174 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5175
5176 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5177
5178 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005179 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005180 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005181
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005182 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005183 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005184 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005185
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005186 // ACLE 6.4.4 LDREX/STREX
5187 if (LDREX)
5188 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5189
5190 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005191 if (ArchVersion == 5 ||
5192 (ArchVersion == 6 && CPUProfile != "M") ||
5193 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005194 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5195
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005196 // ACLE 6.5.1 Hardware Floating Point
5197 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005198 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005199
Yi Konga44c4d72014-06-27 21:25:42 +00005200 // ACLE predefines.
5201 Builder.defineMacro("__ARM_ACLE", "200");
5202
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005203 // FP16 support (we currently only support IEEE format).
5204 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5205 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5206
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005207 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005208 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005209 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5210
Mike Stump9d54bd72009-04-08 02:07:04 +00005211 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005212
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005213 // FIXME: It's more complicated than this and we don't really support
5214 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005215 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005216 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005217 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005218
David Tweed8f676532012-10-25 13:33:01 +00005219 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005220 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005221 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005222 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005223 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005224 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005225 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005226
Tim Northover28fc0e12016-04-28 13:59:55 +00005227 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5228 ABI == "aapcs16")
5229 Builder.defineMacro("__ARM_PCS_VFP", "1");
5230
Daniel Dunbar893d4752009-12-19 04:15:38 +00005231 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005232 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005233
Zijiao Ma56a83722016-08-17 02:13:33 +00005234 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005235 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005236
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005237 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005238 Builder.defineMacro("__THUMBEL__");
5239 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005240 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005241 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005242 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005243
5244 // ACLE 6.4.9 32-bit SIMD instructions
5245 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5246 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5247
5248 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005249 if (((HWDiv & HWDivThumb) && isThumb()) ||
5250 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005251 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005252 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005253 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005254
5255 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005256 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005257
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005258 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005259 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005260 if (FPU & VFP2FPU)
5261 Builder.defineMacro("__ARM_VFPV2__");
5262 if (FPU & VFP3FPU)
5263 Builder.defineMacro("__ARM_VFPV3__");
5264 if (FPU & VFP4FPU)
5265 Builder.defineMacro("__ARM_VFPV4__");
5266 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005267
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005268 // This only gets set when Neon instructions are actually available, unlike
5269 // the VFP define, hence the soft float and arch check. This is subtly
5270 // different from gcc, we follow the intent which was that it should be set
5271 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005272 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005274 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005275 // current AArch32 NEON implementations do not support double-precision
5276 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005277 Builder.defineMacro("__ARM_NEON_FP",
5278 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005279 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005280
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005281 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5282 Opts.ShortWChar ? "2" : "4");
5283
5284 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5285 Opts.ShortEnums ? "1" : "4");
5286
Bradley Smithf4affc12016-03-03 13:52:22 +00005287 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005288 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5289 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5290 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5291 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5292 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005293
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005294 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005295 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005296 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005297 }
5298
5299 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005300 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5302 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005303 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005304 }
5305
5306 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005307 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005308 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005309
5310 if (Opts.UnsafeFPMath)
5311 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005312
5313 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5314 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005315 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005316
Craig Topper6c03a542015-10-19 04:51:35 +00005317 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5318 return llvm::makeArrayRef(BuiltinInfo,
5319 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005320 }
Craig Topper3164f332014-03-11 03:39:26 +00005321 bool isCLZForZeroUndef() const override { return false; }
5322 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005323 return IsAAPCS
5324 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005325 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5326 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005327 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005328 ArrayRef<const char *> getGCCRegNames() const override;
5329 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005330 bool validateAsmConstraint(const char *&Name,
5331 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005332 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005333 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005334 case 'l': // r0-r7
5335 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005336 case 't': // VFP Floating point register single precision
5337 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005338 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005339 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005340 case 'I':
5341 case 'J':
5342 case 'K':
5343 case 'L':
5344 case 'M':
5345 // FIXME
5346 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005347 case 'Q': // A memory address that is a single base register.
5348 Info.setAllowsMemory();
5349 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005350 case 'U': // a memory reference...
5351 switch (Name[1]) {
5352 case 'q': // ...ARMV4 ldrsb
5353 case 'v': // ...VFP load/store (reg+constant offset)
5354 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005355 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005356 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005357 case 'n': // valid address for Neon doubleword vector load/store
5358 case 'm': // valid address for Neon element and structure load/store
5359 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005360 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005361 Info.setAllowsMemory();
5362 Name++;
5363 return true;
5364 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005365 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005366 return false;
5367 }
Craig Topper3164f332014-03-11 03:39:26 +00005368 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005369 std::string R;
5370 switch (*Constraint) {
5371 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005372 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005373 Constraint++;
5374 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005375 case 'p': // 'p' should be translated to 'r' by default.
5376 R = std::string("r");
5377 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005378 default:
5379 return std::string(1, *Constraint);
5380 }
5381 return R;
5382 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005383 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005384 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005385 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005386 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005387 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005388
Bill Wendling9d1ee112012-10-25 23:28:48 +00005389 // Strip off constraint modifiers.
5390 while (Constraint[0] == '=' ||
5391 Constraint[0] == '+' ||
5392 Constraint[0] == '&')
5393 Constraint = Constraint.substr(1);
5394
5395 switch (Constraint[0]) {
5396 default: break;
5397 case 'r': {
5398 switch (Modifier) {
5399 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005400 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005401 case 'q':
5402 // A register of size 32 cannot fit a vector type.
5403 return false;
5404 }
5405 }
5406 }
5407
5408 return true;
5409 }
Craig Topper3164f332014-03-11 03:39:26 +00005410 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005411 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005412 return "";
5413 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005414
Craig Topper3164f332014-03-11 03:39:26 +00005415 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005416 switch (CC) {
5417 case CC_AAPCS:
5418 case CC_AAPCS_VFP:
5419 case CC_Swift:
5420 return CCCR_OK;
5421 default:
5422 return CCCR_Warning;
5423 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005424 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005425
Craig Topper3164f332014-03-11 03:39:26 +00005426 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005427 if (RegNo == 0) return 0;
5428 if (RegNo == 1) return 1;
5429 return -1;
5430 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005431
5432 bool hasSjLjLowering() const override {
5433 return true;
5434 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005435};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005436
Rafael Espindolaeb265472013-08-21 21:59:03 +00005437bool ARMTargetInfo::setFPMath(StringRef Name) {
5438 if (Name == "neon") {
5439 FPMath = FP_Neon;
5440 return true;
5441 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5442 Name == "vfp4") {
5443 FPMath = FP_VFP;
5444 return true;
5445 }
5446 return false;
5447}
5448
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005449const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005450 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005451 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005452 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5453
5454 // Float registers
5455 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5456 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5457 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005458 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005459
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005460 // Double registers
5461 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5462 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005463 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5464 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005465
5466 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005467 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5468 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005469};
5470
Craig Topperf054e3a2015-10-19 03:52:27 +00005471ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5472 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005473}
5474
5475const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005476 { { "a1" }, "r0" },
5477 { { "a2" }, "r1" },
5478 { { "a3" }, "r2" },
5479 { { "a4" }, "r3" },
5480 { { "v1" }, "r4" },
5481 { { "v2" }, "r5" },
5482 { { "v3" }, "r6" },
5483 { { "v4" }, "r7" },
5484 { { "v5" }, "r8" },
5485 { { "v6", "rfp" }, "r9" },
5486 { { "sl" }, "r10" },
5487 { { "fp" }, "r11" },
5488 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005489 { { "r13" }, "sp" },
5490 { { "r14" }, "lr" },
5491 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005492 // The S, D and Q registers overlap, but aren't really aliases; we
5493 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005494};
5495
Craig Topperf054e3a2015-10-19 03:52:27 +00005496ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5497 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005498}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005499
5500const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005501#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005502 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005503#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5504 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005505#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005506
Craig Topper07d3b622015-08-07 05:14:44 +00005507#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005508 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005509#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005510 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005511#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5512 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005513#include "clang/Basic/BuiltinsARM.def"
5514};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005515
5516class ARMleTargetInfo : public ARMTargetInfo {
5517public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005518 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5519 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005520 void getTargetDefines(const LangOptions &Opts,
5521 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005522 Builder.defineMacro("__ARMEL__");
5523 ARMTargetInfo::getTargetDefines(Opts, Builder);
5524 }
5525};
5526
5527class ARMbeTargetInfo : public ARMTargetInfo {
5528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005529 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5530 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005531 void getTargetDefines(const LangOptions &Opts,
5532 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005533 Builder.defineMacro("__ARMEB__");
5534 Builder.defineMacro("__ARM_BIG_ENDIAN");
5535 ARMTargetInfo::getTargetDefines(Opts, Builder);
5536 }
5537};
Chris Lattner17df24e2008-04-21 18:56:49 +00005538
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005539class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5540 const llvm::Triple Triple;
5541public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005542 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5543 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005544 WCharType = UnsignedShort;
5545 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005546 }
5547 void getVisualStudioDefines(const LangOptions &Opts,
5548 MacroBuilder &Builder) const {
5549 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5550
5551 // FIXME: this is invalid for WindowsCE
5552 Builder.defineMacro("_M_ARM_NT", "1");
5553 Builder.defineMacro("_M_ARMT", "_M_ARM");
5554 Builder.defineMacro("_M_THUMB", "_M_ARM");
5555
5556 assert((Triple.getArch() == llvm::Triple::arm ||
5557 Triple.getArch() == llvm::Triple::thumb) &&
5558 "invalid architecture for Windows ARM target info");
5559 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5560 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5561
5562 // TODO map the complete set of values
5563 // 31: VFPv3 40: VFPv4
5564 Builder.defineMacro("_M_ARM_FP", "31");
5565 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005566 BuiltinVaListKind getBuiltinVaListKind() const override {
5567 return TargetInfo::CharPtrBuiltinVaList;
5568 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005569 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5570 switch (CC) {
5571 case CC_X86StdCall:
5572 case CC_X86ThisCall:
5573 case CC_X86FastCall:
5574 case CC_X86VectorCall:
5575 return CCCR_Ignore;
5576 case CC_C:
5577 return CCCR_OK;
5578 default:
5579 return CCCR_Warning;
5580 }
5581 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005582};
5583
5584// Windows ARM + Itanium C++ ABI Target
5585class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5586public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005587 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5588 const TargetOptions &Opts)
5589 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005590 TheCXXABI.set(TargetCXXABI::GenericARM);
5591 }
5592
5593 void getTargetDefines(const LangOptions &Opts,
5594 MacroBuilder &Builder) const override {
5595 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5596
5597 if (Opts.MSVCCompat)
5598 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5599 }
5600};
5601
5602// Windows ARM, MS (C++) ABI
5603class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5604public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005605 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5606 const TargetOptions &Opts)
5607 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005608 TheCXXABI.set(TargetCXXABI::Microsoft);
5609 }
5610
5611 void getTargetDefines(const LangOptions &Opts,
5612 MacroBuilder &Builder) const override {
5613 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5614 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5615 }
5616};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005617
Yaron Keren321249c2015-07-15 13:32:23 +00005618// ARM MinGW target
5619class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5620public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005621 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5622 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005623 TheCXXABI.set(TargetCXXABI::GenericARM);
5624 }
5625
5626 void getTargetDefines(const LangOptions &Opts,
5627 MacroBuilder &Builder) const override {
5628 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5629 DefineStd(Builder, "WIN32", Opts);
5630 DefineStd(Builder, "WINNT", Opts);
5631 Builder.defineMacro("_ARM_");
5632 addMinGWDefines(Opts, Builder);
5633 }
5634};
5635
5636// ARM Cygwin target
5637class CygwinARMTargetInfo : public ARMleTargetInfo {
5638public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005639 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5640 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005641 TLSSupported = false;
5642 WCharType = UnsignedShort;
5643 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005644 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005645 }
5646 void getTargetDefines(const LangOptions &Opts,
5647 MacroBuilder &Builder) const override {
5648 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5649 Builder.defineMacro("_ARM_");
5650 Builder.defineMacro("__CYGWIN__");
5651 Builder.defineMacro("__CYGWIN32__");
5652 DefineStd(Builder, "unix", Opts);
5653 if (Opts.CPlusPlus)
5654 Builder.defineMacro("_GNU_SOURCE");
5655 }
5656};
5657
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005658class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005659protected:
Craig Topper3164f332014-03-11 03:39:26 +00005660 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5661 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005662 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005663 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005664
Torok Edwinb2b37c62009-06-30 17:10:35 +00005665public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005666 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5667 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005668 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005669 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005670 // FIXME: This should be based off of the target features in
5671 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005672 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005673
Tim Northoverd88ecb32016-01-27 19:32:40 +00005674 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005675 // Darwin on iOS uses a variant of the ARM C++ ABI.
5676 TheCXXABI.set(TargetCXXABI::WatchOS);
5677
5678 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5679 // size_t is long, it's a bit weird for it to be int.
5680 PtrDiffType = SignedLong;
5681
5682 // BOOL should be a real boolean on the new ABI
5683 UseSignedCharForObjCBool = false;
5684 } else
5685 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005686 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005687};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005688
Tim Northover573cbee2014-05-24 12:52:07 +00005689class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005690 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005691 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5692 static const char *const GCCRegNames[];
5693
James Molloy75f5f9e2014-04-16 15:33:48 +00005694 enum FPUModeEnum {
5695 FPUMode,
5696 NeonMode
5697 };
5698
5699 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005700 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005701 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005702 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005703 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005704
Tim Northovera2ee4332014-03-29 15:09:45 +00005705 static const Builtin::Info BuiltinInfo[];
5706
5707 std::string ABI;
5708
5709public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005710 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005711 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005712 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5713 WCharType = SignedInt;
5714
5715 // NetBSD apparently prefers consistency across ARM targets to consistency
5716 // across 64-bit targets.
5717 Int64Type = SignedLongLong;
5718 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005719 } else {
5720 WCharType = UnsignedInt;
5721 Int64Type = SignedLong;
5722 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005723 }
5724
Tim Northovera2ee4332014-03-29 15:09:45 +00005725 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005726 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005727 MaxAtomicInlineWidth = 128;
5728 MaxAtomicPromoteWidth = 128;
5729
Tim Northovera6a19f12015-02-06 01:25:07 +00005730 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005731 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5732
Tim Northovera2ee4332014-03-29 15:09:45 +00005733 // {} in inline assembly are neon specifiers, not assembly variant
5734 // specifiers.
5735 NoAsmVariants = true;
5736
Tim Northover7ad87af2015-01-16 18:44:04 +00005737 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5738 // contributes to the alignment of the containing aggregate in the same way
5739 // a plain (non bit-field) member of that type would, without exception for
5740 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005741 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005742 UseZeroLengthBitfieldAlignment = true;
5743
Tim Northover573cbee2014-05-24 12:52:07 +00005744 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005745 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005746
5747 if (Triple.getOS() == llvm::Triple::Linux ||
5748 Triple.getOS() == llvm::Triple::UnknownOS)
5749 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005750 }
5751
Alp Toker4925ba72014-06-07 23:30:42 +00005752 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005753 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005754 if (Name != "aapcs" && Name != "darwinpcs")
5755 return false;
5756
5757 ABI = Name;
5758 return true;
5759 }
5760
David Blaikie1cbb9712014-11-14 19:09:44 +00005761 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005762 return Name == "generic" ||
5763 llvm::AArch64::parseCPUArch(Name) !=
5764 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005765 }
5766
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005767 void getTargetDefines(const LangOptions &Opts,
5768 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005770 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005771
5772 // Target properties.
5773 Builder.defineMacro("_LP64");
5774 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005775
5776 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5777 Builder.defineMacro("__ARM_ACLE", "200");
5778 Builder.defineMacro("__ARM_ARCH", "8");
5779 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5780
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005781 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005782 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005783 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005784
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005785 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5786 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5787 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5788 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005789 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005790 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5791 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005792
5793 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5794
5795 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005796 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005797
5798 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5799 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005800 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5801 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005802
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005803 if (Opts.UnsafeFPMath)
5804 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005805
5806 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5807
5808 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5809 Opts.ShortEnums ? "1" : "4");
5810
James Molloy75f5f9e2014-04-16 15:33:48 +00005811 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005812 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005813 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005814 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005815 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005816
Bradley Smith418c5932014-05-02 15:17:51 +00005817 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005818 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005819
James Molloy75f5f9e2014-04-16 15:33:48 +00005820 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005821 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5822
5823 if (Unaligned)
5824 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005825
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005826 if (V8_1A)
5827 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5828
Reid Klecknerd167d422015-05-06 15:31:46 +00005829 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5830 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5831 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5832 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5833 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005834 }
5835
Craig Topper6c03a542015-10-19 04:51:35 +00005836 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5837 return llvm::makeArrayRef(BuiltinInfo,
5838 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005839 }
5840
David Blaikie1cbb9712014-11-14 19:09:44 +00005841 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005842 return Feature == "aarch64" ||
5843 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005844 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005845 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005846 }
5847
James Molloy5e73df52014-04-16 15:06:20 +00005848 bool handleTargetFeatures(std::vector<std::string> &Features,
5849 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005850 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005851 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005852 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005853 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005854 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005855
Eric Christopher610fe112015-08-26 08:21:55 +00005856 for (const auto &Feature : Features) {
5857 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005858 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005859 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005860 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005861 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005862 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005863 if (Feature == "+strict-align")
5864 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005865 if (Feature == "+v8.1a")
5866 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005867 }
5868
James Y Knightb214cbc2016-03-04 19:00:41 +00005869 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005870
5871 return true;
5872 }
5873
John McCall477f2bb2016-03-03 06:39:32 +00005874 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5875 switch (CC) {
5876 case CC_C:
5877 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005878 case CC_PreserveMost:
5879 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005880 return CCCR_OK;
5881 default:
5882 return CCCR_Warning;
5883 }
5884 }
5885
David Blaikie1cbb9712014-11-14 19:09:44 +00005886 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005887
David Blaikie1cbb9712014-11-14 19:09:44 +00005888 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005889 return TargetInfo::AArch64ABIBuiltinVaList;
5890 }
5891
Craig Topperf054e3a2015-10-19 03:52:27 +00005892 ArrayRef<const char *> getGCCRegNames() const override;
5893 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005894
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005895 bool validateAsmConstraint(const char *&Name,
5896 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005897 switch (*Name) {
5898 default:
5899 return false;
5900 case 'w': // Floating point and SIMD registers (V0-V31)
5901 Info.setAllowsRegister();
5902 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005903 case 'I': // Constant that can be used with an ADD instruction
5904 case 'J': // Constant that can be used with a SUB instruction
5905 case 'K': // Constant that can be used with a 32-bit logical instruction
5906 case 'L': // Constant that can be used with a 64-bit logical instruction
5907 case 'M': // Constant that can be used as a 32-bit MOV immediate
5908 case 'N': // Constant that can be used as a 64-bit MOV immediate
5909 case 'Y': // Floating point constant zero
5910 case 'Z': // Integer constant zero
5911 return true;
5912 case 'Q': // A memory reference with base register and no offset
5913 Info.setAllowsMemory();
5914 return true;
5915 case 'S': // A symbolic address
5916 Info.setAllowsRegister();
5917 return true;
5918 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005919 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5920 // Utf: A memory address suitable for ldp/stp in TF mode.
5921 // Usa: An absolute symbolic address.
5922 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5923 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005924 case 'z': // Zero register, wzr or xzr
5925 Info.setAllowsRegister();
5926 return true;
5927 case 'x': // Floating point and SIMD registers (V0-V15)
5928 Info.setAllowsRegister();
5929 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005930 }
5931 return false;
5932 }
5933
Akira Hatanaka987f1862014-08-22 06:05:21 +00005934 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005935 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005936 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005937 // Strip off constraint modifiers.
5938 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5939 Constraint = Constraint.substr(1);
5940
5941 switch (Constraint[0]) {
5942 default:
5943 return true;
5944 case 'z':
5945 case 'r': {
5946 switch (Modifier) {
5947 case 'x':
5948 case 'w':
5949 // For now assume that the person knows what they're
5950 // doing with the modifier.
5951 return true;
5952 default:
5953 // By default an 'r' constraint will be in the 'x'
5954 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005955 if (Size == 64)
5956 return true;
5957
5958 SuggestedModifier = "w";
5959 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005960 }
5961 }
5962 }
5963 }
5964
David Blaikie1cbb9712014-11-14 19:09:44 +00005965 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005966
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005967 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005968 if (RegNo == 0)
5969 return 0;
5970 if (RegNo == 1)
5971 return 1;
5972 return -1;
5973 }
5974};
5975
Tim Northover573cbee2014-05-24 12:52:07 +00005976const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005977 // 32-bit Integer registers
5978 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5979 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5980 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5981
5982 // 64-bit Integer registers
5983 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5984 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5985 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5986
5987 // 32-bit floating point regsisters
5988 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5989 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5990 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5991
5992 // 64-bit floating point regsisters
5993 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5994 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5995 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5996
5997 // Vector registers
5998 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5999 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6000 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6001};
6002
Craig Topperf054e3a2015-10-19 03:52:27 +00006003ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6004 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006005}
6006
Tim Northover573cbee2014-05-24 12:52:07 +00006007const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006008 { { "w31" }, "wsp" },
6009 { { "x29" }, "fp" },
6010 { { "x30" }, "lr" },
6011 { { "x31" }, "sp" },
6012 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6013 // don't want to substitute one of these for a different-sized one.
6014};
6015
Craig Topperf054e3a2015-10-19 03:52:27 +00006016ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6017 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006018}
6019
Tim Northover573cbee2014-05-24 12:52:07 +00006020const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006021#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006022 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006023#include "clang/Basic/BuiltinsNEON.def"
6024
6025#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006026 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006027#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006028};
James Molloy5e73df52014-04-16 15:06:20 +00006029
Tim Northover573cbee2014-05-24 12:52:07 +00006030class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006031 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006032 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006033 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006034 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006035 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006036 }
6037
6038public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006039 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6040 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006041 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006042 }
James Molloy5e73df52014-04-16 15:06:20 +00006043 void getTargetDefines(const LangOptions &Opts,
6044 MacroBuilder &Builder) const override {
6045 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006046 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006047 }
6048};
6049
Tim Northover573cbee2014-05-24 12:52:07 +00006050class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006051 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006052 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006053 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006054 }
6055
6056public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006057 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6058 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006059 void getTargetDefines(const LangOptions &Opts,
6060 MacroBuilder &Builder) const override {
6061 Builder.defineMacro("__AARCH64EB__");
6062 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6063 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006064 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006065 }
6066};
Tim Northovera2ee4332014-03-29 15:09:45 +00006067
Tim Northover573cbee2014-05-24 12:52:07 +00006068class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006069protected:
6070 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6071 MacroBuilder &Builder) const override {
6072 Builder.defineMacro("__AARCH64_SIMD__");
6073 Builder.defineMacro("__ARM64_ARCH_8__");
6074 Builder.defineMacro("__ARM_NEON__");
6075 Builder.defineMacro("__LITTLE_ENDIAN__");
6076 Builder.defineMacro("__REGISTER_PREFIX__", "");
6077 Builder.defineMacro("__arm64", "1");
6078 Builder.defineMacro("__arm64__", "1");
6079
6080 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6081 }
6082
Tim Northovera2ee4332014-03-29 15:09:45 +00006083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006084 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6085 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006086 Int64Type = SignedLongLong;
6087 WCharType = SignedInt;
6088 UseSignedCharForObjCBool = false;
6089
Tim Northovera6a19f12015-02-06 01:25:07 +00006090 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006091 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6092
6093 TheCXXABI.set(TargetCXXABI::iOS64);
6094 }
6095
David Blaikie1cbb9712014-11-14 19:09:44 +00006096 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006097 return TargetInfo::CharPtrBuiltinVaList;
6098 }
6099};
Tim Northovera2ee4332014-03-29 15:09:45 +00006100
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101// Hexagon abstract base class
6102class HexagonTargetInfo : public TargetInfo {
6103 static const Builtin::Info BuiltinInfo[];
6104 static const char * const GCCRegNames[];
6105 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6106 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006107 bool HasHVX, HasHVXDouble;
6108
Tony Linthicum76329bf2011-12-12 21:14:55 +00006109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006110 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6111 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006112 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006113 // Specify the vector alignment explicitly. For v512x1, the calculated
6114 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6115 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006116 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006117 "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 +00006118 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006119 SizeType = UnsignedInt;
6120 PtrDiffType = SignedInt;
6121 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006122
6123 // {} in inline assembly are packet specifiers, not assembly variant
6124 // specifiers.
6125 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006126
6127 LargeArrayMinWidth = 64;
6128 LargeArrayAlign = 64;
6129 UseBitFieldTypeAlignment = true;
6130 ZeroLengthBitfieldBoundary = 32;
6131 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006132 }
6133
Craig Topper6c03a542015-10-19 04:51:35 +00006134 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6135 return llvm::makeArrayRef(BuiltinInfo,
6136 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006137 }
6138
Craig Topper3164f332014-03-11 03:39:26 +00006139 bool validateAsmConstraint(const char *&Name,
6140 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006141 switch (*Name) {
6142 case 'v':
6143 case 'q':
6144 if (HasHVX) {
6145 Info.setAllowsRegister();
6146 return true;
6147 }
6148 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006149 case 's':
6150 // Relocatable constant.
6151 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006152 }
6153 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006154 }
6155
Craig Topper3164f332014-03-11 03:39:26 +00006156 void getTargetDefines(const LangOptions &Opts,
6157 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006158
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006159 bool isCLZForZeroUndef() const override { return false; }
6160
Craig Topper3164f332014-03-11 03:39:26 +00006161 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006162 return llvm::StringSwitch<bool>(Feature)
6163 .Case("hexagon", true)
6164 .Case("hvx", HasHVX)
6165 .Case("hvx-double", HasHVXDouble)
6166 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006167 }
Craig Topper3164f332014-03-11 03:39:26 +00006168
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006169 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6170 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6171 const override;
6172
6173 bool handleTargetFeatures(std::vector<std::string> &Features,
6174 DiagnosticsEngine &Diags) override;
6175
Craig Topper3164f332014-03-11 03:39:26 +00006176 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006177 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006178 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006179 ArrayRef<const char *> getGCCRegNames() const override;
6180 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006181 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006182 return "";
6183 }
Sebastian Pop86500282012-01-13 20:37:10 +00006184
6185 static const char *getHexagonCPUSuffix(StringRef Name) {
6186 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006187 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006188 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006189 .Case("hexagonv55", "55")
6190 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006191 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006192 }
6193
Craig Topper3164f332014-03-11 03:39:26 +00006194 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006195 if (!getHexagonCPUSuffix(Name))
6196 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006197 CPU = Name;
6198 return true;
6199 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006200
6201 int getEHDataRegisterNumber(unsigned RegNo) const override {
6202 return RegNo < 2 ? RegNo : -1;
6203 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006204};
6205
6206void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006207 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006209 Builder.defineMacro("__hexagon__", "1");
6210
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006211 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212 Builder.defineMacro("__HEXAGON_V4__");
6213 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006214 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006215 Builder.defineMacro("__QDSP6_V4__");
6216 Builder.defineMacro("__QDSP6_ARCH__", "4");
6217 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006219 Builder.defineMacro("__HEXAGON_V5__");
6220 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6221 if(Opts.HexagonQdsp6Compat) {
6222 Builder.defineMacro("__QDSP6_V5__");
6223 Builder.defineMacro("__QDSP6_ARCH__", "5");
6224 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006225 } else if (CPU == "hexagonv55") {
6226 Builder.defineMacro("__HEXAGON_V55__");
6227 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6228 Builder.defineMacro("__QDSP6_V55__");
6229 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006230 } else if (CPU == "hexagonv60") {
6231 Builder.defineMacro("__HEXAGON_V60__");
6232 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6233 Builder.defineMacro("__QDSP6_V60__");
6234 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006235 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006236
6237 if (hasFeature("hvx")) {
6238 Builder.defineMacro("__HVX__");
6239 if (hasFeature("hvx-double"))
6240 Builder.defineMacro("__HVXDBL__");
6241 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006242}
6243
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006244bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6245 DiagnosticsEngine &Diags) {
6246 for (auto &F : Features) {
6247 if (F == "+hvx")
6248 HasHVX = true;
6249 else if (F == "-hvx")
6250 HasHVX = HasHVXDouble = false;
6251 else if (F == "+hvx-double")
6252 HasHVX = HasHVXDouble = true;
6253 else if (F == "-hvx-double")
6254 HasHVXDouble = false;
6255 }
6256 return true;
6257}
6258
6259bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6260 DiagnosticsEngine &Diags, StringRef CPU,
6261 const std::vector<std::string> &FeaturesVec) const {
6262 // Default for v60: -hvx, -hvx-double.
6263 Features["hvx"] = false;
6264 Features["hvx-double"] = false;
6265
6266 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6267}
6268
6269
6270const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006271 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6272 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6273 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6274 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6275 "p0", "p1", "p2", "p3",
6276 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6277};
6278
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006279ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006280 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281}
6282
Tony Linthicum76329bf2011-12-12 21:14:55 +00006283const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6284 { { "sp" }, "r29" },
6285 { { "fp" }, "r30" },
6286 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006287};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006288
Craig Topperf054e3a2015-10-19 03:52:27 +00006289ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6290 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006291}
6292
6293
6294const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006295#define BUILTIN(ID, TYPE, ATTRS) \
6296 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6297#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6298 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006299#include "clang/Basic/BuiltinsHexagon.def"
6300};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006301
Jacques Pienaard964cc22016-03-28 21:02:54 +00006302class LanaiTargetInfo : public TargetInfo {
6303 // Class for Lanai (32-bit).
6304 // The CPU profiles supported by the Lanai backend
6305 enum CPUKind {
6306 CK_NONE,
6307 CK_V11,
6308 } CPU;
6309
6310 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6311 static const char *const GCCRegNames[];
6312
6313public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006314 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6315 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006316 // Description string has to be kept in sync with backend.
6317 resetDataLayout("E" // Big endian
6318 "-m:e" // ELF name manging
6319 "-p:32:32" // 32 bit pointers, 32 bit aligned
6320 "-i64:64" // 64 bit integers, 64 bit aligned
6321 "-a:0:32" // 32 bit alignment of objects of aggregate type
6322 "-n32" // 32 bit native integer width
6323 "-S64" // 64 bit natural stack alignment
6324 );
6325
6326 // Setting RegParmMax equal to what mregparm was set to in the old
6327 // toolchain
6328 RegParmMax = 4;
6329
6330 // Set the default CPU to V11
6331 CPU = CK_V11;
6332
6333 // Temporary approach to make everything at least word-aligned and allow for
6334 // safely casting between pointers with different alignment requirements.
6335 // TODO: Remove this when there are no more cast align warnings on the
6336 // firmware.
6337 MinGlobalAlign = 32;
6338 }
6339
6340 void getTargetDefines(const LangOptions &Opts,
6341 MacroBuilder &Builder) const override {
6342 // Define __lanai__ when building for target lanai.
6343 Builder.defineMacro("__lanai__");
6344
6345 // Set define for the CPU specified.
6346 switch (CPU) {
6347 case CK_V11:
6348 Builder.defineMacro("__LANAI_V11__");
6349 break;
6350 case CK_NONE:
6351 llvm_unreachable("Unhandled target CPU");
6352 }
6353 }
6354
6355 bool setCPU(const std::string &Name) override {
6356 CPU = llvm::StringSwitch<CPUKind>(Name)
6357 .Case("v11", CK_V11)
6358 .Default(CK_NONE);
6359
6360 return CPU != CK_NONE;
6361 }
6362
6363 bool hasFeature(StringRef Feature) const override {
6364 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6365 }
6366
6367 ArrayRef<const char *> getGCCRegNames() const override;
6368
6369 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6370
6371 BuiltinVaListKind getBuiltinVaListKind() const override {
6372 return TargetInfo::VoidPtrBuiltinVaList;
6373 }
6374
6375 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6376
6377 bool validateAsmConstraint(const char *&Name,
6378 TargetInfo::ConstraintInfo &info) const override {
6379 return false;
6380 }
6381
6382 const char *getClobbers() const override { return ""; }
6383};
6384
6385const char *const LanaiTargetInfo::GCCRegNames[] = {
6386 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6387 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6388 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6389
6390ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6391 return llvm::makeArrayRef(GCCRegNames);
6392}
6393
6394const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6395 {{"pc"}, "r2"},
6396 {{"sp"}, "r4"},
6397 {{"fp"}, "r5"},
6398 {{"rv"}, "r8"},
6399 {{"rr1"}, "r10"},
6400 {{"rr2"}, "r11"},
6401 {{"rca"}, "r15"},
6402};
6403
6404ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6405 return llvm::makeArrayRef(GCCRegAliases);
6406}
6407
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006408// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6409class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006410 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6411 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006412 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006413public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006414 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006415 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006416
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006417 int getEHDataRegisterNumber(unsigned RegNo) const override {
6418 if (RegNo == 0) return 24;
6419 if (RegNo == 1) return 25;
6420 return -1;
6421 }
6422
Craig Topper3164f332014-03-11 03:39:26 +00006423 bool handleTargetFeatures(std::vector<std::string> &Features,
6424 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006425 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006426 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6427 if (Feature != Features.end()) {
6428 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006429 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006430 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006431 }
Craig Topper3164f332014-03-11 03:39:26 +00006432 void getTargetDefines(const LangOptions &Opts,
6433 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006434 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006435 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006436
6437 if (SoftFloat)
6438 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006439 }
Craig Topper3164f332014-03-11 03:39:26 +00006440
6441 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006442 return llvm::StringSwitch<bool>(Feature)
6443 .Case("softfloat", SoftFloat)
6444 .Case("sparc", true)
6445 .Default(false);
6446 }
Craig Topper3164f332014-03-11 03:39:26 +00006447
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006448 bool hasSjLjLowering() const override {
6449 return true;
6450 }
6451
Craig Topper6c03a542015-10-19 04:51:35 +00006452 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006453 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006454 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006455 }
Craig Topper3164f332014-03-11 03:39:26 +00006456 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006457 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006458 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006459 ArrayRef<const char *> getGCCRegNames() const override;
6460 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006461 bool validateAsmConstraint(const char *&Name,
6462 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006463 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006464 switch (*Name) {
6465 case 'I': // Signed 13-bit constant
6466 case 'J': // Zero
6467 case 'K': // 32-bit constant with the low 12 bits clear
6468 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6469 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6470 case 'N': // Same as 'K' but zext (required for SIMode)
6471 case 'O': // The constant 4096
6472 return true;
6473 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006474 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006475 }
Craig Topper3164f332014-03-11 03:39:26 +00006476 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006477 // FIXME: Implement!
6478 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006479 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006480
6481 // No Sparc V7 for now, the backend doesn't support it anyway.
6482 enum CPUKind {
6483 CK_GENERIC,
6484 CK_V8,
6485 CK_SUPERSPARC,
6486 CK_SPARCLITE,
6487 CK_F934,
6488 CK_HYPERSPARC,
6489 CK_SPARCLITE86X,
6490 CK_SPARCLET,
6491 CK_TSC701,
6492 CK_V9,
6493 CK_ULTRASPARC,
6494 CK_ULTRASPARC3,
6495 CK_NIAGARA,
6496 CK_NIAGARA2,
6497 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006498 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006499 CK_MYRIAD2100,
6500 CK_MYRIAD2150,
6501 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006502 CK_LEON2,
6503 CK_LEON2_AT697E,
6504 CK_LEON2_AT697F,
6505 CK_LEON3,
6506 CK_LEON3_UT699,
6507 CK_LEON3_GR712RC,
6508 CK_LEON4,
6509 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006510 } CPU = CK_GENERIC;
6511
6512 enum CPUGeneration {
6513 CG_V8,
6514 CG_V9,
6515 };
6516
6517 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6518 switch (Kind) {
6519 case CK_GENERIC:
6520 case CK_V8:
6521 case CK_SUPERSPARC:
6522 case CK_SPARCLITE:
6523 case CK_F934:
6524 case CK_HYPERSPARC:
6525 case CK_SPARCLITE86X:
6526 case CK_SPARCLET:
6527 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006528 case CK_MYRIAD2100:
6529 case CK_MYRIAD2150:
6530 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006531 case CK_LEON2:
6532 case CK_LEON2_AT697E:
6533 case CK_LEON2_AT697F:
6534 case CK_LEON3:
6535 case CK_LEON3_UT699:
6536 case CK_LEON3_GR712RC:
6537 case CK_LEON4:
6538 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006539 return CG_V8;
6540 case CK_V9:
6541 case CK_ULTRASPARC:
6542 case CK_ULTRASPARC3:
6543 case CK_NIAGARA:
6544 case CK_NIAGARA2:
6545 case CK_NIAGARA3:
6546 case CK_NIAGARA4:
6547 return CG_V9;
6548 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006549 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006550 }
6551
6552 CPUKind getCPUKind(StringRef Name) const {
6553 return llvm::StringSwitch<CPUKind>(Name)
6554 .Case("v8", CK_V8)
6555 .Case("supersparc", CK_SUPERSPARC)
6556 .Case("sparclite", CK_SPARCLITE)
6557 .Case("f934", CK_F934)
6558 .Case("hypersparc", CK_HYPERSPARC)
6559 .Case("sparclite86x", CK_SPARCLITE86X)
6560 .Case("sparclet", CK_SPARCLET)
6561 .Case("tsc701", CK_TSC701)
6562 .Case("v9", CK_V9)
6563 .Case("ultrasparc", CK_ULTRASPARC)
6564 .Case("ultrasparc3", CK_ULTRASPARC3)
6565 .Case("niagara", CK_NIAGARA)
6566 .Case("niagara2", CK_NIAGARA2)
6567 .Case("niagara3", CK_NIAGARA3)
6568 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006569 .Case("ma2100", CK_MYRIAD2100)
6570 .Case("ma2150", CK_MYRIAD2150)
6571 .Case("ma2450", CK_MYRIAD2450)
6572 // FIXME: the myriad2[.n] spellings are obsolete,
6573 // but a grace period is needed to allow updating dependent builds.
6574 .Case("myriad2", CK_MYRIAD2100)
6575 .Case("myriad2.1", CK_MYRIAD2100)
6576 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006577 .Case("leon2", CK_LEON2)
6578 .Case("at697e", CK_LEON2_AT697E)
6579 .Case("at697f", CK_LEON2_AT697F)
6580 .Case("leon3", CK_LEON3)
6581 .Case("ut699", CK_LEON3_UT699)
6582 .Case("gr712rc", CK_LEON3_GR712RC)
6583 .Case("leon4", CK_LEON4)
6584 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006585 .Default(CK_GENERIC);
6586 }
6587
6588 bool setCPU(const std::string &Name) override {
6589 CPU = getCPUKind(Name);
6590 return CPU != CK_GENERIC;
6591 }
Gabor Greif49991682008-02-21 16:29:08 +00006592};
6593
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006594const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006595 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6596 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6597 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6598 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6599};
6600
Craig Topperf054e3a2015-10-19 03:52:27 +00006601ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6602 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006603}
6604
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006605const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006606 { { "g0" }, "r0" },
6607 { { "g1" }, "r1" },
6608 { { "g2" }, "r2" },
6609 { { "g3" }, "r3" },
6610 { { "g4" }, "r4" },
6611 { { "g5" }, "r5" },
6612 { { "g6" }, "r6" },
6613 { { "g7" }, "r7" },
6614 { { "o0" }, "r8" },
6615 { { "o1" }, "r9" },
6616 { { "o2" }, "r10" },
6617 { { "o3" }, "r11" },
6618 { { "o4" }, "r12" },
6619 { { "o5" }, "r13" },
6620 { { "o6", "sp" }, "r14" },
6621 { { "o7" }, "r15" },
6622 { { "l0" }, "r16" },
6623 { { "l1" }, "r17" },
6624 { { "l2" }, "r18" },
6625 { { "l3" }, "r19" },
6626 { { "l4" }, "r20" },
6627 { { "l5" }, "r21" },
6628 { { "l6" }, "r22" },
6629 { { "l7" }, "r23" },
6630 { { "i0" }, "r24" },
6631 { { "i1" }, "r25" },
6632 { { "i2" }, "r26" },
6633 { { "i3" }, "r27" },
6634 { { "i4" }, "r28" },
6635 { { "i5" }, "r29" },
6636 { { "i6", "fp" }, "r30" },
6637 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006638};
6639
Craig Topperf054e3a2015-10-19 03:52:27 +00006640ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6641 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006642}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006643
6644// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6645class SparcV8TargetInfo : public SparcTargetInfo {
6646public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006647 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6648 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006649 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006650 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6651 switch (getTriple().getOS()) {
6652 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006653 SizeType = UnsignedInt;
6654 IntPtrType = SignedInt;
6655 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006656 break;
6657 case llvm::Triple::NetBSD:
6658 case llvm::Triple::OpenBSD:
6659 SizeType = UnsignedLong;
6660 IntPtrType = SignedLong;
6661 PtrDiffType = SignedLong;
6662 break;
Brad Smith56495d52015-08-13 22:00:53 +00006663 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006664 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006665 }
6666
Craig Topper3164f332014-03-11 03:39:26 +00006667 void getTargetDefines(const LangOptions &Opts,
6668 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006669 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006670 switch (getCPUGeneration(CPU)) {
6671 case CG_V8:
6672 Builder.defineMacro("__sparcv8");
6673 if (getTriple().getOS() != llvm::Triple::Solaris)
6674 Builder.defineMacro("__sparcv8__");
6675 break;
6676 case CG_V9:
6677 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006678 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006679 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006680 Builder.defineMacro("__sparc_v9__");
6681 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006682 break;
6683 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006684 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006685 std::string MyriadArchValue, Myriad2Value;
6686 Builder.defineMacro("__sparc_v8__");
6687 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006688 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006689 case CK_MYRIAD2150:
6690 MyriadArchValue = "__ma2150";
6691 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006692 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006693 case CK_MYRIAD2450:
6694 MyriadArchValue = "__ma2450";
6695 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006696 break;
6697 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006698 MyriadArchValue = "__ma2100";
6699 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006700 break;
6701 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006702 Builder.defineMacro(MyriadArchValue, "1");
6703 Builder.defineMacro(MyriadArchValue+"__", "1");
6704 Builder.defineMacro("__myriad2__", Myriad2Value);
6705 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006706 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006707 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006708
6709 bool hasSjLjLowering() const override {
6710 return true;
6711 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006712};
6713
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006714// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6715class SparcV8elTargetInfo : public SparcV8TargetInfo {
6716 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006717 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6718 : SparcV8TargetInfo(Triple, Opts) {
6719 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6720 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006721 }
6722};
6723
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006724// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6725class SparcV9TargetInfo : public SparcTargetInfo {
6726public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006727 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6728 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006729 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006730 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006731 // This is an LP64 platform.
6732 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006733
6734 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006735 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006736 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006737 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006738 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006739 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006740
6741 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6742 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6743 LongDoubleWidth = 128;
6744 LongDoubleAlign = 128;
6745 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006746 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006747 }
6748
Craig Topper3164f332014-03-11 03:39:26 +00006749 void getTargetDefines(const LangOptions &Opts,
6750 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006751 SparcTargetInfo::getTargetDefines(Opts, Builder);
6752 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006753 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006754 // Solaris doesn't need these variants, but the BSDs do.
6755 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006756 Builder.defineMacro("__sparc64__");
6757 Builder.defineMacro("__sparc_v9__");
6758 Builder.defineMacro("__sparcv9__");
6759 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006760 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006761
Craig Topper3164f332014-03-11 03:39:26 +00006762 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006763 if (!SparcTargetInfo::setCPU(Name))
6764 return false;
6765 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006766 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006767};
6768
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006769class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006770 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006771 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006772 std::string CPU;
6773 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006774 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006775
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006776public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006777 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006778 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6779 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006780 IntMaxType = SignedLong;
6781 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006782 TLSSupported = true;
6783 IntWidth = IntAlign = 32;
6784 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6785 PointerWidth = PointerAlign = 64;
6786 LongDoubleWidth = 128;
6787 LongDoubleAlign = 64;
6788 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006789 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006790 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006791 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 +00006792 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6793 }
6794 void getTargetDefines(const LangOptions &Opts,
6795 MacroBuilder &Builder) const override {
6796 Builder.defineMacro("__s390__");
6797 Builder.defineMacro("__s390x__");
6798 Builder.defineMacro("__zarch__");
6799 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006800
6801 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6804 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6805
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006806 if (HasTransactionalExecution)
6807 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006808 if (Opts.ZVector)
6809 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006810 }
Craig Topper6c03a542015-10-19 04:51:35 +00006811 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6812 return llvm::makeArrayRef(BuiltinInfo,
6813 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006814 }
6815
Craig Topperf054e3a2015-10-19 03:52:27 +00006816 ArrayRef<const char *> getGCCRegNames() const override;
6817 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006818 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006819 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006820 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006821 bool validateAsmConstraint(const char *&Name,
6822 TargetInfo::ConstraintInfo &info) const override;
6823 const char *getClobbers() const override {
6824 // FIXME: Is this really right?
6825 return "";
6826 }
6827 BuiltinVaListKind getBuiltinVaListKind() const override {
6828 return TargetInfo::SystemZBuiltinVaList;
6829 }
6830 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006831 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006832 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6833 .Case("z10", true)
6834 .Case("z196", true)
6835 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006836 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006837 .Default(false);
6838
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839 return CPUKnown;
6840 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006841 bool
6842 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6843 StringRef CPU,
6844 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006845 if (CPU == "zEC12")
6846 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006847 if (CPU == "z13") {
6848 Features["transactional-execution"] = true;
6849 Features["vector"] = true;
6850 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006851 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006852 }
6853
6854 bool handleTargetFeatures(std::vector<std::string> &Features,
6855 DiagnosticsEngine &Diags) override {
6856 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006857 for (const auto &Feature : Features) {
6858 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006859 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006860 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006861 HasVector = true;
6862 }
6863 // If we use the vector ABI, vector types are 64-bit aligned.
6864 if (HasVector) {
6865 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006866 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6867 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006868 }
6869 return true;
6870 }
6871
6872 bool hasFeature(StringRef Feature) const override {
6873 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006874 .Case("systemz", true)
6875 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006876 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006877 .Default(false);
6878 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006879
Bryan Chane3f1ed52016-04-28 13:56:43 +00006880 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6881 switch (CC) {
6882 case CC_C:
6883 case CC_Swift:
6884 return CCCR_OK;
6885 default:
6886 return CCCR_Warning;
6887 }
6888 }
6889
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006890 StringRef getABI() const override {
6891 if (HasVector)
6892 return "vector";
6893 return "";
6894 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006895
6896 bool useFloat128ManglingForLongDouble() const override {
6897 return true;
6898 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006899};
6900
6901const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6902#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006903 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006904#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6905 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006906#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006907};
6908
6909const char *const SystemZTargetInfo::GCCRegNames[] = {
6910 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6911 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6912 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6913 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6914};
6915
Craig Topperf054e3a2015-10-19 03:52:27 +00006916ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6917 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006918}
6919
6920bool SystemZTargetInfo::
6921validateAsmConstraint(const char *&Name,
6922 TargetInfo::ConstraintInfo &Info) const {
6923 switch (*Name) {
6924 default:
6925 return false;
6926
6927 case 'a': // Address register
6928 case 'd': // Data register (equivalent to 'r')
6929 case 'f': // Floating-point register
6930 Info.setAllowsRegister();
6931 return true;
6932
6933 case 'I': // Unsigned 8-bit constant
6934 case 'J': // Unsigned 12-bit constant
6935 case 'K': // Signed 16-bit constant
6936 case 'L': // Signed 20-bit displacement (on all targets we support)
6937 case 'M': // 0x7fffffff
6938 return true;
6939
6940 case 'Q': // Memory with base and unsigned 12-bit displacement
6941 case 'R': // Likewise, plus an index
6942 case 'S': // Memory with base and signed 20-bit displacement
6943 case 'T': // Likewise, plus an index
6944 Info.setAllowsMemory();
6945 return true;
6946 }
6947}
Ulrich Weigand47445072013-05-06 16:26:41 +00006948
Eric Christopherc48497a2015-09-18 21:26:24 +00006949class MSP430TargetInfo : public TargetInfo {
6950 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006951
Eric Christopherc48497a2015-09-18 21:26:24 +00006952public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006953 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6954 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006955 BigEndian = false;
6956 TLSSupported = false;
6957 IntWidth = 16;
6958 IntAlign = 16;
6959 LongWidth = 32;
6960 LongLongWidth = 64;
6961 LongAlign = LongLongAlign = 16;
6962 PointerWidth = 16;
6963 PointerAlign = 16;
6964 SuitableAlign = 16;
6965 SizeType = UnsignedInt;
6966 IntMaxType = SignedLongLong;
6967 IntPtrType = SignedInt;
6968 PtrDiffType = SignedInt;
6969 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006970 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006971 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006972 void getTargetDefines(const LangOptions &Opts,
6973 MacroBuilder &Builder) const override {
6974 Builder.defineMacro("MSP430");
6975 Builder.defineMacro("__MSP430__");
6976 // FIXME: defines for different 'flavours' of MCU
6977 }
Craig Topper6c03a542015-10-19 04:51:35 +00006978 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006979 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006980 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006981 }
6982 bool hasFeature(StringRef Feature) const override {
6983 return Feature == "msp430";
6984 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006985 ArrayRef<const char *> getGCCRegNames() const override;
6986 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006987 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006988 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006989 }
6990 bool validateAsmConstraint(const char *&Name,
6991 TargetInfo::ConstraintInfo &info) const override {
6992 // FIXME: implement
6993 switch (*Name) {
6994 case 'K': // the constant 1
6995 case 'L': // constant -1^20 .. 1^19
6996 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006997 return true;
6998 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006999 // No target constraints for now.
7000 return false;
7001 }
7002 const char *getClobbers() const override {
7003 // FIXME: Is this really right?
7004 return "";
7005 }
7006 BuiltinVaListKind getBuiltinVaListKind() const override {
7007 // FIXME: implement
7008 return TargetInfo::CharPtrBuiltinVaList;
7009 }
7010};
7011
7012const char *const MSP430TargetInfo::GCCRegNames[] = {
7013 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7014 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7015
Craig Topperf054e3a2015-10-19 03:52:27 +00007016ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7017 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007018}
7019
7020// LLVM and Clang cannot be used directly to output native binaries for
7021// target, but is used to compile C code to llvm bitcode with correct
7022// type and alignment information.
7023//
7024// TCE uses the llvm bitcode as input and uses it for generating customized
7025// target processor and program binary. TCE co-design environment is
7026// publicly available in http://tce.cs.tut.fi
7027
7028static const unsigned TCEOpenCLAddrSpaceMap[] = {
7029 3, // opencl_global
7030 4, // opencl_local
7031 5, // opencl_constant
7032 // FIXME: generic has to be added to the target
7033 0, // opencl_generic
7034 0, // cuda_device
7035 0, // cuda_constant
7036 0 // cuda_shared
7037};
7038
7039class TCETargetInfo : public TargetInfo {
7040public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007041 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7042 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007043 TLSSupported = false;
7044 IntWidth = 32;
7045 LongWidth = LongLongWidth = 32;
7046 PointerWidth = 32;
7047 IntAlign = 32;
7048 LongAlign = LongLongAlign = 32;
7049 PointerAlign = 32;
7050 SuitableAlign = 32;
7051 SizeType = UnsignedInt;
7052 IntMaxType = SignedLong;
7053 IntPtrType = SignedInt;
7054 PtrDiffType = SignedInt;
7055 FloatWidth = 32;
7056 FloatAlign = 32;
7057 DoubleWidth = 32;
7058 DoubleAlign = 32;
7059 LongDoubleWidth = 32;
7060 LongDoubleAlign = 32;
7061 FloatFormat = &llvm::APFloat::IEEEsingle;
7062 DoubleFormat = &llvm::APFloat::IEEEsingle;
7063 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007064 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7065 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007066 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7067 UseAddrSpaceMapMangling = true;
7068 }
7069
7070 void getTargetDefines(const LangOptions &Opts,
7071 MacroBuilder &Builder) const override {
7072 DefineStd(Builder, "tce", Opts);
7073 Builder.defineMacro("__TCE__");
7074 Builder.defineMacro("__TCE_V1__");
7075 }
7076 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7077
Craig Topper6c03a542015-10-19 04:51:35 +00007078 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007079 const char *getClobbers() const override { return ""; }
7080 BuiltinVaListKind getBuiltinVaListKind() const override {
7081 return TargetInfo::VoidPtrBuiltinVaList;
7082 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007083 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007084 bool validateAsmConstraint(const char *&Name,
7085 TargetInfo::ConstraintInfo &info) const override {
7086 return true;
7087 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007088 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7089 return None;
7090 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007091};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007092
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007093class BPFTargetInfo : public TargetInfo {
7094public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007095 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7096 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007097 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7098 SizeType = UnsignedLong;
7099 PtrDiffType = SignedLong;
7100 IntPtrType = SignedLong;
7101 IntMaxType = SignedLong;
7102 Int64Type = SignedLong;
7103 RegParmMax = 5;
7104 if (Triple.getArch() == llvm::Triple::bpfeb) {
7105 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007106 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007107 } else {
7108 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007109 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007110 }
7111 MaxAtomicPromoteWidth = 64;
7112 MaxAtomicInlineWidth = 64;
7113 TLSSupported = false;
7114 }
7115 void getTargetDefines(const LangOptions &Opts,
7116 MacroBuilder &Builder) const override {
7117 DefineStd(Builder, "bpf", Opts);
7118 Builder.defineMacro("__BPF__");
7119 }
7120 bool hasFeature(StringRef Feature) const override {
7121 return Feature == "bpf";
7122 }
7123
Craig Topper6c03a542015-10-19 04:51:35 +00007124 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007125 const char *getClobbers() const override {
7126 return "";
7127 }
7128 BuiltinVaListKind getBuiltinVaListKind() const override {
7129 return TargetInfo::VoidPtrBuiltinVaList;
7130 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007131 ArrayRef<const char *> getGCCRegNames() const override {
7132 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007133 }
7134 bool validateAsmConstraint(const char *&Name,
7135 TargetInfo::ConstraintInfo &info) const override {
7136 return true;
7137 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007138 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7139 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007140 }
7141};
7142
Daniel Sanders4672af62016-05-27 11:51:02 +00007143class MipsTargetInfo : public TargetInfo {
7144 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007145 StringRef Layout;
7146
7147 if (ABI == "o32")
7148 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7149 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007150 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007151 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007152 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007153 else
7154 llvm_unreachable("Invalid ABI");
7155
7156 if (BigEndian)
7157 resetDataLayout(("E-" + Layout).str());
7158 else
7159 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007160 }
7161
Akira Hatanaka9064e362013-10-29 18:30:33 +00007162
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007163 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007164 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007165 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007166 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007167 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007168 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007169 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007170 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007171 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007172 enum DspRevEnum {
7173 NoDSP, DSP1, DSP2
7174 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007175 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007176
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007177protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007178 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007179 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007180
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007181public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007182 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007183 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7184 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7185 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007186 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007187 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7188 getTriple().getArch() == llvm::Triple::mips64;
7189
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007190 setABI((getTriple().getArch() == llvm::Triple::mips ||
7191 getTriple().getArch() == llvm::Triple::mipsel)
7192 ? "o32"
7193 : "n64");
7194
7195 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007196 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007197
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007198 bool isNaN2008Default() const {
7199 return CPU == "mips32r6" || CPU == "mips64r6";
7200 }
7201
7202 bool isFP64Default() const {
7203 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7204 }
7205
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007206 bool isNan2008() const override {
7207 return IsNan2008;
7208 }
7209
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007210 bool processorSupportsGPR64() const {
7211 return llvm::StringSwitch<bool>(CPU)
7212 .Case("mips3", true)
7213 .Case("mips4", true)
7214 .Case("mips5", true)
7215 .Case("mips64", true)
7216 .Case("mips64r2", true)
7217 .Case("mips64r3", true)
7218 .Case("mips64r5", true)
7219 .Case("mips64r6", true)
7220 .Case("octeon", true)
7221 .Default(false);
7222 return false;
7223 }
7224
Alp Toker4925ba72014-06-07 23:30:42 +00007225 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007226 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007227 if (Name == "o32") {
7228 setO32ABITypes();
7229 ABI = Name;
7230 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007231 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007232
7233 if (Name == "n32") {
7234 setN32ABITypes();
7235 ABI = Name;
7236 return true;
7237 }
7238 if (Name == "n64") {
7239 setN64ABITypes();
7240 ABI = Name;
7241 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007242 }
7243 return false;
7244 }
7245
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007246 void setO32ABITypes() {
7247 Int64Type = SignedLongLong;
7248 IntMaxType = Int64Type;
7249 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7250 LongDoubleWidth = LongDoubleAlign = 64;
7251 LongWidth = LongAlign = 32;
7252 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7253 PointerWidth = PointerAlign = 32;
7254 PtrDiffType = SignedInt;
7255 SizeType = UnsignedInt;
7256 SuitableAlign = 64;
7257 }
7258
7259 void setN32N64ABITypes() {
7260 LongDoubleWidth = LongDoubleAlign = 128;
7261 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7262 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7263 LongDoubleWidth = LongDoubleAlign = 64;
7264 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7265 }
7266 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7267 SuitableAlign = 128;
7268 }
7269
Daniel Sanders4672af62016-05-27 11:51:02 +00007270 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007271 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007272 Int64Type = SignedLong;
7273 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007274 LongWidth = LongAlign = 64;
7275 PointerWidth = PointerAlign = 64;
7276 PtrDiffType = SignedLong;
7277 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007278 }
7279
7280 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007281 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007282 Int64Type = SignedLongLong;
7283 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007284 LongWidth = LongAlign = 32;
7285 PointerWidth = PointerAlign = 32;
7286 PtrDiffType = SignedInt;
7287 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007288 }
7289
Craig Topper3164f332014-03-11 03:39:26 +00007290 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007291 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007292 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007293 .Case("mips1", true)
7294 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007295 .Case("mips3", true)
7296 .Case("mips4", true)
7297 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007298 .Case("mips32", true)
7299 .Case("mips32r2", true)
7300 .Case("mips32r3", true)
7301 .Case("mips32r5", true)
7302 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007303 .Case("mips64", true)
7304 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007305 .Case("mips64r3", true)
7306 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007307 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007308 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007309 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007310 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007311 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007312 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007313 bool
7314 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7315 StringRef CPU,
7316 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007317 if (CPU.empty())
7318 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007319 if (CPU == "octeon")
7320 Features["mips64r2"] = Features["cnmips"] = true;
7321 else
7322 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007323 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007324 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007325
Craig Topper3164f332014-03-11 03:39:26 +00007326 void getTargetDefines(const LangOptions &Opts,
7327 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007328 if (BigEndian) {
7329 DefineStd(Builder, "MIPSEB", Opts);
7330 Builder.defineMacro("_MIPSEB");
7331 } else {
7332 DefineStd(Builder, "MIPSEL", Opts);
7333 Builder.defineMacro("_MIPSEL");
7334 }
7335
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007336 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007337 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007338 if (Opts.GNUMode)
7339 Builder.defineMacro("mips");
7340
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007341 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007342 Builder.defineMacro("__mips", "32");
7343 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7344 } else {
7345 Builder.defineMacro("__mips", "64");
7346 Builder.defineMacro("__mips64");
7347 Builder.defineMacro("__mips64__");
7348 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7349 }
7350
7351 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7352 .Cases("mips32", "mips64", "1")
7353 .Cases("mips32r2", "mips64r2", "2")
7354 .Cases("mips32r3", "mips64r3", "3")
7355 .Cases("mips32r5", "mips64r5", "5")
7356 .Cases("mips32r6", "mips64r6", "6")
7357 .Default("");
7358 if (!ISARev.empty())
7359 Builder.defineMacro("__mips_isa_rev", ISARev);
7360
7361 if (ABI == "o32") {
7362 Builder.defineMacro("__mips_o32");
7363 Builder.defineMacro("_ABIO32", "1");
7364 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007365 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007366 Builder.defineMacro("__mips_n32");
7367 Builder.defineMacro("_ABIN32", "2");
7368 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7369 } else if (ABI == "n64") {
7370 Builder.defineMacro("__mips_n64");
7371 Builder.defineMacro("_ABI64", "3");
7372 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7373 } else
7374 llvm_unreachable("Invalid ABI.");
7375
Simon Atanasyan683535b2012-08-29 19:14:58 +00007376 Builder.defineMacro("__REGISTER_PREFIX__", "");
7377
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007378 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007379 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007380 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007381 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007382 case SoftFloat:
7383 Builder.defineMacro("__mips_soft_float", Twine(1));
7384 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007385 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007386
Simon Atanasyan16071912013-04-14 14:07:30 +00007387 if (IsSingleFloat)
7388 Builder.defineMacro("__mips_single_float", Twine(1));
7389
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007390 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7391 Builder.defineMacro("_MIPS_FPSET",
7392 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7393
Simon Atanasyan72244b62012-07-05 16:06:06 +00007394 if (IsMips16)
7395 Builder.defineMacro("__mips16", Twine(1));
7396
Simon Atanasyan60777612013-04-14 14:07:51 +00007397 if (IsMicromips)
7398 Builder.defineMacro("__mips_micromips", Twine(1));
7399
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007400 if (IsNan2008)
7401 Builder.defineMacro("__mips_nan2008", Twine(1));
7402
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007403 switch (DspRev) {
7404 default:
7405 break;
7406 case DSP1:
7407 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7408 Builder.defineMacro("__mips_dsp", Twine(1));
7409 break;
7410 case DSP2:
7411 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7412 Builder.defineMacro("__mips_dspr2", Twine(1));
7413 Builder.defineMacro("__mips_dsp", Twine(1));
7414 break;
7415 }
7416
Jack Carter44ff1e52013-08-12 17:20:29 +00007417 if (HasMSA)
7418 Builder.defineMacro("__mips_msa", Twine(1));
7419
Simon Atanasyan26f19672012-04-05 19:28:31 +00007420 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7421 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7422 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007423
7424 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7425 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007426
7427 // These shouldn't be defined for MIPS-I but there's no need to check
7428 // for that since MIPS-I isn't supported.
7429 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7430 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7431 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007432
7433 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7434 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7435 // the instructions exist but using them violates the ABI since they
7436 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7437 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007438 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007439 }
7440
Craig Topper6c03a542015-10-19 04:51:35 +00007441 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7442 return llvm::makeArrayRef(BuiltinInfo,
7443 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007444 }
Craig Topper3164f332014-03-11 03:39:26 +00007445 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007446 return llvm::StringSwitch<bool>(Feature)
7447 .Case("mips", true)
7448 .Case("fp64", HasFP64)
7449 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007450 }
Craig Topper3164f332014-03-11 03:39:26 +00007451 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007452 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007453 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007454 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007455 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007456 // CPU register names
7457 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007458 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7459 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7460 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007461 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7462 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007463 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7464 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7465 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7466 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007467 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007468 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007469 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7470 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007471 // MSA register names
7472 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7473 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7474 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7475 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7476 // MSA control register names
7477 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7478 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007479 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007480 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007481 }
Craig Topper3164f332014-03-11 03:39:26 +00007482 bool validateAsmConstraint(const char *&Name,
7483 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007484 switch (*Name) {
7485 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007486 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007487 case 'r': // CPU registers.
7488 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007489 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007490 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007491 case 'c': // $25 for indirect jumps
7492 case 'l': // lo register
7493 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007494 Info.setAllowsRegister();
7495 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007496 case 'I': // Signed 16-bit constant
7497 case 'J': // Integer 0
7498 case 'K': // Unsigned 16-bit constant
7499 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7500 case 'M': // Constants not loadable via lui, addiu, or ori
7501 case 'N': // Constant -1 to -65535
7502 case 'O': // A signed 15-bit constant
7503 case 'P': // A constant between 1 go 65535
7504 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007505 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007506 Info.setAllowsMemory();
7507 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007508 case 'Z':
7509 if (Name[1] == 'C') { // An address usable by ll, and sc.
7510 Info.setAllowsMemory();
7511 Name++; // Skip over 'Z'.
7512 return true;
7513 }
7514 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007515 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007516 }
7517
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007518 std::string convertConstraint(const char *&Constraint) const override {
7519 std::string R;
7520 switch (*Constraint) {
7521 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7522 if (Constraint[1] == 'C') {
7523 R = std::string("^") + std::string(Constraint, 2);
7524 Constraint++;
7525 return R;
7526 }
7527 break;
7528 }
7529 return TargetInfo::convertConstraint(Constraint);
7530 }
7531
Craig Topper3164f332014-03-11 03:39:26 +00007532 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007533 // In GCC, $1 is not widely used in generated code (it's used only in a few
7534 // specific situations), so there is no real need for users to add it to
7535 // the clobbers list if they want to use it in their inline assembly code.
7536 //
7537 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7538 // code generation, so using it in inline assembly without adding it to the
7539 // clobbers list can cause conflicts between the inline assembly code and
7540 // the surrounding generated code.
7541 //
7542 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7543 // operands, which will conflict with the ".set at" assembler option (which
7544 // we use only for inline assembly, in order to maintain compatibility with
7545 // GCC) and will also conflict with the user's usage of $1.
7546 //
7547 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7548 // register for generated code is to automatically clobber $1 for all inline
7549 // assembly code.
7550 //
7551 // FIXME: We should automatically clobber $1 only for inline assembly code
7552 // which actually uses it. This would allow LLVM to use $1 for inline
7553 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007554 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007555 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007556
Craig Topper3164f332014-03-11 03:39:26 +00007557 bool handleTargetFeatures(std::vector<std::string> &Features,
7558 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007559 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007560 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007561 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007562 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007563 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007564 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007565 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007566
Eric Christopher610fe112015-08-26 08:21:55 +00007567 for (const auto &Feature : Features) {
7568 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007569 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007570 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007571 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007572 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007573 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007574 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007575 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007576 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007577 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007578 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007579 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007580 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007581 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007582 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007583 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007584 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007585 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007586 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007587 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007588 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007589 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007590 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007591
James Y Knightb214cbc2016-03-04 19:00:41 +00007592 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007593
Rafael Espindolaeb265472013-08-21 21:59:03 +00007594 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007595 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007596
Craig Topper3164f332014-03-11 03:39:26 +00007597 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007598 if (RegNo == 0) return 4;
7599 if (RegNo == 1) return 5;
7600 return -1;
7601 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007602
7603 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007604
7605 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7606 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7607 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7608 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7609 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7610 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7611 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7612 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7613 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7614 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7615 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7616 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7617 {{"ra"}, "$31"}};
7618 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7619 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7620 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7621 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7622 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7623 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7624 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7625 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7626 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7627 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7628 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7629 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007630 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007631 return llvm::makeArrayRef(O32RegAliases);
7632 return llvm::makeArrayRef(NewABIRegAliases);
7633 }
7634
7635 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007636 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007637 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007638
7639 bool validateTarget(DiagnosticsEngine &Diags) const override {
7640 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7641 // this yet. It's better to fail here than on the backend assertion.
7642 if (processorSupportsGPR64() && ABI == "o32") {
7643 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7644 return false;
7645 }
7646
7647 // 64-bit ABI's require 64-bit CPU's.
7648 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7649 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7650 return false;
7651 }
7652
7653 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7654 // can't handle this yet. It's better to fail here than on the
7655 // backend assertion.
7656 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7657 getTriple().getArch() == llvm::Triple::mips64el) &&
7658 ABI == "o32") {
7659 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7660 << ABI << getTriple().str();
7661 return false;
7662 }
7663
7664 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7665 // can't handle this yet. It's better to fail here than on the
7666 // backend assertion.
7667 if ((getTriple().getArch() == llvm::Triple::mips ||
7668 getTriple().getArch() == llvm::Triple::mipsel) &&
7669 (ABI == "n32" || ABI == "n64")) {
7670 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7671 << ABI << getTriple().str();
7672 return false;
7673 }
7674
7675 return true;
7676 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007677};
7678
Daniel Sanders4672af62016-05-27 11:51:02 +00007679const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007680#define BUILTIN(ID, TYPE, ATTRS) \
7681 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7682#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7683 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007684#include "clang/Basic/BuiltinsMips.def"
7685};
7686
Ivan Krasindd7403e2011-08-24 20:22:22 +00007687class PNaClTargetInfo : public TargetInfo {
7688public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007689 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7690 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007691 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007692 this->LongAlign = 32;
7693 this->LongWidth = 32;
7694 this->PointerAlign = 32;
7695 this->PointerWidth = 32;
7696 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007697 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007698 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007699 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007700 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007701 this->SizeType = TargetInfo::UnsignedInt;
7702 this->PtrDiffType = TargetInfo::SignedInt;
7703 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007704 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007705 }
7706
Craig Toppere6f17d02014-03-11 04:07:52 +00007707 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007708 Builder.defineMacro("__le32__");
7709 Builder.defineMacro("__pnacl__");
7710 }
Craig Topper3164f332014-03-11 03:39:26 +00007711 void getTargetDefines(const LangOptions &Opts,
7712 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007713 getArchDefines(Opts, Builder);
7714 }
Craig Topper3164f332014-03-11 03:39:26 +00007715 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007716 return Feature == "pnacl";
7717 }
Craig Topper6c03a542015-10-19 04:51:35 +00007718 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007719 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007720 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007721 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007722 ArrayRef<const char *> getGCCRegNames() const override;
7723 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007724 bool validateAsmConstraint(const char *&Name,
7725 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007726 return false;
7727 }
7728
Craig Topper3164f332014-03-11 03:39:26 +00007729 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007730 return "";
7731 }
7732};
7733
Craig Topperf054e3a2015-10-19 03:52:27 +00007734ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7735 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007736}
7737
Craig Topperf054e3a2015-10-19 03:52:27 +00007738ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7739 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007740}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007741
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007742// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007743class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007744public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007745 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7746 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007747
7748 BuiltinVaListKind getBuiltinVaListKind() const override {
7749 return TargetInfo::PNaClABIBuiltinVaList;
7750 }
7751};
7752
JF Bastien643817d2014-09-12 17:52:47 +00007753class Le64TargetInfo : public TargetInfo {
7754 static const Builtin::Info BuiltinInfo[];
7755
7756public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007757 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7758 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007759 BigEndian = false;
7760 NoAsmVariants = true;
7761 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7762 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007763 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007764 }
7765
7766 void getTargetDefines(const LangOptions &Opts,
7767 MacroBuilder &Builder) const override {
7768 DefineStd(Builder, "unix", Opts);
7769 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7770 Builder.defineMacro("__ELF__");
7771 }
Craig Topper6c03a542015-10-19 04:51:35 +00007772 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7773 return llvm::makeArrayRef(BuiltinInfo,
7774 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007775 }
7776 BuiltinVaListKind getBuiltinVaListKind() const override {
7777 return TargetInfo::PNaClABIBuiltinVaList;
7778 }
7779 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007780 ArrayRef<const char *> getGCCRegNames() const override {
7781 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007782 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007783 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7784 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007785 }
7786 bool validateAsmConstraint(const char *&Name,
7787 TargetInfo::ConstraintInfo &Info) const override {
7788 return false;
7789 }
7790
7791 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007792};
Dan Gohmanc2853072015-09-03 22:51:53 +00007793
7794class WebAssemblyTargetInfo : public TargetInfo {
7795 static const Builtin::Info BuiltinInfo[];
7796
7797 enum SIMDEnum {
7798 NoSIMD,
7799 SIMD128,
7800 } SIMDLevel;
7801
7802public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007803 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007804 : TargetInfo(T), SIMDLevel(NoSIMD) {
7805 BigEndian = false;
7806 NoAsmVariants = true;
7807 SuitableAlign = 128;
7808 LargeArrayMinWidth = 128;
7809 LargeArrayAlign = 128;
7810 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007811 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007812 LongDoubleWidth = LongDoubleAlign = 128;
7813 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007814 }
7815
7816protected:
7817 void getTargetDefines(const LangOptions &Opts,
7818 MacroBuilder &Builder) const override {
7819 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7820 if (SIMDLevel >= SIMD128)
7821 Builder.defineMacro("__wasm_simd128__");
7822 }
7823
7824private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007825 bool
7826 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7827 StringRef CPU,
7828 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007829 if (CPU == "bleeding-edge")
7830 Features["simd128"] = true;
7831 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7832 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007833 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007834 return llvm::StringSwitch<bool>(Feature)
7835 .Case("simd128", SIMDLevel >= SIMD128)
7836 .Default(false);
7837 }
7838 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007839 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007840 for (const auto &Feature : Features) {
7841 if (Feature == "+simd128") {
7842 SIMDLevel = std::max(SIMDLevel, SIMD128);
7843 continue;
7844 }
7845 if (Feature == "-simd128") {
7846 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7847 continue;
7848 }
7849
7850 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7851 << "-target-feature";
7852 return false;
7853 }
7854 return true;
7855 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007856 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007857 return llvm::StringSwitch<bool>(Name)
7858 .Case("mvp", true)
7859 .Case("bleeding-edge", true)
7860 .Case("generic", true)
7861 .Default(false);
7862 }
Craig Topper6c03a542015-10-19 04:51:35 +00007863 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7864 return llvm::makeArrayRef(BuiltinInfo,
7865 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007866 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007867 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007868 return VoidPtrBuiltinVaList;
7869 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007870 ArrayRef<const char *> getGCCRegNames() const final {
7871 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007872 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007873 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7874 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007875 }
7876 bool
7877 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007878 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007879 return false;
7880 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007881 const char *getClobbers() const final { return ""; }
7882 bool isCLZForZeroUndef() const final { return false; }
7883 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007884 IntType getIntTypeByWidth(unsigned BitWidth,
7885 bool IsSigned) const final {
7886 // WebAssembly prefers long long for explicitly 64-bit integers.
7887 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7888 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7889 }
7890 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7891 bool IsSigned) const final {
7892 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7893 return BitWidth == 64
7894 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7895 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7896 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007897};
7898
7899const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7900#define BUILTIN(ID, TYPE, ATTRS) \
7901 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7902#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7903 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7904#include "clang/Basic/BuiltinsWebAssembly.def"
7905};
7906
7907class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007909 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7910 const TargetOptions &Opts)
7911 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007912 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007913 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007914 }
7915
7916protected:
7917 void getTargetDefines(const LangOptions &Opts,
7918 MacroBuilder &Builder) const override {
7919 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7920 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7921 }
7922};
7923
7924class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7925public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007926 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7927 const TargetOptions &Opts)
7928 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007929 LongAlign = LongWidth = 64;
7930 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007931 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007932 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007933 }
7934
7935protected:
7936 void getTargetDefines(const LangOptions &Opts,
7937 MacroBuilder &Builder) const override {
7938 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7939 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7940 }
7941};
7942
JF Bastien643817d2014-09-12 17:52:47 +00007943const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7944#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007945 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007946#include "clang/Basic/BuiltinsLe64.def"
7947};
7948
Eric Christopherc48497a2015-09-18 21:26:24 +00007949static const unsigned SPIRAddrSpaceMap[] = {
7950 1, // opencl_global
7951 3, // opencl_local
7952 2, // opencl_constant
7953 4, // opencl_generic
7954 0, // cuda_device
7955 0, // cuda_constant
7956 0 // cuda_shared
7957};
7958class SPIRTargetInfo : public TargetInfo {
7959public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007960 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7961 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007962 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7963 "SPIR target must use unknown OS");
7964 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7965 "SPIR target must use unknown environment type");
7966 BigEndian = false;
7967 TLSSupported = false;
7968 LongWidth = LongAlign = 64;
7969 AddrSpaceMap = &SPIRAddrSpaceMap;
7970 UseAddrSpaceMapMangling = true;
7971 // Define available target features
7972 // These must be defined in sorted order!
7973 NoAsmVariants = true;
7974 }
7975 void getTargetDefines(const LangOptions &Opts,
7976 MacroBuilder &Builder) const override {
7977 DefineStd(Builder, "SPIR", Opts);
7978 }
7979 bool hasFeature(StringRef Feature) const override {
7980 return Feature == "spir";
7981 }
Craig Topper3164f332014-03-11 03:39:26 +00007982
Craig Topper6c03a542015-10-19 04:51:35 +00007983 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007984 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007985 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007986 bool validateAsmConstraint(const char *&Name,
7987 TargetInfo::ConstraintInfo &info) const override {
7988 return true;
7989 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007990 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7991 return None;
7992 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007993 BuiltinVaListKind getBuiltinVaListKind() const override {
7994 return TargetInfo::VoidPtrBuiltinVaList;
7995 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007996
Eric Christopherc48497a2015-09-18 21:26:24 +00007997 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00007998 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
7999 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008000 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008001
Eric Christopherc48497a2015-09-18 21:26:24 +00008002 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8003 return CC_SpirFunction;
8004 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008005
8006 void setSupportedOpenCLOpts() override {
8007 // Assume all OpenCL extensions and optional core features are supported
8008 // for SPIR since it is a generic target.
8009 getSupportedOpenCLOpts().setAll();
8010 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008011};
Guy Benyeib798fc92012-12-11 21:38:14 +00008012
Eric Christopherc48497a2015-09-18 21:26:24 +00008013class SPIR32TargetInfo : public SPIRTargetInfo {
8014public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008015 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8016 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008017 PointerWidth = PointerAlign = 32;
8018 SizeType = TargetInfo::UnsignedInt;
8019 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008020 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8021 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008022 }
8023 void getTargetDefines(const LangOptions &Opts,
8024 MacroBuilder &Builder) const override {
8025 DefineStd(Builder, "SPIR32", Opts);
8026 }
8027};
Guy Benyeib798fc92012-12-11 21:38:14 +00008028
Eric Christopherc48497a2015-09-18 21:26:24 +00008029class SPIR64TargetInfo : public SPIRTargetInfo {
8030public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008031 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8032 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008033 PointerWidth = PointerAlign = 64;
8034 SizeType = TargetInfo::UnsignedLong;
8035 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008036 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8037 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008038 }
8039 void getTargetDefines(const LangOptions &Opts,
8040 MacroBuilder &Builder) const override {
8041 DefineStd(Builder, "SPIR64", Opts);
8042 }
8043};
Guy Benyeib798fc92012-12-11 21:38:14 +00008044
Robert Lytton0e076492013-08-13 09:43:10 +00008045class XCoreTargetInfo : public TargetInfo {
8046 static const Builtin::Info BuiltinInfo[];
8047public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008048 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8049 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008050 BigEndian = false;
8051 NoAsmVariants = true;
8052 LongLongAlign = 32;
8053 SuitableAlign = 32;
8054 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008055 SizeType = UnsignedInt;
8056 PtrDiffType = SignedInt;
8057 IntPtrType = SignedInt;
8058 WCharType = UnsignedChar;
8059 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008060 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008061 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8062 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008063 }
Craig Topper3164f332014-03-11 03:39:26 +00008064 void getTargetDefines(const LangOptions &Opts,
8065 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008066 Builder.defineMacro("__XS1B__");
8067 }
Craig Topper6c03a542015-10-19 04:51:35 +00008068 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8069 return llvm::makeArrayRef(BuiltinInfo,
8070 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008071 }
Craig Topper3164f332014-03-11 03:39:26 +00008072 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008073 return TargetInfo::VoidPtrBuiltinVaList;
8074 }
Craig Topper3164f332014-03-11 03:39:26 +00008075 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008076 return "";
8077 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008078 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008079 static const char * const GCCRegNames[] = {
8080 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8081 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8082 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008083 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008084 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008085 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8086 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008087 }
Craig Topper3164f332014-03-11 03:39:26 +00008088 bool validateAsmConstraint(const char *&Name,
8089 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008090 return false;
8091 }
Craig Topper3164f332014-03-11 03:39:26 +00008092 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008093 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8094 return (RegNo < 2)? RegNo : -1;
8095 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008096 bool allowsLargerPreferedTypeAlignment() const override {
8097 return false;
8098 }
Robert Lytton0e076492013-08-13 09:43:10 +00008099};
8100
8101const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008102#define BUILTIN(ID, TYPE, ATTRS) \
8103 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8104#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8105 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008106#include "clang/Basic/BuiltinsXCore.def"
8107};
Robert Lytton0e076492013-08-13 09:43:10 +00008108
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008109// x86_32 Android target
8110class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008112 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8113 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008114 SuitableAlign = 32;
8115 LongDoubleWidth = 64;
8116 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8117 }
8118};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008119
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008120// x86_64 Android target
8121class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8122public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008123 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8124 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008125 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8126 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008127
8128 bool useFloat128ManglingForLongDouble() const override {
8129 return true;
8130 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008131};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008132
8133// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8134class RenderScript32TargetInfo : public ARMleTargetInfo {
8135public:
8136 RenderScript32TargetInfo(const llvm::Triple &Triple,
8137 const TargetOptions &Opts)
8138 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8139 Triple.getOSName(),
8140 Triple.getEnvironmentName()),
8141 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008142 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008143 LongWidth = LongAlign = 64;
8144 }
8145 void getTargetDefines(const LangOptions &Opts,
8146 MacroBuilder &Builder) const override {
8147 Builder.defineMacro("__RENDERSCRIPT__");
8148 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8149 }
8150};
8151
8152// 64-bit RenderScript is aarch64
8153class RenderScript64TargetInfo : public AArch64leTargetInfo {
8154public:
8155 RenderScript64TargetInfo(const llvm::Triple &Triple,
8156 const TargetOptions &Opts)
8157 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8158 Triple.getOSName(),
8159 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008160 Opts) {
8161 IsRenderScriptTarget = true;
8162 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008163
8164 void getTargetDefines(const LangOptions &Opts,
8165 MacroBuilder &Builder) const override {
8166 Builder.defineMacro("__RENDERSCRIPT__");
8167 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8168 }
8169};
8170
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008171} // end anonymous namespace
8172
Chris Lattner5ba61f02006-10-14 07:39:34 +00008173//===----------------------------------------------------------------------===//
8174// Driver code
8175//===----------------------------------------------------------------------===//
8176
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008177static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8178 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008179 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008180
Daniel Dunbar52322032009-08-18 05:47:58 +00008181 switch (Triple.getArch()) {
8182 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008183 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008184
Tim Northover2a0783d2014-05-30 14:14:07 +00008185 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008186 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008187
8188 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008189 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008190
Jacques Pienaard964cc22016-03-28 21:02:54 +00008191 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008192 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008193
Tim Northover2a0783d2014-05-30 14:14:07 +00008194 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008195 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008197
8198 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008199 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008201 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008202 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008203 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008204 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008205 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008206 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008207 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008209 }
8210
Christian Pirker9b019ae2014-02-25 13:51:00 +00008211 case llvm::Triple::aarch64_be:
8212 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008213 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008214 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008215 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008216 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008217 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008219 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008220 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008221 }
8222
Daniel Dunbar52322032009-08-18 05:47:58 +00008223 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008224 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008225 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008226 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008227
Daniel Dunbar52322032009-08-18 05:47:58 +00008228 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008229 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008231 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008232 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008233 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008235 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008236 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008237 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008238 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008239 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008241 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008242 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008243 case llvm::Triple::Win32:
8244 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008245 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008246 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008247 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008248 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008249 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008251 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008252 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008254 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008255 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008257 }
8258
8259 case llvm::Triple::armeb:
8260 case llvm::Triple::thumbeb:
8261 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008262 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008263
8264 switch (os) {
8265 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008267 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008268 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008269 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008271 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008273 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008275 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008277 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008279 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008281 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008282
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008283 case llvm::Triple::bpfeb:
8284 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008286
Daniel Dunbar52322032009-08-18 05:47:58 +00008287 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008289
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008290 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008291 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008292 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008293 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008294 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008295 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008296 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008297 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008298 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008299 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008300 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008301 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008302 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008303
8304 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008305 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008306 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008307 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008308 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008309 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008310 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008311 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008312 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008313 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008314 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008315 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008316 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008317 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008318 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008319
Akira Hatanakabef17452011-09-20 19:21:49 +00008320 case llvm::Triple::mips64:
8321 switch (os) {
8322 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008323 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008324 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008325 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008326 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008327 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008328 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008329 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008330 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008331 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008332 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008333 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008334 }
8335
8336 case llvm::Triple::mips64el:
8337 switch (os) {
8338 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008339 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008340 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008341 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008342 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008343 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008344 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008345 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008346 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008347 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008348 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008349 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008350 }
8351
Ivan Krasindd7403e2011-08-24 20:22:22 +00008352 case llvm::Triple::le32:
8353 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008354 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008356 default:
8357 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008358 }
8359
JF Bastien643817d2014-09-12 17:52:47 +00008360 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008362
Daniel Dunbar52322032009-08-18 05:47:58 +00008363 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008364 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008366 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008367 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008369 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008370 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008371 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008373 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008375 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008377 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008379 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008380
8381 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008382 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008383 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008384 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008385 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008387 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008389 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008391 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008393 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008395 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008396
Bill Schmidt778d3872013-07-26 01:36:11 +00008397 case llvm::Triple::ppc64le:
8398 switch (os) {
8399 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008401 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008403 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008405 }
8406
Peter Collingbournec947aae2012-05-20 23:28:41 +00008407 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008409 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008411
Tom Stellardd8e38a32015-01-06 20:34:47 +00008412 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008413 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008414 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008415
Daniel Dunbar52322032009-08-18 05:47:58 +00008416 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008417 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008418 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008420 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008422 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008424 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008426 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008428 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008430 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008431
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008432 // The 'sparcel' architecture copies all the above cases except for Solaris.
8433 case llvm::Triple::sparcel:
8434 switch (os) {
8435 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008436 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008437 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008438 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008439 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008441 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008443 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008445 }
8446
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008447 case llvm::Triple::sparcv9:
8448 switch (os) {
8449 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008451 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008453 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008455 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008457 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008459 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008461 }
8462
Ulrich Weigand47445072013-05-06 16:26:41 +00008463 case llvm::Triple::systemz:
8464 switch (os) {
8465 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008466 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008467 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008468 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008469 }
8470
Eli Friedmana9c3d712009-08-19 20:47:07 +00008471 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008473
Daniel Dunbar52322032009-08-18 05:47:58 +00008474 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008475 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008477
Daniel Dunbar52322032009-08-18 05:47:58 +00008478 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008479 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008481 case llvm::Triple::Linux: {
8482 switch (Triple.getEnvironment()) {
8483 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008484 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008485 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008486 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008487 }
8488 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008489 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008491 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008492 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008493 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008495 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008496 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008497 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008499 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008500 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008501 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008502 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008503 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008505 case llvm::Triple::Win32: {
8506 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008507 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008508 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008509 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008510 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008511 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008512 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008513 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008514 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008515 }
8516 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008517 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008519 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008520 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008521 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008522 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008523 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008524 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008525 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008527 }
8528
8529 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008530 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008532
Daniel Dunbar52322032009-08-18 05:47:58 +00008533 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008534 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008536 case llvm::Triple::Linux: {
8537 switch (Triple.getEnvironment()) {
8538 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008540 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008542 }
8543 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008544 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008546 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008548 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008550 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008552 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008554 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008556 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008558 case llvm::Triple::Win32: {
8559 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008560 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008562 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008563 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008564 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008565 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008567 }
8568 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008569 case llvm::Triple::Haiku:
8570 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008571 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008573 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008575 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008577 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008578
Douglas Katzman78d7c542015-05-12 21:18:10 +00008579 case llvm::Triple::spir: {
8580 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8581 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8582 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008584 }
8585 case llvm::Triple::spir64: {
8586 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8587 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8588 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008589 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008590 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008591 case llvm::Triple::wasm32:
8592 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8593 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008594 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008595 case llvm::Triple::wasm64:
8596 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8597 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008599
8600 case llvm::Triple::renderscript32:
8601 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8602 case llvm::Triple::renderscript64:
8603 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008604 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008605}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008606
8607/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008608/// options.
Alp Toker80758082014-07-06 05:26:44 +00008609TargetInfo *
8610TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008611 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008612 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008613
8614 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008615 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008616 if (!Target) {
8617 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008618 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008619 }
Alp Toker80758082014-07-06 05:26:44 +00008620 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008621
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008622 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008623 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8624 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008625 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008626 }
8627
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008628 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008629 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8630 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008631 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008632 }
8633
Rafael Espindolaeb265472013-08-21 21:59:03 +00008634 // Set the fp math unit.
8635 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8636 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008637 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008638 }
8639
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008640 // Compute the default target features, we need the target to handle this
8641 // because features may have dependencies on one another.
8642 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008643 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8644 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008645 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008646
8647 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008648 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008649 for (const auto &F : Features)
8650 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8651
Eric Christopher3ff21b32013-10-16 21:26:26 +00008652 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008653 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008654
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008655 Target->setSupportedOpenCLOpts();
8656
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008657 if (!Target->validateTarget(Diags))
8658 return nullptr;
8659
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008660 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008661}