blob: 9a74cdf6f2ba1e3d8dcb0cce47ddb71a6b4ce138 [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.
Derek Schuff57b7e8f2012-10-11 16:55:58 +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;
909 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
910 }
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 &&
1149 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1150 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;
Roman Divacky816dcd12012-03-13 16:53:54 +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;
Roman Divacky816dcd12012-03-13 16:53:54 +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();
1927 Opts.cl_clang_storage_class_specifiers = 1;
1928 Opts.cl_khr_gl_sharing = 1;
1929 Opts.cl_khr_icd = 1;
1930
1931 Opts.cl_khr_fp64 = 1;
1932 Opts.cl_khr_byte_addressable_store = 1;
1933 Opts.cl_khr_global_int32_base_atomics = 1;
1934 Opts.cl_khr_global_int32_extended_atomics = 1;
1935 Opts.cl_khr_local_int32_base_atomics = 1;
1936 Opts.cl_khr_local_int32_extended_atomics = 1;
1937 }
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();
2211 Opts.cl_clang_storage_class_specifiers = 1;
2212 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002213
Jan Vesely211ba782016-06-17 02:25:03 +00002214 if (hasFP64)
2215 Opts.cl_khr_fp64 = 1;
2216 if (GPU >= GK_EVERGREEN) {
2217 Opts.cl_khr_byte_addressable_store = 1;
2218 Opts.cl_khr_global_int32_base_atomics = 1;
2219 Opts.cl_khr_global_int32_extended_atomics = 1;
2220 Opts.cl_khr_local_int32_base_atomics = 1;
2221 Opts.cl_khr_local_int32_extended_atomics = 1;
2222 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002223 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002224 Opts.cl_khr_fp16 = 1;
2225 Opts.cl_khr_int64_base_atomics = 1;
2226 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002227 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002228 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002229 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002230 Opts.cl_amd_media_ops = 1;
2231 Opts.cl_amd_media_ops2 = 1;
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 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002248};
2249
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002250const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002251#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002252 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002253#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2254 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002255#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002256};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002257const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002258 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2259 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2260 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2261 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2262 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2263 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2264 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2265 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2266 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2267 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2268 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2269 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2270 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2271 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2272 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2273 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2274 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2275 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2276 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2277 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2278 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2279 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2280 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2281 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2282 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2283 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2284 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2285 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2286 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2287 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2288 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2289 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2290 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2291 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2292 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2293 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2294 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2295 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2296 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2297 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2298 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2299 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2300 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2301 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2302 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2303 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2304 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002305 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002306 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2307 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002308};
2309
Craig Topperf054e3a2015-10-19 03:52:27 +00002310ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2311 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002312}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002313
Matt Arsenault250024f2016-06-08 01:56:42 +00002314bool AMDGPUTargetInfo::initFeatureMap(
2315 llvm::StringMap<bool> &Features,
2316 DiagnosticsEngine &Diags, StringRef CPU,
2317 const std::vector<std::string> &FeatureVec) const {
2318
2319 // XXX - What does the member GPU mean if device name string passed here?
2320 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2321 if (CPU.empty())
2322 CPU = "tahiti";
2323
2324 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002325 case GK_GFX6:
2326 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002327 break;
2328
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002329 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002330 Features["s-memrealtime"] = true;
2331 Features["16-bit-insts"] = true;
2332 break;
2333
2334 case GK_NONE:
2335 return false;
2336 default:
2337 llvm_unreachable("unhandled subtarget");
2338 }
2339 } else {
2340 if (CPU.empty())
2341 CPU = "r600";
2342
2343 switch (parseR600Name(CPU)) {
2344 case GK_R600:
2345 case GK_R700:
2346 case GK_EVERGREEN:
2347 case GK_NORTHERN_ISLANDS:
2348 break;
2349 case GK_R600_DOUBLE_OPS:
2350 case GK_R700_DOUBLE_OPS:
2351 case GK_EVERGREEN_DOUBLE_OPS:
2352 case GK_CAYMAN:
2353 Features["fp64"] = true;
2354 break;
2355 case GK_NONE:
2356 return false;
2357 default:
2358 llvm_unreachable("unhandled subtarget");
2359 }
2360 }
2361
2362 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2363}
2364
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002365const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002366#define BUILTIN(ID, TYPE, ATTRS) \
2367 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002368#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002369 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002370#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2371 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002372#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002373
2374#define BUILTIN(ID, TYPE, ATTRS) \
2375 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002376#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2377 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002378#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2379 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2380#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002381};
Eli Friedmanb5366062008-05-20 14:21:01 +00002382
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002383
Nuno Lopescfca1f02009-12-23 17:49:57 +00002384static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002385 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2386 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002387 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002388 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2389 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2390 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002391 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002392 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2393 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002394 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2395 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2396 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2397 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2398 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2399 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2400 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2401 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002402 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002403};
2404
Eric Christophercdd36352011-06-21 00:05:20 +00002405const TargetInfo::AddlRegName AddlRegNames[] = {
2406 { { "al", "ah", "eax", "rax" }, 0 },
2407 { { "bl", "bh", "ebx", "rbx" }, 3 },
2408 { { "cl", "ch", "ecx", "rcx" }, 2 },
2409 { { "dl", "dh", "edx", "rdx" }, 1 },
2410 { { "esi", "rsi" }, 4 },
2411 { { "edi", "rdi" }, 5 },
2412 { { "esp", "rsp" }, 7 },
2413 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002414 { { "r8d", "r8w", "r8b" }, 38 },
2415 { { "r9d", "r9w", "r9b" }, 39 },
2416 { { "r10d", "r10w", "r10b" }, 40 },
2417 { { "r11d", "r11w", "r11b" }, 41 },
2418 { { "r12d", "r12w", "r12b" }, 42 },
2419 { { "r13d", "r13w", "r13b" }, 43 },
2420 { { "r14d", "r14w", "r14b" }, 44 },
2421 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002422};
2423
2424// X86 target abstract base class; x86-32 and x86-64 are very close, so
2425// most of the implementation can be shared.
2426class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002427 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002428 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002429 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002430 enum MMX3DNowEnum {
2431 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002432 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002433 enum XOPEnum {
2434 NoXOP,
2435 SSE4A,
2436 FMA4,
2437 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002438 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002439
Craig Topper543f3bd2015-10-14 23:47:57 +00002440 bool HasAES = false;
2441 bool HasPCLMUL = false;
2442 bool HasLZCNT = false;
2443 bool HasRDRND = false;
2444 bool HasFSGSBASE = false;
2445 bool HasBMI = false;
2446 bool HasBMI2 = false;
2447 bool HasPOPCNT = false;
2448 bool HasRTM = false;
2449 bool HasPRFCHW = false;
2450 bool HasRDSEED = false;
2451 bool HasADX = false;
2452 bool HasTBM = false;
2453 bool HasFMA = false;
2454 bool HasF16C = false;
2455 bool HasAVX512CD = false;
2456 bool HasAVX512ER = false;
2457 bool HasAVX512PF = false;
2458 bool HasAVX512DQ = false;
2459 bool HasAVX512BW = false;
2460 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002461 bool HasAVX512VBMI = false;
2462 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002463 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002464 bool HasMPX = false;
2465 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002466 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002467 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002468 bool HasXSAVE = false;
2469 bool HasXSAVEOPT = false;
2470 bool HasXSAVEC = false;
2471 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002472 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002473 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002474 bool HasCLFLUSHOPT = false;
2475 bool HasPCOMMIT = false;
2476 bool HasCLWB = false;
2477 bool HasUMIP = false;
2478 bool HasMOVBE = false;
2479 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002480
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002481 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2482 ///
2483 /// Each enumeration represents a particular CPU supported by Clang. These
2484 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2485 enum CPUKind {
2486 CK_Generic,
2487
2488 /// \name i386
2489 /// i386-generation processors.
2490 //@{
2491 CK_i386,
2492 //@}
2493
2494 /// \name i486
2495 /// i486-generation processors.
2496 //@{
2497 CK_i486,
2498 CK_WinChipC6,
2499 CK_WinChip2,
2500 CK_C3,
2501 //@}
2502
2503 /// \name i586
2504 /// i586-generation processors, P5 microarchitecture based.
2505 //@{
2506 CK_i586,
2507 CK_Pentium,
2508 CK_PentiumMMX,
2509 //@}
2510
2511 /// \name i686
2512 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2513 //@{
2514 CK_i686,
2515 CK_PentiumPro,
2516 CK_Pentium2,
2517 CK_Pentium3,
2518 CK_Pentium3M,
2519 CK_PentiumM,
2520 CK_C3_2,
2521
2522 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2523 /// Clang however has some logic to suport this.
2524 // FIXME: Warn, deprecate, and potentially remove this.
2525 CK_Yonah,
2526 //@}
2527
2528 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002529 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002530 //@{
2531 CK_Pentium4,
2532 CK_Pentium4M,
2533 CK_Prescott,
2534 CK_Nocona,
2535 //@}
2536
2537 /// \name Core
2538 /// Core microarchitecture based processors.
2539 //@{
2540 CK_Core2,
2541
2542 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2543 /// codename which GCC no longer accepts as an option to -march, but Clang
2544 /// has some logic for recognizing it.
2545 // FIXME: Warn, deprecate, and potentially remove this.
2546 CK_Penryn,
2547 //@}
2548
2549 /// \name Atom
2550 /// Atom processors
2551 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002552 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002553 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002554 //@}
2555
2556 /// \name Nehalem
2557 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002558 CK_Nehalem,
2559
2560 /// \name Westmere
2561 /// Westmere microarchitecture based processors.
2562 CK_Westmere,
2563
2564 /// \name Sandy Bridge
2565 /// Sandy Bridge microarchitecture based processors.
2566 CK_SandyBridge,
2567
2568 /// \name Ivy Bridge
2569 /// Ivy Bridge microarchitecture based processors.
2570 CK_IvyBridge,
2571
2572 /// \name Haswell
2573 /// Haswell microarchitecture based processors.
2574 CK_Haswell,
2575
2576 /// \name Broadwell
2577 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002578 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002579
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002580 /// \name Skylake Client
2581 /// Skylake client microarchitecture based processors.
2582 CK_SkylakeClient,
2583
2584 /// \name Skylake Server
2585 /// Skylake server microarchitecture based processors.
2586 CK_SkylakeServer,
2587
2588 /// \name Cannonlake Client
2589 /// Cannonlake client microarchitecture based processors.
2590 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002591
Craig Topper449314e2013-08-20 07:09:39 +00002592 /// \name Knights Landing
2593 /// Knights Landing processor.
2594 CK_KNL,
2595
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002596 /// \name Lakemont
2597 /// Lakemont microarchitecture based processors.
2598 CK_Lakemont,
2599
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002600 /// \name K6
2601 /// K6 architecture processors.
2602 //@{
2603 CK_K6,
2604 CK_K6_2,
2605 CK_K6_3,
2606 //@}
2607
2608 /// \name K7
2609 /// K7 architecture processors.
2610 //@{
2611 CK_Athlon,
2612 CK_AthlonThunderbird,
2613 CK_Athlon4,
2614 CK_AthlonXP,
2615 CK_AthlonMP,
2616 //@}
2617
2618 /// \name K8
2619 /// K8 architecture processors.
2620 //@{
2621 CK_Athlon64,
2622 CK_Athlon64SSE3,
2623 CK_AthlonFX,
2624 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002625 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002626 CK_Opteron,
2627 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002628 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002629 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002630
Benjamin Kramer569f2152012-01-10 11:50:18 +00002631 /// \name Bobcat
2632 /// Bobcat architecture processors.
2633 //@{
2634 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002635 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002636 //@}
2637
2638 /// \name Bulldozer
2639 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002640 //@{
2641 CK_BDVER1,
2642 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002643 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002644 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002645 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002646
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002647 /// This specification is deprecated and will be removed in the future.
2648 /// Users should prefer \see CK_K8.
2649 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002650 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002651 CK_x86_64,
2652 //@}
2653
2654 /// \name Geode
2655 /// Geode processors.
2656 //@{
2657 CK_Geode
2658 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002659 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002660
Eric Christopherc50738f2015-08-27 00:05:50 +00002661 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002662 return llvm::StringSwitch<CPUKind>(CPU)
2663 .Case("i386", CK_i386)
2664 .Case("i486", CK_i486)
2665 .Case("winchip-c6", CK_WinChipC6)
2666 .Case("winchip2", CK_WinChip2)
2667 .Case("c3", CK_C3)
2668 .Case("i586", CK_i586)
2669 .Case("pentium", CK_Pentium)
2670 .Case("pentium-mmx", CK_PentiumMMX)
2671 .Case("i686", CK_i686)
2672 .Case("pentiumpro", CK_PentiumPro)
2673 .Case("pentium2", CK_Pentium2)
2674 .Case("pentium3", CK_Pentium3)
2675 .Case("pentium3m", CK_Pentium3M)
2676 .Case("pentium-m", CK_PentiumM)
2677 .Case("c3-2", CK_C3_2)
2678 .Case("yonah", CK_Yonah)
2679 .Case("pentium4", CK_Pentium4)
2680 .Case("pentium4m", CK_Pentium4M)
2681 .Case("prescott", CK_Prescott)
2682 .Case("nocona", CK_Nocona)
2683 .Case("core2", CK_Core2)
2684 .Case("penryn", CK_Penryn)
2685 .Case("bonnell", CK_Bonnell)
2686 .Case("atom", CK_Bonnell) // Legacy name.
2687 .Case("silvermont", CK_Silvermont)
2688 .Case("slm", CK_Silvermont) // Legacy name.
2689 .Case("nehalem", CK_Nehalem)
2690 .Case("corei7", CK_Nehalem) // Legacy name.
2691 .Case("westmere", CK_Westmere)
2692 .Case("sandybridge", CK_SandyBridge)
2693 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2694 .Case("ivybridge", CK_IvyBridge)
2695 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2696 .Case("haswell", CK_Haswell)
2697 .Case("core-avx2", CK_Haswell) // Legacy name.
2698 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002699 .Case("skylake", CK_SkylakeClient)
2700 .Case("skylake-avx512", CK_SkylakeServer)
2701 .Case("skx", CK_SkylakeServer) // Legacy name.
2702 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002703 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002704 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002705 .Case("k6", CK_K6)
2706 .Case("k6-2", CK_K6_2)
2707 .Case("k6-3", CK_K6_3)
2708 .Case("athlon", CK_Athlon)
2709 .Case("athlon-tbird", CK_AthlonThunderbird)
2710 .Case("athlon-4", CK_Athlon4)
2711 .Case("athlon-xp", CK_AthlonXP)
2712 .Case("athlon-mp", CK_AthlonMP)
2713 .Case("athlon64", CK_Athlon64)
2714 .Case("athlon64-sse3", CK_Athlon64SSE3)
2715 .Case("athlon-fx", CK_AthlonFX)
2716 .Case("k8", CK_K8)
2717 .Case("k8-sse3", CK_K8SSE3)
2718 .Case("opteron", CK_Opteron)
2719 .Case("opteron-sse3", CK_OpteronSSE3)
2720 .Case("barcelona", CK_AMDFAM10)
2721 .Case("amdfam10", CK_AMDFAM10)
2722 .Case("btver1", CK_BTVER1)
2723 .Case("btver2", CK_BTVER2)
2724 .Case("bdver1", CK_BDVER1)
2725 .Case("bdver2", CK_BDVER2)
2726 .Case("bdver3", CK_BDVER3)
2727 .Case("bdver4", CK_BDVER4)
2728 .Case("x86-64", CK_x86_64)
2729 .Case("geode", CK_Geode)
2730 .Default(CK_Generic);
2731 }
2732
Rafael Espindolaeb265472013-08-21 21:59:03 +00002733 enum FPMathKind {
2734 FP_Default,
2735 FP_SSE,
2736 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002737 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002738
Eli Friedman3fd920a2008-08-20 02:34:37 +00002739public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002740 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2741 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002742 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002743 }
Craig Topper3164f332014-03-11 03:39:26 +00002744 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002745 // X87 evaluates with 80 bits "long double" precision.
2746 return SSELevel == NoSSE ? 2 : 0;
2747 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002748 ArrayRef<const char *> getGCCRegNames() const override {
2749 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002750 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002751 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2752 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002753 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002754 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2755 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002756 }
Eric Christopherd9832702015-06-29 21:00:05 +00002757 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002758 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002759 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002760
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002761 bool validateGlobalRegisterVariable(StringRef RegName,
2762 unsigned RegSize,
2763 bool &HasSizeMismatch) const override {
2764 // esp and ebp are the only 32-bit registers the x86 backend can currently
2765 // handle.
2766 if (RegName.equals("esp") || RegName.equals("ebp")) {
2767 // Check that the register size is 32-bit.
2768 HasSizeMismatch = RegSize != 32;
2769 return true;
2770 }
2771
2772 return false;
2773 }
2774
Akira Hatanaka974131e2014-09-18 18:17:18 +00002775 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2776
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002777 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2778
Akira Hatanaka974131e2014-09-18 18:17:18 +00002779 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2780
Craig Topper3164f332014-03-11 03:39:26 +00002781 std::string convertConstraint(const char *&Constraint) const override;
2782 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002783 return "~{dirflag},~{fpsr},~{flags}";
2784 }
Craig Topper3164f332014-03-11 03:39:26 +00002785 void getTargetDefines(const LangOptions &Opts,
2786 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002787 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2788 bool Enabled);
2789 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2790 bool Enabled);
2791 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2792 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002793 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2794 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002795 setFeatureEnabledImpl(Features, Name, Enabled);
2796 }
2797 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002798 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002799 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2800 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002801 bool
2802 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2803 StringRef CPU,
2804 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002805 bool hasFeature(StringRef Feature) const override;
2806 bool handleTargetFeatures(std::vector<std::string> &Features,
2807 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002808 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002809 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2810 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002811 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002812 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002813 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002814 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002815 return "no-mmx";
2816 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002817 }
Craig Topper3164f332014-03-11 03:39:26 +00002818 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002819 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002820
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002821 // Perform any per-CPU checks necessary to determine if this CPU is
2822 // acceptable.
2823 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2824 // invalid without explaining *why*.
2825 switch (CPU) {
2826 case CK_Generic:
2827 // No processor selected!
2828 return false;
2829
2830 case CK_i386:
2831 case CK_i486:
2832 case CK_WinChipC6:
2833 case CK_WinChip2:
2834 case CK_C3:
2835 case CK_i586:
2836 case CK_Pentium:
2837 case CK_PentiumMMX:
2838 case CK_i686:
2839 case CK_PentiumPro:
2840 case CK_Pentium2:
2841 case CK_Pentium3:
2842 case CK_Pentium3M:
2843 case CK_PentiumM:
2844 case CK_Yonah:
2845 case CK_C3_2:
2846 case CK_Pentium4:
2847 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002848 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002849 case CK_Prescott:
2850 case CK_K6:
2851 case CK_K6_2:
2852 case CK_K6_3:
2853 case CK_Athlon:
2854 case CK_AthlonThunderbird:
2855 case CK_Athlon4:
2856 case CK_AthlonXP:
2857 case CK_AthlonMP:
2858 case CK_Geode:
2859 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002860 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002861 return false;
2862
2863 // Fallthrough
2864 case CK_Nocona:
2865 case CK_Core2:
2866 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002867 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002868 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002869 case CK_Nehalem:
2870 case CK_Westmere:
2871 case CK_SandyBridge:
2872 case CK_IvyBridge:
2873 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002874 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002875 case CK_SkylakeClient:
2876 case CK_SkylakeServer:
2877 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002878 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002879 case CK_Athlon64:
2880 case CK_Athlon64SSE3:
2881 case CK_AthlonFX:
2882 case CK_K8:
2883 case CK_K8SSE3:
2884 case CK_Opteron:
2885 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002886 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002887 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002888 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002889 case CK_BDVER1:
2890 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002891 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002892 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002893 case CK_x86_64:
2894 return true;
2895 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002896 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002897 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002898
Craig Topper3164f332014-03-11 03:39:26 +00002899 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002900
Craig Topper3164f332014-03-11 03:39:26 +00002901 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002902 // Most of the non-ARM calling conventions are i386 conventions.
2903 switch (CC) {
2904 case CC_X86ThisCall:
2905 case CC_X86FastCall:
2906 case CC_X86StdCall:
2907 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002908 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002909 case CC_C:
2910 case CC_Swift:
2911 case CC_X86Pascal:
2912 case CC_IntelOclBicc:
2913 return CCCR_OK;
2914 default:
2915 return CCCR_Warning;
2916 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002917 }
2918
Craig Topper3164f332014-03-11 03:39:26 +00002919 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002920 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002921 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002922
2923 bool hasSjLjLowering() const override {
2924 return true;
2925 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002926
2927 void setSupportedOpenCLOpts() override {
2928 getSupportedOpenCLOpts().setAll();
2929 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002930};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002931
Rafael Espindolaeb265472013-08-21 21:59:03 +00002932bool X86TargetInfo::setFPMath(StringRef Name) {
2933 if (Name == "387") {
2934 FPMath = FP_387;
2935 return true;
2936 }
2937 if (Name == "sse") {
2938 FPMath = FP_SSE;
2939 return true;
2940 }
2941 return false;
2942}
2943
Eric Christopher007b0a02015-08-28 22:32:01 +00002944bool X86TargetInfo::initFeatureMap(
2945 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002946 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002947 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002948 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002949 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002950 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002951
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002952 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002953
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002954 // Enable X87 for all X86 processors but Lakemont.
2955 if (Kind != CK_Lakemont)
2956 setFeatureEnabledImpl(Features, "x87", true);
2957
2958 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002959 case CK_Generic:
2960 case CK_i386:
2961 case CK_i486:
2962 case CK_i586:
2963 case CK_Pentium:
2964 case CK_i686:
2965 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002966 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 break;
2968 case CK_PentiumMMX:
2969 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002970 case CK_K6:
2971 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002972 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002973 break;
2974 case CK_Pentium3:
2975 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002976 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002977 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002978 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002979 break;
2980 case CK_PentiumM:
2981 case CK_Pentium4:
2982 case CK_Pentium4M:
2983 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002984 setFeatureEnabledImpl(Features, "sse2", 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_Yonah:
2988 case CK_Prescott:
2989 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002990 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002991 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002992 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002993 break;
2994 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002995 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002996 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002997 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002998 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002999 break;
3000 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003001 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003002 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003003 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003004 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003005 case CK_Cannonlake:
3006 setFeatureEnabledImpl(Features, "avx512ifma", true);
3007 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3008 setFeatureEnabledImpl(Features, "sha", true);
3009 setFeatureEnabledImpl(Features, "umip", true);
3010 // FALLTHROUGH
3011 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003012 setFeatureEnabledImpl(Features, "avx512f", true);
3013 setFeatureEnabledImpl(Features, "avx512cd", true);
3014 setFeatureEnabledImpl(Features, "avx512dq", true);
3015 setFeatureEnabledImpl(Features, "avx512bw", true);
3016 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003017 setFeatureEnabledImpl(Features, "pku", true);
3018 setFeatureEnabledImpl(Features, "pcommit", true);
3019 setFeatureEnabledImpl(Features, "clwb", true);
3020 // FALLTHROUGH
3021 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003022 setFeatureEnabledImpl(Features, "xsavec", true);
3023 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003024 setFeatureEnabledImpl(Features, "mpx", true);
3025 setFeatureEnabledImpl(Features, "sgx", true);
3026 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003027 // FALLTHROUGH
3028 case CK_Broadwell:
3029 setFeatureEnabledImpl(Features, "rdseed", true);
3030 setFeatureEnabledImpl(Features, "adx", true);
3031 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003032 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003033 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003034 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003035 setFeatureEnabledImpl(Features, "bmi", true);
3036 setFeatureEnabledImpl(Features, "bmi2", true);
3037 setFeatureEnabledImpl(Features, "rtm", true);
3038 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003039 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003040 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003041 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003042 setFeatureEnabledImpl(Features, "rdrnd", true);
3043 setFeatureEnabledImpl(Features, "f16c", true);
3044 setFeatureEnabledImpl(Features, "fsgsbase", true);
3045 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003046 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003047 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003048 setFeatureEnabledImpl(Features, "xsave", true);
3049 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003050 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003051 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003052 case CK_Silvermont:
3053 setFeatureEnabledImpl(Features, "aes", true);
3054 setFeatureEnabledImpl(Features, "pclmul", true);
3055 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003056 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003057 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003058 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003059 setFeatureEnabledImpl(Features, "cx16", true);
3060 break;
3061 case CK_KNL:
3062 setFeatureEnabledImpl(Features, "avx512f", true);
3063 setFeatureEnabledImpl(Features, "avx512cd", true);
3064 setFeatureEnabledImpl(Features, "avx512er", true);
3065 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003066 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003067 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003068 setFeatureEnabledImpl(Features, "rdseed", true);
3069 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003070 setFeatureEnabledImpl(Features, "lzcnt", true);
3071 setFeatureEnabledImpl(Features, "bmi", true);
3072 setFeatureEnabledImpl(Features, "bmi2", true);
3073 setFeatureEnabledImpl(Features, "rtm", true);
3074 setFeatureEnabledImpl(Features, "fma", true);
3075 setFeatureEnabledImpl(Features, "rdrnd", true);
3076 setFeatureEnabledImpl(Features, "f16c", true);
3077 setFeatureEnabledImpl(Features, "fsgsbase", true);
3078 setFeatureEnabledImpl(Features, "aes", true);
3079 setFeatureEnabledImpl(Features, "pclmul", true);
3080 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003081 setFeatureEnabledImpl(Features, "xsaveopt", true);
3082 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003083 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003084 break;
3085 case CK_K6_2:
3086 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003087 case CK_WinChip2:
3088 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003089 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003090 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003091 case CK_Athlon:
3092 case CK_AthlonThunderbird:
3093 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003094 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003095 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003096 case CK_Athlon4:
3097 case CK_AthlonXP:
3098 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003099 setFeatureEnabledImpl(Features, "sse", true);
3100 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003101 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003102 break;
3103 case CK_K8:
3104 case CK_Opteron:
3105 case CK_Athlon64:
3106 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003107 setFeatureEnabledImpl(Features, "sse2", true);
3108 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003109 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003110 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003111 case CK_AMDFAM10:
3112 setFeatureEnabledImpl(Features, "sse4a", true);
3113 setFeatureEnabledImpl(Features, "lzcnt", true);
3114 setFeatureEnabledImpl(Features, "popcnt", true);
3115 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003116 case CK_K8SSE3:
3117 case CK_OpteronSSE3:
3118 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003119 setFeatureEnabledImpl(Features, "sse3", true);
3120 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003121 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003122 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003123 case CK_BTVER2:
3124 setFeatureEnabledImpl(Features, "avx", true);
3125 setFeatureEnabledImpl(Features, "aes", true);
3126 setFeatureEnabledImpl(Features, "pclmul", true);
3127 setFeatureEnabledImpl(Features, "bmi", true);
3128 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003129 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003130 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003131 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003132 setFeatureEnabledImpl(Features, "ssse3", true);
3133 setFeatureEnabledImpl(Features, "sse4a", true);
3134 setFeatureEnabledImpl(Features, "lzcnt", true);
3135 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003136 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003137 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003138 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003139 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003140 case CK_BDVER4:
3141 setFeatureEnabledImpl(Features, "avx2", true);
3142 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003143 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003144 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003145 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003146 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003147 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003148 // FALLTHROUGH
3149 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003150 setFeatureEnabledImpl(Features, "bmi", true);
3151 setFeatureEnabledImpl(Features, "fma", true);
3152 setFeatureEnabledImpl(Features, "f16c", true);
3153 setFeatureEnabledImpl(Features, "tbm", true);
3154 // FALLTHROUGH
3155 case CK_BDVER1:
3156 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003157 setFeatureEnabledImpl(Features, "xop", true);
3158 setFeatureEnabledImpl(Features, "lzcnt", true);
3159 setFeatureEnabledImpl(Features, "aes", true);
3160 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003161 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003162 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003163 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003164 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003165 break;
Eli Friedman33465822011-07-08 23:31:17 +00003166 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003167 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3168 return false;
3169
3170 // Can't do this earlier because we need to be able to explicitly enable
3171 // or disable these features and the things that they depend upon.
3172
3173 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3174 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003175 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003176 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3177 FeaturesVec.end())
3178 Features["popcnt"] = true;
3179
3180 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3181 I = Features.find("3dnow");
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(), "-prfchw") ==
3184 FeaturesVec.end())
3185 Features["prfchw"] = true;
3186
Eric Christophera7260af2015-10-08 20:10:18 +00003187 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3188 // then enable MMX.
3189 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003190 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003191 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3192 FeaturesVec.end())
3193 Features["mmx"] = true;
3194
Eric Christopherbbd746d2015-10-08 20:10:14 +00003195 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003196}
3197
Rafael Espindolae62e2792013-08-20 13:44:29 +00003198void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003199 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003200 if (Enabled) {
3201 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003202 case AVX512F:
3203 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003204 case AVX2:
3205 Features["avx2"] = true;
3206 case AVX:
3207 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003208 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003210 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003211 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003212 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003213 case SSSE3:
3214 Features["ssse3"] = true;
3215 case SSE3:
3216 Features["sse3"] = true;
3217 case SSE2:
3218 Features["sse2"] = true;
3219 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003220 Features["sse"] = true;
3221 case NoSSE:
3222 break;
3223 }
3224 return;
3225 }
3226
3227 switch (Level) {
3228 case NoSSE:
3229 case SSE1:
3230 Features["sse"] = false;
3231 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003232 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3233 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003234 case SSE3:
3235 Features["sse3"] = false;
3236 setXOPLevel(Features, NoXOP, false);
3237 case SSSE3:
3238 Features["ssse3"] = false;
3239 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003240 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003241 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003242 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003243 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003244 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3245 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003246 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003247 case AVX2:
3248 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003249 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003250 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003251 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003252 Features["avx512vl"] = Features["avx512vbmi"] =
3253 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 }
3255}
3256
3257void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003258 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003259 if (Enabled) {
3260 switch (Level) {
3261 case AMD3DNowAthlon:
3262 Features["3dnowa"] = true;
3263 case AMD3DNow:
3264 Features["3dnow"] = true;
3265 case MMX:
3266 Features["mmx"] = true;
3267 case NoMMX3DNow:
3268 break;
3269 }
3270 return;
3271 }
3272
3273 switch (Level) {
3274 case NoMMX3DNow:
3275 case MMX:
3276 Features["mmx"] = false;
3277 case AMD3DNow:
3278 Features["3dnow"] = false;
3279 case AMD3DNowAthlon:
3280 Features["3dnowa"] = false;
3281 }
3282}
3283
3284void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003285 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286 if (Enabled) {
3287 switch (Level) {
3288 case XOP:
3289 Features["xop"] = true;
3290 case FMA4:
3291 Features["fma4"] = true;
3292 setSSELevel(Features, AVX, true);
3293 case SSE4A:
3294 Features["sse4a"] = true;
3295 setSSELevel(Features, SSE3, true);
3296 case NoXOP:
3297 break;
3298 }
3299 return;
3300 }
3301
3302 switch (Level) {
3303 case NoXOP:
3304 case SSE4A:
3305 Features["sse4a"] = false;
3306 case FMA4:
3307 Features["fma4"] = false;
3308 case XOP:
3309 Features["xop"] = false;
3310 }
3311}
3312
Craig Topper86d79ef2013-09-17 04:51:29 +00003313void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3314 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003315 // This is a bit of a hack to deal with the sse4 target feature when used
3316 // as part of the target attribute. We handle sse4 correctly everywhere
3317 // else. See below for more information on how we handle the sse4 options.
3318 if (Name != "sse4")
3319 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003320
Craig Topper29561122013-09-19 01:13:07 +00003321 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003322 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003323 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003324 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003325 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003326 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003327 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003328 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003329 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003330 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003331 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003332 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003333 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003334 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003335 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003336 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003337 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003338 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003339 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003340 if (Enabled)
3341 setSSELevel(Features, SSE2, Enabled);
3342 } else if (Name == "pclmul") {
3343 if (Enabled)
3344 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003345 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003346 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003347 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003348 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003349 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003350 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003351 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3352 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3353 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003354 if (Enabled)
3355 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003356 // Enable BWI instruction if VBMI is being enabled.
3357 if (Name == "avx512vbmi" && Enabled)
3358 Features["avx512bw"] = true;
3359 // Also disable VBMI if BWI is being disabled.
3360 if (Name == "avx512bw" && !Enabled)
3361 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003362 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003363 if (Enabled)
3364 setSSELevel(Features, AVX, Enabled);
3365 } else if (Name == "fma4") {
3366 setXOPLevel(Features, FMA4, Enabled);
3367 } else if (Name == "xop") {
3368 setXOPLevel(Features, XOP, Enabled);
3369 } else if (Name == "sse4a") {
3370 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003371 } else if (Name == "f16c") {
3372 if (Enabled)
3373 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003374 } else if (Name == "sha") {
3375 if (Enabled)
3376 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003377 } else if (Name == "sse4") {
3378 // We can get here via the __target__ attribute since that's not controlled
3379 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3380 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3381 // disabled.
3382 if (Enabled)
3383 setSSELevel(Features, SSE42, Enabled);
3384 else
3385 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003386 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003387 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003388 Features["xsaveopt"] = false;
3389 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003390 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003391 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003392 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003393}
3394
Eric Christopher3ff21b32013-10-16 21:26:26 +00003395/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003396/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003397bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003398 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003399 for (const auto &Feature : Features) {
3400 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003401 continue;
3402
Eric Christopher610fe112015-08-26 08:21:55 +00003403 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003404 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003405 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003406 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003407 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003408 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003409 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003410 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003411 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003412 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003413 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003414 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003415 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003416 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003417 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003418 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003419 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003420 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003421 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003422 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003423 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003424 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003425 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003426 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003427 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003428 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003429 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003430 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003431 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003432 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003433 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003434 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003435 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003436 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003437 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003438 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003439 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003440 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003441 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003442 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003443 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003444 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003445 } else if (Feature == "+avx512vbmi") {
3446 HasAVX512VBMI = true;
3447 } else if (Feature == "+avx512ifma") {
3448 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003449 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003450 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003451 } else if (Feature == "+mpx") {
3452 HasMPX = true;
3453 } else if (Feature == "+movbe") {
3454 HasMOVBE = true;
3455 } else if (Feature == "+sgx") {
3456 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003457 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003458 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003459 } else if (Feature == "+fxsr") {
3460 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003461 } else if (Feature == "+xsave") {
3462 HasXSAVE = true;
3463 } else if (Feature == "+xsaveopt") {
3464 HasXSAVEOPT = true;
3465 } else if (Feature == "+xsavec") {
3466 HasXSAVEC = true;
3467 } else if (Feature == "+xsaves") {
3468 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003469 } else if (Feature == "+mwaitx") {
3470 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003471 } else if (Feature == "+pku") {
3472 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003473 } else if (Feature == "+clflushopt") {
3474 HasCLFLUSHOPT = true;
3475 } else if (Feature == "+pcommit") {
3476 HasPCOMMIT = true;
3477 } else if (Feature == "+clwb") {
3478 HasCLWB = true;
3479 } else if (Feature == "+umip") {
3480 HasUMIP = true;
3481 } else if (Feature == "+prefetchwt1") {
3482 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003483 }
3484
Benjamin Kramer27402c62012-03-05 15:10:44 +00003485 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003486 .Case("+avx512f", AVX512F)
3487 .Case("+avx2", AVX2)
3488 .Case("+avx", AVX)
3489 .Case("+sse4.2", SSE42)
3490 .Case("+sse4.1", SSE41)
3491 .Case("+ssse3", SSSE3)
3492 .Case("+sse3", SSE3)
3493 .Case("+sse2", SSE2)
3494 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003495 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003496 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003497
Eli Friedman33465822011-07-08 23:31:17 +00003498 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003499 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003500 .Case("+3dnowa", AMD3DNowAthlon)
3501 .Case("+3dnow", AMD3DNow)
3502 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003503 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003504 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003505
3506 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003507 .Case("+xop", XOP)
3508 .Case("+fma4", FMA4)
3509 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003510 .Default(NoXOP);
3511 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003512 }
Eli Friedman33465822011-07-08 23:31:17 +00003513
Rafael Espindolaeb265472013-08-21 21:59:03 +00003514 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3515 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003516 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3517 (FPMath == FP_387 && SSELevel >= SSE1)) {
3518 Diags.Report(diag::err_target_unsupported_fpmath) <<
3519 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003520 return false;
3521 }
3522
Alexey Bataev00396512015-07-02 03:40:19 +00003523 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003524 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003525 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003526}
Chris Lattnerecd49032009-03-02 22:27:17 +00003527
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003528/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3529/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003530void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003531 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003532 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003533 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003534 Builder.defineMacro("__amd64__");
3535 Builder.defineMacro("__amd64");
3536 Builder.defineMacro("__x86_64");
3537 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003538 if (getTriple().getArchName() == "x86_64h") {
3539 Builder.defineMacro("__x86_64h");
3540 Builder.defineMacro("__x86_64h__");
3541 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003542 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003543 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003544 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003545
Chris Lattnerecd49032009-03-02 22:27:17 +00003546 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003547 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3548 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003549 switch (CPU) {
3550 case CK_Generic:
3551 break;
3552 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003553 // The rest are coming from the i386 define above.
3554 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003555 break;
3556 case CK_i486:
3557 case CK_WinChipC6:
3558 case CK_WinChip2:
3559 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003560 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003561 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003562 case CK_PentiumMMX:
3563 Builder.defineMacro("__pentium_mmx__");
3564 Builder.defineMacro("__tune_pentium_mmx__");
3565 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003566 case CK_i586:
3567 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003568 defineCPUMacros(Builder, "i586");
3569 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003570 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003571 case CK_Pentium3:
3572 case CK_Pentium3M:
3573 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003574 Builder.defineMacro("__tune_pentium3__");
3575 // Fallthrough
3576 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003577 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003578 Builder.defineMacro("__tune_pentium2__");
3579 // Fallthrough
3580 case CK_PentiumPro:
3581 Builder.defineMacro("__tune_i686__");
3582 Builder.defineMacro("__tune_pentiumpro__");
3583 // Fallthrough
3584 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003585 Builder.defineMacro("__i686");
3586 Builder.defineMacro("__i686__");
3587 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3588 Builder.defineMacro("__pentiumpro");
3589 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003590 break;
3591 case CK_Pentium4:
3592 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003593 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003594 break;
3595 case CK_Yonah:
3596 case CK_Prescott:
3597 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003598 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003599 break;
3600 case CK_Core2:
3601 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003602 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003603 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003604 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003605 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003606 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003607 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003608 defineCPUMacros(Builder, "slm");
3609 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003610 case CK_Nehalem:
3611 case CK_Westmere:
3612 case CK_SandyBridge:
3613 case CK_IvyBridge:
3614 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003615 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003616 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003617 // FIXME: Historically, we defined this legacy name, it would be nice to
3618 // remove it at some point. We've never exposed fine-grained names for
3619 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003620 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003621 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003622 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003623 defineCPUMacros(Builder, "skx");
3624 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003625 case CK_Cannonlake:
3626 break;
Craig Topper449314e2013-08-20 07:09:39 +00003627 case CK_KNL:
3628 defineCPUMacros(Builder, "knl");
3629 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003630 case CK_Lakemont:
3631 Builder.defineMacro("__tune_lakemont__");
3632 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003633 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003634 Builder.defineMacro("__k6_2__");
3635 Builder.defineMacro("__tune_k6_2__");
3636 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003637 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003638 if (CPU != CK_K6_2) { // In case of fallthrough
3639 // FIXME: GCC may be enabling these in cases where some other k6
3640 // architecture is specified but -m3dnow is explicitly provided. The
3641 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003642 Builder.defineMacro("__k6_3__");
3643 Builder.defineMacro("__tune_k6_3__");
3644 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003645 // Fallthrough
3646 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003647 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003648 break;
3649 case CK_Athlon:
3650 case CK_AthlonThunderbird:
3651 case CK_Athlon4:
3652 case CK_AthlonXP:
3653 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003654 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003655 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003656 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003657 Builder.defineMacro("__tune_athlon_sse__");
3658 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003659 break;
3660 case CK_K8:
3661 case CK_K8SSE3:
3662 case CK_x86_64:
3663 case CK_Opteron:
3664 case CK_OpteronSSE3:
3665 case CK_Athlon64:
3666 case CK_Athlon64SSE3:
3667 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003668 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003669 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003670 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003671 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003672 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003673 case CK_BTVER1:
3674 defineCPUMacros(Builder, "btver1");
3675 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003676 case CK_BTVER2:
3677 defineCPUMacros(Builder, "btver2");
3678 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003679 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003680 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003681 break;
3682 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003683 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003684 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003685 case CK_BDVER3:
3686 defineCPUMacros(Builder, "bdver3");
3687 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003688 case CK_BDVER4:
3689 defineCPUMacros(Builder, "bdver4");
3690 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003691 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003692 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003693 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003694 }
Chris Lattner96e43572009-03-02 22:40:39 +00003695
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003696 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003697 Builder.defineMacro("__REGISTER_PREFIX__", "");
3698
Chris Lattner6df41af2009-04-19 17:32:33 +00003699 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3700 // functions in glibc header files that use FP Stack inline asm which the
3701 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003702 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003703
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003704 if (HasAES)
3705 Builder.defineMacro("__AES__");
3706
Craig Topper3f122a72012-05-31 05:18:48 +00003707 if (HasPCLMUL)
3708 Builder.defineMacro("__PCLMUL__");
3709
Craig Topper22967d42011-12-25 05:06:45 +00003710 if (HasLZCNT)
3711 Builder.defineMacro("__LZCNT__");
3712
Benjamin Kramer1e250392012-07-07 09:39:18 +00003713 if (HasRDRND)
3714 Builder.defineMacro("__RDRND__");
3715
Craig Topper8c7f2512014-11-03 06:51:41 +00003716 if (HasFSGSBASE)
3717 Builder.defineMacro("__FSGSBASE__");
3718
Craig Topper22967d42011-12-25 05:06:45 +00003719 if (HasBMI)
3720 Builder.defineMacro("__BMI__");
3721
3722 if (HasBMI2)
3723 Builder.defineMacro("__BMI2__");
3724
Craig Topper1de83482011-12-29 16:10:46 +00003725 if (HasPOPCNT)
3726 Builder.defineMacro("__POPCNT__");
3727
Michael Liao625a8752012-11-10 05:17:46 +00003728 if (HasRTM)
3729 Builder.defineMacro("__RTM__");
3730
Michael Liao74f4eaf2013-03-26 17:52:08 +00003731 if (HasPRFCHW)
3732 Builder.defineMacro("__PRFCHW__");
3733
Michael Liaoffaae352013-03-29 05:17:55 +00003734 if (HasRDSEED)
3735 Builder.defineMacro("__RDSEED__");
3736
Robert Khasanov50e6f582014-09-19 09:53:48 +00003737 if (HasADX)
3738 Builder.defineMacro("__ADX__");
3739
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003740 if (HasTBM)
3741 Builder.defineMacro("__TBM__");
3742
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003743 if (HasMWAITX)
3744 Builder.defineMacro("__MWAITX__");
3745
Rafael Espindolae62e2792013-08-20 13:44:29 +00003746 switch (XOPLevel) {
3747 case XOP:
3748 Builder.defineMacro("__XOP__");
3749 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003750 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003751 case SSE4A:
3752 Builder.defineMacro("__SSE4A__");
3753 case NoXOP:
3754 break;
3755 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003756
Craig Topperbba778b2012-06-03 21:46:30 +00003757 if (HasFMA)
3758 Builder.defineMacro("__FMA__");
3759
Manman Rena45358c2012-10-11 00:59:55 +00003760 if (HasF16C)
3761 Builder.defineMacro("__F16C__");
3762
Craig Topper679b53a2013-08-21 05:29:10 +00003763 if (HasAVX512CD)
3764 Builder.defineMacro("__AVX512CD__");
3765 if (HasAVX512ER)
3766 Builder.defineMacro("__AVX512ER__");
3767 if (HasAVX512PF)
3768 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003769 if (HasAVX512DQ)
3770 Builder.defineMacro("__AVX512DQ__");
3771 if (HasAVX512BW)
3772 Builder.defineMacro("__AVX512BW__");
3773 if (HasAVX512VL)
3774 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003775 if (HasAVX512VBMI)
3776 Builder.defineMacro("__AVX512VBMI__");
3777 if (HasAVX512IFMA)
3778 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003779
Ben Langmuir58078d02013-09-19 13:22:04 +00003780 if (HasSHA)
3781 Builder.defineMacro("__SHA__");
3782
Craig Toppere33f51f2015-10-16 06:22:36 +00003783 if (HasFXSR)
3784 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003785 if (HasXSAVE)
3786 Builder.defineMacro("__XSAVE__");
3787 if (HasXSAVEOPT)
3788 Builder.defineMacro("__XSAVEOPT__");
3789 if (HasXSAVEC)
3790 Builder.defineMacro("__XSAVEC__");
3791 if (HasXSAVES)
3792 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003793 if (HasPKU)
3794 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003795 if (HasCX16)
3796 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3797
Chris Lattner96e43572009-03-02 22:40:39 +00003798 // Each case falls through to the previous one here.
3799 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003800 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003801 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003802 case AVX2:
3803 Builder.defineMacro("__AVX2__");
3804 case AVX:
3805 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003806 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003807 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003808 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003809 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003810 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003811 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003812 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003813 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003814 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003815 Builder.defineMacro("__SSE2__");
3816 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003817 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003818 Builder.defineMacro("__SSE__");
3819 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003820 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003821 break;
3822 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003823
Derek Schuffc7dd7222012-10-11 15:52:22 +00003824 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003825 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003826 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003827 case AVX2:
3828 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003829 case SSE42:
3830 case SSE41:
3831 case SSSE3:
3832 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003833 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003834 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003835 break;
3836 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003837 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003838 break;
3839 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003840 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003841 }
3842 }
3843
Anders Carlssone437c682010-01-27 03:47:49 +00003844 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003845 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003846 case AMD3DNowAthlon:
3847 Builder.defineMacro("__3dNOW_A__");
3848 case AMD3DNow:
3849 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003850 case MMX:
3851 Builder.defineMacro("__MMX__");
3852 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003853 break;
3854 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003855
3856 if (CPU >= CK_i486) {
3857 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3858 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3859 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3860 }
3861 if (CPU >= CK_i586)
3862 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003863}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003864
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003865bool X86TargetInfo::hasFeature(StringRef Feature) const {
3866 return llvm::StringSwitch<bool>(Feature)
3867 .Case("aes", HasAES)
3868 .Case("avx", SSELevel >= AVX)
3869 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003870 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003871 .Case("avx512cd", HasAVX512CD)
3872 .Case("avx512er", HasAVX512ER)
3873 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003874 .Case("avx512dq", HasAVX512DQ)
3875 .Case("avx512bw", HasAVX512BW)
3876 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003877 .Case("avx512vbmi", HasAVX512VBMI)
3878 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003879 .Case("bmi", HasBMI)
3880 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003881 .Case("clflushopt", HasCLFLUSHOPT)
3882 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003883 .Case("cx16", HasCX16)
3884 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003885 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003886 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003887 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003888 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003889 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003890 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3891 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3892 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003893 .Case("movbe", HasMOVBE)
3894 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003895 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003896 .Case("pcommit", HasPCOMMIT)
3897 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003898 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003899 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003900 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003901 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003902 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003903 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003904 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003905 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003906 .Case("sse", SSELevel >= SSE1)
3907 .Case("sse2", SSELevel >= SSE2)
3908 .Case("sse3", SSELevel >= SSE3)
3909 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003910 .Case("sse4.1", SSELevel >= SSE41)
3911 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003912 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003913 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003914 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003915 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003916 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3917 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003918 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003919 .Case("xsave", HasXSAVE)
3920 .Case("xsavec", HasXSAVEC)
3921 .Case("xsaves", HasXSAVES)
3922 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003923 .Default(false);
3924}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003925
Eric Christopherd9832702015-06-29 21:00:05 +00003926// We can't use a generic validation scheme for the features accepted here
3927// versus subtarget features accepted in the target attribute because the
3928// bitfield structure that's initialized in the runtime only supports the
3929// below currently rather than the full range of subtarget features. (See
3930// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3931bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3932 return llvm::StringSwitch<bool>(FeatureStr)
3933 .Case("cmov", true)
3934 .Case("mmx", true)
3935 .Case("popcnt", true)
3936 .Case("sse", true)
3937 .Case("sse2", true)
3938 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003939 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003940 .Case("sse4.1", true)
3941 .Case("sse4.2", true)
3942 .Case("avx", true)
3943 .Case("avx2", true)
3944 .Case("sse4a", true)
3945 .Case("fma4", true)
3946 .Case("xop", true)
3947 .Case("fma", true)
3948 .Case("avx512f", true)
3949 .Case("bmi", true)
3950 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003951 .Case("aes", true)
3952 .Case("pclmul", true)
3953 .Case("avx512vl", true)
3954 .Case("avx512bw", true)
3955 .Case("avx512dq", true)
3956 .Case("avx512cd", true)
3957 .Case("avx512er", true)
3958 .Case("avx512pf", true)
3959 .Case("avx512vbmi", true)
3960 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003961 .Default(false);
3962}
3963
Eli Friedman3fd920a2008-08-20 02:34:37 +00003964bool
Anders Carlsson58436352009-02-28 17:11:49 +00003965X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003966 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003967 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003968 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003969 // Constant constraints.
3970 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3971 // instructions.
3972 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3973 // x86_64 instructions.
3974 case 's':
3975 Info.setRequiresImmediate();
3976 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003977 case 'I':
3978 Info.setRequiresImmediate(0, 31);
3979 return true;
3980 case 'J':
3981 Info.setRequiresImmediate(0, 63);
3982 return true;
3983 case 'K':
3984 Info.setRequiresImmediate(-128, 127);
3985 return true;
3986 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003987 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003988 return true;
3989 case 'M':
3990 Info.setRequiresImmediate(0, 3);
3991 return true;
3992 case 'N':
3993 Info.setRequiresImmediate(0, 255);
3994 return true;
3995 case 'O':
3996 Info.setRequiresImmediate(0, 127);
3997 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003998 // Register constraints.
3999 case 'Y': // 'Y' is the first character for several 2-character constraints.
4000 // Shift the pointer to the second character of the constraint.
4001 Name++;
4002 switch (*Name) {
4003 default:
4004 return false;
4005 case '0': // First SSE register.
4006 case 't': // Any SSE register, when SSE2 is enabled.
4007 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4008 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004009 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004010 Info.setAllowsRegister();
4011 return true;
4012 }
4013 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004014 // Constraint 'f' cannot be used for output operands.
4015 if (Info.ConstraintStr[0] == '=')
4016 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004017 Info.setAllowsRegister();
4018 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004019 case 'a': // eax.
4020 case 'b': // ebx.
4021 case 'c': // ecx.
4022 case 'd': // edx.
4023 case 'S': // esi.
4024 case 'D': // edi.
4025 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004026 case 't': // Top of floating point stack.
4027 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004028 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004029 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004030 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004031 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004032 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4033 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004034 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004035 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4036 case 'l': // "Index" registers: any general register that can be used as an
4037 // index in a base+index memory access.
4038 Info.setAllowsRegister();
4039 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004040 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004041 case 'C': // SSE floating point constant.
4042 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004043 return true;
4044 }
4045}
4046
Akira Hatanaka974131e2014-09-18 18:17:18 +00004047bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4048 unsigned Size) const {
4049 // Strip off constraint modifiers.
4050 while (Constraint[0] == '=' ||
4051 Constraint[0] == '+' ||
4052 Constraint[0] == '&')
4053 Constraint = Constraint.substr(1);
4054
4055 return validateOperandSize(Constraint, Size);
4056}
4057
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004058bool X86TargetInfo::validateInputSize(StringRef Constraint,
4059 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004060 return validateOperandSize(Constraint, Size);
4061}
4062
4063bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4064 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004065 switch (Constraint[0]) {
4066 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004067 case 'k':
4068 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004069 case 'y':
4070 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004071 case 'f':
4072 case 't':
4073 case 'u':
4074 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004075 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004076 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004077 if (SSELevel >= AVX512F)
4078 // 512-bit zmm registers can be used if target supports AVX512F.
4079 return Size <= 512U;
4080 else if (SSELevel >= AVX)
4081 // 256-bit ymm registers can be used if target supports AVX.
4082 return Size <= 256U;
4083 return Size <= 128U;
4084 case 'Y':
4085 // 'Y' is the first character for several 2-character constraints.
4086 switch (Constraint[1]) {
4087 default: break;
4088 case 'm':
4089 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004090 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004091 return Size <= 64;
4092 case 'i':
4093 case 't':
4094 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4095 if (SSELevel >= AVX512F)
4096 return Size <= 512U;
4097 else if (SSELevel >= AVX)
4098 return Size <= 256U;
4099 return SSELevel >= SSE2 && Size <= 128U;
4100 }
4101
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004102 }
4103
4104 return true;
4105}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004106
Eli Friedman3fd920a2008-08-20 02:34:37 +00004107std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004108X86TargetInfo::convertConstraint(const char *&Constraint) const {
4109 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004110 case 'a': return std::string("{ax}");
4111 case 'b': return std::string("{bx}");
4112 case 'c': return std::string("{cx}");
4113 case 'd': return std::string("{dx}");
4114 case 'S': return std::string("{si}");
4115 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004116 case 'p': // address
4117 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004118 case 't': // top of floating point stack.
4119 return std::string("{st}");
4120 case 'u': // second from top of floating point stack.
4121 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004122 case 'Y':
4123 switch (Constraint[1]) {
4124 default:
4125 // Break from inner switch and fall through (copy single char),
4126 // continue parsing after copying the current constraint into
4127 // the return string.
4128 break;
4129 case 'k':
4130 // "^" hints llvm that this is a 2 letter constraint.
4131 // "Constraint++" is used to promote the string iterator
4132 // to the next constraint.
4133 return std::string("^") + std::string(Constraint++, 2);
4134 }
4135 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004137 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004138 }
4139}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004140
Eli Friedman3fd920a2008-08-20 02:34:37 +00004141// X86-32 generic target
4142class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004143public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004144 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4145 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004146 DoubleAlign = LongLongAlign = 32;
4147 LongDoubleWidth = 96;
4148 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004149 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004150 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004151 SizeType = UnsignedInt;
4152 PtrDiffType = SignedInt;
4153 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004154 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004155
4156 // Use fpret for all types.
4157 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4158 (1 << TargetInfo::Double) |
4159 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004160
4161 // x86-32 has atomics up to 8 bytes
4162 // FIXME: Check that we actually have cmpxchg8b before setting
4163 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4164 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004165 }
Craig Topper3164f332014-03-11 03:39:26 +00004166 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004167 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004168 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004169
Craig Topper3164f332014-03-11 03:39:26 +00004170 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004171 if (RegNo == 0) return 0;
4172 if (RegNo == 1) return 2;
4173 return -1;
4174 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004175 bool validateOperandSize(StringRef Constraint,
4176 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004177 switch (Constraint[0]) {
4178 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004179 case 'R':
4180 case 'q':
4181 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004182 case 'a':
4183 case 'b':
4184 case 'c':
4185 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004186 case 'S':
4187 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004188 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004189 case 'A':
4190 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004191 }
4192
Akira Hatanaka974131e2014-09-18 18:17:18 +00004193 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004194 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004195 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4196 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4197 Builtin::FirstTSBuiltin + 1);
4198 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004199};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004200
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004201class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4202public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004203 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4204 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004205
Craig Topper3164f332014-03-11 03:39:26 +00004206 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004207 unsigned Major, Minor, Micro;
4208 getTriple().getOSVersion(Major, Minor, Micro);
4209 // New NetBSD uses the default rounding mode.
4210 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4211 return X86_32TargetInfo::getFloatEvalMethod();
4212 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004213 return 1;
4214 }
4215};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004216
Eli Friedmane3aa4542009-07-05 18:47:56 +00004217class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4218public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004219 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4220 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004221 SizeType = UnsignedLong;
4222 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004223 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004224 }
4225};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004226
Eli Friedman9fa28852012-08-08 23:57:20 +00004227class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4228public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004229 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4230 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004231 SizeType = UnsignedLong;
4232 IntPtrType = SignedLong;
4233 PtrDiffType = SignedLong;
4234 }
4235};
Eli Friedman9fa28852012-08-08 23:57:20 +00004236
Torok Edwinb2b37c62009-06-30 17:10:35 +00004237class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004238public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004239 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4240 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004241 LongDoubleWidth = 128;
4242 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004243 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004244 MaxVectorAlign = 256;
4245 // The watchOS simulator uses the builtin bool type for Objective-C.
4246 llvm::Triple T = llvm::Triple(Triple);
4247 if (T.isWatchOS())
4248 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004249 SizeType = UnsignedLong;
4250 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004251 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004252 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004253 }
4254
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004255 bool handleTargetFeatures(std::vector<std::string> &Features,
4256 DiagnosticsEngine &Diags) override {
4257 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4258 Diags))
4259 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004260 // We now know the features we have: we can decide how to align vectors.
4261 MaxVectorAlign =
4262 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004263 return true;
4264 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004265};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004266
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004267// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004268class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004269public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004270 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4271 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004272 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004273 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004274 bool IsWinCOFF =
4275 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004276 resetDataLayout(IsWinCOFF
4277 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4278 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004279 }
Craig Topper3164f332014-03-11 03:39:26 +00004280 void getTargetDefines(const LangOptions &Opts,
4281 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004282 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4283 }
4284};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004285
4286// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004287class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004288public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004289 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4290 const TargetOptions &Opts)
4291 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004292 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004293 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4294 }
Craig Topper3164f332014-03-11 03:39:26 +00004295 void getTargetDefines(const LangOptions &Opts,
4296 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004297 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4298 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4299 // The value of the following reflects processor type.
4300 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4301 // We lost the original triple, so we use the default.
4302 Builder.defineMacro("_M_IX86", "600");
4303 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004304};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004305
David Majnemerae1ed0e2015-05-28 04:36:18 +00004306static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004307 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4308 // supports __declspec natively under -fms-extensions, but we define a no-op
4309 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004310 if (Opts.MicrosoftExt)
4311 Builder.defineMacro("__declspec", "__declspec");
4312 else
4313 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4314
4315 if (!Opts.MicrosoftExt) {
4316 // Provide macros for all the calling convention keywords. Provide both
4317 // single and double underscore prefixed variants. These are available on
4318 // x64 as well as x86, even though they have no effect.
4319 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4320 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004321 std::string GCCSpelling = "__attribute__((__";
4322 GCCSpelling += CC;
4323 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004324 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4325 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4326 }
4327 }
4328}
4329
David Majnemerae1ed0e2015-05-28 04:36:18 +00004330static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4331 Builder.defineMacro("__MSVCRT__");
4332 Builder.defineMacro("__MINGW32__");
4333 addCygMingDefines(Opts, Builder);
4334}
4335
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004336// x86-32 MinGW target
4337class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4338public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004339 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4340 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004341 void getTargetDefines(const LangOptions &Opts,
4342 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004343 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004344 DefineStd(Builder, "WIN32", Opts);
4345 DefineStd(Builder, "WINNT", Opts);
4346 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004347 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004348 }
4349};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004350
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004351// x86-32 Cygwin target
4352class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4353public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004354 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4355 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004356 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004357 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004358 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 +00004359 }
Craig Topper3164f332014-03-11 03:39:26 +00004360 void getTargetDefines(const LangOptions &Opts,
4361 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004362 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004363 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004364 Builder.defineMacro("__CYGWIN__");
4365 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004366 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004367 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004368 if (Opts.CPlusPlus)
4369 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004370 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004371};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004372
Chris Lattnerb986aba2010-04-11 19:29:39 +00004373// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004374class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004375public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004376 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004377 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004378 }
Craig Topper3164f332014-03-11 03:39:26 +00004379 void getTargetDefines(const LangOptions &Opts,
4380 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004381 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004382 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004383 }
4384};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004385
Alexey Bataevc99b0492015-11-25 09:24:26 +00004386// X86-32 MCU target
4387class MCUX86_32TargetInfo : public X86_32TargetInfo {
4388public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004389 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4390 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004391 LongDoubleWidth = 64;
4392 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004393 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 +00004394 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004395 }
4396
4397 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4398 // On MCU we support only C calling convention.
4399 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4400 }
4401
4402 void getTargetDefines(const LangOptions &Opts,
4403 MacroBuilder &Builder) const override {
4404 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4405 Builder.defineMacro("__iamcu");
4406 Builder.defineMacro("__iamcu__");
4407 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004408
4409 bool allowsLargerPreferedTypeAlignment() const override {
4410 return false;
4411 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004412};
4413
Douglas Gregor9fabd852011-07-01 22:41:14 +00004414// RTEMS Target
4415template<typename Target>
4416class RTEMSTargetInfo : public OSTargetInfo<Target> {
4417protected:
Craig Topper3164f332014-03-11 03:39:26 +00004418 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4419 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004420 // RTEMS defines; list based off of gcc output
4421
Douglas Gregor9fabd852011-07-01 22:41:14 +00004422 Builder.defineMacro("__rtems__");
4423 Builder.defineMacro("__ELF__");
4424 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004425
Douglas Gregor9fabd852011-07-01 22:41:14 +00004426public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004427 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4428 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004429 switch (Triple.getArch()) {
4430 default:
4431 case llvm::Triple::x86:
4432 // this->MCountName = ".mcount";
4433 break;
4434 case llvm::Triple::mips:
4435 case llvm::Triple::mipsel:
4436 case llvm::Triple::ppc:
4437 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004438 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004439 // this->MCountName = "_mcount";
4440 break;
4441 case llvm::Triple::arm:
4442 // this->MCountName = "__mcount";
4443 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004444 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004445 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004446};
4447
Douglas Gregor9fabd852011-07-01 22:41:14 +00004448// x86-32 RTEMS target
4449class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4450public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004451 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4452 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004453 SizeType = UnsignedLong;
4454 IntPtrType = SignedLong;
4455 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004456 }
Craig Topper3164f332014-03-11 03:39:26 +00004457 void getTargetDefines(const LangOptions &Opts,
4458 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004459 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4460 Builder.defineMacro("__INTEL__");
4461 Builder.defineMacro("__rtems__");
4462 }
4463};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004464
Eli Friedman3fd920a2008-08-20 02:34:37 +00004465// x86-64 generic target
4466class X86_64TargetInfo : public X86TargetInfo {
4467public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004468 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4469 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004470 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004471 bool IsWinCOFF =
4472 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004473 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004474 LongDoubleWidth = 128;
4475 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004476 LargeArrayMinWidth = 128;
4477 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004478 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004479 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4480 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4481 IntPtrType = IsX32 ? SignedInt : SignedLong;
4482 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004483 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004484 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004485
Eric Christopher917e9522014-11-18 22:36:15 +00004486 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004487 resetDataLayout(IsX32
4488 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4489 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4490 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004491
4492 // Use fpret only for long double.
4493 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004494
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004495 // Use fp2ret for _Complex long double.
4496 ComplexLongDoubleUsesFP2Ret = true;
4497
Charles Davisc7d5c942015-09-17 20:55:33 +00004498 // Make __builtin_ms_va_list available.
4499 HasBuiltinMSVaList = true;
4500
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004501 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004502 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004503 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004504 }
Craig Topper3164f332014-03-11 03:39:26 +00004505 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004506 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004507 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004508
Craig Topper3164f332014-03-11 03:39:26 +00004509 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004510 if (RegNo == 0) return 0;
4511 if (RegNo == 1) return 1;
4512 return -1;
4513 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004514
Craig Topper3164f332014-03-11 03:39:26 +00004515 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004516 switch (CC) {
4517 case CC_C:
4518 case CC_Swift:
4519 case CC_X86VectorCall:
4520 case CC_IntelOclBicc:
4521 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004522 case CC_PreserveMost:
4523 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004524 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004525 return CCCR_OK;
4526 default:
4527 return CCCR_Warning;
4528 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004529 }
4530
Craig Topper3164f332014-03-11 03:39:26 +00004531 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004532 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004533 }
4534
Pavel Chupinfd223e12014-08-04 12:39:43 +00004535 // for x32 we need it here explicitly
4536 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004537 unsigned getUnwindWordWidth() const override { return 64; }
4538 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004539
4540 bool validateGlobalRegisterVariable(StringRef RegName,
4541 unsigned RegSize,
4542 bool &HasSizeMismatch) const override {
4543 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4544 // handle.
4545 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4546 // Check that the register size is 64-bit.
4547 HasSizeMismatch = RegSize != 64;
4548 return true;
4549 }
4550
4551 // Check if the register is a 32-bit register the backend can handle.
4552 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4553 HasSizeMismatch);
4554 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004555 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4556 return llvm::makeArrayRef(BuiltinInfoX86,
4557 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4558 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004559};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004560
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004561// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004562class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004564 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4565 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004566 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004567 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004568 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004569 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004570 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004571 SizeType = UnsignedLongLong;
4572 PtrDiffType = SignedLongLong;
4573 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004574 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004575
Craig Topper3164f332014-03-11 03:39:26 +00004576 void getTargetDefines(const LangOptions &Opts,
4577 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004578 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004579 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004580 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004581
Craig Topper3164f332014-03-11 03:39:26 +00004582 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004583 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004584 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004585
Craig Topper3164f332014-03-11 03:39:26 +00004586 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004587 switch (CC) {
4588 case CC_X86StdCall:
4589 case CC_X86ThisCall:
4590 case CC_X86FastCall:
4591 return CCCR_Ignore;
4592 case CC_C:
4593 case CC_X86VectorCall:
4594 case CC_IntelOclBicc:
4595 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004596 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004597 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004598 return CCCR_OK;
4599 default:
4600 return CCCR_Warning;
4601 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004602 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004603};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004604
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004605// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004606class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004607public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004608 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4609 const TargetOptions &Opts)
4610 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004611 LongDoubleWidth = LongDoubleAlign = 64;
4612 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004613 }
Craig Topper3164f332014-03-11 03:39:26 +00004614 void getTargetDefines(const LangOptions &Opts,
4615 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004616 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4617 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004618 Builder.defineMacro("_M_X64", "100");
4619 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004620 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004621};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004622
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004623// x86-64 MinGW target
4624class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004626 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4627 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004628 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4629 // with x86 FP ops. Weird.
4630 LongDoubleWidth = LongDoubleAlign = 128;
4631 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4632 }
4633
Craig Topper3164f332014-03-11 03:39:26 +00004634 void getTargetDefines(const LangOptions &Opts,
4635 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004636 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004637 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004638 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004639 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004640
4641 // GCC defines this macro when it is using __gxx_personality_seh0.
4642 if (!Opts.SjLjExceptions)
4643 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004644 }
4645};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004646
Yaron Kerend030d112015-07-22 17:38:19 +00004647// x86-64 Cygwin target
4648class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4649public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004650 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4651 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004652 TLSSupported = false;
4653 WCharType = UnsignedShort;
4654 }
4655 void getTargetDefines(const LangOptions &Opts,
4656 MacroBuilder &Builder) const override {
4657 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4658 Builder.defineMacro("__x86_64__");
4659 Builder.defineMacro("__CYGWIN__");
4660 Builder.defineMacro("__CYGWIN64__");
4661 addCygMingDefines(Opts, Builder);
4662 DefineStd(Builder, "unix", Opts);
4663 if (Opts.CPlusPlus)
4664 Builder.defineMacro("_GNU_SOURCE");
4665
4666 // GCC defines this macro when it is using __gxx_personality_seh0.
4667 if (!Opts.SjLjExceptions)
4668 Builder.defineMacro("__SEH__");
4669 }
4670};
4671
Eli Friedman2857ccb2009-07-01 03:36:11 +00004672class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4673public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004674 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4675 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004676 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004677 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4678 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004679 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004680 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004681 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004682 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004683
4684 bool handleTargetFeatures(std::vector<std::string> &Features,
4685 DiagnosticsEngine &Diags) override {
4686 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4687 Diags))
4688 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004689 // We now know the features we have: we can decide how to align vectors.
4690 MaxVectorAlign =
4691 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004692 return true;
4693 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004694};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004695
Eli Friedman245f2292009-07-05 22:31:18 +00004696class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4697public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004698 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4699 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004700 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004701 Int64Type = SignedLongLong;
4702 }
4703};
Eli Friedman245f2292009-07-05 22:31:18 +00004704
Eli Friedman9fa28852012-08-08 23:57:20 +00004705class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004707 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4708 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004709 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004710 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004711 }
4712};
Tim Northover9bb857a2013-01-31 12:13:10 +00004713
Eli Friedmanf05b7722008-08-20 07:44:10 +00004714class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004715 // Possible FPU choices.
4716 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004717 VFP2FPU = (1 << 0),
4718 VFP3FPU = (1 << 1),
4719 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004720 NeonFPU = (1 << 3),
4721 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004722 };
4723
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004724 // Possible HWDiv features.
4725 enum HWDivMode {
4726 HWDivThumb = (1 << 0),
4727 HWDivARM = (1 << 1)
4728 };
4729
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004730 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004731 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004732 }
4733
4734 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4735 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004736
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004737 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004738
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004739 StringRef CPUProfile;
4740 StringRef CPUAttr;
4741
Rafael Espindolaeb265472013-08-21 21:59:03 +00004742 enum {
4743 FP_Default,
4744 FP_VFP,
4745 FP_Neon
4746 } FPMath;
4747
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004749 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004750 unsigned ArchProfile;
4751 unsigned ArchVersion;
4752
Bernard Ogdenda13af32013-10-24 18:32:51 +00004753 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004754
Logan Chien57086ce2012-10-10 06:56:20 +00004755 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004756 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004757
4758 // Initialized via features.
4759 unsigned SoftFloat : 1;
4760 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004761
Bernard Ogden18b57012013-10-29 09:47:51 +00004762 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004763 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004764 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004765 unsigned Unaligned : 1;
4766
4767 enum {
4768 LDREX_B = (1 << 0), /// byte (8-bit)
4769 LDREX_H = (1 << 1), /// half (16-bit)
4770 LDREX_W = (1 << 2), /// word (32-bit)
4771 LDREX_D = (1 << 3), /// double (64-bit)
4772 };
4773
4774 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004775
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004776 // ACLE 6.5.1 Hardware floating point
4777 enum {
4778 HW_FP_HP = (1 << 1), /// half (16-bit)
4779 HW_FP_SP = (1 << 2), /// single (32-bit)
4780 HW_FP_DP = (1 << 3), /// double (64-bit)
4781 };
4782 uint32_t HW_FP;
4783
Chris Lattner5cc15e02010-03-03 19:03:45 +00004784 static const Builtin::Info BuiltinInfo[];
4785
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004786 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004787 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004788
4789 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004790 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004791
Renato Golin0201a9e2016-09-22 19:28:20 +00004792 // size_t is unsigned long on MachO-derived environments, NetBSD,
4793 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004794 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004795 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004796 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004797 SizeType = UnsignedLong;
4798 else
4799 SizeType = UnsignedInt;
4800
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004801 switch (T.getOS()) {
4802 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004803 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004804 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004805 break;
4806 case llvm::Triple::Win32:
4807 WCharType = UnsignedShort;
4808 break;
4809 case llvm::Triple::Linux:
4810 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004811 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4812 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004813 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004814 }
4815
4816 UseBitFieldTypeAlignment = true;
4817
4818 ZeroLengthBitfieldBoundary = 0;
4819
Tim Northover147cd2f2014-10-14 22:12:21 +00004820 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4821 // so set preferred for small types to 32.
4822 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004823 resetDataLayout(BigEndian
4824 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4825 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004826 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004827 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004828 resetDataLayout("e"
4829 "-m:w"
4830 "-p:32:32"
4831 "-i64:64"
4832 "-v128:64:128"
4833 "-a:0:32"
4834 "-n32"
4835 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004836 } else if (T.isOSNaCl()) {
4837 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004838 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004839 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004840 resetDataLayout(BigEndian
4841 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4842 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004843 }
4844
4845 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004846 }
4847
Tim Northover5627d392015-10-30 16:30:45 +00004848 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004849 const llvm::Triple &T = getTriple();
4850
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004851 IsAAPCS = false;
4852
Tim Northover5627d392015-10-30 16:30:45 +00004853 if (IsAAPCS16)
4854 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4855 else
4856 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004857
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004858 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004859 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004860 SizeType = UnsignedInt;
4861 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004862 SizeType = UnsignedLong;
4863
4864 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4865 WCharType = SignedInt;
4866
4867 // Do not respect the alignment of bit-field types when laying out
4868 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4869 UseBitFieldTypeAlignment = false;
4870
4871 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4872 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4873 /// gcc.
4874 ZeroLengthBitfieldBoundary = 32;
4875
Tim Northover5627d392015-10-30 16:30:45 +00004876 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4877 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004878 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004879 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004880 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004881 BigEndian
4882 ? "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 +00004883 : "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 +00004884 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004885 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004886 BigEndian
4887 ? "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 +00004888 : "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 +00004889
4890 // FIXME: Override "preferred align" for double and long long.
4891 }
4892
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004893 void setArchInfo() {
4894 StringRef ArchName = getTriple().getArchName();
4895
Renato Goline84b0002015-10-08 16:43:26 +00004896 ArchISA = llvm::ARM::parseArchISA(ArchName);
4897 CPU = llvm::ARM::getDefaultCPU(ArchName);
4898 unsigned AK = llvm::ARM::parseArch(ArchName);
4899 if (AK != llvm::ARM::AK_INVALID)
4900 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004901 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004902 }
4903
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004904 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004905 StringRef SubArch;
4906
4907 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004908 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004909 SubArch = llvm::ARM::getSubArch(ArchKind);
4910 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4911 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004912
4913 // cache CPU related strings
4914 CPUAttr = getCPUAttr();
4915 CPUProfile = getCPUProfile();
4916 }
4917
4918 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004919 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004920 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004921 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004922 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4923 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004924 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004925 if (ArchProfile == llvm::ARM::PK_M) {
4926 MaxAtomicPromoteWidth = 32;
4927 if (ShouldUseInlineAtomic)
4928 MaxAtomicInlineWidth = 32;
4929 }
4930 else {
4931 MaxAtomicPromoteWidth = 64;
4932 if (ShouldUseInlineAtomic)
4933 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004934 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004935 }
4936
4937 bool isThumb() const {
4938 return (ArchISA == llvm::ARM::IK_THUMB);
4939 }
4940
4941 bool supportsThumb() const {
4942 return CPUAttr.count('T') || ArchVersion >= 6;
4943 }
4944
4945 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004946 return CPUAttr.equals("6T2") ||
4947 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004948 }
4949
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004950 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004951 // For most sub-arches, the build attribute CPU name is enough.
4952 // For Cortex variants, it's slightly different.
4953 switch(ArchKind) {
4954 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004955 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004956 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004957 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004958 case llvm::ARM::AK_ARMV7S:
4959 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004960 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004961 return "7A";
4962 case llvm::ARM::AK_ARMV7R:
4963 return "7R";
4964 case llvm::ARM::AK_ARMV7M:
4965 return "7M";
4966 case llvm::ARM::AK_ARMV7EM:
4967 return "7EM";
4968 case llvm::ARM::AK_ARMV8A:
4969 return "8A";
4970 case llvm::ARM::AK_ARMV8_1A:
4971 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004972 case llvm::ARM::AK_ARMV8_2A:
4973 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004974 case llvm::ARM::AK_ARMV8MBaseline:
4975 return "8M_BASE";
4976 case llvm::ARM::AK_ARMV8MMainline:
4977 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00004978 case llvm::ARM::AK_ARMV8R:
4979 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004980 }
4981 }
4982
4983 StringRef getCPUProfile() const {
4984 switch(ArchProfile) {
4985 case llvm::ARM::PK_A:
4986 return "A";
4987 case llvm::ARM::PK_R:
4988 return "R";
4989 case llvm::ARM::PK_M:
4990 return "M";
4991 default:
4992 return "";
4993 }
4994 }
4995
Chris Lattner17df24e2008-04-21 18:56:49 +00004996public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004997 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004998 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4999 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005000
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005001 switch (getTriple().getOS()) {
5002 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005003 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005004 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005005 break;
5006 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005007 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005008 break;
5009 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005010
Renato Goline84b0002015-10-08 16:43:26 +00005011 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005012 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005013
Chris Lattner1a8f3942010-04-23 16:29:58 +00005014 // {} in inline assembly are neon specifiers, not assembly variant
5015 // specifiers.
5016 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005017
Eric Christopher0e261882014-12-05 01:06:59 +00005018 // FIXME: This duplicates code from the driver that sets the -target-abi
5019 // option - this code is used if -target-abi isn't passed and should
5020 // be unified in some way.
5021 if (Triple.isOSBinFormatMachO()) {
5022 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5023 // the frontend matches that.
5024 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5025 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005026 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005027 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005028 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005029 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005030 } else {
5031 setABI("apcs-gnu");
5032 }
5033 } else if (Triple.isOSWindows()) {
5034 // FIXME: this is invalid for WindowsCE
5035 setABI("aapcs");
5036 } else {
5037 // Select the default based on the platform.
5038 switch (Triple.getEnvironment()) {
5039 case llvm::Triple::Android:
5040 case llvm::Triple::GNUEABI:
5041 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005042 case llvm::Triple::MuslEABI:
5043 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005044 setABI("aapcs-linux");
5045 break;
5046 case llvm::Triple::EABIHF:
5047 case llvm::Triple::EABI:
5048 setABI("aapcs");
5049 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005050 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005051 setABI("apcs-gnu");
5052 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005053 default:
5054 if (Triple.getOS() == llvm::Triple::NetBSD)
5055 setABI("apcs-gnu");
5056 else
5057 setABI("aapcs");
5058 break;
5059 }
5060 }
John McCall86353412010-08-21 22:46:04 +00005061
5062 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005063 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005064
Renato Golin15b86152015-07-03 16:41:13 +00005065 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005066 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005067
James Molloya7139222012-03-12 09:14:10 +00005068 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005069 // the alignment of the zero-length bitfield is greater than the member
5070 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005071 // zero length bitfield.
5072 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005073
5074 if (Triple.getOS() == llvm::Triple::Linux ||
5075 Triple.getOS() == llvm::Triple::UnknownOS)
5076 this->MCountName =
5077 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005078 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005079
Alp Toker4925ba72014-06-07 23:30:42 +00005080 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005081
Craig Topper3164f332014-03-11 03:39:26 +00005082 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005083 ABI = Name;
5084
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005085 // The defaults (above) are for AAPCS, check if we need to change them.
5086 //
5087 // FIXME: We need support for -meabi... we could just mangle it into the
5088 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005089 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005090 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005091 return true;
5092 }
5093 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5094 setABIAAPCS();
5095 return true;
5096 }
5097 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005098 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005099
Renato Golinf5c4dec2015-05-27 13:33:00 +00005100 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005101 bool
5102 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5103 StringRef CPU,
5104 const std::vector<std::string> &FeaturesVec) const override {
5105
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005106 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005107 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005108
5109 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005110 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005111 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5112
5113 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005114 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005115 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5116
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005117 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005118 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005119 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005120
Eric Christopher007b0a02015-08-28 22:32:01 +00005121 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005122 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005123
Craig Topper3164f332014-03-11 03:39:26 +00005124 bool handleTargetFeatures(std::vector<std::string> &Features,
5125 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005126 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005127 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005128 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005129 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005130 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005131 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005132 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005133
Ranjeet Singhac08e532015-06-24 23:39:25 +00005134 // This does not diagnose illegal cases like having both
5135 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5136 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005137 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005138 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005139 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005140 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005141 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005142 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005143 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005144 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005145 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005146 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005147 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005148 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005149 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005150 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005151 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005152 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005153 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005154 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005155 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005156 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005157 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005158 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005159 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005160 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005161 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005162 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005163 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005164 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005165 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005166 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005167 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005168 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005169 } else if (Feature == "+strict-align") {
5170 Unaligned = 0;
5171 } else if (Feature == "+fp16") {
5172 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005173 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005174 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005175 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005176
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005177 switch (ArchVersion) {
5178 case 6:
5179 if (ArchProfile == llvm::ARM::PK_M)
5180 LDREX = 0;
5181 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5182 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5183 else
5184 LDREX = LDREX_W;
5185 break;
5186 case 7:
5187 if (ArchProfile == llvm::ARM::PK_M)
5188 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5189 else
5190 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5191 break;
5192 case 8:
5193 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5194 }
5195
Rafael Espindolaeb265472013-08-21 21:59:03 +00005196 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5197 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5198 return false;
5199 }
5200
5201 if (FPMath == FP_Neon)
5202 Features.push_back("+neonfp");
5203 else if (FPMath == FP_VFP)
5204 Features.push_back("-neonfp");
5205
Daniel Dunbar893d4752009-12-19 04:15:38 +00005206 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005207 auto Feature =
5208 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5209 if (Feature != Features.end())
5210 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005211
Rafael Espindolaeb265472013-08-21 21:59:03 +00005212 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005213 }
5214
Craig Topper3164f332014-03-11 03:39:26 +00005215 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005216 return llvm::StringSwitch<bool>(Feature)
5217 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005218 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005219 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005220 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005221 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005222 .Case("hwdiv", HWDiv & HWDivThumb)
5223 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005224 .Default(false);
5225 }
Renato Golin15b86152015-07-03 16:41:13 +00005226
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005227 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005228 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005229 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005230
Renato Golin15b86152015-07-03 16:41:13 +00005231 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005232 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005233 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005234 CPU = Name;
5235 return true;
5236 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005237
Craig Topper3164f332014-03-11 03:39:26 +00005238 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005239
Craig Topper3164f332014-03-11 03:39:26 +00005240 void getTargetDefines(const LangOptions &Opts,
5241 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005242 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005243 Builder.defineMacro("__arm");
5244 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005245 // For bare-metal none-eabi.
5246 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5247 getTriple().getEnvironment() == llvm::Triple::EABI)
5248 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005249
Chris Lattnerecd49032009-03-02 22:27:17 +00005250 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005251 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005252
5253 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5254 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005255 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005256 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5257
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005258 if (!CPUAttr.empty())
5259 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005260
5261 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005262 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005263 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005265 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005266 // ACLE 6.5.7 Crypto Extension
5267 if (Crypto)
5268 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5269 // ACLE 6.5.8 CRC32 Extension
5270 if (CRC)
5271 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5272 // ACLE 6.5.10 Numeric Maximum and Minimum
5273 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5274 // ACLE 6.5.9 Directed Rounding
5275 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005276 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005277
5278 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5279 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005280 // NOTE that the default profile is assumed to be 'A'
5281 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005282 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5283
Bradley Smithf4affc12016-03-03 13:52:22 +00005284 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5285 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5286 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5287 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005288 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005289 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005290 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005291 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5292
5293 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5294 // instruction set such as ARM or Thumb.
5295 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5296
5297 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5298
5299 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005300 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005301 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005302
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005303 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005304 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005305 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005306
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005307 // ACLE 6.4.4 LDREX/STREX
5308 if (LDREX)
5309 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5310
5311 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005312 if (ArchVersion == 5 ||
5313 (ArchVersion == 6 && CPUProfile != "M") ||
5314 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005315 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5316
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005317 // ACLE 6.5.1 Hardware Floating Point
5318 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005319 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005320
Yi Konga44c4d72014-06-27 21:25:42 +00005321 // ACLE predefines.
5322 Builder.defineMacro("__ARM_ACLE", "200");
5323
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005324 // FP16 support (we currently only support IEEE format).
5325 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5326 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5327
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005328 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005329 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005330 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5331
Mike Stump9d54bd72009-04-08 02:07:04 +00005332 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005333
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005334 // FIXME: It's more complicated than this and we don't really support
5335 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005336 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005337 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005338 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005339
David Tweed8f676532012-10-25 13:33:01 +00005340 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005341 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005342 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005343 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005344 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005345 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005346 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005347
Tim Northover28fc0e12016-04-28 13:59:55 +00005348 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5349 ABI == "aapcs16")
5350 Builder.defineMacro("__ARM_PCS_VFP", "1");
5351
Daniel Dunbar893d4752009-12-19 04:15:38 +00005352 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005353 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005354
Zijiao Ma56a83722016-08-17 02:13:33 +00005355 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005356 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005357
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005358 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005359 Builder.defineMacro("__THUMBEL__");
5360 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005361 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005362 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005363 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005364
5365 // ACLE 6.4.9 32-bit SIMD instructions
5366 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5367 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5368
5369 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005370 if (((HWDiv & HWDivThumb) && isThumb()) ||
5371 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005372 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005373 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005374 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005375
5376 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005377 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005378
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005379 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005380 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005381 if (FPU & VFP2FPU)
5382 Builder.defineMacro("__ARM_VFPV2__");
5383 if (FPU & VFP3FPU)
5384 Builder.defineMacro("__ARM_VFPV3__");
5385 if (FPU & VFP4FPU)
5386 Builder.defineMacro("__ARM_VFPV4__");
5387 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005388
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005389 // This only gets set when Neon instructions are actually available, unlike
5390 // the VFP define, hence the soft float and arch check. This is subtly
5391 // different from gcc, we follow the intent which was that it should be set
5392 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005393 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005394 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005395 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005396 // current AArch32 NEON implementations do not support double-precision
5397 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005398 Builder.defineMacro("__ARM_NEON_FP",
5399 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005400 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005401
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005402 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5403 Opts.ShortWChar ? "2" : "4");
5404
5405 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5406 Opts.ShortEnums ? "1" : "4");
5407
Bradley Smithf4affc12016-03-03 13:52:22 +00005408 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005409 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5411 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5412 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5413 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005414
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005415 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005416 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005417 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005418 }
5419
5420 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005421 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005422 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5423 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005424 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005425 }
5426
5427 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005428 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005429 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005430
5431 if (Opts.UnsafeFPMath)
5432 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005433
5434 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5435 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005436 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005437
Craig Topper6c03a542015-10-19 04:51:35 +00005438 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5439 return llvm::makeArrayRef(BuiltinInfo,
5440 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005441 }
Craig Topper3164f332014-03-11 03:39:26 +00005442 bool isCLZForZeroUndef() const override { return false; }
5443 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005444 return IsAAPCS
5445 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005446 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5447 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005448 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005449 ArrayRef<const char *> getGCCRegNames() const override;
5450 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005451 bool validateAsmConstraint(const char *&Name,
5452 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005453 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005454 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005455 case 'l': // r0-r7
5456 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005457 case 't': // VFP Floating point register single precision
5458 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005459 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005460 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005461 case 'I':
5462 case 'J':
5463 case 'K':
5464 case 'L':
5465 case 'M':
5466 // FIXME
5467 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005468 case 'Q': // A memory address that is a single base register.
5469 Info.setAllowsMemory();
5470 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005471 case 'U': // a memory reference...
5472 switch (Name[1]) {
5473 case 'q': // ...ARMV4 ldrsb
5474 case 'v': // ...VFP load/store (reg+constant offset)
5475 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005476 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005477 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005478 case 'n': // valid address for Neon doubleword vector load/store
5479 case 'm': // valid address for Neon element and structure load/store
5480 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005481 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005482 Info.setAllowsMemory();
5483 Name++;
5484 return true;
5485 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005486 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005487 return false;
5488 }
Craig Topper3164f332014-03-11 03:39:26 +00005489 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005490 std::string R;
5491 switch (*Constraint) {
5492 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005493 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005494 Constraint++;
5495 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005496 case 'p': // 'p' should be translated to 'r' by default.
5497 R = std::string("r");
5498 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005499 default:
5500 return std::string(1, *Constraint);
5501 }
5502 return R;
5503 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005504 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005505 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005506 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005507 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005508 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005509
Bill Wendling9d1ee112012-10-25 23:28:48 +00005510 // Strip off constraint modifiers.
5511 while (Constraint[0] == '=' ||
5512 Constraint[0] == '+' ||
5513 Constraint[0] == '&')
5514 Constraint = Constraint.substr(1);
5515
5516 switch (Constraint[0]) {
5517 default: break;
5518 case 'r': {
5519 switch (Modifier) {
5520 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005521 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005522 case 'q':
5523 // A register of size 32 cannot fit a vector type.
5524 return false;
5525 }
5526 }
5527 }
5528
5529 return true;
5530 }
Craig Topper3164f332014-03-11 03:39:26 +00005531 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005532 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005533 return "";
5534 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005535
Craig Topper3164f332014-03-11 03:39:26 +00005536 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005537 switch (CC) {
5538 case CC_AAPCS:
5539 case CC_AAPCS_VFP:
5540 case CC_Swift:
5541 return CCCR_OK;
5542 default:
5543 return CCCR_Warning;
5544 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005545 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005546
Craig Topper3164f332014-03-11 03:39:26 +00005547 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005548 if (RegNo == 0) return 0;
5549 if (RegNo == 1) return 1;
5550 return -1;
5551 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005552
5553 bool hasSjLjLowering() const override {
5554 return true;
5555 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005556};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005557
Rafael Espindolaeb265472013-08-21 21:59:03 +00005558bool ARMTargetInfo::setFPMath(StringRef Name) {
5559 if (Name == "neon") {
5560 FPMath = FP_Neon;
5561 return true;
5562 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5563 Name == "vfp4") {
5564 FPMath = FP_VFP;
5565 return true;
5566 }
5567 return false;
5568}
5569
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005570const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005571 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005572 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005573 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5574
5575 // Float registers
5576 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5577 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5578 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005579 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005580
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005581 // Double registers
5582 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5583 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005584 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5585 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005586
5587 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005588 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5589 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005590};
5591
Craig Topperf054e3a2015-10-19 03:52:27 +00005592ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5593 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005594}
5595
5596const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005597 { { "a1" }, "r0" },
5598 { { "a2" }, "r1" },
5599 { { "a3" }, "r2" },
5600 { { "a4" }, "r3" },
5601 { { "v1" }, "r4" },
5602 { { "v2" }, "r5" },
5603 { { "v3" }, "r6" },
5604 { { "v4" }, "r7" },
5605 { { "v5" }, "r8" },
5606 { { "v6", "rfp" }, "r9" },
5607 { { "sl" }, "r10" },
5608 { { "fp" }, "r11" },
5609 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005610 { { "r13" }, "sp" },
5611 { { "r14" }, "lr" },
5612 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005613 // The S, D and Q registers overlap, but aren't really aliases; we
5614 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005615};
5616
Craig Topperf054e3a2015-10-19 03:52:27 +00005617ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5618 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005619}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005620
5621const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005622#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005623 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005624#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5625 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005626#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005627
Craig Topper07d3b622015-08-07 05:14:44 +00005628#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005629 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005630#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005631 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005632#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5633 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005634#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5635 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005636#include "clang/Basic/BuiltinsARM.def"
5637};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005638
5639class ARMleTargetInfo : public ARMTargetInfo {
5640public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005641 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005642 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005643 void getTargetDefines(const LangOptions &Opts,
5644 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005645 Builder.defineMacro("__ARMEL__");
5646 ARMTargetInfo::getTargetDefines(Opts, Builder);
5647 }
5648};
5649
5650class ARMbeTargetInfo : public ARMTargetInfo {
5651public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005652 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005653 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005654 void getTargetDefines(const LangOptions &Opts,
5655 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005656 Builder.defineMacro("__ARMEB__");
5657 Builder.defineMacro("__ARM_BIG_ENDIAN");
5658 ARMTargetInfo::getTargetDefines(Opts, Builder);
5659 }
5660};
Chris Lattner17df24e2008-04-21 18:56:49 +00005661
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005662class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5663 const llvm::Triple Triple;
5664public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005665 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5666 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005667 WCharType = UnsignedShort;
5668 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005669 }
5670 void getVisualStudioDefines(const LangOptions &Opts,
5671 MacroBuilder &Builder) const {
5672 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5673
5674 // FIXME: this is invalid for WindowsCE
5675 Builder.defineMacro("_M_ARM_NT", "1");
5676 Builder.defineMacro("_M_ARMT", "_M_ARM");
5677 Builder.defineMacro("_M_THUMB", "_M_ARM");
5678
5679 assert((Triple.getArch() == llvm::Triple::arm ||
5680 Triple.getArch() == llvm::Triple::thumb) &&
5681 "invalid architecture for Windows ARM target info");
5682 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5683 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5684
5685 // TODO map the complete set of values
5686 // 31: VFPv3 40: VFPv4
5687 Builder.defineMacro("_M_ARM_FP", "31");
5688 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005689 BuiltinVaListKind getBuiltinVaListKind() const override {
5690 return TargetInfo::CharPtrBuiltinVaList;
5691 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005692 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5693 switch (CC) {
5694 case CC_X86StdCall:
5695 case CC_X86ThisCall:
5696 case CC_X86FastCall:
5697 case CC_X86VectorCall:
5698 return CCCR_Ignore;
5699 case CC_C:
5700 return CCCR_OK;
5701 default:
5702 return CCCR_Warning;
5703 }
5704 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005705};
5706
5707// Windows ARM + Itanium C++ ABI Target
5708class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5709public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005710 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5711 const TargetOptions &Opts)
5712 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005713 TheCXXABI.set(TargetCXXABI::GenericARM);
5714 }
5715
5716 void getTargetDefines(const LangOptions &Opts,
5717 MacroBuilder &Builder) const override {
5718 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5719
5720 if (Opts.MSVCCompat)
5721 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5722 }
5723};
5724
5725// Windows ARM, MS (C++) ABI
5726class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5727public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005728 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5729 const TargetOptions &Opts)
5730 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005731 TheCXXABI.set(TargetCXXABI::Microsoft);
5732 }
5733
5734 void getTargetDefines(const LangOptions &Opts,
5735 MacroBuilder &Builder) const override {
5736 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5737 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5738 }
5739};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005740
Yaron Keren321249c2015-07-15 13:32:23 +00005741// ARM MinGW target
5742class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5743public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005744 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5745 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005746 TheCXXABI.set(TargetCXXABI::GenericARM);
5747 }
5748
5749 void getTargetDefines(const LangOptions &Opts,
5750 MacroBuilder &Builder) const override {
5751 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5752 DefineStd(Builder, "WIN32", Opts);
5753 DefineStd(Builder, "WINNT", Opts);
5754 Builder.defineMacro("_ARM_");
5755 addMinGWDefines(Opts, Builder);
5756 }
5757};
5758
5759// ARM Cygwin target
5760class CygwinARMTargetInfo : public ARMleTargetInfo {
5761public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005762 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5763 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005764 TLSSupported = false;
5765 WCharType = UnsignedShort;
5766 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005767 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005768 }
5769 void getTargetDefines(const LangOptions &Opts,
5770 MacroBuilder &Builder) const override {
5771 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5772 Builder.defineMacro("_ARM_");
5773 Builder.defineMacro("__CYGWIN__");
5774 Builder.defineMacro("__CYGWIN32__");
5775 DefineStd(Builder, "unix", Opts);
5776 if (Opts.CPlusPlus)
5777 Builder.defineMacro("_GNU_SOURCE");
5778 }
5779};
5780
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005781class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005782protected:
Craig Topper3164f332014-03-11 03:39:26 +00005783 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5784 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005785 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005786 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005787
Torok Edwinb2b37c62009-06-30 17:10:35 +00005788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005789 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5790 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005791 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005792 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005793 // FIXME: This should be based off of the target features in
5794 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005795 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005796
Tim Northoverd88ecb32016-01-27 19:32:40 +00005797 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005798 // Darwin on iOS uses a variant of the ARM C++ ABI.
5799 TheCXXABI.set(TargetCXXABI::WatchOS);
5800
5801 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5802 // size_t is long, it's a bit weird for it to be int.
5803 PtrDiffType = SignedLong;
5804
5805 // BOOL should be a real boolean on the new ABI
5806 UseSignedCharForObjCBool = false;
5807 } else
5808 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005809 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005810};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005811
Tim Northover573cbee2014-05-24 12:52:07 +00005812class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005813 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005814 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5815 static const char *const GCCRegNames[];
5816
James Molloy75f5f9e2014-04-16 15:33:48 +00005817 enum FPUModeEnum {
5818 FPUMode,
5819 NeonMode
5820 };
5821
5822 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005823 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005826 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005827
Tim Northovera2ee4332014-03-29 15:09:45 +00005828 static const Builtin::Info BuiltinInfo[];
5829
5830 std::string ABI;
5831
5832public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005833 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005834 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005835 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5836 WCharType = SignedInt;
5837
5838 // NetBSD apparently prefers consistency across ARM targets to consistency
5839 // across 64-bit targets.
5840 Int64Type = SignedLongLong;
5841 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005842 } else {
5843 WCharType = UnsignedInt;
5844 Int64Type = SignedLong;
5845 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005846 }
5847
Tim Northovera2ee4332014-03-29 15:09:45 +00005848 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005849 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005850 MaxAtomicInlineWidth = 128;
5851 MaxAtomicPromoteWidth = 128;
5852
Tim Northovera6a19f12015-02-06 01:25:07 +00005853 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005854 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5855
Tim Northovera2ee4332014-03-29 15:09:45 +00005856 // {} in inline assembly are neon specifiers, not assembly variant
5857 // specifiers.
5858 NoAsmVariants = true;
5859
Tim Northover7ad87af2015-01-16 18:44:04 +00005860 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5861 // contributes to the alignment of the containing aggregate in the same way
5862 // a plain (non bit-field) member of that type would, without exception for
5863 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005864 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005865 UseZeroLengthBitfieldAlignment = true;
5866
Tim Northover573cbee2014-05-24 12:52:07 +00005867 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005868 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005869
5870 if (Triple.getOS() == llvm::Triple::Linux ||
5871 Triple.getOS() == llvm::Triple::UnknownOS)
5872 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005873 }
5874
Alp Toker4925ba72014-06-07 23:30:42 +00005875 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005876 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005877 if (Name != "aapcs" && Name != "darwinpcs")
5878 return false;
5879
5880 ABI = Name;
5881 return true;
5882 }
5883
David Blaikie1cbb9712014-11-14 19:09:44 +00005884 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005885 return Name == "generic" ||
5886 llvm::AArch64::parseCPUArch(Name) !=
5887 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005888 }
5889
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005890 void getTargetDefines(const LangOptions &Opts,
5891 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005892 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005893 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005894
5895 // Target properties.
5896 Builder.defineMacro("_LP64");
5897 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005898
5899 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5900 Builder.defineMacro("__ARM_ACLE", "200");
5901 Builder.defineMacro("__ARM_ARCH", "8");
5902 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5903
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005904 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005905 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005906 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005907
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005908 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5909 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5910 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5911 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005912 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005913 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5914 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005915
5916 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5917
5918 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005919 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005920
5921 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5922 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005923 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5924 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005925
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005926 if (Opts.UnsafeFPMath)
5927 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005928
5929 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5930
5931 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5932 Opts.ShortEnums ? "1" : "4");
5933
James Molloy75f5f9e2014-04-16 15:33:48 +00005934 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005935 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005936 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005937 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005938 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005939
Bradley Smith418c5932014-05-02 15:17:51 +00005940 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005941 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005942
James Molloy75f5f9e2014-04-16 15:33:48 +00005943 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005944 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5945
5946 if (Unaligned)
5947 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005948
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005949 if (V8_1A)
5950 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5951
Reid Klecknerd167d422015-05-06 15:31:46 +00005952 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5953 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5954 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5955 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5956 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005957 }
5958
Craig Topper6c03a542015-10-19 04:51:35 +00005959 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5960 return llvm::makeArrayRef(BuiltinInfo,
5961 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005962 }
5963
David Blaikie1cbb9712014-11-14 19:09:44 +00005964 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005965 return Feature == "aarch64" ||
5966 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005967 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005968 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005969 }
5970
James Molloy5e73df52014-04-16 15:06:20 +00005971 bool handleTargetFeatures(std::vector<std::string> &Features,
5972 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005973 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005974 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005975 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005976 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005977 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005978
Eric Christopher610fe112015-08-26 08:21:55 +00005979 for (const auto &Feature : Features) {
5980 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005981 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005982 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005983 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005984 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005985 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005986 if (Feature == "+strict-align")
5987 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005988 if (Feature == "+v8.1a")
5989 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005990 }
5991
James Y Knightb214cbc2016-03-04 19:00:41 +00005992 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005993
5994 return true;
5995 }
5996
John McCall477f2bb2016-03-03 06:39:32 +00005997 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5998 switch (CC) {
5999 case CC_C:
6000 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006001 case CC_PreserveMost:
6002 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006003 return CCCR_OK;
6004 default:
6005 return CCCR_Warning;
6006 }
6007 }
6008
David Blaikie1cbb9712014-11-14 19:09:44 +00006009 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006010
David Blaikie1cbb9712014-11-14 19:09:44 +00006011 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006012 return TargetInfo::AArch64ABIBuiltinVaList;
6013 }
6014
Craig Topperf054e3a2015-10-19 03:52:27 +00006015 ArrayRef<const char *> getGCCRegNames() const override;
6016 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006017
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006018 bool validateAsmConstraint(const char *&Name,
6019 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006020 switch (*Name) {
6021 default:
6022 return false;
6023 case 'w': // Floating point and SIMD registers (V0-V31)
6024 Info.setAllowsRegister();
6025 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006026 case 'I': // Constant that can be used with an ADD instruction
6027 case 'J': // Constant that can be used with a SUB instruction
6028 case 'K': // Constant that can be used with a 32-bit logical instruction
6029 case 'L': // Constant that can be used with a 64-bit logical instruction
6030 case 'M': // Constant that can be used as a 32-bit MOV immediate
6031 case 'N': // Constant that can be used as a 64-bit MOV immediate
6032 case 'Y': // Floating point constant zero
6033 case 'Z': // Integer constant zero
6034 return true;
6035 case 'Q': // A memory reference with base register and no offset
6036 Info.setAllowsMemory();
6037 return true;
6038 case 'S': // A symbolic address
6039 Info.setAllowsRegister();
6040 return true;
6041 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006042 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6043 // Utf: A memory address suitable for ldp/stp in TF mode.
6044 // Usa: An absolute symbolic address.
6045 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6046 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006047 case 'z': // Zero register, wzr or xzr
6048 Info.setAllowsRegister();
6049 return true;
6050 case 'x': // Floating point and SIMD registers (V0-V15)
6051 Info.setAllowsRegister();
6052 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006053 }
6054 return false;
6055 }
6056
Akira Hatanaka987f1862014-08-22 06:05:21 +00006057 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006058 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006059 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006060 // Strip off constraint modifiers.
6061 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6062 Constraint = Constraint.substr(1);
6063
6064 switch (Constraint[0]) {
6065 default:
6066 return true;
6067 case 'z':
6068 case 'r': {
6069 switch (Modifier) {
6070 case 'x':
6071 case 'w':
6072 // For now assume that the person knows what they're
6073 // doing with the modifier.
6074 return true;
6075 default:
6076 // By default an 'r' constraint will be in the 'x'
6077 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006078 if (Size == 64)
6079 return true;
6080
6081 SuggestedModifier = "w";
6082 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006083 }
6084 }
6085 }
6086 }
6087
David Blaikie1cbb9712014-11-14 19:09:44 +00006088 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006089
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006090 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006091 if (RegNo == 0)
6092 return 0;
6093 if (RegNo == 1)
6094 return 1;
6095 return -1;
6096 }
6097};
6098
Tim Northover573cbee2014-05-24 12:52:07 +00006099const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006100 // 32-bit Integer registers
6101 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6102 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6103 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6104
6105 // 64-bit Integer registers
6106 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6107 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6108 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6109
6110 // 32-bit floating point regsisters
6111 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6112 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6113 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6114
6115 // 64-bit floating point regsisters
6116 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6117 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6118 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6119
6120 // Vector registers
6121 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6122 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6123 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6124};
6125
Craig Topperf054e3a2015-10-19 03:52:27 +00006126ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6127 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006128}
6129
Tim Northover573cbee2014-05-24 12:52:07 +00006130const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006131 { { "w31" }, "wsp" },
6132 { { "x29" }, "fp" },
6133 { { "x30" }, "lr" },
6134 { { "x31" }, "sp" },
6135 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6136 // don't want to substitute one of these for a different-sized one.
6137};
6138
Craig Topperf054e3a2015-10-19 03:52:27 +00006139ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6140 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006141}
6142
Tim Northover573cbee2014-05-24 12:52:07 +00006143const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006144#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006145 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006146#include "clang/Basic/BuiltinsNEON.def"
6147
6148#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006149 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006150#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006151};
James Molloy5e73df52014-04-16 15:06:20 +00006152
Tim Northover573cbee2014-05-24 12:52:07 +00006153class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006154 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006155 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006156 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006157 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006158 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006159 }
6160
6161public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006162 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6163 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006164 }
James Molloy5e73df52014-04-16 15:06:20 +00006165 void getTargetDefines(const LangOptions &Opts,
6166 MacroBuilder &Builder) const override {
6167 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006168 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006169 }
6170};
6171
Tim Northover573cbee2014-05-24 12:52:07 +00006172class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006173 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006174 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006175 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006176 }
6177
6178public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006179 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6180 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006181 void getTargetDefines(const LangOptions &Opts,
6182 MacroBuilder &Builder) const override {
6183 Builder.defineMacro("__AARCH64EB__");
6184 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6185 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006186 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006187 }
6188};
Tim Northovera2ee4332014-03-29 15:09:45 +00006189
Tim Northover573cbee2014-05-24 12:52:07 +00006190class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006191protected:
6192 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6193 MacroBuilder &Builder) const override {
6194 Builder.defineMacro("__AARCH64_SIMD__");
6195 Builder.defineMacro("__ARM64_ARCH_8__");
6196 Builder.defineMacro("__ARM_NEON__");
6197 Builder.defineMacro("__LITTLE_ENDIAN__");
6198 Builder.defineMacro("__REGISTER_PREFIX__", "");
6199 Builder.defineMacro("__arm64", "1");
6200 Builder.defineMacro("__arm64__", "1");
6201
6202 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6203 }
6204
Tim Northovera2ee4332014-03-29 15:09:45 +00006205public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006206 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6207 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006208 Int64Type = SignedLongLong;
6209 WCharType = SignedInt;
6210 UseSignedCharForObjCBool = false;
6211
Tim Northovera6a19f12015-02-06 01:25:07 +00006212 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006213 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6214
6215 TheCXXABI.set(TargetCXXABI::iOS64);
6216 }
6217
David Blaikie1cbb9712014-11-14 19:09:44 +00006218 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006219 return TargetInfo::CharPtrBuiltinVaList;
6220 }
6221};
Tim Northovera2ee4332014-03-29 15:09:45 +00006222
Tony Linthicum76329bf2011-12-12 21:14:55 +00006223// Hexagon abstract base class
6224class HexagonTargetInfo : public TargetInfo {
6225 static const Builtin::Info BuiltinInfo[];
6226 static const char * const GCCRegNames[];
6227 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6228 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006229 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006230 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006231
Tony Linthicum76329bf2011-12-12 21:14:55 +00006232public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006233 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6234 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006235 // Specify the vector alignment explicitly. For v512x1, the calculated
6236 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6237 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006238 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006239 "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 +00006240 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006241 SizeType = UnsignedInt;
6242 PtrDiffType = SignedInt;
6243 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006244
6245 // {} in inline assembly are packet specifiers, not assembly variant
6246 // specifiers.
6247 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006248
6249 LargeArrayMinWidth = 64;
6250 LargeArrayAlign = 64;
6251 UseBitFieldTypeAlignment = true;
6252 ZeroLengthBitfieldBoundary = 32;
6253 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006254 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255 }
6256
Craig Topper6c03a542015-10-19 04:51:35 +00006257 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6258 return llvm::makeArrayRef(BuiltinInfo,
6259 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006260 }
6261
Craig Topper3164f332014-03-11 03:39:26 +00006262 bool validateAsmConstraint(const char *&Name,
6263 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006264 switch (*Name) {
6265 case 'v':
6266 case 'q':
6267 if (HasHVX) {
6268 Info.setAllowsRegister();
6269 return true;
6270 }
6271 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006272 case 's':
6273 // Relocatable constant.
6274 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006275 }
6276 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006277 }
6278
Craig Topper3164f332014-03-11 03:39:26 +00006279 void getTargetDefines(const LangOptions &Opts,
6280 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006281
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006282 bool isCLZForZeroUndef() const override { return false; }
6283
Craig Topper3164f332014-03-11 03:39:26 +00006284 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006285 return llvm::StringSwitch<bool>(Feature)
6286 .Case("hexagon", true)
6287 .Case("hvx", HasHVX)
6288 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006289 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006290 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006291 }
Craig Topper3164f332014-03-11 03:39:26 +00006292
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006293 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6294 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6295 const override;
6296
6297 bool handleTargetFeatures(std::vector<std::string> &Features,
6298 DiagnosticsEngine &Diags) override;
6299
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006300 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6301 bool Enabled) const override;
6302
Craig Topper3164f332014-03-11 03:39:26 +00006303 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006304 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006305 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006306 ArrayRef<const char *> getGCCRegNames() const override;
6307 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006308 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006309 return "";
6310 }
Sebastian Pop86500282012-01-13 20:37:10 +00006311
6312 static const char *getHexagonCPUSuffix(StringRef Name) {
6313 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006314 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006315 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006316 .Case("hexagonv55", "55")
6317 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006318 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006319 }
6320
Craig Topper3164f332014-03-11 03:39:26 +00006321 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006322 if (!getHexagonCPUSuffix(Name))
6323 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006324 CPU = Name;
6325 return true;
6326 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006327
6328 int getEHDataRegisterNumber(unsigned RegNo) const override {
6329 return RegNo < 2 ? RegNo : -1;
6330 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006331};
6332
6333void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006334 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006335 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006336 Builder.defineMacro("__hexagon__", "1");
6337
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006338 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006339 Builder.defineMacro("__HEXAGON_V4__");
6340 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006341 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006342 Builder.defineMacro("__QDSP6_V4__");
6343 Builder.defineMacro("__QDSP6_ARCH__", "4");
6344 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006345 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006346 Builder.defineMacro("__HEXAGON_V5__");
6347 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6348 if(Opts.HexagonQdsp6Compat) {
6349 Builder.defineMacro("__QDSP6_V5__");
6350 Builder.defineMacro("__QDSP6_ARCH__", "5");
6351 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006352 } else if (CPU == "hexagonv55") {
6353 Builder.defineMacro("__HEXAGON_V55__");
6354 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6355 Builder.defineMacro("__QDSP6_V55__");
6356 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006357 } else if (CPU == "hexagonv60") {
6358 Builder.defineMacro("__HEXAGON_V60__");
6359 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6360 Builder.defineMacro("__QDSP6_V60__");
6361 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006362 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006363
6364 if (hasFeature("hvx")) {
6365 Builder.defineMacro("__HVX__");
6366 if (hasFeature("hvx-double"))
6367 Builder.defineMacro("__HVXDBL__");
6368 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369}
6370
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006371bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6372 DiagnosticsEngine &Diags, StringRef CPU,
6373 const std::vector<std::string> &FeaturesVec) const {
6374 // Default for v60: -hvx, -hvx-double.
6375 Features["hvx"] = false;
6376 Features["hvx-double"] = false;
6377 Features["long-calls"] = false;
6378
6379 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6380}
6381
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006382bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6383 DiagnosticsEngine &Diags) {
6384 for (auto &F : Features) {
6385 if (F == "+hvx")
6386 HasHVX = true;
6387 else if (F == "-hvx")
6388 HasHVX = HasHVXDouble = false;
6389 else if (F == "+hvx-double")
6390 HasHVX = HasHVXDouble = true;
6391 else if (F == "-hvx-double")
6392 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006393
6394 if (F == "+long-calls")
6395 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006396 else if (F == "-long-calls")
6397 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006398 }
6399 return true;
6400}
6401
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006402void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6403 StringRef Name, bool Enabled) const {
6404 if (Enabled) {
6405 if (Name == "hvx-double")
6406 Features["hvx"] = true;
6407 } else {
6408 if (Name == "hvx")
6409 Features["hvx-double"] = false;
6410 }
6411 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412}
6413
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006414const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006415 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6416 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6417 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6418 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6419 "p0", "p1", "p2", "p3",
6420 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6421};
6422
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006423ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006424 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006425}
6426
Tony Linthicum76329bf2011-12-12 21:14:55 +00006427const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6428 { { "sp" }, "r29" },
6429 { { "fp" }, "r30" },
6430 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006431};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006432
Craig Topperf054e3a2015-10-19 03:52:27 +00006433ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6434 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006435}
6436
6437
6438const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006439#define BUILTIN(ID, TYPE, ATTRS) \
6440 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6441#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6442 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006443#include "clang/Basic/BuiltinsHexagon.def"
6444};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006445
Jacques Pienaard964cc22016-03-28 21:02:54 +00006446class LanaiTargetInfo : public TargetInfo {
6447 // Class for Lanai (32-bit).
6448 // The CPU profiles supported by the Lanai backend
6449 enum CPUKind {
6450 CK_NONE,
6451 CK_V11,
6452 } CPU;
6453
6454 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6455 static const char *const GCCRegNames[];
6456
6457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006458 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6459 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006460 // Description string has to be kept in sync with backend.
6461 resetDataLayout("E" // Big endian
6462 "-m:e" // ELF name manging
6463 "-p:32:32" // 32 bit pointers, 32 bit aligned
6464 "-i64:64" // 64 bit integers, 64 bit aligned
6465 "-a:0:32" // 32 bit alignment of objects of aggregate type
6466 "-n32" // 32 bit native integer width
6467 "-S64" // 64 bit natural stack alignment
6468 );
6469
6470 // Setting RegParmMax equal to what mregparm was set to in the old
6471 // toolchain
6472 RegParmMax = 4;
6473
6474 // Set the default CPU to V11
6475 CPU = CK_V11;
6476
6477 // Temporary approach to make everything at least word-aligned and allow for
6478 // safely casting between pointers with different alignment requirements.
6479 // TODO: Remove this when there are no more cast align warnings on the
6480 // firmware.
6481 MinGlobalAlign = 32;
6482 }
6483
6484 void getTargetDefines(const LangOptions &Opts,
6485 MacroBuilder &Builder) const override {
6486 // Define __lanai__ when building for target lanai.
6487 Builder.defineMacro("__lanai__");
6488
6489 // Set define for the CPU specified.
6490 switch (CPU) {
6491 case CK_V11:
6492 Builder.defineMacro("__LANAI_V11__");
6493 break;
6494 case CK_NONE:
6495 llvm_unreachable("Unhandled target CPU");
6496 }
6497 }
6498
6499 bool setCPU(const std::string &Name) override {
6500 CPU = llvm::StringSwitch<CPUKind>(Name)
6501 .Case("v11", CK_V11)
6502 .Default(CK_NONE);
6503
6504 return CPU != CK_NONE;
6505 }
6506
6507 bool hasFeature(StringRef Feature) const override {
6508 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6509 }
6510
6511 ArrayRef<const char *> getGCCRegNames() const override;
6512
6513 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6514
6515 BuiltinVaListKind getBuiltinVaListKind() const override {
6516 return TargetInfo::VoidPtrBuiltinVaList;
6517 }
6518
6519 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6520
6521 bool validateAsmConstraint(const char *&Name,
6522 TargetInfo::ConstraintInfo &info) const override {
6523 return false;
6524 }
6525
6526 const char *getClobbers() const override { return ""; }
6527};
6528
6529const char *const LanaiTargetInfo::GCCRegNames[] = {
6530 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6531 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6532 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6533
6534ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6535 return llvm::makeArrayRef(GCCRegNames);
6536}
6537
6538const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6539 {{"pc"}, "r2"},
6540 {{"sp"}, "r4"},
6541 {{"fp"}, "r5"},
6542 {{"rv"}, "r8"},
6543 {{"rr1"}, "r10"},
6544 {{"rr2"}, "r11"},
6545 {{"rca"}, "r15"},
6546};
6547
6548ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6549 return llvm::makeArrayRef(GCCRegAliases);
6550}
6551
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006552// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6553class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006554 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6555 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006556 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006557public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006558 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006559 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006560
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006561 int getEHDataRegisterNumber(unsigned RegNo) const override {
6562 if (RegNo == 0) return 24;
6563 if (RegNo == 1) return 25;
6564 return -1;
6565 }
6566
Craig Topper3164f332014-03-11 03:39:26 +00006567 bool handleTargetFeatures(std::vector<std::string> &Features,
6568 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006569 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006570 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6571 if (Feature != Features.end()) {
6572 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006573 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006574 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006575 }
Craig Topper3164f332014-03-11 03:39:26 +00006576 void getTargetDefines(const LangOptions &Opts,
6577 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006578 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006579 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006580
6581 if (SoftFloat)
6582 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006583 }
Craig Topper3164f332014-03-11 03:39:26 +00006584
6585 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006586 return llvm::StringSwitch<bool>(Feature)
6587 .Case("softfloat", SoftFloat)
6588 .Case("sparc", true)
6589 .Default(false);
6590 }
Craig Topper3164f332014-03-11 03:39:26 +00006591
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006592 bool hasSjLjLowering() const override {
6593 return true;
6594 }
6595
Craig Topper6c03a542015-10-19 04:51:35 +00006596 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006597 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006598 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006599 }
Craig Topper3164f332014-03-11 03:39:26 +00006600 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006601 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006602 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006603 ArrayRef<const char *> getGCCRegNames() const override;
6604 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006605 bool validateAsmConstraint(const char *&Name,
6606 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006607 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006608 switch (*Name) {
6609 case 'I': // Signed 13-bit constant
6610 case 'J': // Zero
6611 case 'K': // 32-bit constant with the low 12 bits clear
6612 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6613 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6614 case 'N': // Same as 'K' but zext (required for SIMode)
6615 case 'O': // The constant 4096
6616 return true;
6617 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006618 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006619 }
Craig Topper3164f332014-03-11 03:39:26 +00006620 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006621 // FIXME: Implement!
6622 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006623 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006624
6625 // No Sparc V7 for now, the backend doesn't support it anyway.
6626 enum CPUKind {
6627 CK_GENERIC,
6628 CK_V8,
6629 CK_SUPERSPARC,
6630 CK_SPARCLITE,
6631 CK_F934,
6632 CK_HYPERSPARC,
6633 CK_SPARCLITE86X,
6634 CK_SPARCLET,
6635 CK_TSC701,
6636 CK_V9,
6637 CK_ULTRASPARC,
6638 CK_ULTRASPARC3,
6639 CK_NIAGARA,
6640 CK_NIAGARA2,
6641 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006642 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006643 CK_MYRIAD2100,
6644 CK_MYRIAD2150,
6645 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006646 CK_LEON2,
6647 CK_LEON2_AT697E,
6648 CK_LEON2_AT697F,
6649 CK_LEON3,
6650 CK_LEON3_UT699,
6651 CK_LEON3_GR712RC,
6652 CK_LEON4,
6653 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006654 } CPU = CK_GENERIC;
6655
6656 enum CPUGeneration {
6657 CG_V8,
6658 CG_V9,
6659 };
6660
6661 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6662 switch (Kind) {
6663 case CK_GENERIC:
6664 case CK_V8:
6665 case CK_SUPERSPARC:
6666 case CK_SPARCLITE:
6667 case CK_F934:
6668 case CK_HYPERSPARC:
6669 case CK_SPARCLITE86X:
6670 case CK_SPARCLET:
6671 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006672 case CK_MYRIAD2100:
6673 case CK_MYRIAD2150:
6674 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006675 case CK_LEON2:
6676 case CK_LEON2_AT697E:
6677 case CK_LEON2_AT697F:
6678 case CK_LEON3:
6679 case CK_LEON3_UT699:
6680 case CK_LEON3_GR712RC:
6681 case CK_LEON4:
6682 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006683 return CG_V8;
6684 case CK_V9:
6685 case CK_ULTRASPARC:
6686 case CK_ULTRASPARC3:
6687 case CK_NIAGARA:
6688 case CK_NIAGARA2:
6689 case CK_NIAGARA3:
6690 case CK_NIAGARA4:
6691 return CG_V9;
6692 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006693 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006694 }
6695
6696 CPUKind getCPUKind(StringRef Name) const {
6697 return llvm::StringSwitch<CPUKind>(Name)
6698 .Case("v8", CK_V8)
6699 .Case("supersparc", CK_SUPERSPARC)
6700 .Case("sparclite", CK_SPARCLITE)
6701 .Case("f934", CK_F934)
6702 .Case("hypersparc", CK_HYPERSPARC)
6703 .Case("sparclite86x", CK_SPARCLITE86X)
6704 .Case("sparclet", CK_SPARCLET)
6705 .Case("tsc701", CK_TSC701)
6706 .Case("v9", CK_V9)
6707 .Case("ultrasparc", CK_ULTRASPARC)
6708 .Case("ultrasparc3", CK_ULTRASPARC3)
6709 .Case("niagara", CK_NIAGARA)
6710 .Case("niagara2", CK_NIAGARA2)
6711 .Case("niagara3", CK_NIAGARA3)
6712 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006713 .Case("ma2100", CK_MYRIAD2100)
6714 .Case("ma2150", CK_MYRIAD2150)
6715 .Case("ma2450", CK_MYRIAD2450)
6716 // FIXME: the myriad2[.n] spellings are obsolete,
6717 // but a grace period is needed to allow updating dependent builds.
6718 .Case("myriad2", CK_MYRIAD2100)
6719 .Case("myriad2.1", CK_MYRIAD2100)
6720 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006721 .Case("leon2", CK_LEON2)
6722 .Case("at697e", CK_LEON2_AT697E)
6723 .Case("at697f", CK_LEON2_AT697F)
6724 .Case("leon3", CK_LEON3)
6725 .Case("ut699", CK_LEON3_UT699)
6726 .Case("gr712rc", CK_LEON3_GR712RC)
6727 .Case("leon4", CK_LEON4)
6728 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006729 .Default(CK_GENERIC);
6730 }
6731
6732 bool setCPU(const std::string &Name) override {
6733 CPU = getCPUKind(Name);
6734 return CPU != CK_GENERIC;
6735 }
Gabor Greif49991682008-02-21 16:29:08 +00006736};
6737
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006738const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006739 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6740 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6741 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6742 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6743};
6744
Craig Topperf054e3a2015-10-19 03:52:27 +00006745ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6746 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006747}
6748
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006749const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006750 { { "g0" }, "r0" },
6751 { { "g1" }, "r1" },
6752 { { "g2" }, "r2" },
6753 { { "g3" }, "r3" },
6754 { { "g4" }, "r4" },
6755 { { "g5" }, "r5" },
6756 { { "g6" }, "r6" },
6757 { { "g7" }, "r7" },
6758 { { "o0" }, "r8" },
6759 { { "o1" }, "r9" },
6760 { { "o2" }, "r10" },
6761 { { "o3" }, "r11" },
6762 { { "o4" }, "r12" },
6763 { { "o5" }, "r13" },
6764 { { "o6", "sp" }, "r14" },
6765 { { "o7" }, "r15" },
6766 { { "l0" }, "r16" },
6767 { { "l1" }, "r17" },
6768 { { "l2" }, "r18" },
6769 { { "l3" }, "r19" },
6770 { { "l4" }, "r20" },
6771 { { "l5" }, "r21" },
6772 { { "l6" }, "r22" },
6773 { { "l7" }, "r23" },
6774 { { "i0" }, "r24" },
6775 { { "i1" }, "r25" },
6776 { { "i2" }, "r26" },
6777 { { "i3" }, "r27" },
6778 { { "i4" }, "r28" },
6779 { { "i5" }, "r29" },
6780 { { "i6", "fp" }, "r30" },
6781 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006782};
6783
Craig Topperf054e3a2015-10-19 03:52:27 +00006784ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6785 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006786}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006787
6788// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6789class SparcV8TargetInfo : public SparcTargetInfo {
6790public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006791 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6792 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006793 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006794 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6795 switch (getTriple().getOS()) {
6796 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006797 SizeType = UnsignedInt;
6798 IntPtrType = SignedInt;
6799 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006800 break;
6801 case llvm::Triple::NetBSD:
6802 case llvm::Triple::OpenBSD:
6803 SizeType = UnsignedLong;
6804 IntPtrType = SignedLong;
6805 PtrDiffType = SignedLong;
6806 break;
Brad Smith56495d52015-08-13 22:00:53 +00006807 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006808 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6809 // on up to 64 bits.
6810 MaxAtomicPromoteWidth = 64;
6811 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006812 }
6813
Craig Topper3164f332014-03-11 03:39:26 +00006814 void getTargetDefines(const LangOptions &Opts,
6815 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006816 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006817 switch (getCPUGeneration(CPU)) {
6818 case CG_V8:
6819 Builder.defineMacro("__sparcv8");
6820 if (getTriple().getOS() != llvm::Triple::Solaris)
6821 Builder.defineMacro("__sparcv8__");
6822 break;
6823 case CG_V9:
6824 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006825 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006826 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006827 Builder.defineMacro("__sparc_v9__");
6828 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006829 break;
6830 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006831 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006832 std::string MyriadArchValue, Myriad2Value;
6833 Builder.defineMacro("__sparc_v8__");
6834 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006835 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006836 case CK_MYRIAD2150:
6837 MyriadArchValue = "__ma2150";
6838 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006839 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006840 case CK_MYRIAD2450:
6841 MyriadArchValue = "__ma2450";
6842 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006843 break;
6844 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006845 MyriadArchValue = "__ma2100";
6846 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006847 break;
6848 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006849 Builder.defineMacro(MyriadArchValue, "1");
6850 Builder.defineMacro(MyriadArchValue+"__", "1");
6851 Builder.defineMacro("__myriad2__", Myriad2Value);
6852 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006853 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006854 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006855
6856 bool hasSjLjLowering() const override {
6857 return true;
6858 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006859};
6860
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006861// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6862class SparcV8elTargetInfo : public SparcV8TargetInfo {
6863 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006864 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6865 : SparcV8TargetInfo(Triple, Opts) {
6866 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006867 }
6868};
6869
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006870// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6871class SparcV9TargetInfo : public SparcTargetInfo {
6872public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006873 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6874 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006875 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006876 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006877 // This is an LP64 platform.
6878 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006879
6880 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006881 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006882 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006883 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006884 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006885 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006886
6887 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6888 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6889 LongDoubleWidth = 128;
6890 LongDoubleAlign = 128;
6891 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006892 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006893 }
6894
Craig Topper3164f332014-03-11 03:39:26 +00006895 void getTargetDefines(const LangOptions &Opts,
6896 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006897 SparcTargetInfo::getTargetDefines(Opts, Builder);
6898 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006899 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006900 // Solaris doesn't need these variants, but the BSDs do.
6901 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006902 Builder.defineMacro("__sparc64__");
6903 Builder.defineMacro("__sparc_v9__");
6904 Builder.defineMacro("__sparcv9__");
6905 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006906 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006907
Craig Topper3164f332014-03-11 03:39:26 +00006908 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006909 if (!SparcTargetInfo::setCPU(Name))
6910 return false;
6911 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006912 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006913};
6914
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006915class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006916 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006917 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006918 std::string CPU;
6919 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006920 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006921
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006922public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006923 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006924 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6925 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006926 IntMaxType = SignedLong;
6927 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006928 TLSSupported = true;
6929 IntWidth = IntAlign = 32;
6930 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6931 PointerWidth = PointerAlign = 64;
6932 LongDoubleWidth = 128;
6933 LongDoubleAlign = 64;
6934 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006935 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006936 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006937 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 +00006938 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6939 }
6940 void getTargetDefines(const LangOptions &Opts,
6941 MacroBuilder &Builder) const override {
6942 Builder.defineMacro("__s390__");
6943 Builder.defineMacro("__s390x__");
6944 Builder.defineMacro("__zarch__");
6945 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006946
6947 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6948 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6949 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6950 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6951
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006952 if (HasTransactionalExecution)
6953 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006954 if (Opts.ZVector)
6955 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006956 }
Craig Topper6c03a542015-10-19 04:51:35 +00006957 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6958 return llvm::makeArrayRef(BuiltinInfo,
6959 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006960 }
6961
Craig Topperf054e3a2015-10-19 03:52:27 +00006962 ArrayRef<const char *> getGCCRegNames() const override;
6963 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006964 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006965 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006966 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006967 bool validateAsmConstraint(const char *&Name,
6968 TargetInfo::ConstraintInfo &info) const override;
6969 const char *getClobbers() const override {
6970 // FIXME: Is this really right?
6971 return "";
6972 }
6973 BuiltinVaListKind getBuiltinVaListKind() const override {
6974 return TargetInfo::SystemZBuiltinVaList;
6975 }
6976 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006977 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006978 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6979 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006980 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006981 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006982 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006983 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006984 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006985 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006986 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006987 .Default(false);
6988
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006989 return CPUKnown;
6990 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006991 bool
6992 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6993 StringRef CPU,
6994 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006995 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006996 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006997 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006998 Features["transactional-execution"] = true;
6999 Features["vector"] = true;
7000 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007001 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007002 }
7003
7004 bool handleTargetFeatures(std::vector<std::string> &Features,
7005 DiagnosticsEngine &Diags) override {
7006 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007007 for (const auto &Feature : Features) {
7008 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007009 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007010 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007011 HasVector = true;
7012 }
7013 // If we use the vector ABI, vector types are 64-bit aligned.
7014 if (HasVector) {
7015 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007016 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7017 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007018 }
7019 return true;
7020 }
7021
7022 bool hasFeature(StringRef Feature) const override {
7023 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007024 .Case("systemz", true)
7025 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007026 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007027 .Default(false);
7028 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007029
Bryan Chane3f1ed52016-04-28 13:56:43 +00007030 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7031 switch (CC) {
7032 case CC_C:
7033 case CC_Swift:
7034 return CCCR_OK;
7035 default:
7036 return CCCR_Warning;
7037 }
7038 }
7039
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007040 StringRef getABI() const override {
7041 if (HasVector)
7042 return "vector";
7043 return "";
7044 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007045
7046 bool useFloat128ManglingForLongDouble() const override {
7047 return true;
7048 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007049};
7050
7051const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7052#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007053 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007054#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7055 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007056#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007057};
7058
7059const char *const SystemZTargetInfo::GCCRegNames[] = {
7060 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7061 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7062 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7063 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7064};
7065
Craig Topperf054e3a2015-10-19 03:52:27 +00007066ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7067 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007068}
7069
7070bool SystemZTargetInfo::
7071validateAsmConstraint(const char *&Name,
7072 TargetInfo::ConstraintInfo &Info) const {
7073 switch (*Name) {
7074 default:
7075 return false;
7076
7077 case 'a': // Address register
7078 case 'd': // Data register (equivalent to 'r')
7079 case 'f': // Floating-point register
7080 Info.setAllowsRegister();
7081 return true;
7082
7083 case 'I': // Unsigned 8-bit constant
7084 case 'J': // Unsigned 12-bit constant
7085 case 'K': // Signed 16-bit constant
7086 case 'L': // Signed 20-bit displacement (on all targets we support)
7087 case 'M': // 0x7fffffff
7088 return true;
7089
7090 case 'Q': // Memory with base and unsigned 12-bit displacement
7091 case 'R': // Likewise, plus an index
7092 case 'S': // Memory with base and signed 20-bit displacement
7093 case 'T': // Likewise, plus an index
7094 Info.setAllowsMemory();
7095 return true;
7096 }
7097}
Ulrich Weigand47445072013-05-06 16:26:41 +00007098
Eric Christopherc48497a2015-09-18 21:26:24 +00007099class MSP430TargetInfo : public TargetInfo {
7100 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007101
Eric Christopherc48497a2015-09-18 21:26:24 +00007102public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007103 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7104 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007105 TLSSupported = false;
7106 IntWidth = 16;
7107 IntAlign = 16;
7108 LongWidth = 32;
7109 LongLongWidth = 64;
7110 LongAlign = LongLongAlign = 16;
7111 PointerWidth = 16;
7112 PointerAlign = 16;
7113 SuitableAlign = 16;
7114 SizeType = UnsignedInt;
7115 IntMaxType = SignedLongLong;
7116 IntPtrType = SignedInt;
7117 PtrDiffType = SignedInt;
7118 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007119 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007120 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007121 void getTargetDefines(const LangOptions &Opts,
7122 MacroBuilder &Builder) const override {
7123 Builder.defineMacro("MSP430");
7124 Builder.defineMacro("__MSP430__");
7125 // FIXME: defines for different 'flavours' of MCU
7126 }
Craig Topper6c03a542015-10-19 04:51:35 +00007127 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007128 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007129 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007130 }
7131 bool hasFeature(StringRef Feature) const override {
7132 return Feature == "msp430";
7133 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007134 ArrayRef<const char *> getGCCRegNames() const override;
7135 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007136 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007137 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007138 }
7139 bool validateAsmConstraint(const char *&Name,
7140 TargetInfo::ConstraintInfo &info) const override {
7141 // FIXME: implement
7142 switch (*Name) {
7143 case 'K': // the constant 1
7144 case 'L': // constant -1^20 .. 1^19
7145 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007146 return true;
7147 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007148 // No target constraints for now.
7149 return false;
7150 }
7151 const char *getClobbers() const override {
7152 // FIXME: Is this really right?
7153 return "";
7154 }
7155 BuiltinVaListKind getBuiltinVaListKind() const override {
7156 // FIXME: implement
7157 return TargetInfo::CharPtrBuiltinVaList;
7158 }
7159};
7160
7161const char *const MSP430TargetInfo::GCCRegNames[] = {
7162 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7163 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7164
Craig Topperf054e3a2015-10-19 03:52:27 +00007165ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7166 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007167}
7168
7169// LLVM and Clang cannot be used directly to output native binaries for
7170// target, but is used to compile C code to llvm bitcode with correct
7171// type and alignment information.
7172//
7173// TCE uses the llvm bitcode as input and uses it for generating customized
7174// target processor and program binary. TCE co-design environment is
7175// publicly available in http://tce.cs.tut.fi
7176
7177static const unsigned TCEOpenCLAddrSpaceMap[] = {
7178 3, // opencl_global
7179 4, // opencl_local
7180 5, // opencl_constant
7181 // FIXME: generic has to be added to the target
7182 0, // opencl_generic
7183 0, // cuda_device
7184 0, // cuda_constant
7185 0 // cuda_shared
7186};
7187
7188class TCETargetInfo : public TargetInfo {
7189public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007190 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7191 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007192 TLSSupported = false;
7193 IntWidth = 32;
7194 LongWidth = LongLongWidth = 32;
7195 PointerWidth = 32;
7196 IntAlign = 32;
7197 LongAlign = LongLongAlign = 32;
7198 PointerAlign = 32;
7199 SuitableAlign = 32;
7200 SizeType = UnsignedInt;
7201 IntMaxType = SignedLong;
7202 IntPtrType = SignedInt;
7203 PtrDiffType = SignedInt;
7204 FloatWidth = 32;
7205 FloatAlign = 32;
7206 DoubleWidth = 32;
7207 DoubleAlign = 32;
7208 LongDoubleWidth = 32;
7209 LongDoubleAlign = 32;
7210 FloatFormat = &llvm::APFloat::IEEEsingle;
7211 DoubleFormat = &llvm::APFloat::IEEEsingle;
7212 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007213 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7214 "i16:16:32-i32:32:32-i64:32:32-"
7215 "f32:32:32-f64:32:32-v64:32:32-"
7216 "v128:32:32-v256:32:32-v512:32:32-"
7217 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007218 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7219 UseAddrSpaceMapMangling = true;
7220 }
7221
7222 void getTargetDefines(const LangOptions &Opts,
7223 MacroBuilder &Builder) const override {
7224 DefineStd(Builder, "tce", Opts);
7225 Builder.defineMacro("__TCE__");
7226 Builder.defineMacro("__TCE_V1__");
7227 }
7228 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7229
Craig Topper6c03a542015-10-19 04:51:35 +00007230 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007231 const char *getClobbers() const override { return ""; }
7232 BuiltinVaListKind getBuiltinVaListKind() const override {
7233 return TargetInfo::VoidPtrBuiltinVaList;
7234 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007235 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007236 bool validateAsmConstraint(const char *&Name,
7237 TargetInfo::ConstraintInfo &info) const override {
7238 return true;
7239 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007240 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7241 return None;
7242 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007243};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007244
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007245class TCELETargetInfo : public TCETargetInfo {
7246public:
7247 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7248 : TCETargetInfo(Triple, Opts) {
7249 BigEndian = false;
7250
7251 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7252 "i16:16:32-i32:32:32-i64:32:32-"
7253 "f32:32:32-f64:32:32-v64:32:32-"
7254 "v128:32:32-v256:32:32-v512:32:32-"
7255 "v1024:32:32-a0:0:32-n32");
7256
7257 }
7258
7259 virtual void getTargetDefines(const LangOptions &Opts,
7260 MacroBuilder &Builder) const {
7261 DefineStd(Builder, "tcele", Opts);
7262 Builder.defineMacro("__TCE__");
7263 Builder.defineMacro("__TCE_V1__");
7264 Builder.defineMacro("__TCELE__");
7265 Builder.defineMacro("__TCELE_V1__");
7266 }
7267
7268};
7269
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007270class BPFTargetInfo : public TargetInfo {
7271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007272 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7273 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007274 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7275 SizeType = UnsignedLong;
7276 PtrDiffType = SignedLong;
7277 IntPtrType = SignedLong;
7278 IntMaxType = SignedLong;
7279 Int64Type = SignedLong;
7280 RegParmMax = 5;
7281 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007282 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007283 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007284 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007285 }
7286 MaxAtomicPromoteWidth = 64;
7287 MaxAtomicInlineWidth = 64;
7288 TLSSupported = false;
7289 }
7290 void getTargetDefines(const LangOptions &Opts,
7291 MacroBuilder &Builder) const override {
7292 DefineStd(Builder, "bpf", Opts);
7293 Builder.defineMacro("__BPF__");
7294 }
7295 bool hasFeature(StringRef Feature) const override {
7296 return Feature == "bpf";
7297 }
7298
Craig Topper6c03a542015-10-19 04:51:35 +00007299 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007300 const char *getClobbers() const override {
7301 return "";
7302 }
7303 BuiltinVaListKind getBuiltinVaListKind() const override {
7304 return TargetInfo::VoidPtrBuiltinVaList;
7305 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007306 ArrayRef<const char *> getGCCRegNames() const override {
7307 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007308 }
7309 bool validateAsmConstraint(const char *&Name,
7310 TargetInfo::ConstraintInfo &info) const override {
7311 return true;
7312 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007313 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7314 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007315 }
7316};
7317
Daniel Sanders4672af62016-05-27 11:51:02 +00007318class MipsTargetInfo : public TargetInfo {
7319 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007320 StringRef Layout;
7321
7322 if (ABI == "o32")
7323 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7324 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007325 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007326 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007327 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007328 else
7329 llvm_unreachable("Invalid ABI");
7330
7331 if (BigEndian)
7332 resetDataLayout(("E-" + Layout).str());
7333 else
7334 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007335 }
7336
Akira Hatanaka9064e362013-10-29 18:30:33 +00007337
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007338 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007339 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007340 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007341 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007342 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007343 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007344 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007345 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007346 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007347 enum DspRevEnum {
7348 NoDSP, DSP1, DSP2
7349 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007350 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007351
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007352protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007353 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007354 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007355
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007356public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007357 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007358 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7359 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7360 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007361 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007362
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007363 setABI((getTriple().getArch() == llvm::Triple::mips ||
7364 getTriple().getArch() == llvm::Triple::mipsel)
7365 ? "o32"
7366 : "n64");
7367
7368 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007369 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007370
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007371 bool isNaN2008Default() const {
7372 return CPU == "mips32r6" || CPU == "mips64r6";
7373 }
7374
7375 bool isFP64Default() const {
7376 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7377 }
7378
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007379 bool isNan2008() const override {
7380 return IsNan2008;
7381 }
7382
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007383 bool processorSupportsGPR64() const {
7384 return llvm::StringSwitch<bool>(CPU)
7385 .Case("mips3", true)
7386 .Case("mips4", true)
7387 .Case("mips5", true)
7388 .Case("mips64", true)
7389 .Case("mips64r2", true)
7390 .Case("mips64r3", true)
7391 .Case("mips64r5", true)
7392 .Case("mips64r6", true)
7393 .Case("octeon", true)
7394 .Default(false);
7395 return false;
7396 }
7397
Alp Toker4925ba72014-06-07 23:30:42 +00007398 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007399 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007400 if (Name == "o32") {
7401 setO32ABITypes();
7402 ABI = Name;
7403 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007404 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007405
7406 if (Name == "n32") {
7407 setN32ABITypes();
7408 ABI = Name;
7409 return true;
7410 }
7411 if (Name == "n64") {
7412 setN64ABITypes();
7413 ABI = Name;
7414 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007415 }
7416 return false;
7417 }
7418
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007419 void setO32ABITypes() {
7420 Int64Type = SignedLongLong;
7421 IntMaxType = Int64Type;
7422 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7423 LongDoubleWidth = LongDoubleAlign = 64;
7424 LongWidth = LongAlign = 32;
7425 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7426 PointerWidth = PointerAlign = 32;
7427 PtrDiffType = SignedInt;
7428 SizeType = UnsignedInt;
7429 SuitableAlign = 64;
7430 }
7431
7432 void setN32N64ABITypes() {
7433 LongDoubleWidth = LongDoubleAlign = 128;
7434 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7435 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7436 LongDoubleWidth = LongDoubleAlign = 64;
7437 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7438 }
7439 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7440 SuitableAlign = 128;
7441 }
7442
Daniel Sanders4672af62016-05-27 11:51:02 +00007443 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007444 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007445 Int64Type = SignedLong;
7446 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007447 LongWidth = LongAlign = 64;
7448 PointerWidth = PointerAlign = 64;
7449 PtrDiffType = SignedLong;
7450 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007451 }
7452
7453 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007454 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007455 Int64Type = SignedLongLong;
7456 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007457 LongWidth = LongAlign = 32;
7458 PointerWidth = PointerAlign = 32;
7459 PtrDiffType = SignedInt;
7460 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007461 }
7462
Craig Topper3164f332014-03-11 03:39:26 +00007463 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007464 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007465 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007466 .Case("mips1", true)
7467 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007468 .Case("mips3", true)
7469 .Case("mips4", true)
7470 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007471 .Case("mips32", true)
7472 .Case("mips32r2", true)
7473 .Case("mips32r3", true)
7474 .Case("mips32r5", true)
7475 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007476 .Case("mips64", true)
7477 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007478 .Case("mips64r3", true)
7479 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007480 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007481 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007482 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007483 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007484 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007485 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007486 bool
7487 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7488 StringRef CPU,
7489 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007490 if (CPU.empty())
7491 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007492 if (CPU == "octeon")
7493 Features["mips64r2"] = Features["cnmips"] = true;
7494 else
7495 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007496 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007497 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007498
Craig Topper3164f332014-03-11 03:39:26 +00007499 void getTargetDefines(const LangOptions &Opts,
7500 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007501 if (BigEndian) {
7502 DefineStd(Builder, "MIPSEB", Opts);
7503 Builder.defineMacro("_MIPSEB");
7504 } else {
7505 DefineStd(Builder, "MIPSEL", Opts);
7506 Builder.defineMacro("_MIPSEL");
7507 }
7508
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007509 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007510 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007511 if (Opts.GNUMode)
7512 Builder.defineMacro("mips");
7513
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007514 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007515 Builder.defineMacro("__mips", "32");
7516 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7517 } else {
7518 Builder.defineMacro("__mips", "64");
7519 Builder.defineMacro("__mips64");
7520 Builder.defineMacro("__mips64__");
7521 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7522 }
7523
7524 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7525 .Cases("mips32", "mips64", "1")
7526 .Cases("mips32r2", "mips64r2", "2")
7527 .Cases("mips32r3", "mips64r3", "3")
7528 .Cases("mips32r5", "mips64r5", "5")
7529 .Cases("mips32r6", "mips64r6", "6")
7530 .Default("");
7531 if (!ISARev.empty())
7532 Builder.defineMacro("__mips_isa_rev", ISARev);
7533
7534 if (ABI == "o32") {
7535 Builder.defineMacro("__mips_o32");
7536 Builder.defineMacro("_ABIO32", "1");
7537 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007538 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007539 Builder.defineMacro("__mips_n32");
7540 Builder.defineMacro("_ABIN32", "2");
7541 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7542 } else if (ABI == "n64") {
7543 Builder.defineMacro("__mips_n64");
7544 Builder.defineMacro("_ABI64", "3");
7545 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7546 } else
7547 llvm_unreachable("Invalid ABI.");
7548
Simon Atanasyan683535b2012-08-29 19:14:58 +00007549 Builder.defineMacro("__REGISTER_PREFIX__", "");
7550
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007551 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007552 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007553 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007554 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007555 case SoftFloat:
7556 Builder.defineMacro("__mips_soft_float", Twine(1));
7557 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007558 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007559
Simon Atanasyan16071912013-04-14 14:07:30 +00007560 if (IsSingleFloat)
7561 Builder.defineMacro("__mips_single_float", Twine(1));
7562
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007563 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7564 Builder.defineMacro("_MIPS_FPSET",
7565 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7566
Simon Atanasyan72244b62012-07-05 16:06:06 +00007567 if (IsMips16)
7568 Builder.defineMacro("__mips16", Twine(1));
7569
Simon Atanasyan60777612013-04-14 14:07:51 +00007570 if (IsMicromips)
7571 Builder.defineMacro("__mips_micromips", Twine(1));
7572
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007573 if (IsNan2008)
7574 Builder.defineMacro("__mips_nan2008", Twine(1));
7575
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007576 switch (DspRev) {
7577 default:
7578 break;
7579 case DSP1:
7580 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7581 Builder.defineMacro("__mips_dsp", Twine(1));
7582 break;
7583 case DSP2:
7584 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7585 Builder.defineMacro("__mips_dspr2", Twine(1));
7586 Builder.defineMacro("__mips_dsp", Twine(1));
7587 break;
7588 }
7589
Jack Carter44ff1e52013-08-12 17:20:29 +00007590 if (HasMSA)
7591 Builder.defineMacro("__mips_msa", Twine(1));
7592
Simon Atanasyan26f19672012-04-05 19:28:31 +00007593 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7594 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7595 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007596
7597 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7598 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007599
7600 // These shouldn't be defined for MIPS-I but there's no need to check
7601 // for that since MIPS-I isn't supported.
7602 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7603 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7604 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007605
7606 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7607 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7608 // the instructions exist but using them violates the ABI since they
7609 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7610 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007611 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007612 }
7613
Craig Topper6c03a542015-10-19 04:51:35 +00007614 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7615 return llvm::makeArrayRef(BuiltinInfo,
7616 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007617 }
Craig Topper3164f332014-03-11 03:39:26 +00007618 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007619 return llvm::StringSwitch<bool>(Feature)
7620 .Case("mips", true)
7621 .Case("fp64", HasFP64)
7622 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007623 }
Craig Topper3164f332014-03-11 03:39:26 +00007624 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007625 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007626 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007627 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007628 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007629 // CPU register names
7630 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007631 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7632 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7633 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007634 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7635 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007636 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7637 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7638 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7639 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007640 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007641 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007642 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7643 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007644 // MSA register names
7645 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7646 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7647 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7648 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7649 // MSA control register names
7650 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7651 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007652 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007653 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007654 }
Craig Topper3164f332014-03-11 03:39:26 +00007655 bool validateAsmConstraint(const char *&Name,
7656 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007657 switch (*Name) {
7658 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007659 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007660 case 'r': // CPU registers.
7661 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007662 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007663 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007664 case 'c': // $25 for indirect jumps
7665 case 'l': // lo register
7666 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007667 Info.setAllowsRegister();
7668 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007669 case 'I': // Signed 16-bit constant
7670 case 'J': // Integer 0
7671 case 'K': // Unsigned 16-bit constant
7672 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7673 case 'M': // Constants not loadable via lui, addiu, or ori
7674 case 'N': // Constant -1 to -65535
7675 case 'O': // A signed 15-bit constant
7676 case 'P': // A constant between 1 go 65535
7677 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007678 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007679 Info.setAllowsMemory();
7680 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007681 case 'Z':
7682 if (Name[1] == 'C') { // An address usable by ll, and sc.
7683 Info.setAllowsMemory();
7684 Name++; // Skip over 'Z'.
7685 return true;
7686 }
7687 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007688 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007689 }
7690
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007691 std::string convertConstraint(const char *&Constraint) const override {
7692 std::string R;
7693 switch (*Constraint) {
7694 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7695 if (Constraint[1] == 'C') {
7696 R = std::string("^") + std::string(Constraint, 2);
7697 Constraint++;
7698 return R;
7699 }
7700 break;
7701 }
7702 return TargetInfo::convertConstraint(Constraint);
7703 }
7704
Craig Topper3164f332014-03-11 03:39:26 +00007705 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007706 // In GCC, $1 is not widely used in generated code (it's used only in a few
7707 // specific situations), so there is no real need for users to add it to
7708 // the clobbers list if they want to use it in their inline assembly code.
7709 //
7710 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7711 // code generation, so using it in inline assembly without adding it to the
7712 // clobbers list can cause conflicts between the inline assembly code and
7713 // the surrounding generated code.
7714 //
7715 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7716 // operands, which will conflict with the ".set at" assembler option (which
7717 // we use only for inline assembly, in order to maintain compatibility with
7718 // GCC) and will also conflict with the user's usage of $1.
7719 //
7720 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7721 // register for generated code is to automatically clobber $1 for all inline
7722 // assembly code.
7723 //
7724 // FIXME: We should automatically clobber $1 only for inline assembly code
7725 // which actually uses it. This would allow LLVM to use $1 for inline
7726 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007727 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007728 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007729
Craig Topper3164f332014-03-11 03:39:26 +00007730 bool handleTargetFeatures(std::vector<std::string> &Features,
7731 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007732 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007733 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007734 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007735 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007736 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007737 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007738 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007739
Eric Christopher610fe112015-08-26 08:21:55 +00007740 for (const auto &Feature : Features) {
7741 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007742 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007743 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007744 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007745 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007746 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007747 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007748 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007749 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007750 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007751 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007752 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007753 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007754 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007755 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007756 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007757 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007758 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007759 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007760 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007761 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007762 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007763 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007764
James Y Knightb214cbc2016-03-04 19:00:41 +00007765 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007766
Rafael Espindolaeb265472013-08-21 21:59:03 +00007767 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007768 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007769
Craig Topper3164f332014-03-11 03:39:26 +00007770 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007771 if (RegNo == 0) return 4;
7772 if (RegNo == 1) return 5;
7773 return -1;
7774 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007775
7776 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007777
7778 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7779 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7780 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7781 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7782 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7783 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7784 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7785 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7786 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7787 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7788 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7789 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7790 {{"ra"}, "$31"}};
7791 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7792 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7793 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7794 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7795 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7796 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7797 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7798 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7799 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7800 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7801 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7802 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007803 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007804 return llvm::makeArrayRef(O32RegAliases);
7805 return llvm::makeArrayRef(NewABIRegAliases);
7806 }
7807
7808 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007809 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007810 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007811
7812 bool validateTarget(DiagnosticsEngine &Diags) const override {
7813 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7814 // this yet. It's better to fail here than on the backend assertion.
7815 if (processorSupportsGPR64() && ABI == "o32") {
7816 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7817 return false;
7818 }
7819
7820 // 64-bit ABI's require 64-bit CPU's.
7821 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7822 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7823 return false;
7824 }
7825
7826 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7827 // can't handle this yet. It's better to fail here than on the
7828 // backend assertion.
7829 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7830 getTriple().getArch() == llvm::Triple::mips64el) &&
7831 ABI == "o32") {
7832 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7833 << ABI << getTriple().str();
7834 return false;
7835 }
7836
7837 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7838 // can't handle this yet. It's better to fail here than on the
7839 // backend assertion.
7840 if ((getTriple().getArch() == llvm::Triple::mips ||
7841 getTriple().getArch() == llvm::Triple::mipsel) &&
7842 (ABI == "n32" || ABI == "n64")) {
7843 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7844 << ABI << getTriple().str();
7845 return false;
7846 }
7847
7848 return true;
7849 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007850};
7851
Daniel Sanders4672af62016-05-27 11:51:02 +00007852const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007853#define BUILTIN(ID, TYPE, ATTRS) \
7854 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7855#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7856 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007857#include "clang/Basic/BuiltinsMips.def"
7858};
7859
Ivan Krasindd7403e2011-08-24 20:22:22 +00007860class PNaClTargetInfo : public TargetInfo {
7861public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007862 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7863 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007864 this->LongAlign = 32;
7865 this->LongWidth = 32;
7866 this->PointerAlign = 32;
7867 this->PointerWidth = 32;
7868 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007869 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007870 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007871 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007872 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007873 this->SizeType = TargetInfo::UnsignedInt;
7874 this->PtrDiffType = TargetInfo::SignedInt;
7875 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007876 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007877 }
7878
Craig Toppere6f17d02014-03-11 04:07:52 +00007879 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007880 Builder.defineMacro("__le32__");
7881 Builder.defineMacro("__pnacl__");
7882 }
Craig Topper3164f332014-03-11 03:39:26 +00007883 void getTargetDefines(const LangOptions &Opts,
7884 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007885 getArchDefines(Opts, Builder);
7886 }
Craig Topper3164f332014-03-11 03:39:26 +00007887 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007888 return Feature == "pnacl";
7889 }
Craig Topper6c03a542015-10-19 04:51:35 +00007890 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007891 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007892 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007893 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007894 ArrayRef<const char *> getGCCRegNames() const override;
7895 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007896 bool validateAsmConstraint(const char *&Name,
7897 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007898 return false;
7899 }
7900
Craig Topper3164f332014-03-11 03:39:26 +00007901 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007902 return "";
7903 }
7904};
7905
Craig Topperf054e3a2015-10-19 03:52:27 +00007906ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7907 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007908}
7909
Craig Topperf054e3a2015-10-19 03:52:27 +00007910ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7911 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007912}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007913
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007914// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007915class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007916public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007917 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7918 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007919
7920 BuiltinVaListKind getBuiltinVaListKind() const override {
7921 return TargetInfo::PNaClABIBuiltinVaList;
7922 }
7923};
7924
JF Bastien643817d2014-09-12 17:52:47 +00007925class Le64TargetInfo : public TargetInfo {
7926 static const Builtin::Info BuiltinInfo[];
7927
7928public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007929 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7930 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007931 NoAsmVariants = true;
7932 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7933 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007934 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007935 }
7936
7937 void getTargetDefines(const LangOptions &Opts,
7938 MacroBuilder &Builder) const override {
7939 DefineStd(Builder, "unix", Opts);
7940 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7941 Builder.defineMacro("__ELF__");
7942 }
Craig Topper6c03a542015-10-19 04:51:35 +00007943 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7944 return llvm::makeArrayRef(BuiltinInfo,
7945 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007946 }
7947 BuiltinVaListKind getBuiltinVaListKind() const override {
7948 return TargetInfo::PNaClABIBuiltinVaList;
7949 }
7950 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007951 ArrayRef<const char *> getGCCRegNames() const override {
7952 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007953 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007954 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7955 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007956 }
7957 bool validateAsmConstraint(const char *&Name,
7958 TargetInfo::ConstraintInfo &Info) const override {
7959 return false;
7960 }
7961
7962 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007963};
Dan Gohmanc2853072015-09-03 22:51:53 +00007964
7965class WebAssemblyTargetInfo : public TargetInfo {
7966 static const Builtin::Info BuiltinInfo[];
7967
7968 enum SIMDEnum {
7969 NoSIMD,
7970 SIMD128,
7971 } SIMDLevel;
7972
7973public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007974 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007975 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007976 NoAsmVariants = true;
7977 SuitableAlign = 128;
7978 LargeArrayMinWidth = 128;
7979 LargeArrayAlign = 128;
7980 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007981 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007982 LongDoubleWidth = LongDoubleAlign = 128;
7983 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007984 SizeType = UnsignedInt;
7985 PtrDiffType = SignedInt;
7986 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007987 }
7988
7989protected:
7990 void getTargetDefines(const LangOptions &Opts,
7991 MacroBuilder &Builder) const override {
7992 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7993 if (SIMDLevel >= SIMD128)
7994 Builder.defineMacro("__wasm_simd128__");
7995 }
7996
7997private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007998 bool
7999 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8000 StringRef CPU,
8001 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008002 if (CPU == "bleeding-edge")
8003 Features["simd128"] = true;
8004 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8005 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008006 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008007 return llvm::StringSwitch<bool>(Feature)
8008 .Case("simd128", SIMDLevel >= SIMD128)
8009 .Default(false);
8010 }
8011 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008012 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008013 for (const auto &Feature : Features) {
8014 if (Feature == "+simd128") {
8015 SIMDLevel = std::max(SIMDLevel, SIMD128);
8016 continue;
8017 }
8018 if (Feature == "-simd128") {
8019 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8020 continue;
8021 }
8022
8023 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8024 << "-target-feature";
8025 return false;
8026 }
8027 return true;
8028 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008029 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008030 return llvm::StringSwitch<bool>(Name)
8031 .Case("mvp", true)
8032 .Case("bleeding-edge", true)
8033 .Case("generic", true)
8034 .Default(false);
8035 }
Craig Topper6c03a542015-10-19 04:51:35 +00008036 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8037 return llvm::makeArrayRef(BuiltinInfo,
8038 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008039 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008040 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008041 return VoidPtrBuiltinVaList;
8042 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008043 ArrayRef<const char *> getGCCRegNames() const final {
8044 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008045 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008046 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8047 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008048 }
8049 bool
8050 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008051 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008052 return false;
8053 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008054 const char *getClobbers() const final { return ""; }
8055 bool isCLZForZeroUndef() const final { return false; }
8056 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008057 IntType getIntTypeByWidth(unsigned BitWidth,
8058 bool IsSigned) const final {
8059 // WebAssembly prefers long long for explicitly 64-bit integers.
8060 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8061 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8062 }
8063 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8064 bool IsSigned) const final {
8065 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8066 return BitWidth == 64
8067 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8068 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8069 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008070};
8071
8072const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8073#define BUILTIN(ID, TYPE, ATTRS) \
8074 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8075#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8076 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8077#include "clang/Basic/BuiltinsWebAssembly.def"
8078};
8079
8080class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8081public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008082 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8083 const TargetOptions &Opts)
8084 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008085 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008086 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008087 }
8088
8089protected:
8090 void getTargetDefines(const LangOptions &Opts,
8091 MacroBuilder &Builder) const override {
8092 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8093 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8094 }
8095};
8096
8097class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8100 const TargetOptions &Opts)
8101 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008102 LongAlign = LongWidth = 64;
8103 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008104 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008105 SizeType = UnsignedLong;
8106 PtrDiffType = SignedLong;
8107 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008108 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008109 }
8110
8111protected:
8112 void getTargetDefines(const LangOptions &Opts,
8113 MacroBuilder &Builder) const override {
8114 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8115 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8116 }
8117};
8118
JF Bastien643817d2014-09-12 17:52:47 +00008119const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8120#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008121 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008122#include "clang/Basic/BuiltinsLe64.def"
8123};
8124
Eric Christopherc48497a2015-09-18 21:26:24 +00008125static const unsigned SPIRAddrSpaceMap[] = {
8126 1, // opencl_global
8127 3, // opencl_local
8128 2, // opencl_constant
8129 4, // opencl_generic
8130 0, // cuda_device
8131 0, // cuda_constant
8132 0 // cuda_shared
8133};
8134class SPIRTargetInfo : public TargetInfo {
8135public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008136 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8137 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008138 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8139 "SPIR target must use unknown OS");
8140 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8141 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008142 TLSSupported = false;
8143 LongWidth = LongAlign = 64;
8144 AddrSpaceMap = &SPIRAddrSpaceMap;
8145 UseAddrSpaceMapMangling = true;
8146 // Define available target features
8147 // These must be defined in sorted order!
8148 NoAsmVariants = true;
8149 }
8150 void getTargetDefines(const LangOptions &Opts,
8151 MacroBuilder &Builder) const override {
8152 DefineStd(Builder, "SPIR", Opts);
8153 }
8154 bool hasFeature(StringRef Feature) const override {
8155 return Feature == "spir";
8156 }
Craig Topper3164f332014-03-11 03:39:26 +00008157
Craig Topper6c03a542015-10-19 04:51:35 +00008158 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008159 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008160 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008161 bool validateAsmConstraint(const char *&Name,
8162 TargetInfo::ConstraintInfo &info) const override {
8163 return true;
8164 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008165 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8166 return None;
8167 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008168 BuiltinVaListKind getBuiltinVaListKind() const override {
8169 return TargetInfo::VoidPtrBuiltinVaList;
8170 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008171
Eric Christopherc48497a2015-09-18 21:26:24 +00008172 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008173 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8174 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008175 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008176
Eric Christopherc48497a2015-09-18 21:26:24 +00008177 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8178 return CC_SpirFunction;
8179 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008180
8181 void setSupportedOpenCLOpts() override {
8182 // Assume all OpenCL extensions and optional core features are supported
8183 // for SPIR since it is a generic target.
8184 getSupportedOpenCLOpts().setAll();
8185 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008186};
Guy Benyeib798fc92012-12-11 21:38:14 +00008187
Eric Christopherc48497a2015-09-18 21:26:24 +00008188class SPIR32TargetInfo : public SPIRTargetInfo {
8189public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8191 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008192 PointerWidth = PointerAlign = 32;
8193 SizeType = TargetInfo::UnsignedInt;
8194 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008195 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8196 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008197 }
8198 void getTargetDefines(const LangOptions &Opts,
8199 MacroBuilder &Builder) const override {
8200 DefineStd(Builder, "SPIR32", Opts);
8201 }
8202};
Guy Benyeib798fc92012-12-11 21:38:14 +00008203
Eric Christopherc48497a2015-09-18 21:26:24 +00008204class SPIR64TargetInfo : public SPIRTargetInfo {
8205public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008206 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8207 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008208 PointerWidth = PointerAlign = 64;
8209 SizeType = TargetInfo::UnsignedLong;
8210 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008211 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8212 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008213 }
8214 void getTargetDefines(const LangOptions &Opts,
8215 MacroBuilder &Builder) const override {
8216 DefineStd(Builder, "SPIR64", Opts);
8217 }
8218};
Guy Benyeib798fc92012-12-11 21:38:14 +00008219
Robert Lytton0e076492013-08-13 09:43:10 +00008220class XCoreTargetInfo : public TargetInfo {
8221 static const Builtin::Info BuiltinInfo[];
8222public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8224 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008225 NoAsmVariants = true;
8226 LongLongAlign = 32;
8227 SuitableAlign = 32;
8228 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008229 SizeType = UnsignedInt;
8230 PtrDiffType = SignedInt;
8231 IntPtrType = SignedInt;
8232 WCharType = UnsignedChar;
8233 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008234 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008235 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8236 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008237 }
Craig Topper3164f332014-03-11 03:39:26 +00008238 void getTargetDefines(const LangOptions &Opts,
8239 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008240 Builder.defineMacro("__XS1B__");
8241 }
Craig Topper6c03a542015-10-19 04:51:35 +00008242 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8243 return llvm::makeArrayRef(BuiltinInfo,
8244 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008245 }
Craig Topper3164f332014-03-11 03:39:26 +00008246 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008247 return TargetInfo::VoidPtrBuiltinVaList;
8248 }
Craig Topper3164f332014-03-11 03:39:26 +00008249 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008250 return "";
8251 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008252 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008253 static const char * const GCCRegNames[] = {
8254 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8255 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8256 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008257 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008258 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008259 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8260 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008261 }
Craig Topper3164f332014-03-11 03:39:26 +00008262 bool validateAsmConstraint(const char *&Name,
8263 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008264 return false;
8265 }
Craig Topper3164f332014-03-11 03:39:26 +00008266 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008267 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8268 return (RegNo < 2)? RegNo : -1;
8269 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008270 bool allowsLargerPreferedTypeAlignment() const override {
8271 return false;
8272 }
Robert Lytton0e076492013-08-13 09:43:10 +00008273};
8274
8275const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008276#define BUILTIN(ID, TYPE, ATTRS) \
8277 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8278#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8279 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008280#include "clang/Basic/BuiltinsXCore.def"
8281};
Robert Lytton0e076492013-08-13 09:43:10 +00008282
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008283// x86_32 Android target
8284class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008286 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8287 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008288 SuitableAlign = 32;
8289 LongDoubleWidth = 64;
8290 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8291 }
8292};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008293
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008294// x86_64 Android target
8295class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8296public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8298 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008299 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8300 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008301
8302 bool useFloat128ManglingForLongDouble() const override {
8303 return true;
8304 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008305};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008306
8307// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8308class RenderScript32TargetInfo : public ARMleTargetInfo {
8309public:
8310 RenderScript32TargetInfo(const llvm::Triple &Triple,
8311 const TargetOptions &Opts)
8312 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8313 Triple.getOSName(),
8314 Triple.getEnvironmentName()),
8315 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008316 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008317 LongWidth = LongAlign = 64;
8318 }
8319 void getTargetDefines(const LangOptions &Opts,
8320 MacroBuilder &Builder) const override {
8321 Builder.defineMacro("__RENDERSCRIPT__");
8322 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8323 }
8324};
8325
8326// 64-bit RenderScript is aarch64
8327class RenderScript64TargetInfo : public AArch64leTargetInfo {
8328public:
8329 RenderScript64TargetInfo(const llvm::Triple &Triple,
8330 const TargetOptions &Opts)
8331 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8332 Triple.getOSName(),
8333 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008334 Opts) {
8335 IsRenderScriptTarget = true;
8336 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008337
8338 void getTargetDefines(const LangOptions &Opts,
8339 MacroBuilder &Builder) const override {
8340 Builder.defineMacro("__RENDERSCRIPT__");
8341 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8342 }
8343};
8344
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008345} // end anonymous namespace
8346
Chris Lattner5ba61f02006-10-14 07:39:34 +00008347//===----------------------------------------------------------------------===//
8348// Driver code
8349//===----------------------------------------------------------------------===//
8350
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8352 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008353 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008354
Daniel Dunbar52322032009-08-18 05:47:58 +00008355 switch (Triple.getArch()) {
8356 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008357 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008358
Tim Northover2a0783d2014-05-30 14:14:07 +00008359 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008361
8362 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008364
Jacques Pienaard964cc22016-03-28 21:02:54 +00008365 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008367
Tim Northover2a0783d2014-05-30 14:14:07 +00008368 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008369 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008370 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008371
8372 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008373 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008375 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008377 case llvm::Triple::Fuchsia:
8378 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008379 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008381 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008383 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008385 }
8386
Christian Pirker9b019ae2014-02-25 13:51:00 +00008387 case llvm::Triple::aarch64_be:
8388 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008389 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008391 case llvm::Triple::Fuchsia:
8392 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008393 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008395 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008397 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008399 }
8400
Daniel Dunbar52322032009-08-18 05:47:58 +00008401 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008402 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008403 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008405
Daniel Dunbar52322032009-08-18 05:47:58 +00008406 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008407 case llvm::Triple::CloudABI:
8408 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008409 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008411 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008412 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008413 case llvm::Triple::Fuchsia:
8414 return new FuchsiaTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008415 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008416 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008417 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008419 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008421 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008422 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008423 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008425 case llvm::Triple::Win32:
8426 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008427 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008428 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008429 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008431 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008432 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008433 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008434 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008436 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008437 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008438 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008439 }
8440
8441 case llvm::Triple::armeb:
8442 case llvm::Triple::thumbeb:
8443 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008445
8446 switch (os) {
8447 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008449 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008451 case llvm::Triple::Fuchsia:
8452 return new FuchsiaTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008453 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008455 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008457 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008459 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008461 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008462 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008463 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008464 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008465 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008466
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008467 case llvm::Triple::bpfeb:
8468 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008470
Daniel Dunbar52322032009-08-18 05:47:58 +00008471 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008473
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008474 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008475 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008476 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008477 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008478 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008479 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008480 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008481 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008482 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008483 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008484 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008485 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008486 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008487
8488 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008489 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008490 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008491 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008492 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008493 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008494 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008495 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008496 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008497 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008498 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008499 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008500 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008501 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008502 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008503
Akira Hatanakabef17452011-09-20 19:21:49 +00008504 case llvm::Triple::mips64:
8505 switch (os) {
8506 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008507 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008508 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008509 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008510 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008511 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008512 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008513 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008514 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008515 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008516 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008517 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008518 }
8519
8520 case llvm::Triple::mips64el:
8521 switch (os) {
8522 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008523 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008524 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008525 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008526 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008527 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008528 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008529 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008530 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008531 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008532 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008533 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008534 }
8535
Ivan Krasindd7403e2011-08-24 20:22:22 +00008536 case llvm::Triple::le32:
8537 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008538 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008540 default:
8541 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008542 }
8543
JF Bastien643817d2014-09-12 17:52:47 +00008544 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008546
Daniel Dunbar52322032009-08-18 05:47:58 +00008547 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008548 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008550 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008551 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008553 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008555 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008557 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008559 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008560 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008561 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008563 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008564
8565 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008566 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008568 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008569 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008571 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008573 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008575 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008577 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008579 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008580
Bill Schmidt778d3872013-07-26 01:36:11 +00008581 case llvm::Triple::ppc64le:
8582 switch (os) {
8583 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008585 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008587 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008588 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008589 }
8590
Peter Collingbournec947aae2012-05-20 23:28:41 +00008591 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008592 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008593 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008594 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008595
Tom Stellardd8e38a32015-01-06 20:34:47 +00008596 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008597 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008599
Daniel Dunbar52322032009-08-18 05:47:58 +00008600 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008601 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008602 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008603 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008604 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008605 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008606 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008607 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008608 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008609 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008610 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008611 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008612 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008613 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008614 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008615
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008616 // The 'sparcel' architecture copies all the above cases except for Solaris.
8617 case llvm::Triple::sparcel:
8618 switch (os) {
8619 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008620 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008621 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008622 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008623 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008624 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008625 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008626 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008627 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008628 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008629 }
8630
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008631 case llvm::Triple::sparcv9:
8632 switch (os) {
8633 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008634 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008635 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008636 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008637 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008638 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008639 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008640 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008641 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008642 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008643 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008644 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008645 }
8646
Ulrich Weigand47445072013-05-06 16:26:41 +00008647 case llvm::Triple::systemz:
8648 switch (os) {
8649 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008650 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008651 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008652 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008653 }
8654
Eli Friedmana9c3d712009-08-19 20:47:07 +00008655 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008656 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008657
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00008658 case llvm::Triple::tcele:
8659 return new TCELETargetInfo(Triple, Opts);
8660
Daniel Dunbar52322032009-08-18 05:47:58 +00008661 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008662 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008663 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008664
Daniel Dunbar52322032009-08-18 05:47:58 +00008665 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008666 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008667 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008668 case llvm::Triple::Linux: {
8669 switch (Triple.getEnvironment()) {
8670 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008671 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008672 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008673 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008674 }
8675 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008676 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008677 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008678 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008679 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008680 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008681 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008682 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008683 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008684 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008685 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008686 case llvm::Triple::Fuchsia:
8687 return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008688 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008689 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008690 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008691 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008692 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008693 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008694 case llvm::Triple::Win32: {
8695 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008696 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008697 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008698 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008699 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008700 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008701 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008702 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008703 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008704 }
8705 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008706 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008707 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008708 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008709 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008710 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008711 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008712 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008713 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008714 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008715 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008716 }
8717
8718 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008719 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008720 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008721
Daniel Dunbar52322032009-08-18 05:47:58 +00008722 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008723 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008724 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008725 case llvm::Triple::Linux: {
8726 switch (Triple.getEnvironment()) {
8727 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008728 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008729 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008730 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008731 }
8732 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008733 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008734 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008735 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008736 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008737 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008738 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008739 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008740 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008741 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008742 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008743 case llvm::Triple::Fuchsia:
8744 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008745 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008746 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008747 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008748 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008749 case llvm::Triple::Win32: {
8750 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008751 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008752 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008753 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008754 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008755 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008756 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008757 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008758 }
8759 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008760 case llvm::Triple::Haiku:
8761 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008762 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008763 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008764 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008765 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008766 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008767 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008768 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008769
Douglas Katzman78d7c542015-05-12 21:18:10 +00008770 case llvm::Triple::spir: {
8771 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8772 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8773 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008774 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008775 }
8776 case llvm::Triple::spir64: {
8777 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8778 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8779 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008780 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008781 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008782 case llvm::Triple::wasm32:
8783 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8784 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008785 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008786 case llvm::Triple::wasm64:
8787 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8788 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008789 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008790
8791 case llvm::Triple::renderscript32:
8792 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8793 case llvm::Triple::renderscript64:
8794 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008795 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008796}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008797
8798/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008799/// options.
Alp Toker80758082014-07-06 05:26:44 +00008800TargetInfo *
8801TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008802 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008803 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008804
8805 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008806 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008807 if (!Target) {
8808 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008809 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008810 }
Alp Toker80758082014-07-06 05:26:44 +00008811 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008812
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008813 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008814 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8815 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008816 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008817 }
8818
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008819 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008820 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8821 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008822 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008823 }
8824
Rafael Espindolaeb265472013-08-21 21:59:03 +00008825 // Set the fp math unit.
8826 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8827 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008828 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008829 }
8830
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008831 // Compute the default target features, we need the target to handle this
8832 // because features may have dependencies on one another.
8833 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008834 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8835 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008836 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008837
8838 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008839 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008840 for (const auto &F : Features)
8841 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8842
Eric Christopher3ff21b32013-10-16 21:26:26 +00008843 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008844 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008845
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008846 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00008847 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008848
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008849 if (!Target->validateTarget(Diags))
8850 return nullptr;
8851
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008852 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008853}