blob: dd88646b17f3824a8c21d7322d522535ef27735b [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);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000515 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
544 DefineStd(Builder, "unix", Opts);
545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 }
549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000550 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
551 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000552 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000553
Eli Friedman3715d1f2011-12-15 02:15:56 +0000554 switch (Triple.getArch()) {
555 default:
556 case llvm::Triple::x86:
557 case llvm::Triple::x86_64:
558 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000559 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000560 this->MCountName = "__mcount";
561 break;
562 case llvm::Triple::mips64:
563 case llvm::Triple::mips64el:
564 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000565 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000566 this->MCountName = "_mcount";
567 break;
568 }
569 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000570};
571
Eli Friedman9fa28852012-08-08 23:57:20 +0000572// Bitrig Target
573template<typename Target>
574class BitrigTargetInfo : public OSTargetInfo<Target> {
575protected:
Craig Topper3164f332014-03-11 03:39:26 +0000576 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
577 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000578 // Bitrig defines; list based off of gcc output
579
580 Builder.defineMacro("__Bitrig__");
581 DefineStd(Builder, "unix", Opts);
582 Builder.defineMacro("__ELF__");
583 if (Opts.POSIXThreads)
584 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000585
586 switch (Triple.getArch()) {
587 default:
588 break;
589 case llvm::Triple::arm:
590 case llvm::Triple::armeb:
591 case llvm::Triple::thumb:
592 case llvm::Triple::thumbeb:
593 Builder.defineMacro("__ARM_DWARF_EH__");
594 break;
595 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000596 }
597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000598 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
599 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000600 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000601 }
602};
603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000604// PSP Target
605template<typename Target>
606class PSPTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000610 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000611 Builder.defineMacro("PSP");
612 Builder.defineMacro("_PSP");
613 Builder.defineMacro("__psp__");
614 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000615 }
616public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000617 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000618};
619
John Thompsone467e192009-11-19 17:18:50 +0000620// PS3 PPU Target
621template<typename Target>
622class PS3PPUTargetInfo : public OSTargetInfo<Target> {
623protected:
Craig Topper3164f332014-03-11 03:39:26 +0000624 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
625 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000626 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000627 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("__PPU__");
629 Builder.defineMacro("__CELLOS_LV2__");
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000632 Builder.defineMacro("_ARCH_PPC64");
633 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000634 }
635public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000636 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
637 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000638 this->LongWidth = this->LongAlign = 32;
639 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000640 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000641 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000642 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000643 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000644 }
645};
646
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647template <typename Target>
648class PS4OSTargetInfo : public OSTargetInfo<Target> {
649protected:
650 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
651 MacroBuilder &Builder) const override {
652 Builder.defineMacro("__FreeBSD__", "9");
653 Builder.defineMacro("__FreeBSD_cc_version", "900001");
654 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
655 DefineStd(Builder, "unix", Opts);
656 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000657 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 }
659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000660 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
661 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000662 this->WCharType = this->UnsignedShort;
663
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000664 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
665 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000666
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000667 // On PS4, do not honor explicit bit field alignment,
668 // as in "__attribute__((aligned(2))) int b : 1;".
669 this->UseExplicitBitFieldAlignment = false;
670
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000671 switch (Triple.getArch()) {
672 default:
673 case llvm::Triple::x86_64:
674 this->MCountName = ".mcount";
675 break;
676 }
677 }
678};
679
Torok Edwinb2b37c62009-06-30 17:10:35 +0000680// Solaris target
681template<typename Target>
682class SolarisTargetInfo : public OSTargetInfo<Target> {
683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000686 DefineStd(Builder, "sun", Opts);
687 DefineStd(Builder, "unix", Opts);
688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__svr4__");
690 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000691 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
692 // newer, but to 500 for everything else. feature_test.h has a check to
693 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000694 // with a new version.
695 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000696 Builder.defineMacro("_XOPEN_SOURCE", "600");
697 else
698 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000699 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000700 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000701 Builder.defineMacro("_LARGEFILE_SOURCE");
702 Builder.defineMacro("_LARGEFILE64_SOURCE");
703 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000704 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000705 }
706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000707 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
708 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000709 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000710 // FIXME: WIntType should be SignedLong
711 }
712};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713
714// Windows target
715template<typename Target>
716class WindowsTargetInfo : public OSTargetInfo<Target> {
717protected:
Craig Topper3164f332014-03-11 03:39:26 +0000718 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
719 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720 Builder.defineMacro("_WIN32");
721 }
722 void getVisualStudioDefines(const LangOptions &Opts,
723 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000725 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 Builder.defineMacro("_CPPRTTI");
727
Reid Kleckner16514352015-01-30 21:42:55 +0000728 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000729 Builder.defineMacro("_CPPUNWIND");
730 }
731
David Majnemer6a658902015-07-22 22:36:26 +0000732 if (Opts.Bool)
733 Builder.defineMacro("__BOOL_DEFINED");
734
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000735 if (!Opts.CharIsSigned)
736 Builder.defineMacro("_CHAR_UNSIGNED");
737
738 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
739 // but it works for now.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000742
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000743 if (Opts.MSCompatibilityVersion) {
744 Builder.defineMacro("_MSC_VER",
745 Twine(Opts.MSCompatibilityVersion / 100000));
746 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000747 // FIXME We cannot encode the revision information into 32-bits
748 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000749
David Majnemerb710a932015-05-11 03:57:49 +0000750 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000751 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000752
753 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
754 if (Opts.CPlusPlus1z)
755 Builder.defineMacro("_MSVC_LANG", "201403L");
756 else if (Opts.CPlusPlus14)
757 Builder.defineMacro("_MSVC_LANG", "201402L");
758 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000759 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000760
761 if (Opts.MicrosoftExt) {
762 Builder.defineMacro("_MSC_EXTENSIONS");
763
764 if (Opts.CPlusPlus11) {
765 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
766 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
767 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
768 }
769 }
770
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000771 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772 }
773
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000775 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
776 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000777};
778
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779template <typename Target>
780class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000781protected:
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
783 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000784 if (Opts.POSIXThreads)
785 Builder.defineMacro("_REENTRANT");
786 if (Opts.CPlusPlus)
787 Builder.defineMacro("_GNU_SOURCE");
788
789 DefineStd(Builder, "unix", Opts);
790 Builder.defineMacro("__ELF__");
791 Builder.defineMacro("__native_client__");
792 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000793
794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000795 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
796 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongAlign = 32;
798 this->LongWidth = 32;
799 this->PointerAlign = 32;
800 this->PointerWidth = 32;
801 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000802 this->Int64Type = TargetInfo::SignedLongLong;
803 this->DoubleAlign = 64;
804 this->LongDoubleWidth = 64;
805 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000806 this->LongLongWidth = 64;
807 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000808 this->SizeType = TargetInfo::UnsignedInt;
809 this->PtrDiffType = TargetInfo::SignedInt;
810 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000811 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000812 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000814 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else {
822 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000823 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000824 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000825 }
826};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000827
Petr Hosek62e1d232016-10-06 06:08:09 +0000828// Fuchsia Target
829template<typename Target>
830class FuchsiaTargetInfo : public OSTargetInfo<Target> {
831protected:
832 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
833 MacroBuilder &Builder) const override {
834 Builder.defineMacro("__Fuchsia__");
835 Builder.defineMacro("__ELF__");
836 if (Opts.POSIXThreads)
837 Builder.defineMacro("_REENTRANT");
838 // Required by the libc++ locale support.
839 if (Opts.CPlusPlus)
840 Builder.defineMacro("_GNU_SOURCE");
841 }
842public:
843 FuchsiaTargetInfo(const llvm::Triple &Triple,
844 const TargetOptions &Opts)
845 : OSTargetInfo<Target>(Triple, Opts) {
846 this->MCountName = "__mcount";
847 }
848};
849
Dan Gohmanc2853072015-09-03 22:51:53 +0000850// WebAssembly target
851template <typename Target>
852class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
853 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000854 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000855 // A common platform macro.
856 if (Opts.POSIXThreads)
857 Builder.defineMacro("_REENTRANT");
858 // Follow g++ convention and predefine _GNU_SOURCE for C++.
859 if (Opts.CPlusPlus)
860 Builder.defineMacro("_GNU_SOURCE");
861 }
862
863 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000864 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000865 return ".text.__startup";
866 }
867
868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000869 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
870 const TargetOptions &Opts)
871 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000872 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000873 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
874 }
875};
Dan Gohmanc2853072015-09-03 22:51:53 +0000876
Chris Lattner09d98f52008-10-05 21:50:58 +0000877//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878// Specific target implementations.
879//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000880
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881// PPC abstract base class
882class PPCTargetInfo : public TargetInfo {
883 static const Builtin::Info BuiltinInfo[];
884 static const char * const GCCRegNames[];
885 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000886 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887
888 // Target cpu features.
889 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000890 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000891 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000892 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000893 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000894 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000895 bool HasBPERMD;
896 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000897 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000898
Ulrich Weigand8afad612014-07-28 13:17:52 +0000899protected:
900 std::string ABI;
901
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000903 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000904 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
905 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000906 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000907 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000908 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000909 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000910 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000911
Hal Finkel6b984f02012-07-03 16:51:04 +0000912 /// \brief Flags for architecture specific defines.
913 typedef enum {
914 ArchDefineNone = 0,
915 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
916 ArchDefinePpcgr = 1 << 1,
917 ArchDefinePpcsq = 1 << 2,
918 ArchDefine440 = 1 << 3,
919 ArchDefine603 = 1 << 4,
920 ArchDefine604 = 1 << 5,
921 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 ArchDefinePwr5 = 1 << 7,
923 ArchDefinePwr5x = 1 << 8,
924 ArchDefinePwr6 = 1 << 9,
925 ArchDefinePwr6x = 1 << 10,
926 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000927 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 ArchDefinePwr9 = 1 << 13,
929 ArchDefineA2 = 1 << 14,
930 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000931 } ArchDefineTypes;
932
Bill Schmidt38378a02013-02-01 20:23:10 +0000933 // Note: GCC recognizes the following additional cpus:
934 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
935 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
936 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000937 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 bool CPUKnown = llvm::StringSwitch<bool>(Name)
939 .Case("generic", true)
940 .Case("440", true)
941 .Case("450", true)
942 .Case("601", true)
943 .Case("602", true)
944 .Case("603", true)
945 .Case("603e", true)
946 .Case("603ev", true)
947 .Case("604", true)
948 .Case("604e", true)
949 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000950 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("g3", true)
952 .Case("7400", true)
953 .Case("g4", true)
954 .Case("7450", true)
955 .Case("g4+", true)
956 .Case("750", true)
957 .Case("970", true)
958 .Case("g5", true)
959 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000960 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000961 .Case("e500mc", true)
962 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000963 .Case("power3", true)
964 .Case("pwr3", true)
965 .Case("power4", true)
966 .Case("pwr4", true)
967 .Case("power5", true)
968 .Case("pwr5", true)
969 .Case("power5x", true)
970 .Case("pwr5x", true)
971 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000972 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("power6x", true)
974 .Case("pwr6x", true)
975 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000976 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000977 .Case("power8", true)
978 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000979 .Case("power9", true)
980 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000985 .Case("powerpc64le", true)
986 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Default(false);
988
989 if (CPUKnown)
990 CPU = Name;
991
992 return CPUKnown;
993 }
994
Ulrich Weigand8afad612014-07-28 13:17:52 +0000995
996 StringRef getABI() const override { return ABI; }
997
Craig Topper6c03a542015-10-19 04:51:35 +0000998 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
999 return llvm::makeArrayRef(BuiltinInfo,
1000 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 void getTargetDefines(const LangOptions &Opts,
1006 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001007
Eric Christopher8c47b422015-10-09 18:39:55 +00001008 bool
1009 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1010 StringRef CPU,
1011 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001012
Craig Topper3164f332014-03-11 03:39:26 +00001013 bool handleTargetFeatures(std::vector<std::string> &Features,
1014 DiagnosticsEngine &Diags) override;
1015 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001016 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1017 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001018
Craig Topperf054e3a2015-10-19 03:52:27 +00001019 ArrayRef<const char *> getGCCRegNames() const override;
1020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001021 bool validateAsmConstraint(const char *&Name,
1022 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001023 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001024 default: return false;
1025 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001026 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 case 'b': // Base register
1028 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001029 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001030 break;
1031 // FIXME: The following are added to allow parsing.
1032 // I just took a guess at what the actions should be.
1033 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001035 case 'v': // Altivec vector register
1036 Info.setAllowsRegister();
1037 break;
1038 case 'w':
1039 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001040 case 'd':// VSX vector register to hold vector double data
1041 case 'f':// VSX vector register to hold vector float data
1042 case 's':// VSX vector register to hold scalar float data
1043 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001044 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 default:
1047 return false;
1048 }
1049 Info.setAllowsRegister();
1050 Name++; // Skip over 'w'.
1051 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001052 case 'h': // `MQ', `CTR', or `LINK' register
1053 case 'q': // `MQ' register
1054 case 'c': // `CTR' register
1055 case 'l': // `LINK' register
1056 case 'x': // `CR' register (condition register) number 0
1057 case 'y': // `CR' register (condition register)
1058 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // (use `L' instead for SImode constants)
1064 case 'K': // Unsigned 16-bit constant
1065 case 'L': // Signed 16-bit constant shifted left 16 bits
1066 case 'M': // Constant larger than 31
1067 case 'N': // Exact power of 2
1068 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001073 break;
1074 case 'm': // Memory operand. Note that on PowerPC targets, m can
1075 // include addresses that update the base register. It
1076 // is therefore only safe to use `m' in an asm statement
1077 // if that asm statement accesses the operand exactly once.
1078 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001079 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1084 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001085 // register to be updated.
1086 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001087 if (Name[1] != 's')
1088 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001089 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001090 // include any automodification of the base register. Unlike
1091 // `m', this constraint can be used in asm statements that
1092 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001093 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001094 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001095 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001096 break;
1097 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001098 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001099 case 'Z': // Memory operand that is an indexed or indirect from a
1100 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001101 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001102 Info.setAllowsMemory();
1103 Info.setAllowsRegister();
1104 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001106 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 // register (`p' is preferable for asm statements)
1108 case 'S': // Constant suitable as a 64-bit mask operand
1109 case 'T': // Constant suitable as a 32-bit mask operand
1110 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001111 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // instructions
1113 case 'W': // Vector constant that does not require memory
1114 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001115 break;
1116 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
John Thompson07a61a42010-06-24 22:44:13 +00001118 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
Craig Topper3164f332014-03-11 03:39:26 +00001120 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001121 std::string R;
1122 switch (*Constraint) {
1123 case 'e':
1124 case 'w':
1125 // Two-character constraint; add "^" hint for later parsing.
1126 R = std::string("^") + std::string(Constraint, 2);
1127 Constraint++;
1128 break;
1129 default:
1130 return TargetInfo::convertConstraint(Constraint);
1131 }
1132 return R;
1133 }
Craig Topper3164f332014-03-11 03:39:26 +00001134 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001136 }
Craig Topper3164f332014-03-11 03:39:26 +00001137 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001138 if (RegNo == 0) return 3;
1139 if (RegNo == 1) return 4;
1140 return -1;
1141 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001142
1143 bool hasSjLjLowering() const override {
1144 return true;
1145 }
David Majnemer2617ea62015-06-09 18:05:33 +00001146
1147 bool useFloat128ManglingForLongDouble() const override {
1148 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001149 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001150 getTriple().isOSBinFormatELF();
1151 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152};
Anders Carlssonf511f642007-11-27 04:11:28 +00001153
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001155#define BUILTIN(ID, TYPE, ATTRS) \
1156 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1157#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1158 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001159#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001161
Eric Christopher917e9522014-11-18 22:36:15 +00001162/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001164bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001166 for (const auto &Feature : Features) {
1167 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001168 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001174 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001176 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001178 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001180 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001182 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001183 } else if (Feature == "+float128") {
1184 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001185 } else if (Feature == "+power9-vector") {
1186 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001187 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001188 // TODO: Finish this list and add an assert that we've handled them
1189 // all.
1190 }
Eric Christopher02c33352015-08-25 00:59:11 +00001191
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001192 return true;
1193}
1194
Chris Lattnerecd49032009-03-02 22:27:17 +00001195/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1196/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001197void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001199 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001201 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001203 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001207 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001209 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001211
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1214 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 } else {
1216 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1217 getTriple().getOS() != llvm::Triple::OpenBSD)
1218 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001219 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001220
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001222 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 Builder.defineMacro("_CALL_ELF", "1");
1224 if (ABI == "elfv2")
1225 Builder.defineMacro("_CALL_ELF", "2");
1226
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001228 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1229 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001230
Chris Lattnerecd49032009-03-02 22:27:17 +00001231 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001232 if (LongDoubleWidth == 128)
1233 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001234
John Thompsone467e192009-11-19 17:18:50 +00001235 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 Builder.defineMacro("__VEC__", "10206");
1237 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001238 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001239
1240 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001241 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1242 .Case("440", ArchDefineName)
1243 .Case("450", ArchDefineName | ArchDefine440)
1244 .Case("601", ArchDefineName)
1245 .Case("602", ArchDefineName | ArchDefinePpcgr)
1246 .Case("603", ArchDefineName | ArchDefinePpcgr)
1247 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1248 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1249 .Case("604", ArchDefineName | ArchDefinePpcgr)
1250 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1251 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001252 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001253 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1254 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1255 .Case("750", ArchDefineName | ArchDefinePpcgr)
1256 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001258 .Case("a2", ArchDefineA2)
1259 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("pwr3", ArchDefinePpcgr)
1261 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1263 | ArchDefinePpcsq)
1264 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1265 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1267 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1269 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1272 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001273 | ArchDefinePpcgr | ArchDefinePpcsq)
1274 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1275 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1276 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1278 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1279 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1280 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 .Case("power3", ArchDefinePpcgr)
1282 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1283 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1284 | ArchDefinePpcsq)
1285 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1286 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1289 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1290 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1293 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001294 | ArchDefinePpcgr | ArchDefinePpcsq)
1295 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1296 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1297 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001298 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1299 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1300 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1301 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001302 .Default(ArchDefineNone);
1303
1304 if (defs & ArchDefineName)
1305 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1306 if (defs & ArchDefinePpcgr)
1307 Builder.defineMacro("_ARCH_PPCGR");
1308 if (defs & ArchDefinePpcsq)
1309 Builder.defineMacro("_ARCH_PPCSQ");
1310 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001311 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001312 if (defs & ArchDefine603)
1313 Builder.defineMacro("_ARCH_603");
1314 if (defs & ArchDefine604)
1315 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001320 if (defs & ArchDefinePwr5x)
1321 Builder.defineMacro("_ARCH_PWR5X");
1322 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 if (defs & ArchDefinePwr6x)
1325 Builder.defineMacro("_ARCH_PWR6X");
1326 if (defs & ArchDefinePwr7)
1327 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001328 if (defs & ArchDefinePwr8)
1329 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001330 if (defs & ArchDefinePwr9)
1331 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001332 if (defs & ArchDefineA2)
1333 Builder.defineMacro("_ARCH_A2");
1334 if (defs & ArchDefineA2q) {
1335 Builder.defineMacro("_ARCH_A2Q");
1336 Builder.defineMacro("_ARCH_QP");
1337 }
1338
1339 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1340 Builder.defineMacro("__bg__");
1341 Builder.defineMacro("__THW_BLUEGENE__");
1342 Builder.defineMacro("__bgq__");
1343 Builder.defineMacro("__TOS_BGQ__");
1344 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001345
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001346 if (HasVSX)
1347 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001348 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001349 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001350 if (HasP8Crypto)
1351 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001352 if (HasHTM)
1353 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001354 if (HasFloat128)
1355 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001356 if (HasP9Vector)
1357 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001358
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1362 if (PointerWidth == 64)
1363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001364
Bill Schmidt38378a02013-02-01 20:23:10 +00001365 // FIXME: The following are not yet generated here by Clang, but are
1366 // generated by GCC:
1367 //
1368 // _SOFT_FLOAT_
1369 // __RECIP_PRECISION__
1370 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001371 // __RECIP__
1372 // __RECIPF__
1373 // __RSQRTE__
1374 // __RSQRTEF__
1375 // _SOFT_DOUBLE_
1376 // __NO_LWSYNC__
1377 // __HAVE_BSWAP__
1378 // __LONGDOUBLE128
1379 // __CMODEL_MEDIUM__
1380 // __CMODEL_LARGE__
1381 // _CALL_SYSV
1382 // _CALL_DARWIN
1383 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001384}
1385
Eric Christophera8a14c32015-08-31 18:39:16 +00001386// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001387// explicitly turned off vsx and turned on any of:
1388// - power8-vector
1389// - direct-move
1390// - float128
1391// - power9-vector
1392// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// set of options.
1394static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001395 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001396
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1398 FeaturesVec.end()) {
1399 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1400 FeaturesVec.end()) {
1401 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1402 << "-mno-vsx";
1403 return false;
1404 }
1405
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1409 << "-mno-vsx";
1410 return false;
1411 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1423 << "-mno-vsx";
1424 return false;
1425 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001426 }
1427
1428 return true;
1429}
1430
Eric Christopher8c47b422015-10-09 18:39:55 +00001431bool PPCTargetInfo::initFeatureMap(
1432 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1433 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001434 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1435 .Case("7400", true)
1436 .Case("g4", true)
1437 .Case("7450", true)
1438 .Case("g4+", true)
1439 .Case("970", true)
1440 .Case("g5", true)
1441 .Case("pwr6", true)
1442 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001443 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001444 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001446 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001447 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001448
1449 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001450 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001451 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1452 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001453 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001454 .Case("pwr8", true)
1455 .Default(false);
1456 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1457 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001458 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001459 .Case("pwr8", true)
1460 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001461 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1462 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001463 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001464 .Case("pwr8", true)
1465 .Case("pwr7", true)
1466 .Default(false);
1467 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001469 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001470 .Case("pwr8", true)
1471 .Case("pwr7", true)
1472 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1474 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001475 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001476 .Case("pwr8", true)
1477 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001478 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1479 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001480 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001481 .Case("pwr8", true)
1482 .Case("pwr7", true)
1483 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001484
Eric Christophera8a14c32015-08-31 18:39:16 +00001485 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1486 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001487
Eric Christopher007b0a02015-08-28 22:32:01 +00001488 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001489}
1490
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001491bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001492 return llvm::StringSwitch<bool>(Feature)
1493 .Case("powerpc", true)
1494 .Case("vsx", HasVSX)
1495 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001497 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001498 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001499 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001500 .Case("bpermd", HasBPERMD)
1501 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001502 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001504 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001505}
Chris Lattner17df24e2008-04-21 18:56:49 +00001506
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001507void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1508 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001509 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1510 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1511 // incompatible options.
1512 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001513 if (Name == "direct-move" ||
1514 Name == "power8-vector" ||
1515 Name == "float128" ||
1516 Name == "power9-vector") {
1517 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001518 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001519 if (Name == "power9-vector")
1520 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001521 } else {
1522 Features[Name] = true;
1523 }
1524 } else {
1525 if (Name == "vsx") {
1526 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001527 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530 }
1531 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001532}
1533
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001535 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1537 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1538 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1539 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1540 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1541 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1542 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001545 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001546 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1547 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1548 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1549 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "vrsave", "vscr",
1551 "spe_acc", "spefscr",
1552 "sfp"
1553};
Chris Lattner10a5b382007-01-29 05:24:35 +00001554
Craig Topperf054e3a2015-10-19 03:52:27 +00001555ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1556 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001558
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001559const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1560 // While some of these aliases do map to different registers
1561 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "0" }, "r0" },
1563 { { "1"}, "r1" },
1564 { { "2" }, "r2" },
1565 { { "3" }, "r3" },
1566 { { "4" }, "r4" },
1567 { { "5" }, "r5" },
1568 { { "6" }, "r6" },
1569 { { "7" }, "r7" },
1570 { { "8" }, "r8" },
1571 { { "9" }, "r9" },
1572 { { "10" }, "r10" },
1573 { { "11" }, "r11" },
1574 { { "12" }, "r12" },
1575 { { "13" }, "r13" },
1576 { { "14" }, "r14" },
1577 { { "15" }, "r15" },
1578 { { "16" }, "r16" },
1579 { { "17" }, "r17" },
1580 { { "18" }, "r18" },
1581 { { "19" }, "r19" },
1582 { { "20" }, "r20" },
1583 { { "21" }, "r21" },
1584 { { "22" }, "r22" },
1585 { { "23" }, "r23" },
1586 { { "24" }, "r24" },
1587 { { "25" }, "r25" },
1588 { { "26" }, "r26" },
1589 { { "27" }, "r27" },
1590 { { "28" }, "r28" },
1591 { { "29" }, "r29" },
1592 { { "30" }, "r30" },
1593 { { "31" }, "r31" },
1594 { { "fr0" }, "f0" },
1595 { { "fr1" }, "f1" },
1596 { { "fr2" }, "f2" },
1597 { { "fr3" }, "f3" },
1598 { { "fr4" }, "f4" },
1599 { { "fr5" }, "f5" },
1600 { { "fr6" }, "f6" },
1601 { { "fr7" }, "f7" },
1602 { { "fr8" }, "f8" },
1603 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001604 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001605 { { "fr11" }, "f11" },
1606 { { "fr12" }, "f12" },
1607 { { "fr13" }, "f13" },
1608 { { "fr14" }, "f14" },
1609 { { "fr15" }, "f15" },
1610 { { "fr16" }, "f16" },
1611 { { "fr17" }, "f17" },
1612 { { "fr18" }, "f18" },
1613 { { "fr19" }, "f19" },
1614 { { "fr20" }, "f20" },
1615 { { "fr21" }, "f21" },
1616 { { "fr22" }, "f22" },
1617 { { "fr23" }, "f23" },
1618 { { "fr24" }, "f24" },
1619 { { "fr25" }, "f25" },
1620 { { "fr26" }, "f26" },
1621 { { "fr27" }, "f27" },
1622 { { "fr28" }, "f28" },
1623 { { "fr29" }, "f29" },
1624 { { "fr30" }, "f30" },
1625 { { "fr31" }, "f31" },
1626 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001627};
1628
Craig Topperf054e3a2015-10-19 03:52:27 +00001629ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1630 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001632
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001633class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001635 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1636 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001638
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001640 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001641 case llvm::Triple::FreeBSD:
1642 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001643 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001644 PtrDiffType = SignedInt;
1645 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001647 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001648 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001649 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001650
Roman Divacky3ffe7462012-03-13 19:20:17 +00001651 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1652 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001653 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001654 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001655
1656 // PPC32 supports atomics up to 4 bytes.
1657 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
1659
Craig Topper3164f332014-03-11 03:39:26 +00001660 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001661 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001663 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001664};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001665
Bill Schmidt778d3872013-07-26 01:36:11 +00001666// Note: ABI differences may eventually require us to have a separate
1667// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1671 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001672 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001673 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001674 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001675
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001677 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001678 ABI = "elfv2";
1679 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001680 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001681 ABI = "elfv1";
1682 }
1683
1684 switch (getTriple().getOS()) {
1685 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001686 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001687 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001688 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001689 case llvm::Triple::NetBSD:
1690 IntMaxType = SignedLongLong;
1691 Int64Type = SignedLongLong;
1692 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001693 default:
1694 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001695 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001696
1697 // PPC64 supports atomics up to 8 bytes.
1698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001703 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001705 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001706 ABI = Name;
1707 return true;
1708 }
1709 return false;
1710 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001711};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001712
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001715 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001717 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001718 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001719 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001720 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001721 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001722 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001723 }
Craig Topper3164f332014-03-11 03:39:26 +00001724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001725 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001726 }
1727};
1728
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001730public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001731 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1732 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001734 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001735 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736 }
1737};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001738
Eric Christopherc48497a2015-09-18 21:26:24 +00001739static const unsigned NVPTXAddrSpaceMap[] = {
1740 1, // opencl_global
1741 3, // opencl_local
1742 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001743 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001744 0, // opencl_generic
1745 1, // cuda_device
1746 4, // cuda_constant
1747 3, // cuda_shared
1748};
1749
1750class NVPTXTargetInfo : public TargetInfo {
1751 static const char *const GCCRegNames[];
1752 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001753 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001754
Eric Christopherc48497a2015-09-18 21:26:24 +00001755public:
Justin Lebar76945b22016-04-29 23:05:19 +00001756 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001757 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001758 TLSSupported = false;
1759 LongWidth = LongAlign = 64;
1760 AddrSpaceMap = &NVPTXAddrSpaceMap;
1761 UseAddrSpaceMapMangling = true;
1762 // Define available target features
1763 // These must be defined in sorted order!
1764 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001765 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001766
1767 // If possible, get a TargetInfo for our host triple, so we can match its
1768 // types.
1769 llvm::Triple HostTriple(Opts.HostTriple);
1770 if (HostTriple.isNVPTX())
1771 return;
1772 std::unique_ptr<TargetInfo> HostTarget(
1773 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1774 if (!HostTarget) {
1775 return;
1776 }
1777
1778 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1779 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1780 BoolWidth = HostTarget->getBoolWidth();
1781 BoolAlign = HostTarget->getBoolAlign();
1782 IntWidth = HostTarget->getIntWidth();
1783 IntAlign = HostTarget->getIntAlign();
1784 HalfWidth = HostTarget->getHalfWidth();
1785 HalfAlign = HostTarget->getHalfAlign();
1786 FloatWidth = HostTarget->getFloatWidth();
1787 FloatAlign = HostTarget->getFloatAlign();
1788 DoubleWidth = HostTarget->getDoubleWidth();
1789 DoubleAlign = HostTarget->getDoubleAlign();
1790 LongWidth = HostTarget->getLongWidth();
1791 LongAlign = HostTarget->getLongAlign();
1792 LongLongWidth = HostTarget->getLongLongWidth();
1793 LongLongAlign = HostTarget->getLongLongAlign();
1794 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001795 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001796 DefaultAlignForAttributeAligned =
1797 HostTarget->getDefaultAlignForAttributeAligned();
1798 SizeType = HostTarget->getSizeType();
1799 IntMaxType = HostTarget->getIntMaxType();
1800 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1801 IntPtrType = HostTarget->getIntPtrType();
1802 WCharType = HostTarget->getWCharType();
1803 WIntType = HostTarget->getWIntType();
1804 Char16Type = HostTarget->getChar16Type();
1805 Char32Type = HostTarget->getChar32Type();
1806 Int64Type = HostTarget->getInt64Type();
1807 SigAtomicType = HostTarget->getSigAtomicType();
1808 ProcessIDType = HostTarget->getProcessIDType();
1809
1810 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1811 UseZeroLengthBitfieldAlignment =
1812 HostTarget->useZeroLengthBitfieldAlignment();
1813 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1814 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1815
Justin Lebar5057f172016-09-09 20:35:43 +00001816 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1817 // we need those macros to be identical on host and device, because (among
1818 // other things) they affect which standard library classes are defined, and
1819 // we need all classes to be defined on both the host and device.
1820 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1821
Justin Lebar76945b22016-04-29 23:05:19 +00001822 // Properties intentionally not copied from host:
1823 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1824 // host/device boundary.
1825 // - SuitableAlign: Not visible across the host/device boundary, and may
1826 // correctly be different on host/device, e.g. if host has wider vector
1827 // types than device.
1828 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1829 // as its double type, but that's not necessarily true on the host.
1830 // TODO: nvcc emits a warning when using long double on device; we should
1831 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 }
1833 void getTargetDefines(const LangOptions &Opts,
1834 MacroBuilder &Builder) const override {
1835 Builder.defineMacro("__PTX__");
1836 Builder.defineMacro("__NVPTX__");
1837 if (Opts.CUDAIsDevice) {
1838 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001839 std::string CUDAArchCode = [this] {
1840 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001841 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001842 assert(false && "No GPU arch when compiling CUDA device code.");
1843 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001844 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001846 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001847 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001848 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001849 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001850 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001851 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001852 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001853 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001854 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001855 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001856 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001857 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001858 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001859 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001860 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001861 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001862 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001863 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001864 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001865 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001866 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001867 return "620";
1868 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001869 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001870 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001872 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001873 }
Craig Topper6c03a542015-10-19 04:51:35 +00001874 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1875 return llvm::makeArrayRef(BuiltinInfo,
1876 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001877 }
Artem Belevichfda99052016-09-28 17:47:35 +00001878 bool
1879 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1880 StringRef CPU,
1881 const std::vector<std::string> &FeaturesVec) const override {
1882 Features["satom"] = GPU >= CudaArch::SM_60;
1883 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1884 }
1885
Eric Christopherc48497a2015-09-18 21:26:24 +00001886 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001887 return llvm::StringSwitch<bool>(Feature)
1888 .Cases("ptx", "nvptx", true)
1889 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1890 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001891 }
1892
Craig Topperf054e3a2015-10-19 03:52:27 +00001893 ArrayRef<const char *> getGCCRegNames() const override;
1894 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001895 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001896 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001897 }
1898 bool validateAsmConstraint(const char *&Name,
1899 TargetInfo::ConstraintInfo &Info) const override {
1900 switch (*Name) {
1901 default:
1902 return false;
1903 case 'c':
1904 case 'h':
1905 case 'r':
1906 case 'l':
1907 case 'f':
1908 case 'd':
1909 Info.setAllowsRegister();
1910 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001911 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001912 }
1913 const char *getClobbers() const override {
1914 // FIXME: Is this really right?
1915 return "";
1916 }
1917 BuiltinVaListKind getBuiltinVaListKind() const override {
1918 // FIXME: implement
1919 return TargetInfo::CharPtrBuiltinVaList;
1920 }
1921 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001922 GPU = StringToCudaArch(Name);
1923 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001924 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001925 void setSupportedOpenCLOpts() override {
1926 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001927 Opts.support("cl_clang_storage_class_specifiers");
1928 Opts.support("cl_khr_gl_sharing");
1929 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001930
Yaxun Liu5b746652016-12-18 05:18:55 +00001931 Opts.support("cl_khr_fp64");
1932 Opts.support("cl_khr_byte_addressable_store");
1933 Opts.support("cl_khr_global_int32_base_atomics");
1934 Opts.support("cl_khr_global_int32_extended_atomics");
1935 Opts.support("cl_khr_local_int32_base_atomics");
1936 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001937 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001938};
1939
1940const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1941#define BUILTIN(ID, TYPE, ATTRS) \
1942 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1943#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1944 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001945#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1946 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001947#include "clang/Basic/BuiltinsNVPTX.def"
1948};
1949
1950const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1951
Craig Topperf054e3a2015-10-19 03:52:27 +00001952ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1953 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001954}
1955
1956class NVPTX32TargetInfo : public NVPTXTargetInfo {
1957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001958 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1959 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001960 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001961 PointerWidth = PointerAlign = 32;
1962 SizeType = TargetInfo::UnsignedInt;
1963 PtrDiffType = TargetInfo::SignedInt;
1964 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001965 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001966 }
1967};
1968
1969class NVPTX64TargetInfo : public NVPTXTargetInfo {
1970public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001971 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1972 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001973 PointerWidth = PointerAlign = 64;
1974 SizeType = TargetInfo::UnsignedLong;
1975 PtrDiffType = TargetInfo::SignedLong;
1976 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001977 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001978 }
1979};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001980
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001981static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001982 1, // opencl_global
1983 3, // opencl_local
1984 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001985 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001986 1, // cuda_device
1987 2, // cuda_constant
1988 3 // cuda_shared
1989};
1990
Tom Stellarda96344b2014-08-21 13:58:40 +00001991// If you edit the description strings, make sure you update
1992// getPointerWidthV().
1993
Craig Topper273dbc62015-10-18 05:29:26 +00001994static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001995 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1996 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001997
Craig Topper273dbc62015-10-18 05:29:26 +00001998static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001999 "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 +00002000 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2001 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002002
Matt Arsenault250024f2016-06-08 01:56:42 +00002003class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002004 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002005 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002006
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002007 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002008 enum GPUKind {
2009 GK_NONE,
2010 GK_R600,
2011 GK_R600_DOUBLE_OPS,
2012 GK_R700,
2013 GK_R700_DOUBLE_OPS,
2014 GK_EVERGREEN,
2015 GK_EVERGREEN_DOUBLE_OPS,
2016 GK_NORTHERN_ISLANDS,
2017 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002018 GK_GFX6,
2019 GK_GFX7,
2020 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002021 } GPU;
2022
Jan Veselyeebeaea2015-05-04 19:53:36 +00002023 bool hasFP64:1;
2024 bool hasFMAF:1;
2025 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002026 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002027
Matt Arsenault250024f2016-06-08 01:56:42 +00002028 static bool isAMDGCN(const llvm::Triple &TT) {
2029 return TT.getArch() == llvm::Triple::amdgcn;
2030 }
2031
Eli Friedmand13b41e2012-10-12 23:32:00 +00002032public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002033 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002034 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002035 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002036 hasFP64(false),
2037 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002038 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002039 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002040 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002041 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002042 hasFMAF = true;
2043 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002044 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002045
2046 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2047 DataLayoutStringSI : DataLayoutStringR600);
2048
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002049 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002050 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002051 }
2052
Tom Stellarda96344b2014-08-21 13:58:40 +00002053 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2054 if (GPU <= GK_CAYMAN)
2055 return 32;
2056
2057 switch(AddrSpace) {
2058 default:
2059 return 64;
2060 case 0:
2061 case 3:
2062 case 5:
2063 return 32;
2064 }
2065 }
2066
Yaxun Liu26f75662016-08-19 05:17:25 +00002067 uint64_t getMaxPointerWidth() const override {
2068 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2069 }
2070
Craig Topper3164f332014-03-11 03:39:26 +00002071 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002072 return "";
2073 }
2074
Craig Topperf054e3a2015-10-19 03:52:27 +00002075 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002076
Craig Topperf054e3a2015-10-19 03:52:27 +00002077 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2078 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002079 }
2080
Craig Topper3164f332014-03-11 03:39:26 +00002081 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002082 TargetInfo::ConstraintInfo &Info) const override {
2083 switch (*Name) {
2084 default: break;
2085 case 'v': // vgpr
2086 case 's': // sgpr
2087 Info.setAllowsRegister();
2088 return true;
2089 }
2090 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002091 }
2092
Matt Arsenault250024f2016-06-08 01:56:42 +00002093 bool initFeatureMap(llvm::StringMap<bool> &Features,
2094 DiagnosticsEngine &Diags, StringRef CPU,
2095 const std::vector<std::string> &FeatureVec) const override;
2096
Yaxun Liu2c17e822016-08-09 19:43:38 +00002097 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2098 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002099 bool hasFP32Denormals = false;
2100 bool hasFP64Denormals = false;
2101 for (auto &I : TargetOpts.FeaturesAsWritten) {
2102 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2103 hasFP32Denormals = true;
2104 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2105 hasFP64Denormals = true;
2106 }
2107 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002108 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2109 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2110 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002112 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002113 }
2114
Craig Topper6c03a542015-10-19 04:51:35 +00002115 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2116 return llvm::makeArrayRef(BuiltinInfo,
2117 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002118 }
2119
Craig Topper3164f332014-03-11 03:39:26 +00002120 void getTargetDefines(const LangOptions &Opts,
2121 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002122 if (getTriple().getArch() == llvm::Triple::amdgcn)
2123 Builder.defineMacro("__AMDGCN__");
2124 else
2125 Builder.defineMacro("__R600__");
2126
Jan Veselyeebeaea2015-05-04 19:53:36 +00002127 if (hasFMAF)
2128 Builder.defineMacro("__HAS_FMAF__");
2129 if (hasLDEXPF)
2130 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002131 if (hasFP64)
2132 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002133 }
2134
Craig Topper3164f332014-03-11 03:39:26 +00002135 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002136 return TargetInfo::CharPtrBuiltinVaList;
2137 }
2138
Matt Arsenault250024f2016-06-08 01:56:42 +00002139 static GPUKind parseR600Name(StringRef Name) {
2140 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002141 .Case("r600" , GK_R600)
2142 .Case("rv610", GK_R600)
2143 .Case("rv620", GK_R600)
2144 .Case("rv630", GK_R600)
2145 .Case("rv635", GK_R600)
2146 .Case("rs780", GK_R600)
2147 .Case("rs880", GK_R600)
2148 .Case("rv670", GK_R600_DOUBLE_OPS)
2149 .Case("rv710", GK_R700)
2150 .Case("rv730", GK_R700)
2151 .Case("rv740", GK_R700_DOUBLE_OPS)
2152 .Case("rv770", GK_R700_DOUBLE_OPS)
2153 .Case("palm", GK_EVERGREEN)
2154 .Case("cedar", GK_EVERGREEN)
2155 .Case("sumo", GK_EVERGREEN)
2156 .Case("sumo2", GK_EVERGREEN)
2157 .Case("redwood", GK_EVERGREEN)
2158 .Case("juniper", GK_EVERGREEN)
2159 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2160 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2161 .Case("barts", GK_NORTHERN_ISLANDS)
2162 .Case("turks", GK_NORTHERN_ISLANDS)
2163 .Case("caicos", GK_NORTHERN_ISLANDS)
2164 .Case("cayman", GK_CAYMAN)
2165 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002166 .Default(GK_NONE);
2167 }
2168
2169 static GPUKind parseAMDGCNName(StringRef Name) {
2170 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002171 .Case("tahiti", GK_GFX6)
2172 .Case("pitcairn", GK_GFX6)
2173 .Case("verde", GK_GFX6)
2174 .Case("oland", GK_GFX6)
2175 .Case("hainan", GK_GFX6)
2176 .Case("bonaire", GK_GFX7)
2177 .Case("kabini", GK_GFX7)
2178 .Case("kaveri", GK_GFX7)
2179 .Case("hawaii", GK_GFX7)
2180 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002181 .Case("gfx700", GK_GFX7)
2182 .Case("gfx701", GK_GFX7)
2183 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002184 .Case("tonga", GK_GFX8)
2185 .Case("iceland", GK_GFX8)
2186 .Case("carrizo", GK_GFX8)
2187 .Case("fiji", GK_GFX8)
2188 .Case("stoney", GK_GFX8)
2189 .Case("polaris10", GK_GFX8)
2190 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002191 .Case("gfx800", GK_GFX8)
2192 .Case("gfx801", GK_GFX8)
2193 .Case("gfx802", GK_GFX8)
2194 .Case("gfx803", GK_GFX8)
2195 .Case("gfx804", GK_GFX8)
2196 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002197 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002198 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002199
Matt Arsenault250024f2016-06-08 01:56:42 +00002200 bool setCPU(const std::string &Name) override {
2201 if (getTriple().getArch() == llvm::Triple::amdgcn)
2202 GPU = parseAMDGCNName(Name);
2203 else
2204 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002205
Matt Arsenault250024f2016-06-08 01:56:42 +00002206 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002207 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002208
Jan Vesely211ba782016-06-17 02:25:03 +00002209 void setSupportedOpenCLOpts() override {
2210 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002211 Opts.support("cl_clang_storage_class_specifiers");
2212 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002213
Jan Vesely211ba782016-06-17 02:25:03 +00002214 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002215 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002216 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002217 Opts.support("cl_khr_byte_addressable_store");
2218 Opts.support("cl_khr_global_int32_base_atomics");
2219 Opts.support("cl_khr_global_int32_extended_atomics");
2220 Opts.support("cl_khr_local_int32_base_atomics");
2221 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002222 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002223 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002224 Opts.support("cl_khr_fp16");
2225 Opts.support("cl_khr_int64_base_atomics");
2226 Opts.support("cl_khr_int64_extended_atomics");
2227 Opts.support("cl_khr_mipmap_image");
2228 Opts.support("cl_khr_subgroups");
2229 Opts.support("cl_khr_3d_image_writes");
2230 Opts.support("cl_amd_media_ops");
2231 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002232 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002233 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002234
Yaxun Liu99444cb2016-08-03 20:38:06 +00002235 LangAS::ID getOpenCLImageAddrSpace() const override {
2236 return LangAS::opencl_constant;
2237 }
2238
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002239 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2240 switch (CC) {
2241 default:
2242 return CCCR_Warning;
2243 case CC_C:
2244 case CC_OpenCLKernel:
2245 return CCCR_OK;
2246 }
2247 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002248
2249 // In amdgcn target the null pointer in global, constant, and generic
2250 // address space has value 0 but in private and local address space has
2251 // value ~0.
2252 uint64_t getNullPointerValue(unsigned AS) const override {
2253 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2254 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002255};
2256
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002257const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002258#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002259 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002260#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2261 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002262#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002263};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002264const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002265 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2266 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2267 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2268 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2269 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2270 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2271 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2272 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2273 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2274 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2275 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2276 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2277 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2278 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2279 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2280 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2281 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2282 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2283 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2284 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2285 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2286 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2287 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2288 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2289 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2290 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2291 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2292 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2293 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2294 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2295 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2296 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2297 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2298 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2299 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2300 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2301 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2302 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2303 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2304 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2305 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2306 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2307 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2308 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2309 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2310 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2311 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002312 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002313 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2314 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002315};
2316
Craig Topperf054e3a2015-10-19 03:52:27 +00002317ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2318 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002319}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002320
Matt Arsenault250024f2016-06-08 01:56:42 +00002321bool AMDGPUTargetInfo::initFeatureMap(
2322 llvm::StringMap<bool> &Features,
2323 DiagnosticsEngine &Diags, StringRef CPU,
2324 const std::vector<std::string> &FeatureVec) const {
2325
2326 // XXX - What does the member GPU mean if device name string passed here?
2327 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2328 if (CPU.empty())
2329 CPU = "tahiti";
2330
2331 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002332 case GK_GFX6:
2333 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002334 break;
2335
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002336 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002337 Features["s-memrealtime"] = true;
2338 Features["16-bit-insts"] = true;
2339 break;
2340
2341 case GK_NONE:
2342 return false;
2343 default:
2344 llvm_unreachable("unhandled subtarget");
2345 }
2346 } else {
2347 if (CPU.empty())
2348 CPU = "r600";
2349
2350 switch (parseR600Name(CPU)) {
2351 case GK_R600:
2352 case GK_R700:
2353 case GK_EVERGREEN:
2354 case GK_NORTHERN_ISLANDS:
2355 break;
2356 case GK_R600_DOUBLE_OPS:
2357 case GK_R700_DOUBLE_OPS:
2358 case GK_EVERGREEN_DOUBLE_OPS:
2359 case GK_CAYMAN:
2360 Features["fp64"] = true;
2361 break;
2362 case GK_NONE:
2363 return false;
2364 default:
2365 llvm_unreachable("unhandled subtarget");
2366 }
2367 }
2368
2369 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2370}
2371
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002372const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002373#define BUILTIN(ID, TYPE, ATTRS) \
2374 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002375#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002376 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002377#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2378 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002379#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002380
2381#define BUILTIN(ID, TYPE, ATTRS) \
2382 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002383#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2384 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002385#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2386 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2387#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002388};
Eli Friedmanb5366062008-05-20 14:21:01 +00002389
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002390
Nuno Lopescfca1f02009-12-23 17:49:57 +00002391static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002392 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2393 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002394 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002395 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2396 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2397 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002398 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002399 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2400 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002401 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2402 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2403 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2404 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2405 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2406 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2407 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2408 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002409 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002410};
2411
Eric Christophercdd36352011-06-21 00:05:20 +00002412const TargetInfo::AddlRegName AddlRegNames[] = {
2413 { { "al", "ah", "eax", "rax" }, 0 },
2414 { { "bl", "bh", "ebx", "rbx" }, 3 },
2415 { { "cl", "ch", "ecx", "rcx" }, 2 },
2416 { { "dl", "dh", "edx", "rdx" }, 1 },
2417 { { "esi", "rsi" }, 4 },
2418 { { "edi", "rdi" }, 5 },
2419 { { "esp", "rsp" }, 7 },
2420 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002421 { { "r8d", "r8w", "r8b" }, 38 },
2422 { { "r9d", "r9w", "r9b" }, 39 },
2423 { { "r10d", "r10w", "r10b" }, 40 },
2424 { { "r11d", "r11w", "r11b" }, 41 },
2425 { { "r12d", "r12w", "r12b" }, 42 },
2426 { { "r13d", "r13w", "r13b" }, 43 },
2427 { { "r14d", "r14w", "r14b" }, 44 },
2428 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002429};
2430
2431// X86 target abstract base class; x86-32 and x86-64 are very close, so
2432// most of the implementation can be shared.
2433class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002434 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002435 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002436 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002437 enum MMX3DNowEnum {
2438 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002439 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002440 enum XOPEnum {
2441 NoXOP,
2442 SSE4A,
2443 FMA4,
2444 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002445 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002446
Craig Topper543f3bd2015-10-14 23:47:57 +00002447 bool HasAES = false;
2448 bool HasPCLMUL = false;
2449 bool HasLZCNT = false;
2450 bool HasRDRND = false;
2451 bool HasFSGSBASE = false;
2452 bool HasBMI = false;
2453 bool HasBMI2 = false;
2454 bool HasPOPCNT = false;
2455 bool HasRTM = false;
2456 bool HasPRFCHW = false;
2457 bool HasRDSEED = false;
2458 bool HasADX = false;
2459 bool HasTBM = false;
2460 bool HasFMA = false;
2461 bool HasF16C = false;
2462 bool HasAVX512CD = false;
2463 bool HasAVX512ER = false;
2464 bool HasAVX512PF = false;
2465 bool HasAVX512DQ = false;
2466 bool HasAVX512BW = false;
2467 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002468 bool HasAVX512VBMI = false;
2469 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002470 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002471 bool HasMPX = false;
2472 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002473 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002474 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002475 bool HasXSAVE = false;
2476 bool HasXSAVEOPT = false;
2477 bool HasXSAVEC = false;
2478 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002479 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002480 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002481 bool HasCLFLUSHOPT = false;
2482 bool HasPCOMMIT = false;
2483 bool HasCLWB = false;
2484 bool HasUMIP = false;
2485 bool HasMOVBE = false;
2486 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002487
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002488 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2489 ///
2490 /// Each enumeration represents a particular CPU supported by Clang. These
2491 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2492 enum CPUKind {
2493 CK_Generic,
2494
2495 /// \name i386
2496 /// i386-generation processors.
2497 //@{
2498 CK_i386,
2499 //@}
2500
2501 /// \name i486
2502 /// i486-generation processors.
2503 //@{
2504 CK_i486,
2505 CK_WinChipC6,
2506 CK_WinChip2,
2507 CK_C3,
2508 //@}
2509
2510 /// \name i586
2511 /// i586-generation processors, P5 microarchitecture based.
2512 //@{
2513 CK_i586,
2514 CK_Pentium,
2515 CK_PentiumMMX,
2516 //@}
2517
2518 /// \name i686
2519 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2520 //@{
2521 CK_i686,
2522 CK_PentiumPro,
2523 CK_Pentium2,
2524 CK_Pentium3,
2525 CK_Pentium3M,
2526 CK_PentiumM,
2527 CK_C3_2,
2528
2529 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2530 /// Clang however has some logic to suport this.
2531 // FIXME: Warn, deprecate, and potentially remove this.
2532 CK_Yonah,
2533 //@}
2534
2535 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002536 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002537 //@{
2538 CK_Pentium4,
2539 CK_Pentium4M,
2540 CK_Prescott,
2541 CK_Nocona,
2542 //@}
2543
2544 /// \name Core
2545 /// Core microarchitecture based processors.
2546 //@{
2547 CK_Core2,
2548
2549 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2550 /// codename which GCC no longer accepts as an option to -march, but Clang
2551 /// has some logic for recognizing it.
2552 // FIXME: Warn, deprecate, and potentially remove this.
2553 CK_Penryn,
2554 //@}
2555
2556 /// \name Atom
2557 /// Atom processors
2558 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002559 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002560 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002561 //@}
2562
2563 /// \name Nehalem
2564 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002565 CK_Nehalem,
2566
2567 /// \name Westmere
2568 /// Westmere microarchitecture based processors.
2569 CK_Westmere,
2570
2571 /// \name Sandy Bridge
2572 /// Sandy Bridge microarchitecture based processors.
2573 CK_SandyBridge,
2574
2575 /// \name Ivy Bridge
2576 /// Ivy Bridge microarchitecture based processors.
2577 CK_IvyBridge,
2578
2579 /// \name Haswell
2580 /// Haswell microarchitecture based processors.
2581 CK_Haswell,
2582
2583 /// \name Broadwell
2584 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002585 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002586
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002587 /// \name Skylake Client
2588 /// Skylake client microarchitecture based processors.
2589 CK_SkylakeClient,
2590
2591 /// \name Skylake Server
2592 /// Skylake server microarchitecture based processors.
2593 CK_SkylakeServer,
2594
2595 /// \name Cannonlake Client
2596 /// Cannonlake client microarchitecture based processors.
2597 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002598
Craig Topper449314e2013-08-20 07:09:39 +00002599 /// \name Knights Landing
2600 /// Knights Landing processor.
2601 CK_KNL,
2602
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002603 /// \name Lakemont
2604 /// Lakemont microarchitecture based processors.
2605 CK_Lakemont,
2606
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002607 /// \name K6
2608 /// K6 architecture processors.
2609 //@{
2610 CK_K6,
2611 CK_K6_2,
2612 CK_K6_3,
2613 //@}
2614
2615 /// \name K7
2616 /// K7 architecture processors.
2617 //@{
2618 CK_Athlon,
2619 CK_AthlonThunderbird,
2620 CK_Athlon4,
2621 CK_AthlonXP,
2622 CK_AthlonMP,
2623 //@}
2624
2625 /// \name K8
2626 /// K8 architecture processors.
2627 //@{
2628 CK_Athlon64,
2629 CK_Athlon64SSE3,
2630 CK_AthlonFX,
2631 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002632 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002633 CK_Opteron,
2634 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002635 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002636 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002637
Benjamin Kramer569f2152012-01-10 11:50:18 +00002638 /// \name Bobcat
2639 /// Bobcat architecture processors.
2640 //@{
2641 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002642 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002643 //@}
2644
2645 /// \name Bulldozer
2646 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002647 //@{
2648 CK_BDVER1,
2649 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002650 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002651 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002652 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002653
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002654 /// This specification is deprecated and will be removed in the future.
2655 /// Users should prefer \see CK_K8.
2656 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002657 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002658 CK_x86_64,
2659 //@}
2660
2661 /// \name Geode
2662 /// Geode processors.
2663 //@{
2664 CK_Geode
2665 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002666 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002667
Eric Christopherc50738f2015-08-27 00:05:50 +00002668 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002669 return llvm::StringSwitch<CPUKind>(CPU)
2670 .Case("i386", CK_i386)
2671 .Case("i486", CK_i486)
2672 .Case("winchip-c6", CK_WinChipC6)
2673 .Case("winchip2", CK_WinChip2)
2674 .Case("c3", CK_C3)
2675 .Case("i586", CK_i586)
2676 .Case("pentium", CK_Pentium)
2677 .Case("pentium-mmx", CK_PentiumMMX)
2678 .Case("i686", CK_i686)
2679 .Case("pentiumpro", CK_PentiumPro)
2680 .Case("pentium2", CK_Pentium2)
2681 .Case("pentium3", CK_Pentium3)
2682 .Case("pentium3m", CK_Pentium3M)
2683 .Case("pentium-m", CK_PentiumM)
2684 .Case("c3-2", CK_C3_2)
2685 .Case("yonah", CK_Yonah)
2686 .Case("pentium4", CK_Pentium4)
2687 .Case("pentium4m", CK_Pentium4M)
2688 .Case("prescott", CK_Prescott)
2689 .Case("nocona", CK_Nocona)
2690 .Case("core2", CK_Core2)
2691 .Case("penryn", CK_Penryn)
2692 .Case("bonnell", CK_Bonnell)
2693 .Case("atom", CK_Bonnell) // Legacy name.
2694 .Case("silvermont", CK_Silvermont)
2695 .Case("slm", CK_Silvermont) // Legacy name.
2696 .Case("nehalem", CK_Nehalem)
2697 .Case("corei7", CK_Nehalem) // Legacy name.
2698 .Case("westmere", CK_Westmere)
2699 .Case("sandybridge", CK_SandyBridge)
2700 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2701 .Case("ivybridge", CK_IvyBridge)
2702 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2703 .Case("haswell", CK_Haswell)
2704 .Case("core-avx2", CK_Haswell) // Legacy name.
2705 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002706 .Case("skylake", CK_SkylakeClient)
2707 .Case("skylake-avx512", CK_SkylakeServer)
2708 .Case("skx", CK_SkylakeServer) // Legacy name.
2709 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002710 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002711 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002712 .Case("k6", CK_K6)
2713 .Case("k6-2", CK_K6_2)
2714 .Case("k6-3", CK_K6_3)
2715 .Case("athlon", CK_Athlon)
2716 .Case("athlon-tbird", CK_AthlonThunderbird)
2717 .Case("athlon-4", CK_Athlon4)
2718 .Case("athlon-xp", CK_AthlonXP)
2719 .Case("athlon-mp", CK_AthlonMP)
2720 .Case("athlon64", CK_Athlon64)
2721 .Case("athlon64-sse3", CK_Athlon64SSE3)
2722 .Case("athlon-fx", CK_AthlonFX)
2723 .Case("k8", CK_K8)
2724 .Case("k8-sse3", CK_K8SSE3)
2725 .Case("opteron", CK_Opteron)
2726 .Case("opteron-sse3", CK_OpteronSSE3)
2727 .Case("barcelona", CK_AMDFAM10)
2728 .Case("amdfam10", CK_AMDFAM10)
2729 .Case("btver1", CK_BTVER1)
2730 .Case("btver2", CK_BTVER2)
2731 .Case("bdver1", CK_BDVER1)
2732 .Case("bdver2", CK_BDVER2)
2733 .Case("bdver3", CK_BDVER3)
2734 .Case("bdver4", CK_BDVER4)
2735 .Case("x86-64", CK_x86_64)
2736 .Case("geode", CK_Geode)
2737 .Default(CK_Generic);
2738 }
2739
Rafael Espindolaeb265472013-08-21 21:59:03 +00002740 enum FPMathKind {
2741 FP_Default,
2742 FP_SSE,
2743 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002744 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002745
Eli Friedman3fd920a2008-08-20 02:34:37 +00002746public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002747 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2748 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002749 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002750 }
Craig Topper3164f332014-03-11 03:39:26 +00002751 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002752 // X87 evaluates with 80 bits "long double" precision.
2753 return SSELevel == NoSSE ? 2 : 0;
2754 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002755 ArrayRef<const char *> getGCCRegNames() const override {
2756 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002757 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002758 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2759 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002760 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002761 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2762 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002763 }
Eric Christopherd9832702015-06-29 21:00:05 +00002764 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002765 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002766 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002767
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002768 bool validateGlobalRegisterVariable(StringRef RegName,
2769 unsigned RegSize,
2770 bool &HasSizeMismatch) const override {
2771 // esp and ebp are the only 32-bit registers the x86 backend can currently
2772 // handle.
2773 if (RegName.equals("esp") || RegName.equals("ebp")) {
2774 // Check that the register size is 32-bit.
2775 HasSizeMismatch = RegSize != 32;
2776 return true;
2777 }
2778
2779 return false;
2780 }
2781
Akira Hatanaka974131e2014-09-18 18:17:18 +00002782 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2783
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002784 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2785
Akira Hatanaka974131e2014-09-18 18:17:18 +00002786 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2787
Craig Topper3164f332014-03-11 03:39:26 +00002788 std::string convertConstraint(const char *&Constraint) const override;
2789 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002790 return "~{dirflag},~{fpsr},~{flags}";
2791 }
Craig Topper3164f332014-03-11 03:39:26 +00002792 void getTargetDefines(const LangOptions &Opts,
2793 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002794 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2795 bool Enabled);
2796 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2797 bool Enabled);
2798 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2799 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002800 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2801 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002802 setFeatureEnabledImpl(Features, Name, Enabled);
2803 }
2804 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002805 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002806 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2807 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002808 bool
2809 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2810 StringRef CPU,
2811 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002812 bool hasFeature(StringRef Feature) const override;
2813 bool handleTargetFeatures(std::vector<std::string> &Features,
2814 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002815 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002816 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2817 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002818 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002819 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002820 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002821 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002822 return "no-mmx";
2823 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002824 }
Craig Topper3164f332014-03-11 03:39:26 +00002825 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002826 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002827
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002828 // Perform any per-CPU checks necessary to determine if this CPU is
2829 // acceptable.
2830 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2831 // invalid without explaining *why*.
2832 switch (CPU) {
2833 case CK_Generic:
2834 // No processor selected!
2835 return false;
2836
2837 case CK_i386:
2838 case CK_i486:
2839 case CK_WinChipC6:
2840 case CK_WinChip2:
2841 case CK_C3:
2842 case CK_i586:
2843 case CK_Pentium:
2844 case CK_PentiumMMX:
2845 case CK_i686:
2846 case CK_PentiumPro:
2847 case CK_Pentium2:
2848 case CK_Pentium3:
2849 case CK_Pentium3M:
2850 case CK_PentiumM:
2851 case CK_Yonah:
2852 case CK_C3_2:
2853 case CK_Pentium4:
2854 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002855 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002856 case CK_Prescott:
2857 case CK_K6:
2858 case CK_K6_2:
2859 case CK_K6_3:
2860 case CK_Athlon:
2861 case CK_AthlonThunderbird:
2862 case CK_Athlon4:
2863 case CK_AthlonXP:
2864 case CK_AthlonMP:
2865 case CK_Geode:
2866 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002867 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002868 return false;
2869
2870 // Fallthrough
2871 case CK_Nocona:
2872 case CK_Core2:
2873 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002874 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002875 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002876 case CK_Nehalem:
2877 case CK_Westmere:
2878 case CK_SandyBridge:
2879 case CK_IvyBridge:
2880 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002881 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002882 case CK_SkylakeClient:
2883 case CK_SkylakeServer:
2884 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002885 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002886 case CK_Athlon64:
2887 case CK_Athlon64SSE3:
2888 case CK_AthlonFX:
2889 case CK_K8:
2890 case CK_K8SSE3:
2891 case CK_Opteron:
2892 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002893 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002894 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002895 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002896 case CK_BDVER1:
2897 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002898 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002899 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002900 case CK_x86_64:
2901 return true;
2902 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002903 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002904 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002905
Craig Topper3164f332014-03-11 03:39:26 +00002906 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002907
Craig Topper3164f332014-03-11 03:39:26 +00002908 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002909 // Most of the non-ARM calling conventions are i386 conventions.
2910 switch (CC) {
2911 case CC_X86ThisCall:
2912 case CC_X86FastCall:
2913 case CC_X86StdCall:
2914 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002915 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002916 case CC_C:
2917 case CC_Swift:
2918 case CC_X86Pascal:
2919 case CC_IntelOclBicc:
2920 return CCCR_OK;
2921 default:
2922 return CCCR_Warning;
2923 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002924 }
2925
Craig Topper3164f332014-03-11 03:39:26 +00002926 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002927 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002928 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002929
2930 bool hasSjLjLowering() const override {
2931 return true;
2932 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002933
2934 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00002935 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002936 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002937};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002938
Rafael Espindolaeb265472013-08-21 21:59:03 +00002939bool X86TargetInfo::setFPMath(StringRef Name) {
2940 if (Name == "387") {
2941 FPMath = FP_387;
2942 return true;
2943 }
2944 if (Name == "sse") {
2945 FPMath = FP_SSE;
2946 return true;
2947 }
2948 return false;
2949}
2950
Eric Christopher007b0a02015-08-28 22:32:01 +00002951bool X86TargetInfo::initFeatureMap(
2952 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002953 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002954 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002955 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002956 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002957 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002958
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002959 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002960
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002961 // Enable X87 for all X86 processors but Lakemont.
2962 if (Kind != CK_Lakemont)
2963 setFeatureEnabledImpl(Features, "x87", true);
2964
2965 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002966 case CK_Generic:
2967 case CK_i386:
2968 case CK_i486:
2969 case CK_i586:
2970 case CK_Pentium:
2971 case CK_i686:
2972 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002973 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002974 break;
2975 case CK_PentiumMMX:
2976 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002977 case CK_K6:
2978 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002979 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002980 break;
2981 case CK_Pentium3:
2982 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002983 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002984 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002985 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002986 break;
2987 case CK_PentiumM:
2988 case CK_Pentium4:
2989 case CK_Pentium4M:
2990 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002991 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002992 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002993 break;
2994 case CK_Yonah:
2995 case CK_Prescott:
2996 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002997 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002998 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002999 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003000 break;
3001 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003002 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003003 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003004 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003005 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003006 break;
3007 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003008 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003009 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003010 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003011 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003012 case CK_Cannonlake:
3013 setFeatureEnabledImpl(Features, "avx512ifma", true);
3014 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3015 setFeatureEnabledImpl(Features, "sha", true);
3016 setFeatureEnabledImpl(Features, "umip", true);
3017 // FALLTHROUGH
3018 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003019 setFeatureEnabledImpl(Features, "avx512f", true);
3020 setFeatureEnabledImpl(Features, "avx512cd", true);
3021 setFeatureEnabledImpl(Features, "avx512dq", true);
3022 setFeatureEnabledImpl(Features, "avx512bw", true);
3023 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003024 setFeatureEnabledImpl(Features, "pku", true);
3025 setFeatureEnabledImpl(Features, "pcommit", true);
3026 setFeatureEnabledImpl(Features, "clwb", true);
3027 // FALLTHROUGH
3028 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003029 setFeatureEnabledImpl(Features, "xsavec", true);
3030 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003031 setFeatureEnabledImpl(Features, "mpx", true);
3032 setFeatureEnabledImpl(Features, "sgx", true);
3033 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003034 // FALLTHROUGH
3035 case CK_Broadwell:
3036 setFeatureEnabledImpl(Features, "rdseed", true);
3037 setFeatureEnabledImpl(Features, "adx", true);
3038 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003039 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003040 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003041 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003042 setFeatureEnabledImpl(Features, "bmi", true);
3043 setFeatureEnabledImpl(Features, "bmi2", true);
3044 setFeatureEnabledImpl(Features, "rtm", true);
3045 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003046 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003047 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003048 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003049 setFeatureEnabledImpl(Features, "rdrnd", true);
3050 setFeatureEnabledImpl(Features, "f16c", true);
3051 setFeatureEnabledImpl(Features, "fsgsbase", true);
3052 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003053 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003054 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003055 setFeatureEnabledImpl(Features, "xsave", true);
3056 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003057 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003058 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003059 case CK_Silvermont:
3060 setFeatureEnabledImpl(Features, "aes", true);
3061 setFeatureEnabledImpl(Features, "pclmul", true);
3062 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003063 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003064 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003065 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003066 setFeatureEnabledImpl(Features, "cx16", true);
3067 break;
3068 case CK_KNL:
3069 setFeatureEnabledImpl(Features, "avx512f", true);
3070 setFeatureEnabledImpl(Features, "avx512cd", true);
3071 setFeatureEnabledImpl(Features, "avx512er", true);
3072 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003073 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003074 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003075 setFeatureEnabledImpl(Features, "rdseed", true);
3076 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003077 setFeatureEnabledImpl(Features, "lzcnt", true);
3078 setFeatureEnabledImpl(Features, "bmi", true);
3079 setFeatureEnabledImpl(Features, "bmi2", true);
3080 setFeatureEnabledImpl(Features, "rtm", true);
3081 setFeatureEnabledImpl(Features, "fma", true);
3082 setFeatureEnabledImpl(Features, "rdrnd", true);
3083 setFeatureEnabledImpl(Features, "f16c", true);
3084 setFeatureEnabledImpl(Features, "fsgsbase", true);
3085 setFeatureEnabledImpl(Features, "aes", true);
3086 setFeatureEnabledImpl(Features, "pclmul", true);
3087 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003088 setFeatureEnabledImpl(Features, "xsaveopt", true);
3089 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003090 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003091 break;
3092 case CK_K6_2:
3093 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 case CK_WinChip2:
3095 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003096 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003097 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003098 case CK_Athlon:
3099 case CK_AthlonThunderbird:
3100 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003101 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003102 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003103 case CK_Athlon4:
3104 case CK_AthlonXP:
3105 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003106 setFeatureEnabledImpl(Features, "sse", true);
3107 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003108 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003109 break;
3110 case CK_K8:
3111 case CK_Opteron:
3112 case CK_Athlon64:
3113 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003114 setFeatureEnabledImpl(Features, "sse2", true);
3115 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003116 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003117 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003118 case CK_AMDFAM10:
3119 setFeatureEnabledImpl(Features, "sse4a", true);
3120 setFeatureEnabledImpl(Features, "lzcnt", true);
3121 setFeatureEnabledImpl(Features, "popcnt", true);
3122 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003123 case CK_K8SSE3:
3124 case CK_OpteronSSE3:
3125 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003126 setFeatureEnabledImpl(Features, "sse3", true);
3127 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003128 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003129 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003130 case CK_BTVER2:
3131 setFeatureEnabledImpl(Features, "avx", true);
3132 setFeatureEnabledImpl(Features, "aes", true);
3133 setFeatureEnabledImpl(Features, "pclmul", true);
3134 setFeatureEnabledImpl(Features, "bmi", true);
3135 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003136 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003137 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003138 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003139 setFeatureEnabledImpl(Features, "ssse3", true);
3140 setFeatureEnabledImpl(Features, "sse4a", true);
3141 setFeatureEnabledImpl(Features, "lzcnt", true);
3142 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003143 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003144 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003145 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003146 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003147 case CK_BDVER4:
3148 setFeatureEnabledImpl(Features, "avx2", true);
3149 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003150 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003151 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003152 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003153 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003154 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003155 // FALLTHROUGH
3156 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003157 setFeatureEnabledImpl(Features, "bmi", true);
3158 setFeatureEnabledImpl(Features, "fma", true);
3159 setFeatureEnabledImpl(Features, "f16c", true);
3160 setFeatureEnabledImpl(Features, "tbm", true);
3161 // FALLTHROUGH
3162 case CK_BDVER1:
3163 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003164 setFeatureEnabledImpl(Features, "xop", true);
3165 setFeatureEnabledImpl(Features, "lzcnt", true);
3166 setFeatureEnabledImpl(Features, "aes", true);
3167 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003168 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003169 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003170 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003171 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003172 break;
Eli Friedman33465822011-07-08 23:31:17 +00003173 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003174 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3175 return false;
3176
3177 // Can't do this earlier because we need to be able to explicitly enable
3178 // or disable these features and the things that they depend upon.
3179
3180 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3181 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003182 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003183 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3184 FeaturesVec.end())
3185 Features["popcnt"] = true;
3186
3187 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3188 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003189 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003190 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3191 FeaturesVec.end())
3192 Features["prfchw"] = true;
3193
Eric Christophera7260af2015-10-08 20:10:18 +00003194 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3195 // then enable MMX.
3196 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003197 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003198 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3199 FeaturesVec.end())
3200 Features["mmx"] = true;
3201
Eric Christopherbbd746d2015-10-08 20:10:14 +00003202 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003203}
3204
Rafael Espindolae62e2792013-08-20 13:44:29 +00003205void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003206 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 if (Enabled) {
3208 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003209 case AVX512F:
3210 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003211 case AVX2:
3212 Features["avx2"] = true;
3213 case AVX:
3214 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003215 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003216 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003217 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003218 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003219 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003220 case SSSE3:
3221 Features["ssse3"] = true;
3222 case SSE3:
3223 Features["sse3"] = true;
3224 case SSE2:
3225 Features["sse2"] = true;
3226 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003227 Features["sse"] = true;
3228 case NoSSE:
3229 break;
3230 }
3231 return;
3232 }
3233
3234 switch (Level) {
3235 case NoSSE:
3236 case SSE1:
3237 Features["sse"] = false;
3238 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003239 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3240 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003241 case SSE3:
3242 Features["sse3"] = false;
3243 setXOPLevel(Features, NoXOP, false);
3244 case SSSE3:
3245 Features["ssse3"] = false;
3246 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003247 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003248 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003249 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003251 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3252 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003253 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 case AVX2:
3255 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003256 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003257 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003258 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003259 Features["avx512vl"] = Features["avx512vbmi"] =
3260 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 }
3262}
3263
3264void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003265 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003266 if (Enabled) {
3267 switch (Level) {
3268 case AMD3DNowAthlon:
3269 Features["3dnowa"] = true;
3270 case AMD3DNow:
3271 Features["3dnow"] = true;
3272 case MMX:
3273 Features["mmx"] = true;
3274 case NoMMX3DNow:
3275 break;
3276 }
3277 return;
3278 }
3279
3280 switch (Level) {
3281 case NoMMX3DNow:
3282 case MMX:
3283 Features["mmx"] = false;
3284 case AMD3DNow:
3285 Features["3dnow"] = false;
3286 case AMD3DNowAthlon:
3287 Features["3dnowa"] = false;
3288 }
3289}
3290
3291void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003292 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003293 if (Enabled) {
3294 switch (Level) {
3295 case XOP:
3296 Features["xop"] = true;
3297 case FMA4:
3298 Features["fma4"] = true;
3299 setSSELevel(Features, AVX, true);
3300 case SSE4A:
3301 Features["sse4a"] = true;
3302 setSSELevel(Features, SSE3, true);
3303 case NoXOP:
3304 break;
3305 }
3306 return;
3307 }
3308
3309 switch (Level) {
3310 case NoXOP:
3311 case SSE4A:
3312 Features["sse4a"] = false;
3313 case FMA4:
3314 Features["fma4"] = false;
3315 case XOP:
3316 Features["xop"] = false;
3317 }
3318}
3319
Craig Topper86d79ef2013-09-17 04:51:29 +00003320void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3321 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003322 // This is a bit of a hack to deal with the sse4 target feature when used
3323 // as part of the target attribute. We handle sse4 correctly everywhere
3324 // else. See below for more information on how we handle the sse4 options.
3325 if (Name != "sse4")
3326 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003327
Craig Topper29561122013-09-19 01:13:07 +00003328 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003329 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003330 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003331 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003332 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003333 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003334 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003335 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003336 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003337 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003338 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003339 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003340 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003341 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003342 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003343 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003344 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003345 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003346 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003347 if (Enabled)
3348 setSSELevel(Features, SSE2, Enabled);
3349 } else if (Name == "pclmul") {
3350 if (Enabled)
3351 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003352 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003353 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003354 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003355 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003356 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003357 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003358 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3359 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3360 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003361 if (Enabled)
3362 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003363 // Enable BWI instruction if VBMI is being enabled.
3364 if (Name == "avx512vbmi" && Enabled)
3365 Features["avx512bw"] = true;
3366 // Also disable VBMI if BWI is being disabled.
3367 if (Name == "avx512bw" && !Enabled)
3368 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003369 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003370 if (Enabled)
3371 setSSELevel(Features, AVX, Enabled);
3372 } else if (Name == "fma4") {
3373 setXOPLevel(Features, FMA4, Enabled);
3374 } else if (Name == "xop") {
3375 setXOPLevel(Features, XOP, Enabled);
3376 } else if (Name == "sse4a") {
3377 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003378 } else if (Name == "f16c") {
3379 if (Enabled)
3380 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003381 } else if (Name == "sha") {
3382 if (Enabled)
3383 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003384 } else if (Name == "sse4") {
3385 // We can get here via the __target__ attribute since that's not controlled
3386 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3387 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3388 // disabled.
3389 if (Enabled)
3390 setSSELevel(Features, SSE42, Enabled);
3391 else
3392 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003393 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003394 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003395 Features["xsaveopt"] = false;
3396 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003397 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003398 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003399 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003400}
3401
Eric Christopher3ff21b32013-10-16 21:26:26 +00003402/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003403/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003404bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003405 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003406 for (const auto &Feature : Features) {
3407 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003408 continue;
3409
Eric Christopher610fe112015-08-26 08:21:55 +00003410 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003411 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003412 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003413 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003414 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003415 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003416 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003417 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003418 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003419 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003420 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003421 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003422 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003423 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003424 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003425 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003426 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003427 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003428 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003429 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003430 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003431 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003432 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003433 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003434 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003435 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003436 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003437 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003438 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003439 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003440 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003441 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003442 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003443 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003444 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003445 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003446 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003447 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003448 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003449 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003450 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003451 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003452 } else if (Feature == "+avx512vbmi") {
3453 HasAVX512VBMI = true;
3454 } else if (Feature == "+avx512ifma") {
3455 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003456 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003457 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003458 } else if (Feature == "+mpx") {
3459 HasMPX = true;
3460 } else if (Feature == "+movbe") {
3461 HasMOVBE = true;
3462 } else if (Feature == "+sgx") {
3463 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003464 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003465 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003466 } else if (Feature == "+fxsr") {
3467 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003468 } else if (Feature == "+xsave") {
3469 HasXSAVE = true;
3470 } else if (Feature == "+xsaveopt") {
3471 HasXSAVEOPT = true;
3472 } else if (Feature == "+xsavec") {
3473 HasXSAVEC = true;
3474 } else if (Feature == "+xsaves") {
3475 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003476 } else if (Feature == "+mwaitx") {
3477 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003478 } else if (Feature == "+pku") {
3479 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003480 } else if (Feature == "+clflushopt") {
3481 HasCLFLUSHOPT = true;
3482 } else if (Feature == "+pcommit") {
3483 HasPCOMMIT = true;
3484 } else if (Feature == "+clwb") {
3485 HasCLWB = true;
3486 } else if (Feature == "+umip") {
3487 HasUMIP = true;
3488 } else if (Feature == "+prefetchwt1") {
3489 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003490 }
3491
Benjamin Kramer27402c62012-03-05 15:10:44 +00003492 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003493 .Case("+avx512f", AVX512F)
3494 .Case("+avx2", AVX2)
3495 .Case("+avx", AVX)
3496 .Case("+sse4.2", SSE42)
3497 .Case("+sse4.1", SSE41)
3498 .Case("+ssse3", SSSE3)
3499 .Case("+sse3", SSE3)
3500 .Case("+sse2", SSE2)
3501 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003502 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003503 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003504
Eli Friedman33465822011-07-08 23:31:17 +00003505 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003506 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003507 .Case("+3dnowa", AMD3DNowAthlon)
3508 .Case("+3dnow", AMD3DNow)
3509 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003510 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003511 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003512
3513 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003514 .Case("+xop", XOP)
3515 .Case("+fma4", FMA4)
3516 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003517 .Default(NoXOP);
3518 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003519 }
Eli Friedman33465822011-07-08 23:31:17 +00003520
Rafael Espindolaeb265472013-08-21 21:59:03 +00003521 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3522 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003523 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3524 (FPMath == FP_387 && SSELevel >= SSE1)) {
3525 Diags.Report(diag::err_target_unsupported_fpmath) <<
3526 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003527 return false;
3528 }
3529
Alexey Bataev00396512015-07-02 03:40:19 +00003530 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003531 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003532 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003533}
Chris Lattnerecd49032009-03-02 22:27:17 +00003534
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003535/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3536/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003537void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003538 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003539 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003540 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003541 Builder.defineMacro("__amd64__");
3542 Builder.defineMacro("__amd64");
3543 Builder.defineMacro("__x86_64");
3544 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003545 if (getTriple().getArchName() == "x86_64h") {
3546 Builder.defineMacro("__x86_64h");
3547 Builder.defineMacro("__x86_64h__");
3548 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003549 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003550 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003551 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003552
Chris Lattnerecd49032009-03-02 22:27:17 +00003553 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003554 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3555 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 switch (CPU) {
3557 case CK_Generic:
3558 break;
3559 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003560 // The rest are coming from the i386 define above.
3561 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003562 break;
3563 case CK_i486:
3564 case CK_WinChipC6:
3565 case CK_WinChip2:
3566 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003567 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003568 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003569 case CK_PentiumMMX:
3570 Builder.defineMacro("__pentium_mmx__");
3571 Builder.defineMacro("__tune_pentium_mmx__");
3572 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003573 case CK_i586:
3574 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003575 defineCPUMacros(Builder, "i586");
3576 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003577 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003578 case CK_Pentium3:
3579 case CK_Pentium3M:
3580 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003581 Builder.defineMacro("__tune_pentium3__");
3582 // Fallthrough
3583 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003584 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003585 Builder.defineMacro("__tune_pentium2__");
3586 // Fallthrough
3587 case CK_PentiumPro:
3588 Builder.defineMacro("__tune_i686__");
3589 Builder.defineMacro("__tune_pentiumpro__");
3590 // Fallthrough
3591 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003592 Builder.defineMacro("__i686");
3593 Builder.defineMacro("__i686__");
3594 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3595 Builder.defineMacro("__pentiumpro");
3596 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003597 break;
3598 case CK_Pentium4:
3599 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003600 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003601 break;
3602 case CK_Yonah:
3603 case CK_Prescott:
3604 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003605 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003606 break;
3607 case CK_Core2:
3608 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003609 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003610 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003611 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003612 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003613 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003614 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003615 defineCPUMacros(Builder, "slm");
3616 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003617 case CK_Nehalem:
3618 case CK_Westmere:
3619 case CK_SandyBridge:
3620 case CK_IvyBridge:
3621 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003622 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003623 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003624 // FIXME: Historically, we defined this legacy name, it would be nice to
3625 // remove it at some point. We've never exposed fine-grained names for
3626 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003627 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003628 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003629 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003630 defineCPUMacros(Builder, "skx");
3631 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003632 case CK_Cannonlake:
3633 break;
Craig Topper449314e2013-08-20 07:09:39 +00003634 case CK_KNL:
3635 defineCPUMacros(Builder, "knl");
3636 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003637 case CK_Lakemont:
3638 Builder.defineMacro("__tune_lakemont__");
3639 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003640 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003641 Builder.defineMacro("__k6_2__");
3642 Builder.defineMacro("__tune_k6_2__");
3643 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003644 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003645 if (CPU != CK_K6_2) { // In case of fallthrough
3646 // FIXME: GCC may be enabling these in cases where some other k6
3647 // architecture is specified but -m3dnow is explicitly provided. The
3648 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003649 Builder.defineMacro("__k6_3__");
3650 Builder.defineMacro("__tune_k6_3__");
3651 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003652 // Fallthrough
3653 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003654 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003655 break;
3656 case CK_Athlon:
3657 case CK_AthlonThunderbird:
3658 case CK_Athlon4:
3659 case CK_AthlonXP:
3660 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003661 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003662 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003663 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003664 Builder.defineMacro("__tune_athlon_sse__");
3665 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003666 break;
3667 case CK_K8:
3668 case CK_K8SSE3:
3669 case CK_x86_64:
3670 case CK_Opteron:
3671 case CK_OpteronSSE3:
3672 case CK_Athlon64:
3673 case CK_Athlon64SSE3:
3674 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003675 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003676 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003677 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003678 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003679 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003680 case CK_BTVER1:
3681 defineCPUMacros(Builder, "btver1");
3682 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003683 case CK_BTVER2:
3684 defineCPUMacros(Builder, "btver2");
3685 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003686 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003687 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003688 break;
3689 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003690 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003691 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003692 case CK_BDVER3:
3693 defineCPUMacros(Builder, "bdver3");
3694 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003695 case CK_BDVER4:
3696 defineCPUMacros(Builder, "bdver4");
3697 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003698 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003699 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003700 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003701 }
Chris Lattner96e43572009-03-02 22:40:39 +00003702
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003703 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003704 Builder.defineMacro("__REGISTER_PREFIX__", "");
3705
Chris Lattner6df41af2009-04-19 17:32:33 +00003706 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3707 // functions in glibc header files that use FP Stack inline asm which the
3708 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003709 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003710
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003711 if (HasAES)
3712 Builder.defineMacro("__AES__");
3713
Craig Topper3f122a72012-05-31 05:18:48 +00003714 if (HasPCLMUL)
3715 Builder.defineMacro("__PCLMUL__");
3716
Craig Topper22967d42011-12-25 05:06:45 +00003717 if (HasLZCNT)
3718 Builder.defineMacro("__LZCNT__");
3719
Benjamin Kramer1e250392012-07-07 09:39:18 +00003720 if (HasRDRND)
3721 Builder.defineMacro("__RDRND__");
3722
Craig Topper8c7f2512014-11-03 06:51:41 +00003723 if (HasFSGSBASE)
3724 Builder.defineMacro("__FSGSBASE__");
3725
Craig Topper22967d42011-12-25 05:06:45 +00003726 if (HasBMI)
3727 Builder.defineMacro("__BMI__");
3728
3729 if (HasBMI2)
3730 Builder.defineMacro("__BMI2__");
3731
Craig Topper1de83482011-12-29 16:10:46 +00003732 if (HasPOPCNT)
3733 Builder.defineMacro("__POPCNT__");
3734
Michael Liao625a8752012-11-10 05:17:46 +00003735 if (HasRTM)
3736 Builder.defineMacro("__RTM__");
3737
Michael Liao74f4eaf2013-03-26 17:52:08 +00003738 if (HasPRFCHW)
3739 Builder.defineMacro("__PRFCHW__");
3740
Michael Liaoffaae352013-03-29 05:17:55 +00003741 if (HasRDSEED)
3742 Builder.defineMacro("__RDSEED__");
3743
Robert Khasanov50e6f582014-09-19 09:53:48 +00003744 if (HasADX)
3745 Builder.defineMacro("__ADX__");
3746
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003747 if (HasTBM)
3748 Builder.defineMacro("__TBM__");
3749
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003750 if (HasMWAITX)
3751 Builder.defineMacro("__MWAITX__");
3752
Rafael Espindolae62e2792013-08-20 13:44:29 +00003753 switch (XOPLevel) {
3754 case XOP:
3755 Builder.defineMacro("__XOP__");
3756 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003757 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003758 case SSE4A:
3759 Builder.defineMacro("__SSE4A__");
3760 case NoXOP:
3761 break;
3762 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003763
Craig Topperbba778b2012-06-03 21:46:30 +00003764 if (HasFMA)
3765 Builder.defineMacro("__FMA__");
3766
Manman Rena45358c2012-10-11 00:59:55 +00003767 if (HasF16C)
3768 Builder.defineMacro("__F16C__");
3769
Craig Topper679b53a2013-08-21 05:29:10 +00003770 if (HasAVX512CD)
3771 Builder.defineMacro("__AVX512CD__");
3772 if (HasAVX512ER)
3773 Builder.defineMacro("__AVX512ER__");
3774 if (HasAVX512PF)
3775 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003776 if (HasAVX512DQ)
3777 Builder.defineMacro("__AVX512DQ__");
3778 if (HasAVX512BW)
3779 Builder.defineMacro("__AVX512BW__");
3780 if (HasAVX512VL)
3781 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003782 if (HasAVX512VBMI)
3783 Builder.defineMacro("__AVX512VBMI__");
3784 if (HasAVX512IFMA)
3785 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003786
Ben Langmuir58078d02013-09-19 13:22:04 +00003787 if (HasSHA)
3788 Builder.defineMacro("__SHA__");
3789
Craig Toppere33f51f2015-10-16 06:22:36 +00003790 if (HasFXSR)
3791 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003792 if (HasXSAVE)
3793 Builder.defineMacro("__XSAVE__");
3794 if (HasXSAVEOPT)
3795 Builder.defineMacro("__XSAVEOPT__");
3796 if (HasXSAVEC)
3797 Builder.defineMacro("__XSAVEC__");
3798 if (HasXSAVES)
3799 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003800 if (HasPKU)
3801 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003802 if (HasCX16)
3803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3804
Chris Lattner96e43572009-03-02 22:40:39 +00003805 // Each case falls through to the previous one here.
3806 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003807 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003808 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003809 case AVX2:
3810 Builder.defineMacro("__AVX2__");
3811 case AVX:
3812 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003813 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003814 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003815 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003816 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003817 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003818 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003819 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003820 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003821 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003822 Builder.defineMacro("__SSE2__");
3823 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003824 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003825 Builder.defineMacro("__SSE__");
3826 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003827 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003828 break;
3829 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003830
Derek Schuffc7dd7222012-10-11 15:52:22 +00003831 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003832 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003833 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003834 case AVX2:
3835 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003836 case SSE42:
3837 case SSE41:
3838 case SSSE3:
3839 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003840 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003841 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003842 break;
3843 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003844 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003845 break;
3846 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003847 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003848 }
3849 }
3850
Anders Carlssone437c682010-01-27 03:47:49 +00003851 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003852 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003853 case AMD3DNowAthlon:
3854 Builder.defineMacro("__3dNOW_A__");
3855 case AMD3DNow:
3856 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003857 case MMX:
3858 Builder.defineMacro("__MMX__");
3859 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003860 break;
3861 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003862
3863 if (CPU >= CK_i486) {
3864 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3865 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3866 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3867 }
3868 if (CPU >= CK_i586)
3869 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003870}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003871
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003872bool X86TargetInfo::hasFeature(StringRef Feature) const {
3873 return llvm::StringSwitch<bool>(Feature)
3874 .Case("aes", HasAES)
3875 .Case("avx", SSELevel >= AVX)
3876 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003877 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003878 .Case("avx512cd", HasAVX512CD)
3879 .Case("avx512er", HasAVX512ER)
3880 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003881 .Case("avx512dq", HasAVX512DQ)
3882 .Case("avx512bw", HasAVX512BW)
3883 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003884 .Case("avx512vbmi", HasAVX512VBMI)
3885 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003886 .Case("bmi", HasBMI)
3887 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003888 .Case("clflushopt", HasCLFLUSHOPT)
3889 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003890 .Case("cx16", HasCX16)
3891 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003892 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003893 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003894 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003895 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003896 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003897 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3898 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3899 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003900 .Case("movbe", HasMOVBE)
3901 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003902 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003903 .Case("pcommit", HasPCOMMIT)
3904 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003905 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003906 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003907 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003908 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003909 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003910 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003911 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003912 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003913 .Case("sse", SSELevel >= SSE1)
3914 .Case("sse2", SSELevel >= SSE2)
3915 .Case("sse3", SSELevel >= SSE3)
3916 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003917 .Case("sse4.1", SSELevel >= SSE41)
3918 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003919 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003920 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003921 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003922 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003923 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3924 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003925 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003926 .Case("xsave", HasXSAVE)
3927 .Case("xsavec", HasXSAVEC)
3928 .Case("xsaves", HasXSAVES)
3929 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003930 .Default(false);
3931}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003932
Eric Christopherd9832702015-06-29 21:00:05 +00003933// We can't use a generic validation scheme for the features accepted here
3934// versus subtarget features accepted in the target attribute because the
3935// bitfield structure that's initialized in the runtime only supports the
3936// below currently rather than the full range of subtarget features. (See
3937// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3938bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3939 return llvm::StringSwitch<bool>(FeatureStr)
3940 .Case("cmov", true)
3941 .Case("mmx", true)
3942 .Case("popcnt", true)
3943 .Case("sse", true)
3944 .Case("sse2", true)
3945 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003946 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003947 .Case("sse4.1", true)
3948 .Case("sse4.2", true)
3949 .Case("avx", true)
3950 .Case("avx2", true)
3951 .Case("sse4a", true)
3952 .Case("fma4", true)
3953 .Case("xop", true)
3954 .Case("fma", true)
3955 .Case("avx512f", true)
3956 .Case("bmi", true)
3957 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003958 .Case("aes", true)
3959 .Case("pclmul", true)
3960 .Case("avx512vl", true)
3961 .Case("avx512bw", true)
3962 .Case("avx512dq", true)
3963 .Case("avx512cd", true)
3964 .Case("avx512er", true)
3965 .Case("avx512pf", true)
3966 .Case("avx512vbmi", true)
3967 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003968 .Default(false);
3969}
3970
Eli Friedman3fd920a2008-08-20 02:34:37 +00003971bool
Anders Carlsson58436352009-02-28 17:11:49 +00003972X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003973 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003974 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003975 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003976 // Constant constraints.
3977 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3978 // instructions.
3979 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3980 // x86_64 instructions.
3981 case 's':
3982 Info.setRequiresImmediate();
3983 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003984 case 'I':
3985 Info.setRequiresImmediate(0, 31);
3986 return true;
3987 case 'J':
3988 Info.setRequiresImmediate(0, 63);
3989 return true;
3990 case 'K':
3991 Info.setRequiresImmediate(-128, 127);
3992 return true;
3993 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003994 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003995 return true;
3996 case 'M':
3997 Info.setRequiresImmediate(0, 3);
3998 return true;
3999 case 'N':
4000 Info.setRequiresImmediate(0, 255);
4001 return true;
4002 case 'O':
4003 Info.setRequiresImmediate(0, 127);
4004 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004005 // Register constraints.
4006 case 'Y': // 'Y' is the first character for several 2-character constraints.
4007 // Shift the pointer to the second character of the constraint.
4008 Name++;
4009 switch (*Name) {
4010 default:
4011 return false;
4012 case '0': // First SSE register.
4013 case 't': // Any SSE register, when SSE2 is enabled.
4014 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4015 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004016 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004017 Info.setAllowsRegister();
4018 return true;
4019 }
4020 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004021 // Constraint 'f' cannot be used for output operands.
4022 if (Info.ConstraintStr[0] == '=')
4023 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004024 Info.setAllowsRegister();
4025 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004026 case 'a': // eax.
4027 case 'b': // ebx.
4028 case 'c': // ecx.
4029 case 'd': // edx.
4030 case 'S': // esi.
4031 case 'D': // edi.
4032 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004033 case 't': // Top of floating point stack.
4034 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004035 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004036 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004037 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004038 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004039 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4040 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004041 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004042 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4043 case 'l': // "Index" registers: any general register that can be used as an
4044 // index in a base+index memory access.
4045 Info.setAllowsRegister();
4046 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004047 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004048 case 'C': // SSE floating point constant.
4049 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004050 return true;
4051 }
4052}
4053
Akira Hatanaka974131e2014-09-18 18:17:18 +00004054bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4055 unsigned Size) const {
4056 // Strip off constraint modifiers.
4057 while (Constraint[0] == '=' ||
4058 Constraint[0] == '+' ||
4059 Constraint[0] == '&')
4060 Constraint = Constraint.substr(1);
4061
4062 return validateOperandSize(Constraint, Size);
4063}
4064
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004065bool X86TargetInfo::validateInputSize(StringRef Constraint,
4066 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004067 return validateOperandSize(Constraint, Size);
4068}
4069
4070bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4071 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004072 switch (Constraint[0]) {
4073 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004074 case 'k':
4075 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004076 case 'y':
4077 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004078 case 'f':
4079 case 't':
4080 case 'u':
4081 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004082 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004083 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004084 if (SSELevel >= AVX512F)
4085 // 512-bit zmm registers can be used if target supports AVX512F.
4086 return Size <= 512U;
4087 else if (SSELevel >= AVX)
4088 // 256-bit ymm registers can be used if target supports AVX.
4089 return Size <= 256U;
4090 return Size <= 128U;
4091 case 'Y':
4092 // 'Y' is the first character for several 2-character constraints.
4093 switch (Constraint[1]) {
4094 default: break;
4095 case 'm':
4096 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004097 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004098 return Size <= 64;
4099 case 'i':
4100 case 't':
4101 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4102 if (SSELevel >= AVX512F)
4103 return Size <= 512U;
4104 else if (SSELevel >= AVX)
4105 return Size <= 256U;
4106 return SSELevel >= SSE2 && Size <= 128U;
4107 }
4108
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004109 }
4110
4111 return true;
4112}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004113
Eli Friedman3fd920a2008-08-20 02:34:37 +00004114std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004115X86TargetInfo::convertConstraint(const char *&Constraint) const {
4116 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004117 case 'a': return std::string("{ax}");
4118 case 'b': return std::string("{bx}");
4119 case 'c': return std::string("{cx}");
4120 case 'd': return std::string("{dx}");
4121 case 'S': return std::string("{si}");
4122 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004123 case 'p': // address
4124 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004125 case 't': // top of floating point stack.
4126 return std::string("{st}");
4127 case 'u': // second from top of floating point stack.
4128 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004129 case 'Y':
4130 switch (Constraint[1]) {
4131 default:
4132 // Break from inner switch and fall through (copy single char),
4133 // continue parsing after copying the current constraint into
4134 // the return string.
4135 break;
4136 case 'k':
4137 // "^" hints llvm that this is a 2 letter constraint.
4138 // "Constraint++" is used to promote the string iterator
4139 // to the next constraint.
4140 return std::string("^") + std::string(Constraint++, 2);
4141 }
4142 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004143 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004144 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004145 }
4146}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004147
Eli Friedman3fd920a2008-08-20 02:34:37 +00004148// X86-32 generic target
4149class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004150public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004151 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4152 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004153 DoubleAlign = LongLongAlign = 32;
4154 LongDoubleWidth = 96;
4155 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004156 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004157 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004158 SizeType = UnsignedInt;
4159 PtrDiffType = SignedInt;
4160 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004161 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004162
4163 // Use fpret for all types.
4164 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4165 (1 << TargetInfo::Double) |
4166 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004167
4168 // x86-32 has atomics up to 8 bytes
4169 // FIXME: Check that we actually have cmpxchg8b before setting
4170 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4171 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004172 }
Craig Topper3164f332014-03-11 03:39:26 +00004173 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004174 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004175 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004176
Craig Topper3164f332014-03-11 03:39:26 +00004177 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004178 if (RegNo == 0) return 0;
4179 if (RegNo == 1) return 2;
4180 return -1;
4181 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004182 bool validateOperandSize(StringRef Constraint,
4183 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004184 switch (Constraint[0]) {
4185 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004186 case 'R':
4187 case 'q':
4188 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004189 case 'a':
4190 case 'b':
4191 case 'c':
4192 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004193 case 'S':
4194 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004195 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004196 case 'A':
4197 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004198 }
4199
Akira Hatanaka974131e2014-09-18 18:17:18 +00004200 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004201 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004202 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4203 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4204 Builtin::FirstTSBuiltin + 1);
4205 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004206};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004207
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004208class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4209public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004210 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4211 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004212
Craig Topper3164f332014-03-11 03:39:26 +00004213 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004214 unsigned Major, Minor, Micro;
4215 getTriple().getOSVersion(Major, Minor, Micro);
4216 // New NetBSD uses the default rounding mode.
4217 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4218 return X86_32TargetInfo::getFloatEvalMethod();
4219 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004220 return 1;
4221 }
4222};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004223
Eli Friedmane3aa4542009-07-05 18:47:56 +00004224class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4225public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004226 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4227 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004228 SizeType = UnsignedLong;
4229 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004230 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004231 }
4232};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004233
Eli Friedman9fa28852012-08-08 23:57:20 +00004234class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4235public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004236 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4237 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004238 SizeType = UnsignedLong;
4239 IntPtrType = SignedLong;
4240 PtrDiffType = SignedLong;
4241 }
4242};
Eli Friedman9fa28852012-08-08 23:57:20 +00004243
Torok Edwinb2b37c62009-06-30 17:10:35 +00004244class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004246 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4247 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004248 LongDoubleWidth = 128;
4249 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004250 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004251 MaxVectorAlign = 256;
4252 // The watchOS simulator uses the builtin bool type for Objective-C.
4253 llvm::Triple T = llvm::Triple(Triple);
4254 if (T.isWatchOS())
4255 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004256 SizeType = UnsignedLong;
4257 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004258 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004259 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004260 }
4261
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004262 bool handleTargetFeatures(std::vector<std::string> &Features,
4263 DiagnosticsEngine &Diags) override {
4264 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4265 Diags))
4266 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004267 // We now know the features we have: we can decide how to align vectors.
4268 MaxVectorAlign =
4269 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004270 return true;
4271 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004272};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004273
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004274// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004275class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004276public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004277 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4278 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004279 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004280 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004281 bool IsWinCOFF =
4282 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004283 resetDataLayout(IsWinCOFF
4284 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4285 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004286 }
Craig Topper3164f332014-03-11 03:39:26 +00004287 void getTargetDefines(const LangOptions &Opts,
4288 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004289 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4290 }
4291};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004292
4293// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004294class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004295public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004296 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4297 const TargetOptions &Opts)
4298 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004299 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004300 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004301 }
Craig Topper3164f332014-03-11 03:39:26 +00004302 void getTargetDefines(const LangOptions &Opts,
4303 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004304 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4305 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4306 // The value of the following reflects processor type.
4307 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4308 // We lost the original triple, so we use the default.
4309 Builder.defineMacro("_M_IX86", "600");
4310 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004311};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004312
David Majnemerae1ed0e2015-05-28 04:36:18 +00004313static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004314 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4315 // supports __declspec natively under -fms-extensions, but we define a no-op
4316 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004317 if (Opts.MicrosoftExt)
4318 Builder.defineMacro("__declspec", "__declspec");
4319 else
4320 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4321
4322 if (!Opts.MicrosoftExt) {
4323 // Provide macros for all the calling convention keywords. Provide both
4324 // single and double underscore prefixed variants. These are available on
4325 // x64 as well as x86, even though they have no effect.
4326 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4327 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004328 std::string GCCSpelling = "__attribute__((__";
4329 GCCSpelling += CC;
4330 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004331 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4332 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4333 }
4334 }
4335}
4336
David Majnemerae1ed0e2015-05-28 04:36:18 +00004337static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4338 Builder.defineMacro("__MSVCRT__");
4339 Builder.defineMacro("__MINGW32__");
4340 addCygMingDefines(Opts, Builder);
4341}
4342
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004343// x86-32 MinGW target
4344class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4345public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004346 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4347 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004348 void getTargetDefines(const LangOptions &Opts,
4349 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004350 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004351 DefineStd(Builder, "WIN32", Opts);
4352 DefineStd(Builder, "WINNT", Opts);
4353 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004354 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004355 }
4356};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004357
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004358// x86-32 Cygwin target
4359class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004361 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4362 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004363 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004364 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004365 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 +00004366 }
Craig Topper3164f332014-03-11 03:39:26 +00004367 void getTargetDefines(const LangOptions &Opts,
4368 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004369 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004370 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004371 Builder.defineMacro("__CYGWIN__");
4372 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004373 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004374 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004375 if (Opts.CPlusPlus)
4376 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004377 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004378};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004379
Chris Lattnerb986aba2010-04-11 19:29:39 +00004380// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004381class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004382public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004383 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004384 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004385 }
Craig Topper3164f332014-03-11 03:39:26 +00004386 void getTargetDefines(const LangOptions &Opts,
4387 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004388 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004389 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004390 }
4391};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004392
Alexey Bataevc99b0492015-11-25 09:24:26 +00004393// X86-32 MCU target
4394class MCUX86_32TargetInfo : public X86_32TargetInfo {
4395public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004396 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4397 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004398 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004399 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004400 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 +00004401 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004402 }
4403
4404 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4405 // On MCU we support only C calling convention.
4406 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4407 }
4408
4409 void getTargetDefines(const LangOptions &Opts,
4410 MacroBuilder &Builder) const override {
4411 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4412 Builder.defineMacro("__iamcu");
4413 Builder.defineMacro("__iamcu__");
4414 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004415
4416 bool allowsLargerPreferedTypeAlignment() const override {
4417 return false;
4418 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004419};
4420
Douglas Gregor9fabd852011-07-01 22:41:14 +00004421// RTEMS Target
4422template<typename Target>
4423class RTEMSTargetInfo : public OSTargetInfo<Target> {
4424protected:
Craig Topper3164f332014-03-11 03:39:26 +00004425 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4426 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004427 // RTEMS defines; list based off of gcc output
4428
Douglas Gregor9fabd852011-07-01 22:41:14 +00004429 Builder.defineMacro("__rtems__");
4430 Builder.defineMacro("__ELF__");
4431 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004432
Douglas Gregor9fabd852011-07-01 22:41:14 +00004433public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004434 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4435 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004436 switch (Triple.getArch()) {
4437 default:
4438 case llvm::Triple::x86:
4439 // this->MCountName = ".mcount";
4440 break;
4441 case llvm::Triple::mips:
4442 case llvm::Triple::mipsel:
4443 case llvm::Triple::ppc:
4444 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004445 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004446 // this->MCountName = "_mcount";
4447 break;
4448 case llvm::Triple::arm:
4449 // this->MCountName = "__mcount";
4450 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004451 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004452 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004453};
4454
Douglas Gregor9fabd852011-07-01 22:41:14 +00004455// x86-32 RTEMS target
4456class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004458 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4459 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004460 SizeType = UnsignedLong;
4461 IntPtrType = SignedLong;
4462 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004463 }
Craig Topper3164f332014-03-11 03:39:26 +00004464 void getTargetDefines(const LangOptions &Opts,
4465 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004466 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4467 Builder.defineMacro("__INTEL__");
4468 Builder.defineMacro("__rtems__");
4469 }
4470};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004471
Eli Friedman3fd920a2008-08-20 02:34:37 +00004472// x86-64 generic target
4473class X86_64TargetInfo : public X86TargetInfo {
4474public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004475 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4476 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004477 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004478 bool IsWinCOFF =
4479 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004480 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004481 LongDoubleWidth = 128;
4482 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004483 LargeArrayMinWidth = 128;
4484 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004485 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004486 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4487 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4488 IntPtrType = IsX32 ? SignedInt : SignedLong;
4489 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004490 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004491 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004492
Eric Christopher917e9522014-11-18 22:36:15 +00004493 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004494 resetDataLayout(IsX32
4495 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4496 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4497 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004498
4499 // Use fpret only for long double.
4500 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004501
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004502 // Use fp2ret for _Complex long double.
4503 ComplexLongDoubleUsesFP2Ret = true;
4504
Charles Davisc7d5c942015-09-17 20:55:33 +00004505 // Make __builtin_ms_va_list available.
4506 HasBuiltinMSVaList = true;
4507
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004508 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004509 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004510 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004511 }
Craig Topper3164f332014-03-11 03:39:26 +00004512 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004513 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004514 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004515
Craig Topper3164f332014-03-11 03:39:26 +00004516 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004517 if (RegNo == 0) return 0;
4518 if (RegNo == 1) return 1;
4519 return -1;
4520 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004521
Craig Topper3164f332014-03-11 03:39:26 +00004522 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004523 switch (CC) {
4524 case CC_C:
4525 case CC_Swift:
4526 case CC_X86VectorCall:
4527 case CC_IntelOclBicc:
4528 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004529 case CC_PreserveMost:
4530 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004531 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004532 return CCCR_OK;
4533 default:
4534 return CCCR_Warning;
4535 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004536 }
4537
Craig Topper3164f332014-03-11 03:39:26 +00004538 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004539 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004540 }
4541
Pavel Chupinfd223e12014-08-04 12:39:43 +00004542 // for x32 we need it here explicitly
4543 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004544 unsigned getUnwindWordWidth() const override { return 64; }
4545 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004546
4547 bool validateGlobalRegisterVariable(StringRef RegName,
4548 unsigned RegSize,
4549 bool &HasSizeMismatch) const override {
4550 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4551 // handle.
4552 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4553 // Check that the register size is 64-bit.
4554 HasSizeMismatch = RegSize != 64;
4555 return true;
4556 }
4557
4558 // Check if the register is a 32-bit register the backend can handle.
4559 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4560 HasSizeMismatch);
4561 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004562 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4563 return llvm::makeArrayRef(BuiltinInfoX86,
4564 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4565 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004566};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004567
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004568// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004569class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004570public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004571 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4572 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004573 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004574 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004575 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004576 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004577 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004578 SizeType = UnsignedLongLong;
4579 PtrDiffType = SignedLongLong;
4580 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004581 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004582
Craig Topper3164f332014-03-11 03:39:26 +00004583 void getTargetDefines(const LangOptions &Opts,
4584 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004585 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004586 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004587 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004588
Craig Topper3164f332014-03-11 03:39:26 +00004589 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004590 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004591 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004592
Craig Topper3164f332014-03-11 03:39:26 +00004593 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004594 switch (CC) {
4595 case CC_X86StdCall:
4596 case CC_X86ThisCall:
4597 case CC_X86FastCall:
4598 return CCCR_Ignore;
4599 case CC_C:
4600 case CC_X86VectorCall:
4601 case CC_IntelOclBicc:
4602 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004603 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004604 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004605 return CCCR_OK;
4606 default:
4607 return CCCR_Warning;
4608 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004609 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004610};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004611
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004612// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004613class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004614public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004615 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4616 const TargetOptions &Opts)
4617 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004618 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004619 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004620 }
Craig Topper3164f332014-03-11 03:39:26 +00004621 void getTargetDefines(const LangOptions &Opts,
4622 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004623 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4624 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004625 Builder.defineMacro("_M_X64", "100");
4626 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004627 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004628};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004629
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004630// x86-64 MinGW target
4631class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004633 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4634 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004635 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4636 // with x86 FP ops. Weird.
4637 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004638 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004639 }
4640
Craig Topper3164f332014-03-11 03:39:26 +00004641 void getTargetDefines(const LangOptions &Opts,
4642 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004643 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004644 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004645 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004646 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004647
4648 // GCC defines this macro when it is using __gxx_personality_seh0.
4649 if (!Opts.SjLjExceptions)
4650 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004651 }
4652};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004653
Yaron Kerend030d112015-07-22 17:38:19 +00004654// x86-64 Cygwin target
4655class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4656public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004657 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4658 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004659 TLSSupported = false;
4660 WCharType = UnsignedShort;
4661 }
4662 void getTargetDefines(const LangOptions &Opts,
4663 MacroBuilder &Builder) const override {
4664 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4665 Builder.defineMacro("__x86_64__");
4666 Builder.defineMacro("__CYGWIN__");
4667 Builder.defineMacro("__CYGWIN64__");
4668 addCygMingDefines(Opts, Builder);
4669 DefineStd(Builder, "unix", Opts);
4670 if (Opts.CPlusPlus)
4671 Builder.defineMacro("_GNU_SOURCE");
4672
4673 // GCC defines this macro when it is using __gxx_personality_seh0.
4674 if (!Opts.SjLjExceptions)
4675 Builder.defineMacro("__SEH__");
4676 }
4677};
4678
Eli Friedman2857ccb2009-07-01 03:36:11 +00004679class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4680public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004681 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4682 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004683 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004684 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4685 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004686 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004687 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004688 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004689 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004690
4691 bool handleTargetFeatures(std::vector<std::string> &Features,
4692 DiagnosticsEngine &Diags) override {
4693 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4694 Diags))
4695 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004696 // We now know the features we have: we can decide how to align vectors.
4697 MaxVectorAlign =
4698 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004699 return true;
4700 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004701};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004702
Eli Friedman245f2292009-07-05 22:31:18 +00004703class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004705 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4706 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004707 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004708 Int64Type = SignedLongLong;
4709 }
4710};
Eli Friedman245f2292009-07-05 22:31:18 +00004711
Eli Friedman9fa28852012-08-08 23:57:20 +00004712class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4713public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004714 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4715 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004716 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004717 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004718 }
4719};
Tim Northover9bb857a2013-01-31 12:13:10 +00004720
Eli Friedmanf05b7722008-08-20 07:44:10 +00004721class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004722 // Possible FPU choices.
4723 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004724 VFP2FPU = (1 << 0),
4725 VFP3FPU = (1 << 1),
4726 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004727 NeonFPU = (1 << 3),
4728 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004729 };
4730
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004731 // Possible HWDiv features.
4732 enum HWDivMode {
4733 HWDivThumb = (1 << 0),
4734 HWDivARM = (1 << 1)
4735 };
4736
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004737 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004738 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004739 }
4740
4741 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4742 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004743
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004744 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004745
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004746 StringRef CPUProfile;
4747 StringRef CPUAttr;
4748
Rafael Espindolaeb265472013-08-21 21:59:03 +00004749 enum {
4750 FP_Default,
4751 FP_VFP,
4752 FP_Neon
4753 } FPMath;
4754
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004755 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004756 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004757 unsigned ArchProfile;
4758 unsigned ArchVersion;
4759
Bernard Ogdenda13af32013-10-24 18:32:51 +00004760 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004761
Logan Chien57086ce2012-10-10 06:56:20 +00004762 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004763 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004764
4765 // Initialized via features.
4766 unsigned SoftFloat : 1;
4767 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004768
Bernard Ogden18b57012013-10-29 09:47:51 +00004769 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004770 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004771 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004772 unsigned Unaligned : 1;
4773
4774 enum {
4775 LDREX_B = (1 << 0), /// byte (8-bit)
4776 LDREX_H = (1 << 1), /// half (16-bit)
4777 LDREX_W = (1 << 2), /// word (32-bit)
4778 LDREX_D = (1 << 3), /// double (64-bit)
4779 };
4780
4781 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004782
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004783 // ACLE 6.5.1 Hardware floating point
4784 enum {
4785 HW_FP_HP = (1 << 1), /// half (16-bit)
4786 HW_FP_SP = (1 << 2), /// single (32-bit)
4787 HW_FP_DP = (1 << 3), /// double (64-bit)
4788 };
4789 uint32_t HW_FP;
4790
Chris Lattner5cc15e02010-03-03 19:03:45 +00004791 static const Builtin::Info BuiltinInfo[];
4792
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004793 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004794 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004795
4796 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004797 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004798
Renato Golin0201a9e2016-09-22 19:28:20 +00004799 // size_t is unsigned long on MachO-derived environments, NetBSD,
4800 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004801 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004802 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004803 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004804 SizeType = UnsignedLong;
4805 else
4806 SizeType = UnsignedInt;
4807
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004808 switch (T.getOS()) {
4809 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004810 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004811 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004812 break;
4813 case llvm::Triple::Win32:
4814 WCharType = UnsignedShort;
4815 break;
4816 case llvm::Triple::Linux:
4817 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004818 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4819 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004820 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004821 }
4822
4823 UseBitFieldTypeAlignment = true;
4824
4825 ZeroLengthBitfieldBoundary = 0;
4826
Tim Northover147cd2f2014-10-14 22:12:21 +00004827 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4828 // so set preferred for small types to 32.
4829 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004830 resetDataLayout(BigEndian
4831 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4832 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004833 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004834 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004835 resetDataLayout("e"
4836 "-m:w"
4837 "-p:32:32"
4838 "-i64:64"
4839 "-v128:64:128"
4840 "-a:0:32"
4841 "-n32"
4842 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004843 } else if (T.isOSNaCl()) {
4844 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004845 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004846 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004847 resetDataLayout(BigEndian
4848 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4849 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004850 }
4851
4852 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004853 }
4854
Tim Northover5627d392015-10-30 16:30:45 +00004855 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004856 const llvm::Triple &T = getTriple();
4857
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004858 IsAAPCS = false;
4859
Tim Northover5627d392015-10-30 16:30:45 +00004860 if (IsAAPCS16)
4861 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4862 else
4863 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004864
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004865 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004866 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004867 SizeType = UnsignedInt;
4868 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004869 SizeType = UnsignedLong;
4870
4871 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4872 WCharType = SignedInt;
4873
4874 // Do not respect the alignment of bit-field types when laying out
4875 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4876 UseBitFieldTypeAlignment = false;
4877
4878 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4879 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4880 /// gcc.
4881 ZeroLengthBitfieldBoundary = 32;
4882
Tim Northover5627d392015-10-30 16:30:45 +00004883 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4884 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004885 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004886 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004887 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004888 BigEndian
4889 ? "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 +00004890 : "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 +00004891 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004892 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004893 BigEndian
4894 ? "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 +00004895 : "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 +00004896
4897 // FIXME: Override "preferred align" for double and long long.
4898 }
4899
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004900 void setArchInfo() {
4901 StringRef ArchName = getTriple().getArchName();
4902
Renato Goline84b0002015-10-08 16:43:26 +00004903 ArchISA = llvm::ARM::parseArchISA(ArchName);
4904 CPU = llvm::ARM::getDefaultCPU(ArchName);
4905 unsigned AK = llvm::ARM::parseArch(ArchName);
4906 if (AK != llvm::ARM::AK_INVALID)
4907 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004908 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004909 }
4910
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004911 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004912 StringRef SubArch;
4913
4914 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004915 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004916 SubArch = llvm::ARM::getSubArch(ArchKind);
4917 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4918 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004919
4920 // cache CPU related strings
4921 CPUAttr = getCPUAttr();
4922 CPUProfile = getCPUProfile();
4923 }
4924
4925 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004926 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004927 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004928 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004929 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4930 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004931 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004932 if (ArchProfile == llvm::ARM::PK_M) {
4933 MaxAtomicPromoteWidth = 32;
4934 if (ShouldUseInlineAtomic)
4935 MaxAtomicInlineWidth = 32;
4936 }
4937 else {
4938 MaxAtomicPromoteWidth = 64;
4939 if (ShouldUseInlineAtomic)
4940 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004941 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004942 }
4943
4944 bool isThumb() const {
4945 return (ArchISA == llvm::ARM::IK_THUMB);
4946 }
4947
4948 bool supportsThumb() const {
4949 return CPUAttr.count('T') || ArchVersion >= 6;
4950 }
4951
4952 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004953 return CPUAttr.equals("6T2") ||
4954 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004955 }
4956
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004957 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004958 // For most sub-arches, the build attribute CPU name is enough.
4959 // For Cortex variants, it's slightly different.
4960 switch(ArchKind) {
4961 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004962 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004963 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004964 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004965 case llvm::ARM::AK_ARMV7S:
4966 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004967 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004968 return "7A";
4969 case llvm::ARM::AK_ARMV7R:
4970 return "7R";
4971 case llvm::ARM::AK_ARMV7M:
4972 return "7M";
4973 case llvm::ARM::AK_ARMV7EM:
4974 return "7EM";
4975 case llvm::ARM::AK_ARMV8A:
4976 return "8A";
4977 case llvm::ARM::AK_ARMV8_1A:
4978 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004979 case llvm::ARM::AK_ARMV8_2A:
4980 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004981 case llvm::ARM::AK_ARMV8MBaseline:
4982 return "8M_BASE";
4983 case llvm::ARM::AK_ARMV8MMainline:
4984 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00004985 case llvm::ARM::AK_ARMV8R:
4986 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004987 }
4988 }
4989
4990 StringRef getCPUProfile() const {
4991 switch(ArchProfile) {
4992 case llvm::ARM::PK_A:
4993 return "A";
4994 case llvm::ARM::PK_R:
4995 return "R";
4996 case llvm::ARM::PK_M:
4997 return "M";
4998 default:
4999 return "";
5000 }
5001 }
5002
Chris Lattner17df24e2008-04-21 18:56:49 +00005003public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005004 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005005 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5006 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005007
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005008 switch (getTriple().getOS()) {
5009 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005010 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005011 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005012 break;
5013 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005014 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005015 break;
5016 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005017
Renato Goline84b0002015-10-08 16:43:26 +00005018 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005019 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005020
Chris Lattner1a8f3942010-04-23 16:29:58 +00005021 // {} in inline assembly are neon specifiers, not assembly variant
5022 // specifiers.
5023 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005024
Eric Christopher0e261882014-12-05 01:06:59 +00005025 // FIXME: This duplicates code from the driver that sets the -target-abi
5026 // option - this code is used if -target-abi isn't passed and should
5027 // be unified in some way.
5028 if (Triple.isOSBinFormatMachO()) {
5029 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5030 // the frontend matches that.
5031 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5032 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005033 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005034 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005035 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005036 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005037 } else {
5038 setABI("apcs-gnu");
5039 }
5040 } else if (Triple.isOSWindows()) {
5041 // FIXME: this is invalid for WindowsCE
5042 setABI("aapcs");
5043 } else {
5044 // Select the default based on the platform.
5045 switch (Triple.getEnvironment()) {
5046 case llvm::Triple::Android:
5047 case llvm::Triple::GNUEABI:
5048 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005049 case llvm::Triple::MuslEABI:
5050 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005051 setABI("aapcs-linux");
5052 break;
5053 case llvm::Triple::EABIHF:
5054 case llvm::Triple::EABI:
5055 setABI("aapcs");
5056 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005057 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005058 setABI("apcs-gnu");
5059 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005060 default:
5061 if (Triple.getOS() == llvm::Triple::NetBSD)
5062 setABI("apcs-gnu");
5063 else
5064 setABI("aapcs");
5065 break;
5066 }
5067 }
John McCall86353412010-08-21 22:46:04 +00005068
5069 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005070 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005071
Renato Golin15b86152015-07-03 16:41:13 +00005072 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005073 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005074
James Molloya7139222012-03-12 09:14:10 +00005075 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005076 // the alignment of the zero-length bitfield is greater than the member
5077 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005078 // zero length bitfield.
5079 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005080
5081 if (Triple.getOS() == llvm::Triple::Linux ||
5082 Triple.getOS() == llvm::Triple::UnknownOS)
5083 this->MCountName =
5084 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005085 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005086
Alp Toker4925ba72014-06-07 23:30:42 +00005087 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005088
Craig Topper3164f332014-03-11 03:39:26 +00005089 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005090 ABI = Name;
5091
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005092 // The defaults (above) are for AAPCS, check if we need to change them.
5093 //
5094 // FIXME: We need support for -meabi... we could just mangle it into the
5095 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005096 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005097 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005098 return true;
5099 }
5100 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5101 setABIAAPCS();
5102 return true;
5103 }
5104 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005105 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005106
Renato Golinf5c4dec2015-05-27 13:33:00 +00005107 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005108 bool
5109 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5110 StringRef CPU,
5111 const std::vector<std::string> &FeaturesVec) const override {
5112
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005113 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005114 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005115
5116 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005117 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005118 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5119
5120 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005121 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005122 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5123
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005124 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005125 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005126 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005127
Eric Christopher007b0a02015-08-28 22:32:01 +00005128 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005129 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005130
Craig Topper3164f332014-03-11 03:39:26 +00005131 bool handleTargetFeatures(std::vector<std::string> &Features,
5132 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005133 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005134 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005135 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005136 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005137 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005138 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005139 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005140
Ranjeet Singhac08e532015-06-24 23:39:25 +00005141 // This does not diagnose illegal cases like having both
5142 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5143 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005144 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005145 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005146 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005147 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005148 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005149 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005150 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005151 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005152 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005153 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005154 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005155 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005156 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005157 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005158 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005159 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005160 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005161 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005162 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005163 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005164 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005165 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005166 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005167 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005168 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005169 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005170 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005171 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005172 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005173 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005174 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005175 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005176 } else if (Feature == "+strict-align") {
5177 Unaligned = 0;
5178 } else if (Feature == "+fp16") {
5179 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005180 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005181 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005182 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005183
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005184 switch (ArchVersion) {
5185 case 6:
5186 if (ArchProfile == llvm::ARM::PK_M)
5187 LDREX = 0;
5188 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5189 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5190 else
5191 LDREX = LDREX_W;
5192 break;
5193 case 7:
5194 if (ArchProfile == llvm::ARM::PK_M)
5195 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5196 else
5197 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5198 break;
5199 case 8:
5200 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5201 }
5202
Rafael Espindolaeb265472013-08-21 21:59:03 +00005203 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5204 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5205 return false;
5206 }
5207
5208 if (FPMath == FP_Neon)
5209 Features.push_back("+neonfp");
5210 else if (FPMath == FP_VFP)
5211 Features.push_back("-neonfp");
5212
Daniel Dunbar893d4752009-12-19 04:15:38 +00005213 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005214 auto Feature =
5215 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5216 if (Feature != Features.end())
5217 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005218
Rafael Espindolaeb265472013-08-21 21:59:03 +00005219 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005220 }
5221
Craig Topper3164f332014-03-11 03:39:26 +00005222 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005223 return llvm::StringSwitch<bool>(Feature)
5224 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005225 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005226 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005227 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005228 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005229 .Case("hwdiv", HWDiv & HWDivThumb)
5230 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005231 .Default(false);
5232 }
Renato Golin15b86152015-07-03 16:41:13 +00005233
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005234 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005235 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005236 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005237
Renato Golin15b86152015-07-03 16:41:13 +00005238 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005239 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005240 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005241 CPU = Name;
5242 return true;
5243 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005244
Craig Topper3164f332014-03-11 03:39:26 +00005245 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005246
Craig Topper3164f332014-03-11 03:39:26 +00005247 void getTargetDefines(const LangOptions &Opts,
5248 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005249 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005250 Builder.defineMacro("__arm");
5251 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005252 // For bare-metal none-eabi.
5253 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5254 getTriple().getEnvironment() == llvm::Triple::EABI)
5255 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005256
Chris Lattnerecd49032009-03-02 22:27:17 +00005257 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005258 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005259
5260 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5261 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005262 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005263 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5264
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005265 if (!CPUAttr.empty())
5266 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005267
5268 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005269 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005270 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005271
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005272 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 // ACLE 6.5.7 Crypto Extension
5274 if (Crypto)
5275 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5276 // ACLE 6.5.8 CRC32 Extension
5277 if (CRC)
5278 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5279 // ACLE 6.5.10 Numeric Maximum and Minimum
5280 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5281 // ACLE 6.5.9 Directed Rounding
5282 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005283 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005284
5285 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5286 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005287 // NOTE that the default profile is assumed to be 'A'
5288 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005289 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5290
Bradley Smithf4affc12016-03-03 13:52:22 +00005291 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5292 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5293 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5294 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005295 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005296 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005297 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005298 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5299
5300 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5301 // instruction set such as ARM or Thumb.
5302 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5303
5304 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5305
5306 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005307 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005308 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005309
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005310 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005311 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005312 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005313
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005314 // ACLE 6.4.4 LDREX/STREX
5315 if (LDREX)
5316 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5317
5318 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005319 if (ArchVersion == 5 ||
5320 (ArchVersion == 6 && CPUProfile != "M") ||
5321 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005322 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5323
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005324 // ACLE 6.5.1 Hardware Floating Point
5325 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005326 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005327
Yi Konga44c4d72014-06-27 21:25:42 +00005328 // ACLE predefines.
5329 Builder.defineMacro("__ARM_ACLE", "200");
5330
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005331 // FP16 support (we currently only support IEEE format).
5332 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5333 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5334
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005335 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005336 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005337 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5338
Mike Stump9d54bd72009-04-08 02:07:04 +00005339 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005340
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005341 // FIXME: It's more complicated than this and we don't really support
5342 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005343 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005344 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005345 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005346
David Tweed8f676532012-10-25 13:33:01 +00005347 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005348 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005349 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005350 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005351 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005352 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005353 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005354
Tim Northover28fc0e12016-04-28 13:59:55 +00005355 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5356 ABI == "aapcs16")
5357 Builder.defineMacro("__ARM_PCS_VFP", "1");
5358
Daniel Dunbar893d4752009-12-19 04:15:38 +00005359 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005360 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005361
Zijiao Ma56a83722016-08-17 02:13:33 +00005362 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005363 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005364
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005365 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005366 Builder.defineMacro("__THUMBEL__");
5367 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005368 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005369 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005370 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005371
5372 // ACLE 6.4.9 32-bit SIMD instructions
5373 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5374 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5375
5376 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005377 if (((HWDiv & HWDivThumb) && isThumb()) ||
5378 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005379 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005380 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005381 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005382
5383 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005384 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005385
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005386 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005387 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005388 if (FPU & VFP2FPU)
5389 Builder.defineMacro("__ARM_VFPV2__");
5390 if (FPU & VFP3FPU)
5391 Builder.defineMacro("__ARM_VFPV3__");
5392 if (FPU & VFP4FPU)
5393 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005394 if (FPU & FPARMV8)
5395 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005396 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005397
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005398 // This only gets set when Neon instructions are actually available, unlike
5399 // the VFP define, hence the soft float and arch check. This is subtly
5400 // different from gcc, we follow the intent which was that it should be set
5401 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005402 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005403 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005404 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005405 // current AArch32 NEON implementations do not support double-precision
5406 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005407 Builder.defineMacro("__ARM_NEON_FP",
5408 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005409 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005410
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005411 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5412 Opts.ShortWChar ? "2" : "4");
5413
5414 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5415 Opts.ShortEnums ? "1" : "4");
5416
Bradley Smithf4affc12016-03-03 13:52:22 +00005417 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005418 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5419 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5420 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5421 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5422 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005423
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005424 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005425 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005426 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005427 }
5428
5429 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005430 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005431 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5432 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005433 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005434 }
5435
5436 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005437 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005438 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005439
5440 if (Opts.UnsafeFPMath)
5441 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005442
5443 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5444 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005445 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005446
Craig Topper6c03a542015-10-19 04:51:35 +00005447 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5448 return llvm::makeArrayRef(BuiltinInfo,
5449 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005450 }
Craig Topper3164f332014-03-11 03:39:26 +00005451 bool isCLZForZeroUndef() const override { return false; }
5452 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005453 return IsAAPCS
5454 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005455 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5456 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005457 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005458 ArrayRef<const char *> getGCCRegNames() const override;
5459 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005460 bool validateAsmConstraint(const char *&Name,
5461 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005462 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005463 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005464 case 'l': // r0-r7
5465 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005466 case 't': // VFP Floating point register single precision
5467 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005468 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005469 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005470 case 'I':
5471 case 'J':
5472 case 'K':
5473 case 'L':
5474 case 'M':
5475 // FIXME
5476 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005477 case 'Q': // A memory address that is a single base register.
5478 Info.setAllowsMemory();
5479 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005480 case 'U': // a memory reference...
5481 switch (Name[1]) {
5482 case 'q': // ...ARMV4 ldrsb
5483 case 'v': // ...VFP load/store (reg+constant offset)
5484 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005485 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005486 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005487 case 'n': // valid address for Neon doubleword vector load/store
5488 case 'm': // valid address for Neon element and structure load/store
5489 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005490 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005491 Info.setAllowsMemory();
5492 Name++;
5493 return true;
5494 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005495 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005496 return false;
5497 }
Craig Topper3164f332014-03-11 03:39:26 +00005498 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005499 std::string R;
5500 switch (*Constraint) {
5501 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005502 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005503 Constraint++;
5504 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005505 case 'p': // 'p' should be translated to 'r' by default.
5506 R = std::string("r");
5507 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005508 default:
5509 return std::string(1, *Constraint);
5510 }
5511 return R;
5512 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005513 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005514 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005515 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005516 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005517 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005518
Bill Wendling9d1ee112012-10-25 23:28:48 +00005519 // Strip off constraint modifiers.
5520 while (Constraint[0] == '=' ||
5521 Constraint[0] == '+' ||
5522 Constraint[0] == '&')
5523 Constraint = Constraint.substr(1);
5524
5525 switch (Constraint[0]) {
5526 default: break;
5527 case 'r': {
5528 switch (Modifier) {
5529 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005530 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005531 case 'q':
5532 // A register of size 32 cannot fit a vector type.
5533 return false;
5534 }
5535 }
5536 }
5537
5538 return true;
5539 }
Craig Topper3164f332014-03-11 03:39:26 +00005540 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005541 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005542 return "";
5543 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005544
Craig Topper3164f332014-03-11 03:39:26 +00005545 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005546 switch (CC) {
5547 case CC_AAPCS:
5548 case CC_AAPCS_VFP:
5549 case CC_Swift:
5550 return CCCR_OK;
5551 default:
5552 return CCCR_Warning;
5553 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005554 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005555
Craig Topper3164f332014-03-11 03:39:26 +00005556 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005557 if (RegNo == 0) return 0;
5558 if (RegNo == 1) return 1;
5559 return -1;
5560 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005561
5562 bool hasSjLjLowering() const override {
5563 return true;
5564 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005565};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005566
Rafael Espindolaeb265472013-08-21 21:59:03 +00005567bool ARMTargetInfo::setFPMath(StringRef Name) {
5568 if (Name == "neon") {
5569 FPMath = FP_Neon;
5570 return true;
5571 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5572 Name == "vfp4") {
5573 FPMath = FP_VFP;
5574 return true;
5575 }
5576 return false;
5577}
5578
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005579const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005580 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005581 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005582 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5583
5584 // Float registers
5585 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5586 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5587 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005588 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005589
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005590 // Double registers
5591 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5592 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005593 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5594 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005595
5596 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005597 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5598 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005599};
5600
Craig Topperf054e3a2015-10-19 03:52:27 +00005601ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5602 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005603}
5604
5605const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005606 { { "a1" }, "r0" },
5607 { { "a2" }, "r1" },
5608 { { "a3" }, "r2" },
5609 { { "a4" }, "r3" },
5610 { { "v1" }, "r4" },
5611 { { "v2" }, "r5" },
5612 { { "v3" }, "r6" },
5613 { { "v4" }, "r7" },
5614 { { "v5" }, "r8" },
5615 { { "v6", "rfp" }, "r9" },
5616 { { "sl" }, "r10" },
5617 { { "fp" }, "r11" },
5618 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005619 { { "r13" }, "sp" },
5620 { { "r14" }, "lr" },
5621 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005622 // The S, D and Q registers overlap, but aren't really aliases; we
5623 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005624};
5625
Craig Topperf054e3a2015-10-19 03:52:27 +00005626ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5627 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005628}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005629
5630const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005631#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005632 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005633#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5634 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005635#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005636
Craig Topper07d3b622015-08-07 05:14:44 +00005637#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005638 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005639#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005640 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005641#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5642 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005643#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5644 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005645#include "clang/Basic/BuiltinsARM.def"
5646};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005647
5648class ARMleTargetInfo : public ARMTargetInfo {
5649public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005650 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005651 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005652 void getTargetDefines(const LangOptions &Opts,
5653 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005654 Builder.defineMacro("__ARMEL__");
5655 ARMTargetInfo::getTargetDefines(Opts, Builder);
5656 }
5657};
5658
5659class ARMbeTargetInfo : public ARMTargetInfo {
5660public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005661 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005662 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005663 void getTargetDefines(const LangOptions &Opts,
5664 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005665 Builder.defineMacro("__ARMEB__");
5666 Builder.defineMacro("__ARM_BIG_ENDIAN");
5667 ARMTargetInfo::getTargetDefines(Opts, Builder);
5668 }
5669};
Chris Lattner17df24e2008-04-21 18:56:49 +00005670
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005671class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5672 const llvm::Triple Triple;
5673public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005674 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5675 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005676 WCharType = UnsignedShort;
5677 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005678 }
5679 void getVisualStudioDefines(const LangOptions &Opts,
5680 MacroBuilder &Builder) const {
5681 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5682
5683 // FIXME: this is invalid for WindowsCE
5684 Builder.defineMacro("_M_ARM_NT", "1");
5685 Builder.defineMacro("_M_ARMT", "_M_ARM");
5686 Builder.defineMacro("_M_THUMB", "_M_ARM");
5687
5688 assert((Triple.getArch() == llvm::Triple::arm ||
5689 Triple.getArch() == llvm::Triple::thumb) &&
5690 "invalid architecture for Windows ARM target info");
5691 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5692 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5693
5694 // TODO map the complete set of values
5695 // 31: VFPv3 40: VFPv4
5696 Builder.defineMacro("_M_ARM_FP", "31");
5697 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005698 BuiltinVaListKind getBuiltinVaListKind() const override {
5699 return TargetInfo::CharPtrBuiltinVaList;
5700 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005701 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5702 switch (CC) {
5703 case CC_X86StdCall:
5704 case CC_X86ThisCall:
5705 case CC_X86FastCall:
5706 case CC_X86VectorCall:
5707 return CCCR_Ignore;
5708 case CC_C:
5709 return CCCR_OK;
5710 default:
5711 return CCCR_Warning;
5712 }
5713 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005714};
5715
5716// Windows ARM + Itanium C++ ABI Target
5717class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5718public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005719 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5720 const TargetOptions &Opts)
5721 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005722 TheCXXABI.set(TargetCXXABI::GenericARM);
5723 }
5724
5725 void getTargetDefines(const LangOptions &Opts,
5726 MacroBuilder &Builder) const override {
5727 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5728
5729 if (Opts.MSVCCompat)
5730 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5731 }
5732};
5733
5734// Windows ARM, MS (C++) ABI
5735class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5736public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005737 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5738 const TargetOptions &Opts)
5739 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005740 TheCXXABI.set(TargetCXXABI::Microsoft);
5741 }
5742
5743 void getTargetDefines(const LangOptions &Opts,
5744 MacroBuilder &Builder) const override {
5745 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5746 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5747 }
5748};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005749
Yaron Keren321249c2015-07-15 13:32:23 +00005750// ARM MinGW target
5751class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5752public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005753 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5754 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005755 TheCXXABI.set(TargetCXXABI::GenericARM);
5756 }
5757
5758 void getTargetDefines(const LangOptions &Opts,
5759 MacroBuilder &Builder) const override {
5760 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5761 DefineStd(Builder, "WIN32", Opts);
5762 DefineStd(Builder, "WINNT", Opts);
5763 Builder.defineMacro("_ARM_");
5764 addMinGWDefines(Opts, Builder);
5765 }
5766};
5767
5768// ARM Cygwin target
5769class CygwinARMTargetInfo : public ARMleTargetInfo {
5770public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005771 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5772 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005773 TLSSupported = false;
5774 WCharType = UnsignedShort;
5775 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005776 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005777 }
5778 void getTargetDefines(const LangOptions &Opts,
5779 MacroBuilder &Builder) const override {
5780 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5781 Builder.defineMacro("_ARM_");
5782 Builder.defineMacro("__CYGWIN__");
5783 Builder.defineMacro("__CYGWIN32__");
5784 DefineStd(Builder, "unix", Opts);
5785 if (Opts.CPlusPlus)
5786 Builder.defineMacro("_GNU_SOURCE");
5787 }
5788};
5789
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005790class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005791protected:
Craig Topper3164f332014-03-11 03:39:26 +00005792 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5793 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005794 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005795 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005796
Torok Edwinb2b37c62009-06-30 17:10:35 +00005797public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005798 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5799 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005800 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005801 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005802 // FIXME: This should be based off of the target features in
5803 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005804 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005805
Tim Northoverd88ecb32016-01-27 19:32:40 +00005806 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005807 // Darwin on iOS uses a variant of the ARM C++ ABI.
5808 TheCXXABI.set(TargetCXXABI::WatchOS);
5809
5810 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5811 // size_t is long, it's a bit weird for it to be int.
5812 PtrDiffType = SignedLong;
5813
5814 // BOOL should be a real boolean on the new ABI
5815 UseSignedCharForObjCBool = false;
5816 } else
5817 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005818 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005819};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005820
Tim Northover573cbee2014-05-24 12:52:07 +00005821class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005822 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005823 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5824 static const char *const GCCRegNames[];
5825
James Molloy75f5f9e2014-04-16 15:33:48 +00005826 enum FPUModeEnum {
5827 FPUMode,
5828 NeonMode
5829 };
5830
5831 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005832 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005833 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005834 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005835 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005836
Tim Northovera2ee4332014-03-29 15:09:45 +00005837 static const Builtin::Info BuiltinInfo[];
5838
5839 std::string ABI;
5840
5841public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005842 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005843 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005844 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5845 WCharType = SignedInt;
5846
5847 // NetBSD apparently prefers consistency across ARM targets to consistency
5848 // across 64-bit targets.
5849 Int64Type = SignedLongLong;
5850 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005851 } else {
5852 WCharType = UnsignedInt;
5853 Int64Type = SignedLong;
5854 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005855 }
5856
Tim Northovera2ee4332014-03-29 15:09:45 +00005857 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005858 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005859 MaxAtomicInlineWidth = 128;
5860 MaxAtomicPromoteWidth = 128;
5861
Tim Northovera6a19f12015-02-06 01:25:07 +00005862 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005863 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005864
Tim Northovera2ee4332014-03-29 15:09:45 +00005865 // {} in inline assembly are neon specifiers, not assembly variant
5866 // specifiers.
5867 NoAsmVariants = true;
5868
Tim Northover7ad87af2015-01-16 18:44:04 +00005869 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5870 // contributes to the alignment of the containing aggregate in the same way
5871 // a plain (non bit-field) member of that type would, without exception for
5872 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005873 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005874 UseZeroLengthBitfieldAlignment = true;
5875
Tim Northover573cbee2014-05-24 12:52:07 +00005876 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005877 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005878
5879 if (Triple.getOS() == llvm::Triple::Linux ||
5880 Triple.getOS() == llvm::Triple::UnknownOS)
5881 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005882 }
5883
Alp Toker4925ba72014-06-07 23:30:42 +00005884 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005885 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005886 if (Name != "aapcs" && Name != "darwinpcs")
5887 return false;
5888
5889 ABI = Name;
5890 return true;
5891 }
5892
David Blaikie1cbb9712014-11-14 19:09:44 +00005893 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005894 return Name == "generic" ||
5895 llvm::AArch64::parseCPUArch(Name) !=
5896 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005897 }
5898
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005899 void getTargetDefines(const LangOptions &Opts,
5900 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005901 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005902 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005903
5904 // Target properties.
5905 Builder.defineMacro("_LP64");
5906 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005907
5908 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5909 Builder.defineMacro("__ARM_ACLE", "200");
5910 Builder.defineMacro("__ARM_ARCH", "8");
5911 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5912
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005913 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005914 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005915 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005916
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005917 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5918 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5919 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5920 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005921 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005922 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5923 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005924
5925 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5926
5927 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005928 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005929
5930 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5931 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005932 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5933 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005934
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005935 if (Opts.UnsafeFPMath)
5936 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005937
5938 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5939
5940 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5941 Opts.ShortEnums ? "1" : "4");
5942
James Molloy75f5f9e2014-04-16 15:33:48 +00005943 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005944 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005945 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005946 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005947 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005948
Bradley Smith418c5932014-05-02 15:17:51 +00005949 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005950 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005951
James Molloy75f5f9e2014-04-16 15:33:48 +00005952 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005953 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5954
5955 if (Unaligned)
5956 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005957
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005958 if (V8_1A)
5959 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5960
Reid Klecknerd167d422015-05-06 15:31:46 +00005961 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5962 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5963 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5964 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5965 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005966 }
5967
Craig Topper6c03a542015-10-19 04:51:35 +00005968 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5969 return llvm::makeArrayRef(BuiltinInfo,
5970 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005971 }
5972
David Blaikie1cbb9712014-11-14 19:09:44 +00005973 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005974 return Feature == "aarch64" ||
5975 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005976 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005977 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005978 }
5979
James Molloy5e73df52014-04-16 15:06:20 +00005980 bool handleTargetFeatures(std::vector<std::string> &Features,
5981 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005982 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005983 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005984 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005985 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005986 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005987
Eric Christopher610fe112015-08-26 08:21:55 +00005988 for (const auto &Feature : Features) {
5989 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005990 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005991 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005992 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005993 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005994 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005995 if (Feature == "+strict-align")
5996 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005997 if (Feature == "+v8.1a")
5998 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005999 }
6000
James Y Knightb214cbc2016-03-04 19:00:41 +00006001 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006002
6003 return true;
6004 }
6005
John McCall477f2bb2016-03-03 06:39:32 +00006006 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6007 switch (CC) {
6008 case CC_C:
6009 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006010 case CC_PreserveMost:
6011 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006012 return CCCR_OK;
6013 default:
6014 return CCCR_Warning;
6015 }
6016 }
6017
David Blaikie1cbb9712014-11-14 19:09:44 +00006018 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006019
David Blaikie1cbb9712014-11-14 19:09:44 +00006020 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006021 return TargetInfo::AArch64ABIBuiltinVaList;
6022 }
6023
Craig Topperf054e3a2015-10-19 03:52:27 +00006024 ArrayRef<const char *> getGCCRegNames() const override;
6025 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006026
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006027 bool validateAsmConstraint(const char *&Name,
6028 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006029 switch (*Name) {
6030 default:
6031 return false;
6032 case 'w': // Floating point and SIMD registers (V0-V31)
6033 Info.setAllowsRegister();
6034 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006035 case 'I': // Constant that can be used with an ADD instruction
6036 case 'J': // Constant that can be used with a SUB instruction
6037 case 'K': // Constant that can be used with a 32-bit logical instruction
6038 case 'L': // Constant that can be used with a 64-bit logical instruction
6039 case 'M': // Constant that can be used as a 32-bit MOV immediate
6040 case 'N': // Constant that can be used as a 64-bit MOV immediate
6041 case 'Y': // Floating point constant zero
6042 case 'Z': // Integer constant zero
6043 return true;
6044 case 'Q': // A memory reference with base register and no offset
6045 Info.setAllowsMemory();
6046 return true;
6047 case 'S': // A symbolic address
6048 Info.setAllowsRegister();
6049 return true;
6050 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006051 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6052 // Utf: A memory address suitable for ldp/stp in TF mode.
6053 // Usa: An absolute symbolic address.
6054 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6055 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006056 case 'z': // Zero register, wzr or xzr
6057 Info.setAllowsRegister();
6058 return true;
6059 case 'x': // Floating point and SIMD registers (V0-V15)
6060 Info.setAllowsRegister();
6061 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006062 }
6063 return false;
6064 }
6065
Akira Hatanaka987f1862014-08-22 06:05:21 +00006066 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006067 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006068 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006069 // Strip off constraint modifiers.
6070 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6071 Constraint = Constraint.substr(1);
6072
6073 switch (Constraint[0]) {
6074 default:
6075 return true;
6076 case 'z':
6077 case 'r': {
6078 switch (Modifier) {
6079 case 'x':
6080 case 'w':
6081 // For now assume that the person knows what they're
6082 // doing with the modifier.
6083 return true;
6084 default:
6085 // By default an 'r' constraint will be in the 'x'
6086 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006087 if (Size == 64)
6088 return true;
6089
6090 SuggestedModifier = "w";
6091 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006092 }
6093 }
6094 }
6095 }
6096
David Blaikie1cbb9712014-11-14 19:09:44 +00006097 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006098
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006099 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006100 if (RegNo == 0)
6101 return 0;
6102 if (RegNo == 1)
6103 return 1;
6104 return -1;
6105 }
6106};
6107
Tim Northover573cbee2014-05-24 12:52:07 +00006108const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006109 // 32-bit Integer registers
6110 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6111 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6112 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6113
6114 // 64-bit Integer registers
6115 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6116 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6117 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6118
6119 // 32-bit floating point regsisters
6120 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6121 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6122 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6123
6124 // 64-bit floating point regsisters
6125 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6126 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6127 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6128
6129 // Vector registers
6130 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6131 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6132 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6133};
6134
Craig Topperf054e3a2015-10-19 03:52:27 +00006135ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6136 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006137}
6138
Tim Northover573cbee2014-05-24 12:52:07 +00006139const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006140 { { "w31" }, "wsp" },
6141 { { "x29" }, "fp" },
6142 { { "x30" }, "lr" },
6143 { { "x31" }, "sp" },
6144 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6145 // don't want to substitute one of these for a different-sized one.
6146};
6147
Craig Topperf054e3a2015-10-19 03:52:27 +00006148ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6149 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006150}
6151
Tim Northover573cbee2014-05-24 12:52:07 +00006152const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006153#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006154 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006155#include "clang/Basic/BuiltinsNEON.def"
6156
6157#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006158 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006159#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006160};
James Molloy5e73df52014-04-16 15:06:20 +00006161
Tim Northover573cbee2014-05-24 12:52:07 +00006162class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006163 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006164 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006165 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006166 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006167 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006168 }
6169
6170public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006171 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6172 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006173 }
James Molloy5e73df52014-04-16 15:06:20 +00006174 void getTargetDefines(const LangOptions &Opts,
6175 MacroBuilder &Builder) const override {
6176 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006177 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006178 }
6179};
6180
Tim Northover573cbee2014-05-24 12:52:07 +00006181class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006182 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006183 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006184 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006185 }
6186
6187public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006188 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6189 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006190 void getTargetDefines(const LangOptions &Opts,
6191 MacroBuilder &Builder) const override {
6192 Builder.defineMacro("__AARCH64EB__");
6193 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6194 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006195 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006196 }
6197};
Tim Northovera2ee4332014-03-29 15:09:45 +00006198
Tim Northover573cbee2014-05-24 12:52:07 +00006199class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006200protected:
6201 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6202 MacroBuilder &Builder) const override {
6203 Builder.defineMacro("__AARCH64_SIMD__");
6204 Builder.defineMacro("__ARM64_ARCH_8__");
6205 Builder.defineMacro("__ARM_NEON__");
6206 Builder.defineMacro("__LITTLE_ENDIAN__");
6207 Builder.defineMacro("__REGISTER_PREFIX__", "");
6208 Builder.defineMacro("__arm64", "1");
6209 Builder.defineMacro("__arm64__", "1");
6210
6211 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6212 }
6213
Tim Northovera2ee4332014-03-29 15:09:45 +00006214public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006215 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6216 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006217 Int64Type = SignedLongLong;
6218 WCharType = SignedInt;
6219 UseSignedCharForObjCBool = false;
6220
Tim Northovera6a19f12015-02-06 01:25:07 +00006221 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006222 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006223
6224 TheCXXABI.set(TargetCXXABI::iOS64);
6225 }
6226
David Blaikie1cbb9712014-11-14 19:09:44 +00006227 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006228 return TargetInfo::CharPtrBuiltinVaList;
6229 }
6230};
Tim Northovera2ee4332014-03-29 15:09:45 +00006231
Tony Linthicum76329bf2011-12-12 21:14:55 +00006232// Hexagon abstract base class
6233class HexagonTargetInfo : public TargetInfo {
6234 static const Builtin::Info BuiltinInfo[];
6235 static const char * const GCCRegNames[];
6236 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6237 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006238 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006239 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006240
Tony Linthicum76329bf2011-12-12 21:14:55 +00006241public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006242 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6243 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006244 // Specify the vector alignment explicitly. For v512x1, the calculated
6245 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6246 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006247 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006248 "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 +00006249 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006250 SizeType = UnsignedInt;
6251 PtrDiffType = SignedInt;
6252 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253
6254 // {} in inline assembly are packet specifiers, not assembly variant
6255 // specifiers.
6256 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006257
6258 LargeArrayMinWidth = 64;
6259 LargeArrayAlign = 64;
6260 UseBitFieldTypeAlignment = true;
6261 ZeroLengthBitfieldBoundary = 32;
6262 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006263 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006264 }
6265
Craig Topper6c03a542015-10-19 04:51:35 +00006266 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6267 return llvm::makeArrayRef(BuiltinInfo,
6268 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006269 }
6270
Craig Topper3164f332014-03-11 03:39:26 +00006271 bool validateAsmConstraint(const char *&Name,
6272 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006273 switch (*Name) {
6274 case 'v':
6275 case 'q':
6276 if (HasHVX) {
6277 Info.setAllowsRegister();
6278 return true;
6279 }
6280 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006281 case 's':
6282 // Relocatable constant.
6283 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006284 }
6285 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006286 }
6287
Craig Topper3164f332014-03-11 03:39:26 +00006288 void getTargetDefines(const LangOptions &Opts,
6289 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006290
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006291 bool isCLZForZeroUndef() const override { return false; }
6292
Craig Topper3164f332014-03-11 03:39:26 +00006293 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006294 return llvm::StringSwitch<bool>(Feature)
6295 .Case("hexagon", true)
6296 .Case("hvx", HasHVX)
6297 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006298 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006299 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006300 }
Craig Topper3164f332014-03-11 03:39:26 +00006301
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006302 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6303 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6304 const override;
6305
6306 bool handleTargetFeatures(std::vector<std::string> &Features,
6307 DiagnosticsEngine &Diags) override;
6308
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006309 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6310 bool Enabled) const override;
6311
Craig Topper3164f332014-03-11 03:39:26 +00006312 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006313 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006314 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006315 ArrayRef<const char *> getGCCRegNames() const override;
6316 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006317 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006318 return "";
6319 }
Sebastian Pop86500282012-01-13 20:37:10 +00006320
6321 static const char *getHexagonCPUSuffix(StringRef Name) {
6322 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006323 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006324 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006325 .Case("hexagonv55", "55")
6326 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006327 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006328 }
6329
Craig Topper3164f332014-03-11 03:39:26 +00006330 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006331 if (!getHexagonCPUSuffix(Name))
6332 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333 CPU = Name;
6334 return true;
6335 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006336
6337 int getEHDataRegisterNumber(unsigned RegNo) const override {
6338 return RegNo < 2 ? RegNo : -1;
6339 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006340};
6341
6342void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006344 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006345 Builder.defineMacro("__hexagon__", "1");
6346
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006347 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006348 Builder.defineMacro("__HEXAGON_V4__");
6349 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006350 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006351 Builder.defineMacro("__QDSP6_V4__");
6352 Builder.defineMacro("__QDSP6_ARCH__", "4");
6353 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006354 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006355 Builder.defineMacro("__HEXAGON_V5__");
6356 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6357 if(Opts.HexagonQdsp6Compat) {
6358 Builder.defineMacro("__QDSP6_V5__");
6359 Builder.defineMacro("__QDSP6_ARCH__", "5");
6360 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006361 } else if (CPU == "hexagonv55") {
6362 Builder.defineMacro("__HEXAGON_V55__");
6363 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6364 Builder.defineMacro("__QDSP6_V55__");
6365 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006366 } else if (CPU == "hexagonv60") {
6367 Builder.defineMacro("__HEXAGON_V60__");
6368 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6369 Builder.defineMacro("__QDSP6_V60__");
6370 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006371 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006372
6373 if (hasFeature("hvx")) {
6374 Builder.defineMacro("__HVX__");
6375 if (hasFeature("hvx-double"))
6376 Builder.defineMacro("__HVXDBL__");
6377 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006378}
6379
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006380bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6381 DiagnosticsEngine &Diags, StringRef CPU,
6382 const std::vector<std::string> &FeaturesVec) const {
6383 // Default for v60: -hvx, -hvx-double.
6384 Features["hvx"] = false;
6385 Features["hvx-double"] = false;
6386 Features["long-calls"] = false;
6387
6388 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6389}
6390
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006391bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6392 DiagnosticsEngine &Diags) {
6393 for (auto &F : Features) {
6394 if (F == "+hvx")
6395 HasHVX = true;
6396 else if (F == "-hvx")
6397 HasHVX = HasHVXDouble = false;
6398 else if (F == "+hvx-double")
6399 HasHVX = HasHVXDouble = true;
6400 else if (F == "-hvx-double")
6401 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006402
6403 if (F == "+long-calls")
6404 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006405 else if (F == "-long-calls")
6406 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006407 }
6408 return true;
6409}
6410
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006411void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6412 StringRef Name, bool Enabled) const {
6413 if (Enabled) {
6414 if (Name == "hvx-double")
6415 Features["hvx"] = true;
6416 } else {
6417 if (Name == "hvx")
6418 Features["hvx-double"] = false;
6419 }
6420 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006421}
6422
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006423const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006424 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6425 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6426 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6427 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6428 "p0", "p1", "p2", "p3",
6429 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6430};
6431
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006432ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006433 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006434}
6435
Tony Linthicum76329bf2011-12-12 21:14:55 +00006436const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6437 { { "sp" }, "r29" },
6438 { { "fp" }, "r30" },
6439 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006440};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006441
Craig Topperf054e3a2015-10-19 03:52:27 +00006442ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6443 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006444}
6445
6446
6447const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006448#define BUILTIN(ID, TYPE, ATTRS) \
6449 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6450#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6451 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006452#include "clang/Basic/BuiltinsHexagon.def"
6453};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454
Jacques Pienaard964cc22016-03-28 21:02:54 +00006455class LanaiTargetInfo : public TargetInfo {
6456 // Class for Lanai (32-bit).
6457 // The CPU profiles supported by the Lanai backend
6458 enum CPUKind {
6459 CK_NONE,
6460 CK_V11,
6461 } CPU;
6462
6463 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6464 static const char *const GCCRegNames[];
6465
6466public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006467 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6468 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006469 // Description string has to be kept in sync with backend.
6470 resetDataLayout("E" // Big endian
6471 "-m:e" // ELF name manging
6472 "-p:32:32" // 32 bit pointers, 32 bit aligned
6473 "-i64:64" // 64 bit integers, 64 bit aligned
6474 "-a:0:32" // 32 bit alignment of objects of aggregate type
6475 "-n32" // 32 bit native integer width
6476 "-S64" // 64 bit natural stack alignment
6477 );
6478
6479 // Setting RegParmMax equal to what mregparm was set to in the old
6480 // toolchain
6481 RegParmMax = 4;
6482
6483 // Set the default CPU to V11
6484 CPU = CK_V11;
6485
6486 // Temporary approach to make everything at least word-aligned and allow for
6487 // safely casting between pointers with different alignment requirements.
6488 // TODO: Remove this when there are no more cast align warnings on the
6489 // firmware.
6490 MinGlobalAlign = 32;
6491 }
6492
6493 void getTargetDefines(const LangOptions &Opts,
6494 MacroBuilder &Builder) const override {
6495 // Define __lanai__ when building for target lanai.
6496 Builder.defineMacro("__lanai__");
6497
6498 // Set define for the CPU specified.
6499 switch (CPU) {
6500 case CK_V11:
6501 Builder.defineMacro("__LANAI_V11__");
6502 break;
6503 case CK_NONE:
6504 llvm_unreachable("Unhandled target CPU");
6505 }
6506 }
6507
6508 bool setCPU(const std::string &Name) override {
6509 CPU = llvm::StringSwitch<CPUKind>(Name)
6510 .Case("v11", CK_V11)
6511 .Default(CK_NONE);
6512
6513 return CPU != CK_NONE;
6514 }
6515
6516 bool hasFeature(StringRef Feature) const override {
6517 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6518 }
6519
6520 ArrayRef<const char *> getGCCRegNames() const override;
6521
6522 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6523
6524 BuiltinVaListKind getBuiltinVaListKind() const override {
6525 return TargetInfo::VoidPtrBuiltinVaList;
6526 }
6527
6528 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6529
6530 bool validateAsmConstraint(const char *&Name,
6531 TargetInfo::ConstraintInfo &info) const override {
6532 return false;
6533 }
6534
6535 const char *getClobbers() const override { return ""; }
6536};
6537
6538const char *const LanaiTargetInfo::GCCRegNames[] = {
6539 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6540 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6541 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6542
6543ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6544 return llvm::makeArrayRef(GCCRegNames);
6545}
6546
6547const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6548 {{"pc"}, "r2"},
6549 {{"sp"}, "r4"},
6550 {{"fp"}, "r5"},
6551 {{"rv"}, "r8"},
6552 {{"rr1"}, "r10"},
6553 {{"rr2"}, "r11"},
6554 {{"rca"}, "r15"},
6555};
6556
6557ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6558 return llvm::makeArrayRef(GCCRegAliases);
6559}
6560
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006561// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6562class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006563 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6564 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006565 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006566public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006567 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006568 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006569
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006570 int getEHDataRegisterNumber(unsigned RegNo) const override {
6571 if (RegNo == 0) return 24;
6572 if (RegNo == 1) return 25;
6573 return -1;
6574 }
6575
Craig Topper3164f332014-03-11 03:39:26 +00006576 bool handleTargetFeatures(std::vector<std::string> &Features,
6577 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006578 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006579 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6580 if (Feature != Features.end()) {
6581 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006582 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006583 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006584 }
Craig Topper3164f332014-03-11 03:39:26 +00006585 void getTargetDefines(const LangOptions &Opts,
6586 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006587 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006588 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006589
6590 if (SoftFloat)
6591 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006592 }
Craig Topper3164f332014-03-11 03:39:26 +00006593
6594 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006595 return llvm::StringSwitch<bool>(Feature)
6596 .Case("softfloat", SoftFloat)
6597 .Case("sparc", true)
6598 .Default(false);
6599 }
Craig Topper3164f332014-03-11 03:39:26 +00006600
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006601 bool hasSjLjLowering() const override {
6602 return true;
6603 }
6604
Craig Topper6c03a542015-10-19 04:51:35 +00006605 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006606 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006607 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006608 }
Craig Topper3164f332014-03-11 03:39:26 +00006609 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006610 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006611 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006612 ArrayRef<const char *> getGCCRegNames() const override;
6613 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006614 bool validateAsmConstraint(const char *&Name,
6615 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006616 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006617 switch (*Name) {
6618 case 'I': // Signed 13-bit constant
6619 case 'J': // Zero
6620 case 'K': // 32-bit constant with the low 12 bits clear
6621 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6622 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6623 case 'N': // Same as 'K' but zext (required for SIMode)
6624 case 'O': // The constant 4096
6625 return true;
6626 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006627 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006628 }
Craig Topper3164f332014-03-11 03:39:26 +00006629 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006630 // FIXME: Implement!
6631 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006632 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006633
6634 // No Sparc V7 for now, the backend doesn't support it anyway.
6635 enum CPUKind {
6636 CK_GENERIC,
6637 CK_V8,
6638 CK_SUPERSPARC,
6639 CK_SPARCLITE,
6640 CK_F934,
6641 CK_HYPERSPARC,
6642 CK_SPARCLITE86X,
6643 CK_SPARCLET,
6644 CK_TSC701,
6645 CK_V9,
6646 CK_ULTRASPARC,
6647 CK_ULTRASPARC3,
6648 CK_NIAGARA,
6649 CK_NIAGARA2,
6650 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006651 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006652 CK_MYRIAD2100,
6653 CK_MYRIAD2150,
6654 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006655 CK_LEON2,
6656 CK_LEON2_AT697E,
6657 CK_LEON2_AT697F,
6658 CK_LEON3,
6659 CK_LEON3_UT699,
6660 CK_LEON3_GR712RC,
6661 CK_LEON4,
6662 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006663 } CPU = CK_GENERIC;
6664
6665 enum CPUGeneration {
6666 CG_V8,
6667 CG_V9,
6668 };
6669
6670 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6671 switch (Kind) {
6672 case CK_GENERIC:
6673 case CK_V8:
6674 case CK_SUPERSPARC:
6675 case CK_SPARCLITE:
6676 case CK_F934:
6677 case CK_HYPERSPARC:
6678 case CK_SPARCLITE86X:
6679 case CK_SPARCLET:
6680 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006681 case CK_MYRIAD2100:
6682 case CK_MYRIAD2150:
6683 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006684 case CK_LEON2:
6685 case CK_LEON2_AT697E:
6686 case CK_LEON2_AT697F:
6687 case CK_LEON3:
6688 case CK_LEON3_UT699:
6689 case CK_LEON3_GR712RC:
6690 case CK_LEON4:
6691 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006692 return CG_V8;
6693 case CK_V9:
6694 case CK_ULTRASPARC:
6695 case CK_ULTRASPARC3:
6696 case CK_NIAGARA:
6697 case CK_NIAGARA2:
6698 case CK_NIAGARA3:
6699 case CK_NIAGARA4:
6700 return CG_V9;
6701 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006702 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006703 }
6704
6705 CPUKind getCPUKind(StringRef Name) const {
6706 return llvm::StringSwitch<CPUKind>(Name)
6707 .Case("v8", CK_V8)
6708 .Case("supersparc", CK_SUPERSPARC)
6709 .Case("sparclite", CK_SPARCLITE)
6710 .Case("f934", CK_F934)
6711 .Case("hypersparc", CK_HYPERSPARC)
6712 .Case("sparclite86x", CK_SPARCLITE86X)
6713 .Case("sparclet", CK_SPARCLET)
6714 .Case("tsc701", CK_TSC701)
6715 .Case("v9", CK_V9)
6716 .Case("ultrasparc", CK_ULTRASPARC)
6717 .Case("ultrasparc3", CK_ULTRASPARC3)
6718 .Case("niagara", CK_NIAGARA)
6719 .Case("niagara2", CK_NIAGARA2)
6720 .Case("niagara3", CK_NIAGARA3)
6721 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006722 .Case("ma2100", CK_MYRIAD2100)
6723 .Case("ma2150", CK_MYRIAD2150)
6724 .Case("ma2450", CK_MYRIAD2450)
6725 // FIXME: the myriad2[.n] spellings are obsolete,
6726 // but a grace period is needed to allow updating dependent builds.
6727 .Case("myriad2", CK_MYRIAD2100)
6728 .Case("myriad2.1", CK_MYRIAD2100)
6729 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006730 .Case("leon2", CK_LEON2)
6731 .Case("at697e", CK_LEON2_AT697E)
6732 .Case("at697f", CK_LEON2_AT697F)
6733 .Case("leon3", CK_LEON3)
6734 .Case("ut699", CK_LEON3_UT699)
6735 .Case("gr712rc", CK_LEON3_GR712RC)
6736 .Case("leon4", CK_LEON4)
6737 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006738 .Default(CK_GENERIC);
6739 }
6740
6741 bool setCPU(const std::string &Name) override {
6742 CPU = getCPUKind(Name);
6743 return CPU != CK_GENERIC;
6744 }
Gabor Greif49991682008-02-21 16:29:08 +00006745};
6746
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006747const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006748 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6749 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6750 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6751 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6752};
6753
Craig Topperf054e3a2015-10-19 03:52:27 +00006754ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6755 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006756}
6757
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006758const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006759 { { "g0" }, "r0" },
6760 { { "g1" }, "r1" },
6761 { { "g2" }, "r2" },
6762 { { "g3" }, "r3" },
6763 { { "g4" }, "r4" },
6764 { { "g5" }, "r5" },
6765 { { "g6" }, "r6" },
6766 { { "g7" }, "r7" },
6767 { { "o0" }, "r8" },
6768 { { "o1" }, "r9" },
6769 { { "o2" }, "r10" },
6770 { { "o3" }, "r11" },
6771 { { "o4" }, "r12" },
6772 { { "o5" }, "r13" },
6773 { { "o6", "sp" }, "r14" },
6774 { { "o7" }, "r15" },
6775 { { "l0" }, "r16" },
6776 { { "l1" }, "r17" },
6777 { { "l2" }, "r18" },
6778 { { "l3" }, "r19" },
6779 { { "l4" }, "r20" },
6780 { { "l5" }, "r21" },
6781 { { "l6" }, "r22" },
6782 { { "l7" }, "r23" },
6783 { { "i0" }, "r24" },
6784 { { "i1" }, "r25" },
6785 { { "i2" }, "r26" },
6786 { { "i3" }, "r27" },
6787 { { "i4" }, "r28" },
6788 { { "i5" }, "r29" },
6789 { { "i6", "fp" }, "r30" },
6790 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006791};
6792
Craig Topperf054e3a2015-10-19 03:52:27 +00006793ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6794 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006795}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006796
6797// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6798class SparcV8TargetInfo : public SparcTargetInfo {
6799public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006800 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6801 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006802 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006803 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6804 switch (getTriple().getOS()) {
6805 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006806 SizeType = UnsignedInt;
6807 IntPtrType = SignedInt;
6808 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006809 break;
6810 case llvm::Triple::NetBSD:
6811 case llvm::Triple::OpenBSD:
6812 SizeType = UnsignedLong;
6813 IntPtrType = SignedLong;
6814 PtrDiffType = SignedLong;
6815 break;
Brad Smith56495d52015-08-13 22:00:53 +00006816 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006817 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6818 // on up to 64 bits.
6819 MaxAtomicPromoteWidth = 64;
6820 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006821 }
6822
Craig Topper3164f332014-03-11 03:39:26 +00006823 void getTargetDefines(const LangOptions &Opts,
6824 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006825 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006826 switch (getCPUGeneration(CPU)) {
6827 case CG_V8:
6828 Builder.defineMacro("__sparcv8");
6829 if (getTriple().getOS() != llvm::Triple::Solaris)
6830 Builder.defineMacro("__sparcv8__");
6831 break;
6832 case CG_V9:
6833 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006834 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006835 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006836 Builder.defineMacro("__sparc_v9__");
6837 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006838 break;
6839 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006840 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006841 std::string MyriadArchValue, Myriad2Value;
6842 Builder.defineMacro("__sparc_v8__");
6843 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006844 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006845 case CK_MYRIAD2150:
6846 MyriadArchValue = "__ma2150";
6847 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006848 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006849 case CK_MYRIAD2450:
6850 MyriadArchValue = "__ma2450";
6851 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006852 break;
6853 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006854 MyriadArchValue = "__ma2100";
6855 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006856 break;
6857 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006858 Builder.defineMacro(MyriadArchValue, "1");
6859 Builder.defineMacro(MyriadArchValue+"__", "1");
6860 Builder.defineMacro("__myriad2__", Myriad2Value);
6861 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006862 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006863 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006864
6865 bool hasSjLjLowering() const override {
6866 return true;
6867 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006868};
6869
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006870// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6871class SparcV8elTargetInfo : public SparcV8TargetInfo {
6872 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006873 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6874 : SparcV8TargetInfo(Triple, Opts) {
6875 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006876 }
6877};
6878
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006879// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6880class SparcV9TargetInfo : public SparcTargetInfo {
6881public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006882 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6883 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006884 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006885 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006886 // This is an LP64 platform.
6887 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006888
6889 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006890 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006891 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006892 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006893 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006894 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006895
6896 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6897 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6898 LongDoubleWidth = 128;
6899 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006900 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006901 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006902 }
6903
Craig Topper3164f332014-03-11 03:39:26 +00006904 void getTargetDefines(const LangOptions &Opts,
6905 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006906 SparcTargetInfo::getTargetDefines(Opts, Builder);
6907 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006908 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006909 // Solaris doesn't need these variants, but the BSDs do.
6910 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006911 Builder.defineMacro("__sparc64__");
6912 Builder.defineMacro("__sparc_v9__");
6913 Builder.defineMacro("__sparcv9__");
6914 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006915 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006916
Craig Topper3164f332014-03-11 03:39:26 +00006917 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006918 if (!SparcTargetInfo::setCPU(Name))
6919 return false;
6920 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006921 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006922};
6923
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006924class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006925 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006926 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006927 std::string CPU;
6928 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006929 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006930
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006931public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006932 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006933 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6934 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006935 IntMaxType = SignedLong;
6936 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006937 TLSSupported = true;
6938 IntWidth = IntAlign = 32;
6939 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6940 PointerWidth = PointerAlign = 64;
6941 LongDoubleWidth = 128;
6942 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006943 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006944 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006945 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006946 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 +00006947 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6948 }
6949 void getTargetDefines(const LangOptions &Opts,
6950 MacroBuilder &Builder) const override {
6951 Builder.defineMacro("__s390__");
6952 Builder.defineMacro("__s390x__");
6953 Builder.defineMacro("__zarch__");
6954 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006955
6956 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6957 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6958 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6959 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6960
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006961 if (HasTransactionalExecution)
6962 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006963 if (Opts.ZVector)
6964 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006965 }
Craig Topper6c03a542015-10-19 04:51:35 +00006966 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6967 return llvm::makeArrayRef(BuiltinInfo,
6968 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006969 }
6970
Craig Topperf054e3a2015-10-19 03:52:27 +00006971 ArrayRef<const char *> getGCCRegNames() const override;
6972 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006973 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006974 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006975 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006976 bool validateAsmConstraint(const char *&Name,
6977 TargetInfo::ConstraintInfo &info) const override;
6978 const char *getClobbers() const override {
6979 // FIXME: Is this really right?
6980 return "";
6981 }
6982 BuiltinVaListKind getBuiltinVaListKind() const override {
6983 return TargetInfo::SystemZBuiltinVaList;
6984 }
6985 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006986 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006987 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6988 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006989 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006990 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006991 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006992 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006993 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006994 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006995 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006996 .Default(false);
6997
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006998 return CPUKnown;
6999 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007000 bool
7001 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7002 StringRef CPU,
7003 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007004 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007005 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007006 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007007 Features["transactional-execution"] = true;
7008 Features["vector"] = true;
7009 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007010 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007011 }
7012
7013 bool handleTargetFeatures(std::vector<std::string> &Features,
7014 DiagnosticsEngine &Diags) override {
7015 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007016 for (const auto &Feature : Features) {
7017 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007018 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007019 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007020 HasVector = true;
7021 }
7022 // If we use the vector ABI, vector types are 64-bit aligned.
7023 if (HasVector) {
7024 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007025 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7026 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007027 }
7028 return true;
7029 }
7030
7031 bool hasFeature(StringRef Feature) const override {
7032 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007033 .Case("systemz", true)
7034 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007035 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007036 .Default(false);
7037 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007038
Bryan Chane3f1ed52016-04-28 13:56:43 +00007039 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7040 switch (CC) {
7041 case CC_C:
7042 case CC_Swift:
7043 return CCCR_OK;
7044 default:
7045 return CCCR_Warning;
7046 }
7047 }
7048
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007049 StringRef getABI() const override {
7050 if (HasVector)
7051 return "vector";
7052 return "";
7053 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007054
7055 bool useFloat128ManglingForLongDouble() const override {
7056 return true;
7057 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007058};
7059
7060const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7061#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007062 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007063#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7064 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007065#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007066};
7067
7068const char *const SystemZTargetInfo::GCCRegNames[] = {
7069 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7070 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7071 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7072 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7073};
7074
Craig Topperf054e3a2015-10-19 03:52:27 +00007075ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7076 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007077}
7078
7079bool SystemZTargetInfo::
7080validateAsmConstraint(const char *&Name,
7081 TargetInfo::ConstraintInfo &Info) const {
7082 switch (*Name) {
7083 default:
7084 return false;
7085
7086 case 'a': // Address register
7087 case 'd': // Data register (equivalent to 'r')
7088 case 'f': // Floating-point register
7089 Info.setAllowsRegister();
7090 return true;
7091
7092 case 'I': // Unsigned 8-bit constant
7093 case 'J': // Unsigned 12-bit constant
7094 case 'K': // Signed 16-bit constant
7095 case 'L': // Signed 20-bit displacement (on all targets we support)
7096 case 'M': // 0x7fffffff
7097 return true;
7098
7099 case 'Q': // Memory with base and unsigned 12-bit displacement
7100 case 'R': // Likewise, plus an index
7101 case 'S': // Memory with base and signed 20-bit displacement
7102 case 'T': // Likewise, plus an index
7103 Info.setAllowsMemory();
7104 return true;
7105 }
7106}
Ulrich Weigand47445072013-05-06 16:26:41 +00007107
Eric Christopherc48497a2015-09-18 21:26:24 +00007108class MSP430TargetInfo : public TargetInfo {
7109 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007110
Eric Christopherc48497a2015-09-18 21:26:24 +00007111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007112 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7113 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007114 TLSSupported = false;
7115 IntWidth = 16;
7116 IntAlign = 16;
7117 LongWidth = 32;
7118 LongLongWidth = 64;
7119 LongAlign = LongLongAlign = 16;
7120 PointerWidth = 16;
7121 PointerAlign = 16;
7122 SuitableAlign = 16;
7123 SizeType = UnsignedInt;
7124 IntMaxType = SignedLongLong;
7125 IntPtrType = SignedInt;
7126 PtrDiffType = SignedInt;
7127 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007128 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007129 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007130 void getTargetDefines(const LangOptions &Opts,
7131 MacroBuilder &Builder) const override {
7132 Builder.defineMacro("MSP430");
7133 Builder.defineMacro("__MSP430__");
7134 // FIXME: defines for different 'flavours' of MCU
7135 }
Craig Topper6c03a542015-10-19 04:51:35 +00007136 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007137 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007138 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007139 }
7140 bool hasFeature(StringRef Feature) const override {
7141 return Feature == "msp430";
7142 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007143 ArrayRef<const char *> getGCCRegNames() const override;
7144 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007145 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007146 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007147 }
7148 bool validateAsmConstraint(const char *&Name,
7149 TargetInfo::ConstraintInfo &info) const override {
7150 // FIXME: implement
7151 switch (*Name) {
7152 case 'K': // the constant 1
7153 case 'L': // constant -1^20 .. 1^19
7154 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007155 return true;
7156 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007157 // No target constraints for now.
7158 return false;
7159 }
7160 const char *getClobbers() const override {
7161 // FIXME: Is this really right?
7162 return "";
7163 }
7164 BuiltinVaListKind getBuiltinVaListKind() const override {
7165 // FIXME: implement
7166 return TargetInfo::CharPtrBuiltinVaList;
7167 }
7168};
7169
7170const char *const MSP430TargetInfo::GCCRegNames[] = {
7171 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7172 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7173
Craig Topperf054e3a2015-10-19 03:52:27 +00007174ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7175 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007176}
7177
7178// LLVM and Clang cannot be used directly to output native binaries for
7179// target, but is used to compile C code to llvm bitcode with correct
7180// type and alignment information.
7181//
7182// TCE uses the llvm bitcode as input and uses it for generating customized
7183// target processor and program binary. TCE co-design environment is
7184// publicly available in http://tce.cs.tut.fi
7185
7186static const unsigned TCEOpenCLAddrSpaceMap[] = {
7187 3, // opencl_global
7188 4, // opencl_local
7189 5, // opencl_constant
7190 // FIXME: generic has to be added to the target
7191 0, // opencl_generic
7192 0, // cuda_device
7193 0, // cuda_constant
7194 0 // cuda_shared
7195};
7196
7197class TCETargetInfo : public TargetInfo {
7198public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007199 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7200 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007201 TLSSupported = false;
7202 IntWidth = 32;
7203 LongWidth = LongLongWidth = 32;
7204 PointerWidth = 32;
7205 IntAlign = 32;
7206 LongAlign = LongLongAlign = 32;
7207 PointerAlign = 32;
7208 SuitableAlign = 32;
7209 SizeType = UnsignedInt;
7210 IntMaxType = SignedLong;
7211 IntPtrType = SignedInt;
7212 PtrDiffType = SignedInt;
7213 FloatWidth = 32;
7214 FloatAlign = 32;
7215 DoubleWidth = 32;
7216 DoubleAlign = 32;
7217 LongDoubleWidth = 32;
7218 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007219 FloatFormat = &llvm::APFloat::IEEEsingle();
7220 DoubleFormat = &llvm::APFloat::IEEEsingle();
7221 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007222 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7223 "i16:16:32-i32:32:32-i64:32:32-"
7224 "f32:32:32-f64:32:32-v64:32:32-"
7225 "v128:32:32-v256:32:32-v512:32:32-"
7226 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007227 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7228 UseAddrSpaceMapMangling = true;
7229 }
7230
7231 void getTargetDefines(const LangOptions &Opts,
7232 MacroBuilder &Builder) const override {
7233 DefineStd(Builder, "tce", Opts);
7234 Builder.defineMacro("__TCE__");
7235 Builder.defineMacro("__TCE_V1__");
7236 }
7237 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7238
Craig Topper6c03a542015-10-19 04:51:35 +00007239 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007240 const char *getClobbers() const override { return ""; }
7241 BuiltinVaListKind getBuiltinVaListKind() const override {
7242 return TargetInfo::VoidPtrBuiltinVaList;
7243 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007244 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007245 bool validateAsmConstraint(const char *&Name,
7246 TargetInfo::ConstraintInfo &info) const override {
7247 return true;
7248 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007249 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7250 return None;
7251 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007252};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007253
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007254class TCELETargetInfo : public TCETargetInfo {
7255public:
7256 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7257 : TCETargetInfo(Triple, Opts) {
7258 BigEndian = false;
7259
7260 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7261 "i16:16:32-i32:32:32-i64:32:32-"
7262 "f32:32:32-f64:32:32-v64:32:32-"
7263 "v128:32:32-v256:32:32-v512:32:32-"
7264 "v1024:32:32-a0:0:32-n32");
7265
7266 }
7267
7268 virtual void getTargetDefines(const LangOptions &Opts,
7269 MacroBuilder &Builder) const {
7270 DefineStd(Builder, "tcele", Opts);
7271 Builder.defineMacro("__TCE__");
7272 Builder.defineMacro("__TCE_V1__");
7273 Builder.defineMacro("__TCELE__");
7274 Builder.defineMacro("__TCELE_V1__");
7275 }
7276
7277};
7278
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007279class BPFTargetInfo : public TargetInfo {
7280public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007281 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7282 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007283 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7284 SizeType = UnsignedLong;
7285 PtrDiffType = SignedLong;
7286 IntPtrType = SignedLong;
7287 IntMaxType = SignedLong;
7288 Int64Type = SignedLong;
7289 RegParmMax = 5;
7290 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007291 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007292 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007293 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007294 }
7295 MaxAtomicPromoteWidth = 64;
7296 MaxAtomicInlineWidth = 64;
7297 TLSSupported = false;
7298 }
7299 void getTargetDefines(const LangOptions &Opts,
7300 MacroBuilder &Builder) const override {
7301 DefineStd(Builder, "bpf", Opts);
7302 Builder.defineMacro("__BPF__");
7303 }
7304 bool hasFeature(StringRef Feature) const override {
7305 return Feature == "bpf";
7306 }
7307
Craig Topper6c03a542015-10-19 04:51:35 +00007308 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007309 const char *getClobbers() const override {
7310 return "";
7311 }
7312 BuiltinVaListKind getBuiltinVaListKind() const override {
7313 return TargetInfo::VoidPtrBuiltinVaList;
7314 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007315 ArrayRef<const char *> getGCCRegNames() const override {
7316 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007317 }
7318 bool validateAsmConstraint(const char *&Name,
7319 TargetInfo::ConstraintInfo &info) const override {
7320 return true;
7321 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007322 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7323 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007324 }
7325};
7326
Daniel Sanders4672af62016-05-27 11:51:02 +00007327class MipsTargetInfo : public TargetInfo {
7328 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007329 StringRef Layout;
7330
7331 if (ABI == "o32")
7332 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7333 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007334 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007335 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007336 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007337 else
7338 llvm_unreachable("Invalid ABI");
7339
7340 if (BigEndian)
7341 resetDataLayout(("E-" + Layout).str());
7342 else
7343 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007344 }
7345
Akira Hatanaka9064e362013-10-29 18:30:33 +00007346
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007347 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007348 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007349 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007350 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007351 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007352 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007353 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007354 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007355 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007356 enum DspRevEnum {
7357 NoDSP, DSP1, DSP2
7358 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007359 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007360
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007361protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007362 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007363 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007364
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007365public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007366 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007367 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7368 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7369 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007370 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007371
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007372 setABI((getTriple().getArch() == llvm::Triple::mips ||
7373 getTriple().getArch() == llvm::Triple::mipsel)
7374 ? "o32"
7375 : "n64");
7376
7377 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007378 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007379
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007380 bool isNaN2008Default() const {
7381 return CPU == "mips32r6" || CPU == "mips64r6";
7382 }
7383
7384 bool isFP64Default() const {
7385 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7386 }
7387
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007388 bool isNan2008() const override {
7389 return IsNan2008;
7390 }
7391
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007392 bool processorSupportsGPR64() const {
7393 return llvm::StringSwitch<bool>(CPU)
7394 .Case("mips3", true)
7395 .Case("mips4", true)
7396 .Case("mips5", true)
7397 .Case("mips64", true)
7398 .Case("mips64r2", true)
7399 .Case("mips64r3", true)
7400 .Case("mips64r5", true)
7401 .Case("mips64r6", true)
7402 .Case("octeon", true)
7403 .Default(false);
7404 return false;
7405 }
7406
Alp Toker4925ba72014-06-07 23:30:42 +00007407 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007408 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007409 if (Name == "o32") {
7410 setO32ABITypes();
7411 ABI = Name;
7412 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007413 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007414
7415 if (Name == "n32") {
7416 setN32ABITypes();
7417 ABI = Name;
7418 return true;
7419 }
7420 if (Name == "n64") {
7421 setN64ABITypes();
7422 ABI = Name;
7423 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007424 }
7425 return false;
7426 }
7427
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007428 void setO32ABITypes() {
7429 Int64Type = SignedLongLong;
7430 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007431 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007432 LongDoubleWidth = LongDoubleAlign = 64;
7433 LongWidth = LongAlign = 32;
7434 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7435 PointerWidth = PointerAlign = 32;
7436 PtrDiffType = SignedInt;
7437 SizeType = UnsignedInt;
7438 SuitableAlign = 64;
7439 }
7440
7441 void setN32N64ABITypes() {
7442 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007443 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007444 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7445 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007446 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007447 }
7448 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7449 SuitableAlign = 128;
7450 }
7451
Daniel Sanders4672af62016-05-27 11:51:02 +00007452 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007453 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007454 Int64Type = SignedLong;
7455 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007456 LongWidth = LongAlign = 64;
7457 PointerWidth = PointerAlign = 64;
7458 PtrDiffType = SignedLong;
7459 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007460 }
7461
7462 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007463 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007464 Int64Type = SignedLongLong;
7465 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007466 LongWidth = LongAlign = 32;
7467 PointerWidth = PointerAlign = 32;
7468 PtrDiffType = SignedInt;
7469 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007470 }
7471
Craig Topper3164f332014-03-11 03:39:26 +00007472 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007473 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007474 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007475 .Case("mips1", true)
7476 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007477 .Case("mips3", true)
7478 .Case("mips4", true)
7479 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007480 .Case("mips32", true)
7481 .Case("mips32r2", true)
7482 .Case("mips32r3", true)
7483 .Case("mips32r5", true)
7484 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007485 .Case("mips64", true)
7486 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007487 .Case("mips64r3", true)
7488 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007489 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007490 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007491 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007492 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007493 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007494 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007495 bool
7496 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7497 StringRef CPU,
7498 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007499 if (CPU.empty())
7500 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007501 if (CPU == "octeon")
7502 Features["mips64r2"] = Features["cnmips"] = true;
7503 else
7504 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007505 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007506 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007507
Craig Topper3164f332014-03-11 03:39:26 +00007508 void getTargetDefines(const LangOptions &Opts,
7509 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007510 if (BigEndian) {
7511 DefineStd(Builder, "MIPSEB", Opts);
7512 Builder.defineMacro("_MIPSEB");
7513 } else {
7514 DefineStd(Builder, "MIPSEL", Opts);
7515 Builder.defineMacro("_MIPSEL");
7516 }
7517
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007518 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007519 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007520 if (Opts.GNUMode)
7521 Builder.defineMacro("mips");
7522
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007523 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007524 Builder.defineMacro("__mips", "32");
7525 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7526 } else {
7527 Builder.defineMacro("__mips", "64");
7528 Builder.defineMacro("__mips64");
7529 Builder.defineMacro("__mips64__");
7530 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7531 }
7532
7533 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7534 .Cases("mips32", "mips64", "1")
7535 .Cases("mips32r2", "mips64r2", "2")
7536 .Cases("mips32r3", "mips64r3", "3")
7537 .Cases("mips32r5", "mips64r5", "5")
7538 .Cases("mips32r6", "mips64r6", "6")
7539 .Default("");
7540 if (!ISARev.empty())
7541 Builder.defineMacro("__mips_isa_rev", ISARev);
7542
7543 if (ABI == "o32") {
7544 Builder.defineMacro("__mips_o32");
7545 Builder.defineMacro("_ABIO32", "1");
7546 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007547 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007548 Builder.defineMacro("__mips_n32");
7549 Builder.defineMacro("_ABIN32", "2");
7550 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7551 } else if (ABI == "n64") {
7552 Builder.defineMacro("__mips_n64");
7553 Builder.defineMacro("_ABI64", "3");
7554 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7555 } else
7556 llvm_unreachable("Invalid ABI.");
7557
Simon Atanasyan683535b2012-08-29 19:14:58 +00007558 Builder.defineMacro("__REGISTER_PREFIX__", "");
7559
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007560 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007561 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007562 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007563 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007564 case SoftFloat:
7565 Builder.defineMacro("__mips_soft_float", Twine(1));
7566 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007567 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007568
Simon Atanasyan16071912013-04-14 14:07:30 +00007569 if (IsSingleFloat)
7570 Builder.defineMacro("__mips_single_float", Twine(1));
7571
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007572 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7573 Builder.defineMacro("_MIPS_FPSET",
7574 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7575
Simon Atanasyan72244b62012-07-05 16:06:06 +00007576 if (IsMips16)
7577 Builder.defineMacro("__mips16", Twine(1));
7578
Simon Atanasyan60777612013-04-14 14:07:51 +00007579 if (IsMicromips)
7580 Builder.defineMacro("__mips_micromips", Twine(1));
7581
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007582 if (IsNan2008)
7583 Builder.defineMacro("__mips_nan2008", Twine(1));
7584
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007585 switch (DspRev) {
7586 default:
7587 break;
7588 case DSP1:
7589 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7590 Builder.defineMacro("__mips_dsp", Twine(1));
7591 break;
7592 case DSP2:
7593 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7594 Builder.defineMacro("__mips_dspr2", Twine(1));
7595 Builder.defineMacro("__mips_dsp", Twine(1));
7596 break;
7597 }
7598
Jack Carter44ff1e52013-08-12 17:20:29 +00007599 if (HasMSA)
7600 Builder.defineMacro("__mips_msa", Twine(1));
7601
Simon Atanasyan26f19672012-04-05 19:28:31 +00007602 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7603 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7604 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007605
7606 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7607 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007608
7609 // These shouldn't be defined for MIPS-I but there's no need to check
7610 // for that since MIPS-I isn't supported.
7611 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7612 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7613 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007614
7615 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7616 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7617 // the instructions exist but using them violates the ABI since they
7618 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7619 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007620 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007621 }
7622
Craig Topper6c03a542015-10-19 04:51:35 +00007623 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7624 return llvm::makeArrayRef(BuiltinInfo,
7625 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007626 }
Craig Topper3164f332014-03-11 03:39:26 +00007627 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007628 return llvm::StringSwitch<bool>(Feature)
7629 .Case("mips", true)
7630 .Case("fp64", HasFP64)
7631 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007632 }
Craig Topper3164f332014-03-11 03:39:26 +00007633 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007634 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007635 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007636 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007637 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007638 // CPU register names
7639 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007640 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7641 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7642 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007643 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7644 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007645 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7646 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7647 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7648 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007649 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007650 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007651 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7652 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007653 // MSA register names
7654 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7655 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7656 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7657 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7658 // MSA control register names
7659 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7660 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007661 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007662 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007663 }
Craig Topper3164f332014-03-11 03:39:26 +00007664 bool validateAsmConstraint(const char *&Name,
7665 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007666 switch (*Name) {
7667 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007668 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007669 case 'r': // CPU registers.
7670 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007671 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007672 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007673 case 'c': // $25 for indirect jumps
7674 case 'l': // lo register
7675 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007676 Info.setAllowsRegister();
7677 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007678 case 'I': // Signed 16-bit constant
7679 case 'J': // Integer 0
7680 case 'K': // Unsigned 16-bit constant
7681 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7682 case 'M': // Constants not loadable via lui, addiu, or ori
7683 case 'N': // Constant -1 to -65535
7684 case 'O': // A signed 15-bit constant
7685 case 'P': // A constant between 1 go 65535
7686 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007687 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007688 Info.setAllowsMemory();
7689 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007690 case 'Z':
7691 if (Name[1] == 'C') { // An address usable by ll, and sc.
7692 Info.setAllowsMemory();
7693 Name++; // Skip over 'Z'.
7694 return true;
7695 }
7696 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007697 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007698 }
7699
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007700 std::string convertConstraint(const char *&Constraint) const override {
7701 std::string R;
7702 switch (*Constraint) {
7703 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7704 if (Constraint[1] == 'C') {
7705 R = std::string("^") + std::string(Constraint, 2);
7706 Constraint++;
7707 return R;
7708 }
7709 break;
7710 }
7711 return TargetInfo::convertConstraint(Constraint);
7712 }
7713
Craig Topper3164f332014-03-11 03:39:26 +00007714 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007715 // In GCC, $1 is not widely used in generated code (it's used only in a few
7716 // specific situations), so there is no real need for users to add it to
7717 // the clobbers list if they want to use it in their inline assembly code.
7718 //
7719 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7720 // code generation, so using it in inline assembly without adding it to the
7721 // clobbers list can cause conflicts between the inline assembly code and
7722 // the surrounding generated code.
7723 //
7724 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7725 // operands, which will conflict with the ".set at" assembler option (which
7726 // we use only for inline assembly, in order to maintain compatibility with
7727 // GCC) and will also conflict with the user's usage of $1.
7728 //
7729 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7730 // register for generated code is to automatically clobber $1 for all inline
7731 // assembly code.
7732 //
7733 // FIXME: We should automatically clobber $1 only for inline assembly code
7734 // which actually uses it. This would allow LLVM to use $1 for inline
7735 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007736 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007737 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007738
Craig Topper3164f332014-03-11 03:39:26 +00007739 bool handleTargetFeatures(std::vector<std::string> &Features,
7740 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007741 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007742 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007743 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007744 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007745 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007746 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007747 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007748
Eric Christopher610fe112015-08-26 08:21:55 +00007749 for (const auto &Feature : Features) {
7750 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007751 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007752 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007753 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007754 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007755 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007756 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007757 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007758 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007759 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007760 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007761 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007762 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007763 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007764 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007765 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007766 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007767 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007768 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007769 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007770 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007771 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007772 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007773
James Y Knightb214cbc2016-03-04 19:00:41 +00007774 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007775
Rafael Espindolaeb265472013-08-21 21:59:03 +00007776 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007777 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007778
Craig Topper3164f332014-03-11 03:39:26 +00007779 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007780 if (RegNo == 0) return 4;
7781 if (RegNo == 1) return 5;
7782 return -1;
7783 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007784
7785 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007786
7787 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7788 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7789 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7790 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7791 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7792 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7793 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7794 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7795 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7796 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7797 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7798 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7799 {{"ra"}, "$31"}};
7800 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7801 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7802 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7803 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7804 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7805 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7806 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7807 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7808 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7809 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7810 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7811 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007812 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007813 return llvm::makeArrayRef(O32RegAliases);
7814 return llvm::makeArrayRef(NewABIRegAliases);
7815 }
7816
7817 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007818 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007819 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007820
7821 bool validateTarget(DiagnosticsEngine &Diags) const override {
7822 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7823 // this yet. It's better to fail here than on the backend assertion.
7824 if (processorSupportsGPR64() && ABI == "o32") {
7825 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7826 return false;
7827 }
7828
7829 // 64-bit ABI's require 64-bit CPU's.
7830 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7831 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7832 return false;
7833 }
7834
7835 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7836 // can't handle this yet. It's better to fail here than on the
7837 // backend assertion.
7838 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7839 getTriple().getArch() == llvm::Triple::mips64el) &&
7840 ABI == "o32") {
7841 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7842 << ABI << getTriple().str();
7843 return false;
7844 }
7845
7846 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7847 // can't handle this yet. It's better to fail here than on the
7848 // backend assertion.
7849 if ((getTriple().getArch() == llvm::Triple::mips ||
7850 getTriple().getArch() == llvm::Triple::mipsel) &&
7851 (ABI == "n32" || ABI == "n64")) {
7852 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7853 << ABI << getTriple().str();
7854 return false;
7855 }
7856
7857 return true;
7858 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007859};
7860
Daniel Sanders4672af62016-05-27 11:51:02 +00007861const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007862#define BUILTIN(ID, TYPE, ATTRS) \
7863 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7864#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7865 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007866#include "clang/Basic/BuiltinsMips.def"
7867};
7868
Ivan Krasindd7403e2011-08-24 20:22:22 +00007869class PNaClTargetInfo : public TargetInfo {
7870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007871 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7872 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007873 this->LongAlign = 32;
7874 this->LongWidth = 32;
7875 this->PointerAlign = 32;
7876 this->PointerWidth = 32;
7877 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007878 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007879 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007880 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007881 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007882 this->SizeType = TargetInfo::UnsignedInt;
7883 this->PtrDiffType = TargetInfo::SignedInt;
7884 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007885 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007886 }
7887
Craig Toppere6f17d02014-03-11 04:07:52 +00007888 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007889 Builder.defineMacro("__le32__");
7890 Builder.defineMacro("__pnacl__");
7891 }
Craig Topper3164f332014-03-11 03:39:26 +00007892 void getTargetDefines(const LangOptions &Opts,
7893 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007894 getArchDefines(Opts, Builder);
7895 }
Craig Topper3164f332014-03-11 03:39:26 +00007896 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007897 return Feature == "pnacl";
7898 }
Craig Topper6c03a542015-10-19 04:51:35 +00007899 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007900 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007901 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007902 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007903 ArrayRef<const char *> getGCCRegNames() const override;
7904 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007905 bool validateAsmConstraint(const char *&Name,
7906 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007907 return false;
7908 }
7909
Craig Topper3164f332014-03-11 03:39:26 +00007910 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007911 return "";
7912 }
7913};
7914
Craig Topperf054e3a2015-10-19 03:52:27 +00007915ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7916 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007917}
7918
Craig Topperf054e3a2015-10-19 03:52:27 +00007919ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7920 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007921}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007922
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007923// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007924class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007925public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007926 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7927 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007928
7929 BuiltinVaListKind getBuiltinVaListKind() const override {
7930 return TargetInfo::PNaClABIBuiltinVaList;
7931 }
7932};
7933
JF Bastien643817d2014-09-12 17:52:47 +00007934class Le64TargetInfo : public TargetInfo {
7935 static const Builtin::Info BuiltinInfo[];
7936
7937public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007938 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7939 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007940 NoAsmVariants = true;
7941 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7942 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007943 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007944 }
7945
7946 void getTargetDefines(const LangOptions &Opts,
7947 MacroBuilder &Builder) const override {
7948 DefineStd(Builder, "unix", Opts);
7949 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7950 Builder.defineMacro("__ELF__");
7951 }
Craig Topper6c03a542015-10-19 04:51:35 +00007952 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7953 return llvm::makeArrayRef(BuiltinInfo,
7954 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007955 }
7956 BuiltinVaListKind getBuiltinVaListKind() const override {
7957 return TargetInfo::PNaClABIBuiltinVaList;
7958 }
7959 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007960 ArrayRef<const char *> getGCCRegNames() const override {
7961 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007962 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007963 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7964 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007965 }
7966 bool validateAsmConstraint(const char *&Name,
7967 TargetInfo::ConstraintInfo &Info) const override {
7968 return false;
7969 }
7970
7971 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007972};
Dan Gohmanc2853072015-09-03 22:51:53 +00007973
7974class WebAssemblyTargetInfo : public TargetInfo {
7975 static const Builtin::Info BuiltinInfo[];
7976
7977 enum SIMDEnum {
7978 NoSIMD,
7979 SIMD128,
7980 } SIMDLevel;
7981
7982public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007983 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007984 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007985 NoAsmVariants = true;
7986 SuitableAlign = 128;
7987 LargeArrayMinWidth = 128;
7988 LargeArrayAlign = 128;
7989 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007990 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007991 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007992 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00007993 SizeType = UnsignedInt;
7994 PtrDiffType = SignedInt;
7995 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007996 }
7997
7998protected:
7999 void getTargetDefines(const LangOptions &Opts,
8000 MacroBuilder &Builder) const override {
8001 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8002 if (SIMDLevel >= SIMD128)
8003 Builder.defineMacro("__wasm_simd128__");
8004 }
8005
8006private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008007 bool
8008 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8009 StringRef CPU,
8010 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008011 if (CPU == "bleeding-edge")
8012 Features["simd128"] = true;
8013 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8014 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008015 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008016 return llvm::StringSwitch<bool>(Feature)
8017 .Case("simd128", SIMDLevel >= SIMD128)
8018 .Default(false);
8019 }
8020 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008021 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008022 for (const auto &Feature : Features) {
8023 if (Feature == "+simd128") {
8024 SIMDLevel = std::max(SIMDLevel, SIMD128);
8025 continue;
8026 }
8027 if (Feature == "-simd128") {
8028 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8029 continue;
8030 }
8031
8032 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8033 << "-target-feature";
8034 return false;
8035 }
8036 return true;
8037 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008038 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008039 return llvm::StringSwitch<bool>(Name)
8040 .Case("mvp", true)
8041 .Case("bleeding-edge", true)
8042 .Case("generic", true)
8043 .Default(false);
8044 }
Craig Topper6c03a542015-10-19 04:51:35 +00008045 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8046 return llvm::makeArrayRef(BuiltinInfo,
8047 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008048 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008049 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008050 return VoidPtrBuiltinVaList;
8051 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008052 ArrayRef<const char *> getGCCRegNames() const final {
8053 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008054 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008055 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8056 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008057 }
8058 bool
8059 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008060 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008061 return false;
8062 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008063 const char *getClobbers() const final { return ""; }
8064 bool isCLZForZeroUndef() const final { return false; }
8065 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008066 IntType getIntTypeByWidth(unsigned BitWidth,
8067 bool IsSigned) const final {
8068 // WebAssembly prefers long long for explicitly 64-bit integers.
8069 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8070 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8071 }
8072 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8073 bool IsSigned) const final {
8074 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8075 return BitWidth == 64
8076 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8077 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8078 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008079};
8080
8081const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8082#define BUILTIN(ID, TYPE, ATTRS) \
8083 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8084#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8085 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8086#include "clang/Basic/BuiltinsWebAssembly.def"
8087};
8088
8089class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8090public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008091 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8092 const TargetOptions &Opts)
8093 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008094 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008095 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008096 }
8097
8098protected:
8099 void getTargetDefines(const LangOptions &Opts,
8100 MacroBuilder &Builder) const override {
8101 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8102 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8103 }
8104};
8105
8106class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008108 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8109 const TargetOptions &Opts)
8110 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008111 LongAlign = LongWidth = 64;
8112 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008113 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008114 SizeType = UnsignedLong;
8115 PtrDiffType = SignedLong;
8116 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008117 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008118 }
8119
8120protected:
8121 void getTargetDefines(const LangOptions &Opts,
8122 MacroBuilder &Builder) const override {
8123 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8124 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8125 }
8126};
8127
JF Bastien643817d2014-09-12 17:52:47 +00008128const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8129#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008130 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008131#include "clang/Basic/BuiltinsLe64.def"
8132};
8133
Eric Christopherc48497a2015-09-18 21:26:24 +00008134static const unsigned SPIRAddrSpaceMap[] = {
8135 1, // opencl_global
8136 3, // opencl_local
8137 2, // opencl_constant
8138 4, // opencl_generic
8139 0, // cuda_device
8140 0, // cuda_constant
8141 0 // cuda_shared
8142};
8143class SPIRTargetInfo : public TargetInfo {
8144public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008145 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8146 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008147 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8148 "SPIR target must use unknown OS");
8149 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8150 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008151 TLSSupported = false;
8152 LongWidth = LongAlign = 64;
8153 AddrSpaceMap = &SPIRAddrSpaceMap;
8154 UseAddrSpaceMapMangling = true;
8155 // Define available target features
8156 // These must be defined in sorted order!
8157 NoAsmVariants = true;
8158 }
8159 void getTargetDefines(const LangOptions &Opts,
8160 MacroBuilder &Builder) const override {
8161 DefineStd(Builder, "SPIR", Opts);
8162 }
8163 bool hasFeature(StringRef Feature) const override {
8164 return Feature == "spir";
8165 }
Craig Topper3164f332014-03-11 03:39:26 +00008166
Craig Topper6c03a542015-10-19 04:51:35 +00008167 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008168 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008169 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008170 bool validateAsmConstraint(const char *&Name,
8171 TargetInfo::ConstraintInfo &info) const override {
8172 return true;
8173 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008174 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8175 return None;
8176 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008177 BuiltinVaListKind getBuiltinVaListKind() const override {
8178 return TargetInfo::VoidPtrBuiltinVaList;
8179 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008180
Eric Christopherc48497a2015-09-18 21:26:24 +00008181 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008182 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8183 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008184 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008185
Eric Christopherc48497a2015-09-18 21:26:24 +00008186 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8187 return CC_SpirFunction;
8188 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008189
8190 void setSupportedOpenCLOpts() override {
8191 // Assume all OpenCL extensions and optional core features are supported
8192 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008193 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008194 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008195};
Guy Benyeib798fc92012-12-11 21:38:14 +00008196
Eric Christopherc48497a2015-09-18 21:26:24 +00008197class SPIR32TargetInfo : public SPIRTargetInfo {
8198public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008199 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8200 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008201 PointerWidth = PointerAlign = 32;
8202 SizeType = TargetInfo::UnsignedInt;
8203 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008204 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8205 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008206 }
8207 void getTargetDefines(const LangOptions &Opts,
8208 MacroBuilder &Builder) const override {
8209 DefineStd(Builder, "SPIR32", Opts);
8210 }
8211};
Guy Benyeib798fc92012-12-11 21:38:14 +00008212
Eric Christopherc48497a2015-09-18 21:26:24 +00008213class SPIR64TargetInfo : public SPIRTargetInfo {
8214public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8216 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008217 PointerWidth = PointerAlign = 64;
8218 SizeType = TargetInfo::UnsignedLong;
8219 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008220 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8221 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008222 }
8223 void getTargetDefines(const LangOptions &Opts,
8224 MacroBuilder &Builder) const override {
8225 DefineStd(Builder, "SPIR64", Opts);
8226 }
8227};
Guy Benyeib798fc92012-12-11 21:38:14 +00008228
Robert Lytton0e076492013-08-13 09:43:10 +00008229class XCoreTargetInfo : public TargetInfo {
8230 static const Builtin::Info BuiltinInfo[];
8231public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008232 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8233 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008234 NoAsmVariants = true;
8235 LongLongAlign = 32;
8236 SuitableAlign = 32;
8237 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008238 SizeType = UnsignedInt;
8239 PtrDiffType = SignedInt;
8240 IntPtrType = SignedInt;
8241 WCharType = UnsignedChar;
8242 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008243 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008244 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8245 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008246 }
Craig Topper3164f332014-03-11 03:39:26 +00008247 void getTargetDefines(const LangOptions &Opts,
8248 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008249 Builder.defineMacro("__XS1B__");
8250 }
Craig Topper6c03a542015-10-19 04:51:35 +00008251 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8252 return llvm::makeArrayRef(BuiltinInfo,
8253 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008254 }
Craig Topper3164f332014-03-11 03:39:26 +00008255 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008256 return TargetInfo::VoidPtrBuiltinVaList;
8257 }
Craig Topper3164f332014-03-11 03:39:26 +00008258 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008259 return "";
8260 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008261 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008262 static const char * const GCCRegNames[] = {
8263 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8264 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8265 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008266 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008267 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008268 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8269 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008270 }
Craig Topper3164f332014-03-11 03:39:26 +00008271 bool validateAsmConstraint(const char *&Name,
8272 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008273 return false;
8274 }
Craig Topper3164f332014-03-11 03:39:26 +00008275 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008276 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8277 return (RegNo < 2)? RegNo : -1;
8278 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008279 bool allowsLargerPreferedTypeAlignment() const override {
8280 return false;
8281 }
Robert Lytton0e076492013-08-13 09:43:10 +00008282};
8283
8284const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008285#define BUILTIN(ID, TYPE, ATTRS) \
8286 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8287#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8288 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008289#include "clang/Basic/BuiltinsXCore.def"
8290};
Robert Lytton0e076492013-08-13 09:43:10 +00008291
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008292// x86_32 Android target
8293class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8294public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8296 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008297 SuitableAlign = 32;
8298 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008299 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008300 }
8301};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008302
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008303// x86_64 Android target
8304class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8305public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008306 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8307 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008308 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008309 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008310
8311 bool useFloat128ManglingForLongDouble() const override {
8312 return true;
8313 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008314};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008315
8316// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8317class RenderScript32TargetInfo : public ARMleTargetInfo {
8318public:
8319 RenderScript32TargetInfo(const llvm::Triple &Triple,
8320 const TargetOptions &Opts)
8321 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8322 Triple.getOSName(),
8323 Triple.getEnvironmentName()),
8324 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008325 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008326 LongWidth = LongAlign = 64;
8327 }
8328 void getTargetDefines(const LangOptions &Opts,
8329 MacroBuilder &Builder) const override {
8330 Builder.defineMacro("__RENDERSCRIPT__");
8331 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8332 }
8333};
8334
8335// 64-bit RenderScript is aarch64
8336class RenderScript64TargetInfo : public AArch64leTargetInfo {
8337public:
8338 RenderScript64TargetInfo(const llvm::Triple &Triple,
8339 const TargetOptions &Opts)
8340 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8341 Triple.getOSName(),
8342 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008343 Opts) {
8344 IsRenderScriptTarget = true;
8345 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008346
8347 void getTargetDefines(const LangOptions &Opts,
8348 MacroBuilder &Builder) const override {
8349 Builder.defineMacro("__RENDERSCRIPT__");
8350 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8351 }
8352};
8353
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008354} // end anonymous namespace
8355
Chris Lattner5ba61f02006-10-14 07:39:34 +00008356//===----------------------------------------------------------------------===//
8357// Driver code
8358//===----------------------------------------------------------------------===//
8359
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8361 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008362 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008363
Daniel Dunbar52322032009-08-18 05:47:58 +00008364 switch (Triple.getArch()) {
8365 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008366 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008367
Tim Northover2a0783d2014-05-30 14:14:07 +00008368 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008370
8371 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008373
Jacques Pienaard964cc22016-03-28 21:02:54 +00008374 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008376
Tim Northover2a0783d2014-05-30 14:14:07 +00008377 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008378 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008380
8381 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008382 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008383 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008384 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008386 case llvm::Triple::Fuchsia:
8387 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008388 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008390 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008392 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008394 }
8395
Christian Pirker9b019ae2014-02-25 13:51:00 +00008396 case llvm::Triple::aarch64_be:
8397 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008398 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008400 case llvm::Triple::Fuchsia:
8401 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008402 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008404 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008406 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008408 }
8409
Daniel Dunbar52322032009-08-18 05:47:58 +00008410 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008411 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008412 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008414
Daniel Dunbar52322032009-08-18 05:47:58 +00008415 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008416 case llvm::Triple::CloudABI:
8417 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008418 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008420 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008422 case llvm::Triple::Fuchsia:
8423 return new FuchsiaTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008424 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008426 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008428 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008430 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008432 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008434 case llvm::Triple::Win32:
8435 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008436 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008438 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008440 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008442 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008443 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008445 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008446 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008448 }
8449
8450 case llvm::Triple::armeb:
8451 case llvm::Triple::thumbeb:
8452 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008453 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008454
8455 switch (os) {
8456 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008458 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008460 case llvm::Triple::Fuchsia:
8461 return new FuchsiaTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008462 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008464 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008466 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008468 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008470 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008472 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008474 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008475
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008476 case llvm::Triple::bpfeb:
8477 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008478 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008479
Daniel Dunbar52322032009-08-18 05:47:58 +00008480 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008482
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008483 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008484 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008485 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008486 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008487 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008488 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008489 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008490 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008491 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008492 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008493 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008494 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008495 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008496
8497 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008498 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008499 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008500 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008501 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008502 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008503 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008504 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008505 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008506 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008507 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008508 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008509 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008510 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008511 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008512
Akira Hatanakabef17452011-09-20 19:21:49 +00008513 case llvm::Triple::mips64:
8514 switch (os) {
8515 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008516 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008517 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008518 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008519 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008520 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008521 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008522 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008523 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008524 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008525 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008526 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008527 }
8528
8529 case llvm::Triple::mips64el:
8530 switch (os) {
8531 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008532 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008533 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008534 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008535 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008536 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008537 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008538 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008539 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008540 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008541 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008542 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008543 }
8544
Ivan Krasindd7403e2011-08-24 20:22:22 +00008545 case llvm::Triple::le32:
8546 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008547 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008548 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008549 default:
8550 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008551 }
8552
JF Bastien643817d2014-09-12 17:52:47 +00008553 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008555
Daniel Dunbar52322032009-08-18 05:47:58 +00008556 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008557 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008559 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008560 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008562 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008563 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008564 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008566 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008568 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008569 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008570 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008571 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008572 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008573
8574 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008575 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008577 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008578 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008579 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008580 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008581 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008582 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008584 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008585 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008586 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008588 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008589
Bill Schmidt778d3872013-07-26 01:36:11 +00008590 case llvm::Triple::ppc64le:
8591 switch (os) {
8592 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008594 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008596 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008597 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008598 }
8599
Peter Collingbournec947aae2012-05-20 23:28:41 +00008600 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008602 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008603 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008604
Tom Stellardd8e38a32015-01-06 20:34:47 +00008605 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008606 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008607 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008608
Daniel Dunbar52322032009-08-18 05:47:58 +00008609 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008610 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008611 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008612 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008613 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008615 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008616 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008617 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008618 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008619 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008620 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008621 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008622 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008623 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008624
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008625 // The 'sparcel' architecture copies all the above cases except for Solaris.
8626 case llvm::Triple::sparcel:
8627 switch (os) {
8628 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008629 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008630 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008631 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008632 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008633 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008634 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008635 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008636 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008637 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008638 }
8639
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008640 case llvm::Triple::sparcv9:
8641 switch (os) {
8642 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008643 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008644 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008645 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008646 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008647 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008648 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008649 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008650 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008651 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008652 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008653 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008654 }
8655
Ulrich Weigand47445072013-05-06 16:26:41 +00008656 case llvm::Triple::systemz:
8657 switch (os) {
8658 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008659 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008660 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008661 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008662 }
8663
Eli Friedmana9c3d712009-08-19 20:47:07 +00008664 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008665 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008666
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00008667 case llvm::Triple::tcele:
8668 return new TCELETargetInfo(Triple, Opts);
8669
Daniel Dunbar52322032009-08-18 05:47:58 +00008670 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008671 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008672 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008673
Daniel Dunbar52322032009-08-18 05:47:58 +00008674 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008675 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008676 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008677 case llvm::Triple::Linux: {
8678 switch (Triple.getEnvironment()) {
8679 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008680 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008681 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008682 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008683 }
8684 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008685 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008686 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008687 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008688 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008689 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008690 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008691 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008692 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008693 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008694 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008695 case llvm::Triple::Fuchsia:
8696 return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008697 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008698 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008699 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008700 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008701 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008702 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008703 case llvm::Triple::Win32: {
8704 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008705 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008706 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008707 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008708 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008709 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008710 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008711 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008712 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008713 }
8714 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008715 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008716 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008717 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008718 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008719 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008720 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008721 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008722 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008723 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008724 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008725 }
8726
8727 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008728 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008729 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008730
Daniel Dunbar52322032009-08-18 05:47:58 +00008731 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008732 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008733 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008734 case llvm::Triple::Linux: {
8735 switch (Triple.getEnvironment()) {
8736 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008737 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008738 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008739 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008740 }
8741 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008742 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008743 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008744 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008745 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008746 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008747 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008748 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008749 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008750 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008751 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008752 case llvm::Triple::Fuchsia:
8753 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008754 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008755 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008756 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008757 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008758 case llvm::Triple::Win32: {
8759 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008760 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008761 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008762 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008763 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008764 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008765 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008766 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008767 }
8768 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008769 case llvm::Triple::Haiku:
8770 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008771 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008772 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008773 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008774 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008775 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008776 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008777 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008778
Douglas Katzman78d7c542015-05-12 21:18:10 +00008779 case llvm::Triple::spir: {
8780 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8781 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8782 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008783 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008784 }
8785 case llvm::Triple::spir64: {
8786 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8787 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8788 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008789 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008790 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008791 case llvm::Triple::wasm32:
8792 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8793 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008794 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008795 case llvm::Triple::wasm64:
8796 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8797 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008798 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008799
8800 case llvm::Triple::renderscript32:
8801 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8802 case llvm::Triple::renderscript64:
8803 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008804 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008805}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008806
8807/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008808/// options.
Alp Toker80758082014-07-06 05:26:44 +00008809TargetInfo *
8810TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008811 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008812 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008813
8814 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008815 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008816 if (!Target) {
8817 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008818 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008819 }
Alp Toker80758082014-07-06 05:26:44 +00008820 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008821
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008822 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008823 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8824 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008825 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008826 }
8827
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008828 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008829 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8830 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008831 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008832 }
8833
Rafael Espindolaeb265472013-08-21 21:59:03 +00008834 // Set the fp math unit.
8835 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8836 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008837 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008838 }
8839
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008840 // Compute the default target features, we need the target to handle this
8841 // because features may have dependencies on one another.
8842 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008843 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8844 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008845 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008846
8847 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008848 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008849 for (const auto &F : Features)
8850 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8851
Eric Christopher3ff21b32013-10-16 21:26:26 +00008852 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008853 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008854
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008855 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00008856 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008857
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008858 if (!Target->validateTarget(Diags))
8859 return nullptr;
8860
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008861 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008862}