blob: d60f8924836931ce582541959273efd1a64848a2 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Petr Hosek62e1d232016-10-06 06:08:09 +0000826// Fuchsia Target
827template<typename Target>
828class FuchsiaTargetInfo : public OSTargetInfo<Target> {
829protected:
830 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
831 MacroBuilder &Builder) const override {
832 Builder.defineMacro("__Fuchsia__");
833 Builder.defineMacro("__ELF__");
834 if (Opts.POSIXThreads)
835 Builder.defineMacro("_REENTRANT");
836 // Required by the libc++ locale support.
837 if (Opts.CPlusPlus)
838 Builder.defineMacro("_GNU_SOURCE");
839 }
840public:
841 FuchsiaTargetInfo(const llvm::Triple &Triple,
842 const TargetOptions &Opts)
843 : OSTargetInfo<Target>(Triple, Opts) {
844 this->MCountName = "__mcount";
845 }
846};
847
Dan Gohmanc2853072015-09-03 22:51:53 +0000848// WebAssembly target
849template <typename Target>
850class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
851 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000852 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000853 // A common platform macro.
854 if (Opts.POSIXThreads)
855 Builder.defineMacro("_REENTRANT");
856 // Follow g++ convention and predefine _GNU_SOURCE for C++.
857 if (Opts.CPlusPlus)
858 Builder.defineMacro("_GNU_SOURCE");
859 }
860
861 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000862 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000863 return ".text.__startup";
864 }
865
866public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000867 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
868 const TargetOptions &Opts)
869 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000870 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000871 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
872 }
873};
Dan Gohmanc2853072015-09-03 22:51:53 +0000874
Chris Lattner09d98f52008-10-05 21:50:58 +0000875//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000876// Specific target implementations.
877//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000878
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000879// PPC abstract base class
880class PPCTargetInfo : public TargetInfo {
881 static const Builtin::Info BuiltinInfo[];
882 static const char * const GCCRegNames[];
883 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000885
886 // Target cpu features.
887 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000888 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000889 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000890 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000891 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000892 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000893 bool HasBPERMD;
894 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000895 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000896
Ulrich Weigand8afad612014-07-28 13:17:52 +0000897protected:
898 std::string ABI;
899
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000900public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000901 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000902 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
903 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000904 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000905 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000906 LongDoubleWidth = LongDoubleAlign = 128;
907 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
908 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000909
Hal Finkel6b984f02012-07-03 16:51:04 +0000910 /// \brief Flags for architecture specific defines.
911 typedef enum {
912 ArchDefineNone = 0,
913 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
914 ArchDefinePpcgr = 1 << 1,
915 ArchDefinePpcsq = 1 << 2,
916 ArchDefine440 = 1 << 3,
917 ArchDefine603 = 1 << 4,
918 ArchDefine604 = 1 << 5,
919 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000920 ArchDefinePwr5 = 1 << 7,
921 ArchDefinePwr5x = 1 << 8,
922 ArchDefinePwr6 = 1 << 9,
923 ArchDefinePwr6x = 1 << 10,
924 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000925 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000926 ArchDefinePwr9 = 1 << 13,
927 ArchDefineA2 = 1 << 14,
928 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000929 } ArchDefineTypes;
930
Bill Schmidt38378a02013-02-01 20:23:10 +0000931 // Note: GCC recognizes the following additional cpus:
932 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
933 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
934 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000935 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 bool CPUKnown = llvm::StringSwitch<bool>(Name)
937 .Case("generic", true)
938 .Case("440", true)
939 .Case("450", true)
940 .Case("601", true)
941 .Case("602", true)
942 .Case("603", true)
943 .Case("603e", true)
944 .Case("603ev", true)
945 .Case("604", true)
946 .Case("604e", true)
947 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 .Case("g3", true)
950 .Case("7400", true)
951 .Case("g4", true)
952 .Case("7450", true)
953 .Case("g4+", true)
954 .Case("750", true)
955 .Case("970", true)
956 .Case("g5", true)
957 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000958 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000959 .Case("e500mc", true)
960 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("power3", true)
962 .Case("pwr3", true)
963 .Case("power4", true)
964 .Case("pwr4", true)
965 .Case("power5", true)
966 .Case("pwr5", true)
967 .Case("power5x", true)
968 .Case("pwr5x", true)
969 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000970 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000971 .Case("power6x", true)
972 .Case("pwr6x", true)
973 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000974 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000975 .Case("power8", true)
976 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000977 .Case("power9", true)
978 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000979 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000980 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000983 .Case("powerpc64le", true)
984 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000985 .Default(false);
986
987 if (CPUKnown)
988 CPU = Name;
989
990 return CPUKnown;
991 }
992
Ulrich Weigand8afad612014-07-28 13:17:52 +0000993
994 StringRef getABI() const override { return ABI; }
995
Craig Topper6c03a542015-10-19 04:51:35 +0000996 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
997 return llvm::makeArrayRef(BuiltinInfo,
998 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000999 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001000
Craig Topper3164f332014-03-11 03:39:26 +00001001 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 void getTargetDefines(const LangOptions &Opts,
1004 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005
Eric Christopher8c47b422015-10-09 18:39:55 +00001006 bool
1007 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1008 StringRef CPU,
1009 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001010
Craig Topper3164f332014-03-11 03:39:26 +00001011 bool handleTargetFeatures(std::vector<std::string> &Features,
1012 DiagnosticsEngine &Diags) override;
1013 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001014 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1015 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001016
Craig Topperf054e3a2015-10-19 03:52:27 +00001017 ArrayRef<const char *> getGCCRegNames() const override;
1018 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001019 bool validateAsmConstraint(const char *&Name,
1020 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001021 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001022 default: return false;
1023 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001024 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 case 'b': // Base register
1026 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001027 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
1029 // FIXME: The following are added to allow parsing.
1030 // I just took a guess at what the actions should be.
1031 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001032 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001033 case 'v': // Altivec vector register
1034 Info.setAllowsRegister();
1035 break;
1036 case 'w':
1037 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 case 'd':// VSX vector register to hold vector double data
1039 case 'f':// VSX vector register to hold vector float data
1040 case 's':// VSX vector register to hold scalar float data
1041 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001042 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001043 break;
1044 default:
1045 return false;
1046 }
1047 Info.setAllowsRegister();
1048 Name++; // Skip over 'w'.
1049 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 case 'h': // `MQ', `CTR', or `LINK' register
1051 case 'q': // `MQ' register
1052 case 'c': // `CTR' register
1053 case 'l': // `LINK' register
1054 case 'x': // `CR' register (condition register) number 0
1055 case 'y': // `CR' register (condition register)
1056 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001057 Info.setAllowsRegister();
1058 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001059 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // (use `L' instead for SImode constants)
1062 case 'K': // Unsigned 16-bit constant
1063 case 'L': // Signed 16-bit constant shifted left 16 bits
1064 case 'M': // Constant larger than 31
1065 case 'N': // Exact power of 2
1066 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'm': // Memory operand. Note that on PowerPC targets, m can
1073 // include addresses that update the base register. It
1074 // is therefore only safe to use `m' in an asm statement
1075 // if that asm statement accesses the operand exactly once.
1076 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001077 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001078 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001079 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1082 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register to be updated.
1084 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001085 if (Name[1] != 's')
1086 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001087 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001088 // include any automodification of the base register. Unlike
1089 // `m', this constraint can be used in asm statements that
1090 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001091 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001092 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001093 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001094 break;
1095 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001097 case 'Z': // Memory operand that is an indexed or indirect from a
1098 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001099 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001100 Info.setAllowsMemory();
1101 Info.setAllowsRegister();
1102 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001104 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 // register (`p' is preferable for asm statements)
1106 case 'S': // Constant suitable as a 64-bit mask operand
1107 case 'T': // Constant suitable as a 32-bit mask operand
1108 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001109 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001110 // instructions
1111 case 'W': // Vector constant that does not require memory
1112 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001113 break;
1114 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001115 }
John Thompson07a61a42010-06-24 22:44:13 +00001116 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
Craig Topper3164f332014-03-11 03:39:26 +00001118 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001119 std::string R;
1120 switch (*Constraint) {
1121 case 'e':
1122 case 'w':
1123 // Two-character constraint; add "^" hint for later parsing.
1124 R = std::string("^") + std::string(Constraint, 2);
1125 Constraint++;
1126 break;
1127 default:
1128 return TargetInfo::convertConstraint(Constraint);
1129 }
1130 return R;
1131 }
Craig Topper3164f332014-03-11 03:39:26 +00001132 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001133 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001134 }
Craig Topper3164f332014-03-11 03:39:26 +00001135 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001136 if (RegNo == 0) return 3;
1137 if (RegNo == 1) return 4;
1138 return -1;
1139 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001140
1141 bool hasSjLjLowering() const override {
1142 return true;
1143 }
David Majnemer2617ea62015-06-09 18:05:33 +00001144
1145 bool useFloat128ManglingForLongDouble() const override {
1146 return LongDoubleWidth == 128 &&
1147 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1148 getTriple().isOSBinFormatELF();
1149 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001150};
Anders Carlssonf511f642007-11-27 04:11:28 +00001151
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001153#define BUILTIN(ID, TYPE, ATTRS) \
1154 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1155#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1156 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001157#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001159
Eric Christopher917e9522014-11-18 22:36:15 +00001160/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001162bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001164 for (const auto &Feature : Features) {
1165 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001166 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001167 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001168 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001172 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001174 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001176 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001178 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001180 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001181 } else if (Feature == "+float128") {
1182 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001183 } else if (Feature == "+power9-vector") {
1184 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001185 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001186 // TODO: Finish this list and add an assert that we've handled them
1187 // all.
1188 }
Eric Christopher02c33352015-08-25 00:59:11 +00001189
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001190 return true;
1191}
1192
Chris Lattnerecd49032009-03-02 22:27:17 +00001193/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1194/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001195void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001196 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001197 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001199 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001201 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001205 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001207 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001208 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001209
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001211 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1212 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 } else {
1214 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1215 getTriple().getOS() != llvm::Triple::OpenBSD)
1216 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001218
Ulrich Weigand8afad612014-07-28 13:17:52 +00001219 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001220 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 Builder.defineMacro("_CALL_ELF", "1");
1222 if (ABI == "elfv2")
1223 Builder.defineMacro("_CALL_ELF", "2");
1224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001226 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1227 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228
Chris Lattnerecd49032009-03-02 22:27:17 +00001229 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001230 if (LongDoubleWidth == 128)
1231 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001232
John Thompsone467e192009-11-19 17:18:50 +00001233 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001234 Builder.defineMacro("__VEC__", "10206");
1235 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001236 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001237
1238 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001239 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1240 .Case("440", ArchDefineName)
1241 .Case("450", ArchDefineName | ArchDefine440)
1242 .Case("601", ArchDefineName)
1243 .Case("602", ArchDefineName | ArchDefinePpcgr)
1244 .Case("603", ArchDefineName | ArchDefinePpcgr)
1245 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1246 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1247 .Case("604", ArchDefineName | ArchDefinePpcgr)
1248 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1249 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001250 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001251 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1252 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1253 .Case("750", ArchDefineName | ArchDefinePpcgr)
1254 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001256 .Case("a2", ArchDefineA2)
1257 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001258 .Case("pwr3", ArchDefinePpcgr)
1259 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1261 | ArchDefinePpcsq)
1262 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1263 | ArchDefinePpcgr | ArchDefinePpcsq)
1264 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1265 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1267 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1268 | ArchDefinePpcsq)
1269 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1270 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001271 | ArchDefinePpcgr | ArchDefinePpcsq)
1272 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1273 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1274 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001275 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1276 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1277 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1278 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001279 .Case("power3", ArchDefinePpcgr)
1280 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1282 | ArchDefinePpcsq)
1283 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1284 | ArchDefinePpcgr | ArchDefinePpcsq)
1285 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1286 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1288 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1289 | ArchDefinePpcsq)
1290 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1291 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001292 | ArchDefinePpcgr | ArchDefinePpcsq)
1293 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1294 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1295 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001296 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1297 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1298 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1299 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001300 .Default(ArchDefineNone);
1301
1302 if (defs & ArchDefineName)
1303 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1304 if (defs & ArchDefinePpcgr)
1305 Builder.defineMacro("_ARCH_PPCGR");
1306 if (defs & ArchDefinePpcsq)
1307 Builder.defineMacro("_ARCH_PPCSQ");
1308 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001309 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001310 if (defs & ArchDefine603)
1311 Builder.defineMacro("_ARCH_603");
1312 if (defs & ArchDefine604)
1313 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001314 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001315 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5x)
1319 Builder.defineMacro("_ARCH_PWR5X");
1320 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001322 if (defs & ArchDefinePwr6x)
1323 Builder.defineMacro("_ARCH_PWR6X");
1324 if (defs & ArchDefinePwr7)
1325 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001326 if (defs & ArchDefinePwr8)
1327 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001328 if (defs & ArchDefinePwr9)
1329 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001330 if (defs & ArchDefineA2)
1331 Builder.defineMacro("_ARCH_A2");
1332 if (defs & ArchDefineA2q) {
1333 Builder.defineMacro("_ARCH_A2Q");
1334 Builder.defineMacro("_ARCH_QP");
1335 }
1336
1337 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1338 Builder.defineMacro("__bg__");
1339 Builder.defineMacro("__THW_BLUEGENE__");
1340 Builder.defineMacro("__bgq__");
1341 Builder.defineMacro("__TOS_BGQ__");
1342 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001343
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001344 if (HasVSX)
1345 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001346 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001347 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001348 if (HasP8Crypto)
1349 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001350 if (HasHTM)
1351 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001352 if (HasFloat128)
1353 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001354 if (HasP9Vector)
1355 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001356
1357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1360 if (PointerWidth == 64)
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001362
Bill Schmidt38378a02013-02-01 20:23:10 +00001363 // FIXME: The following are not yet generated here by Clang, but are
1364 // generated by GCC:
1365 //
1366 // _SOFT_FLOAT_
1367 // __RECIP_PRECISION__
1368 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001369 // __RECIP__
1370 // __RECIPF__
1371 // __RSQRTE__
1372 // __RSQRTEF__
1373 // _SOFT_DOUBLE_
1374 // __NO_LWSYNC__
1375 // __HAVE_BSWAP__
1376 // __LONGDOUBLE128
1377 // __CMODEL_MEDIUM__
1378 // __CMODEL_LARGE__
1379 // _CALL_SYSV
1380 // _CALL_DARWIN
1381 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001382}
1383
Eric Christophera8a14c32015-08-31 18:39:16 +00001384// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001385// explicitly turned off vsx and turned on any of:
1386// - power8-vector
1387// - direct-move
1388// - float128
1389// - power9-vector
1390// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001391// set of options.
1392static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001393 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001394
1395 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1396 FeaturesVec.end()) {
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1398 FeaturesVec.end()) {
1399 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1400 << "-mno-vsx";
1401 return false;
1402 }
1403
1404 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1405 FeaturesVec.end()) {
1406 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1407 << "-mno-vsx";
1408 return false;
1409 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001410
1411 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1412 FeaturesVec.end()) {
1413 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1414 << "-mno-vsx";
1415 return false;
1416 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001417
1418 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1419 FeaturesVec.end()) {
1420 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1421 << "-mno-vsx";
1422 return false;
1423 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001424 }
1425
1426 return true;
1427}
1428
Eric Christopher8c47b422015-10-09 18:39:55 +00001429bool PPCTargetInfo::initFeatureMap(
1430 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1431 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001432 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("7400", true)
1434 .Case("g4", true)
1435 .Case("7450", true)
1436 .Case("g4+", true)
1437 .Case("970", true)
1438 .Case("g5", true)
1439 .Case("pwr6", true)
1440 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001441 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001442 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001443 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001444 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001446
1447 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001448 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001449 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001452 .Case("pwr8", true)
1453 .Default(false);
1454 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001457 .Case("pwr8", true)
1458 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1460 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001461 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001462 .Case("pwr8", true)
1463 .Case("pwr7", true)
1464 .Default(false);
1465 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1466 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001467 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001468 .Case("pwr8", true)
1469 .Case("pwr7", true)
1470 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001471 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1472 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001473 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001474 .Case("pwr8", true)
1475 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001476 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1477 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001478 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001479 .Case("pwr8", true)
1480 .Case("pwr7", true)
1481 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001482
Eric Christophera8a14c32015-08-31 18:39:16 +00001483 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1484 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001485
Eric Christopher007b0a02015-08-28 22:32:01 +00001486 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001487}
1488
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001489bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001490 return llvm::StringSwitch<bool>(Feature)
1491 .Case("powerpc", true)
1492 .Case("vsx", HasVSX)
1493 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001494 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001495 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001497 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001498 .Case("bpermd", HasBPERMD)
1499 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001500 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001501 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001502 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001503}
Chris Lattner17df24e2008-04-21 18:56:49 +00001504
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001505void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1506 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001507 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1508 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1509 // incompatible options.
1510 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001511 if (Name == "direct-move" ||
1512 Name == "power8-vector" ||
1513 Name == "float128" ||
1514 Name == "power9-vector") {
1515 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001516 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001517 if (Name == "power9-vector")
1518 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001519 } else {
1520 Features[Name] = true;
1521 }
1522 } else {
1523 if (Name == "vsx") {
1524 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001525 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001526 } else {
1527 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001528 }
1529 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530}
1531
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001532const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001533 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1534 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1535 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1536 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1537 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1538 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1539 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1540 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001541 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001542 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1545 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1546 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1547 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001548 "vrsave", "vscr",
1549 "spe_acc", "spefscr",
1550 "sfp"
1551};
Chris Lattner10a5b382007-01-29 05:24:35 +00001552
Craig Topperf054e3a2015-10-19 03:52:27 +00001553ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1554 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001555}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001556
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1558 // While some of these aliases do map to different registers
1559 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001560 { { "0" }, "r0" },
1561 { { "1"}, "r1" },
1562 { { "2" }, "r2" },
1563 { { "3" }, "r3" },
1564 { { "4" }, "r4" },
1565 { { "5" }, "r5" },
1566 { { "6" }, "r6" },
1567 { { "7" }, "r7" },
1568 { { "8" }, "r8" },
1569 { { "9" }, "r9" },
1570 { { "10" }, "r10" },
1571 { { "11" }, "r11" },
1572 { { "12" }, "r12" },
1573 { { "13" }, "r13" },
1574 { { "14" }, "r14" },
1575 { { "15" }, "r15" },
1576 { { "16" }, "r16" },
1577 { { "17" }, "r17" },
1578 { { "18" }, "r18" },
1579 { { "19" }, "r19" },
1580 { { "20" }, "r20" },
1581 { { "21" }, "r21" },
1582 { { "22" }, "r22" },
1583 { { "23" }, "r23" },
1584 { { "24" }, "r24" },
1585 { { "25" }, "r25" },
1586 { { "26" }, "r26" },
1587 { { "27" }, "r27" },
1588 { { "28" }, "r28" },
1589 { { "29" }, "r29" },
1590 { { "30" }, "r30" },
1591 { { "31" }, "r31" },
1592 { { "fr0" }, "f0" },
1593 { { "fr1" }, "f1" },
1594 { { "fr2" }, "f2" },
1595 { { "fr3" }, "f3" },
1596 { { "fr4" }, "f4" },
1597 { { "fr5" }, "f5" },
1598 { { "fr6" }, "f6" },
1599 { { "fr7" }, "f7" },
1600 { { "fr8" }, "f8" },
1601 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001602 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001603 { { "fr11" }, "f11" },
1604 { { "fr12" }, "f12" },
1605 { { "fr13" }, "f13" },
1606 { { "fr14" }, "f14" },
1607 { { "fr15" }, "f15" },
1608 { { "fr16" }, "f16" },
1609 { { "fr17" }, "f17" },
1610 { { "fr18" }, "f18" },
1611 { { "fr19" }, "f19" },
1612 { { "fr20" }, "f20" },
1613 { { "fr21" }, "f21" },
1614 { { "fr22" }, "f22" },
1615 { { "fr23" }, "f23" },
1616 { { "fr24" }, "f24" },
1617 { { "fr25" }, "f25" },
1618 { { "fr26" }, "f26" },
1619 { { "fr27" }, "f27" },
1620 { { "fr28" }, "f28" },
1621 { { "fr29" }, "f29" },
1622 { { "fr30" }, "f30" },
1623 { { "fr31" }, "f31" },
1624 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625};
1626
Craig Topperf054e3a2015-10-19 03:52:27 +00001627ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1628 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001629}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001630
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001633 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1634 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001635 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001636
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001637 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001638 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 case llvm::Triple::FreeBSD:
1640 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001641 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001642 PtrDiffType = SignedInt;
1643 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001644 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001645 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001647 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001648
Roman Divacky3ffe7462012-03-13 19:20:17 +00001649 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1650 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC32 supports atomics up to 4 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001656 }
1657
Craig Topper3164f332014-03-11 03:39:26 +00001658 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001660 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001661 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001662};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001663
Bill Schmidt778d3872013-07-26 01:36:11 +00001664// Note: ABI differences may eventually require us to have a separate
1665// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001666class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001671 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001672 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001673
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001674 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001675 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 ABI = "elfv2";
1677 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001679 ABI = "elfv1";
1680 }
1681
1682 switch (getTriple().getOS()) {
1683 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001684 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001685 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001686 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001687 case llvm::Triple::NetBSD:
1688 IntMaxType = SignedLongLong;
1689 Int64Type = SignedLongLong;
1690 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001691 default:
1692 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001693 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001694
1695 // PPC64 supports atomics up to 8 bytes.
1696 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001697 }
Craig Topper3164f332014-03-11 03:39:26 +00001698 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001699 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001701 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001702 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001703 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 ABI = Name;
1705 return true;
1706 }
1707 return false;
1708 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001709};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001710
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001711class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1714 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001715 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001716 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001717 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001718 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001719 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001720 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001721 }
Craig Topper3164f332014-03-11 03:39:26 +00001722 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001723 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001724 }
1725};
1726
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001727class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001728public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1730 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001731 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001732 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001733 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001734 }
1735};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736
Eric Christopherc48497a2015-09-18 21:26:24 +00001737static const unsigned NVPTXAddrSpaceMap[] = {
1738 1, // opencl_global
1739 3, // opencl_local
1740 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001741 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001742 0, // opencl_generic
1743 1, // cuda_device
1744 4, // cuda_constant
1745 3, // cuda_shared
1746};
1747
1748class NVPTXTargetInfo : public TargetInfo {
1749 static const char *const GCCRegNames[];
1750 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001751 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001752
Eric Christopherc48497a2015-09-18 21:26:24 +00001753public:
Justin Lebar76945b22016-04-29 23:05:19 +00001754 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001755 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001756 TLSSupported = false;
1757 LongWidth = LongAlign = 64;
1758 AddrSpaceMap = &NVPTXAddrSpaceMap;
1759 UseAddrSpaceMapMangling = true;
1760 // Define available target features
1761 // These must be defined in sorted order!
1762 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001763 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001764
1765 // If possible, get a TargetInfo for our host triple, so we can match its
1766 // types.
1767 llvm::Triple HostTriple(Opts.HostTriple);
1768 if (HostTriple.isNVPTX())
1769 return;
1770 std::unique_ptr<TargetInfo> HostTarget(
1771 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1772 if (!HostTarget) {
1773 return;
1774 }
1775
1776 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1777 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1778 BoolWidth = HostTarget->getBoolWidth();
1779 BoolAlign = HostTarget->getBoolAlign();
1780 IntWidth = HostTarget->getIntWidth();
1781 IntAlign = HostTarget->getIntAlign();
1782 HalfWidth = HostTarget->getHalfWidth();
1783 HalfAlign = HostTarget->getHalfAlign();
1784 FloatWidth = HostTarget->getFloatWidth();
1785 FloatAlign = HostTarget->getFloatAlign();
1786 DoubleWidth = HostTarget->getDoubleWidth();
1787 DoubleAlign = HostTarget->getDoubleAlign();
1788 LongWidth = HostTarget->getLongWidth();
1789 LongAlign = HostTarget->getLongAlign();
1790 LongLongWidth = HostTarget->getLongLongWidth();
1791 LongLongAlign = HostTarget->getLongLongAlign();
1792 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001793 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001794 DefaultAlignForAttributeAligned =
1795 HostTarget->getDefaultAlignForAttributeAligned();
1796 SizeType = HostTarget->getSizeType();
1797 IntMaxType = HostTarget->getIntMaxType();
1798 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1799 IntPtrType = HostTarget->getIntPtrType();
1800 WCharType = HostTarget->getWCharType();
1801 WIntType = HostTarget->getWIntType();
1802 Char16Type = HostTarget->getChar16Type();
1803 Char32Type = HostTarget->getChar32Type();
1804 Int64Type = HostTarget->getInt64Type();
1805 SigAtomicType = HostTarget->getSigAtomicType();
1806 ProcessIDType = HostTarget->getProcessIDType();
1807
1808 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1809 UseZeroLengthBitfieldAlignment =
1810 HostTarget->useZeroLengthBitfieldAlignment();
1811 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1812 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1813
Justin Lebar5057f172016-09-09 20:35:43 +00001814 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1815 // we need those macros to be identical on host and device, because (among
1816 // other things) they affect which standard library classes are defined, and
1817 // we need all classes to be defined on both the host and device.
1818 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1819
Justin Lebar76945b22016-04-29 23:05:19 +00001820 // Properties intentionally not copied from host:
1821 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1822 // host/device boundary.
1823 // - SuitableAlign: Not visible across the host/device boundary, and may
1824 // correctly be different on host/device, e.g. if host has wider vector
1825 // types than device.
1826 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1827 // as its double type, but that's not necessarily true on the host.
1828 // TODO: nvcc emits a warning when using long double on device; we should
1829 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001830 }
1831 void getTargetDefines(const LangOptions &Opts,
1832 MacroBuilder &Builder) const override {
1833 Builder.defineMacro("__PTX__");
1834 Builder.defineMacro("__NVPTX__");
1835 if (Opts.CUDAIsDevice) {
1836 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001837 std::string CUDAArchCode = [this] {
1838 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001839 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001840 assert(false && "No GPU arch when compiling CUDA device code.");
1841 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001842 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001843 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001844 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001846 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001847 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001848 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001849 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001850 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001851 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001852 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001853 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001854 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001855 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001856 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001857 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001858 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001859 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001860 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001861 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001862 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001863 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001864 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001865 return "620";
1866 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001867 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001868 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001869 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001870 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 }
Craig Topper6c03a542015-10-19 04:51:35 +00001872 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1873 return llvm::makeArrayRef(BuiltinInfo,
1874 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001875 }
Artem Belevichfda99052016-09-28 17:47:35 +00001876 bool
1877 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1878 StringRef CPU,
1879 const std::vector<std::string> &FeaturesVec) const override {
1880 Features["satom"] = GPU >= CudaArch::SM_60;
1881 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1882 }
1883
Eric Christopherc48497a2015-09-18 21:26:24 +00001884 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001885 return llvm::StringSwitch<bool>(Feature)
1886 .Cases("ptx", "nvptx", true)
1887 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1888 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001889 }
1890
Craig Topperf054e3a2015-10-19 03:52:27 +00001891 ArrayRef<const char *> getGCCRegNames() const override;
1892 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001893 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001894 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001895 }
1896 bool validateAsmConstraint(const char *&Name,
1897 TargetInfo::ConstraintInfo &Info) const override {
1898 switch (*Name) {
1899 default:
1900 return false;
1901 case 'c':
1902 case 'h':
1903 case 'r':
1904 case 'l':
1905 case 'f':
1906 case 'd':
1907 Info.setAllowsRegister();
1908 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001909 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001910 }
1911 const char *getClobbers() const override {
1912 // FIXME: Is this really right?
1913 return "";
1914 }
1915 BuiltinVaListKind getBuiltinVaListKind() const override {
1916 // FIXME: implement
1917 return TargetInfo::CharPtrBuiltinVaList;
1918 }
1919 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001920 GPU = StringToCudaArch(Name);
1921 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001923 void setSupportedOpenCLOpts() override {
1924 auto &Opts = getSupportedOpenCLOpts();
1925 Opts.cl_clang_storage_class_specifiers = 1;
1926 Opts.cl_khr_gl_sharing = 1;
1927 Opts.cl_khr_icd = 1;
1928
1929 Opts.cl_khr_fp64 = 1;
1930 Opts.cl_khr_byte_addressable_store = 1;
1931 Opts.cl_khr_global_int32_base_atomics = 1;
1932 Opts.cl_khr_global_int32_extended_atomics = 1;
1933 Opts.cl_khr_local_int32_base_atomics = 1;
1934 Opts.cl_khr_local_int32_extended_atomics = 1;
1935 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001936};
1937
1938const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1939#define BUILTIN(ID, TYPE, ATTRS) \
1940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1941#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001943#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001945#include "clang/Basic/BuiltinsNVPTX.def"
1946};
1947
1948const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1949
Craig Topperf054e3a2015-10-19 03:52:27 +00001950ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1951 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001952}
1953
1954class NVPTX32TargetInfo : public NVPTXTargetInfo {
1955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001956 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1957 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001958 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 PointerWidth = PointerAlign = 32;
1960 SizeType = TargetInfo::UnsignedInt;
1961 PtrDiffType = TargetInfo::SignedInt;
1962 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001963 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001964 }
1965};
1966
1967class NVPTX64TargetInfo : public NVPTXTargetInfo {
1968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001969 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1970 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001971 PointerWidth = PointerAlign = 64;
1972 SizeType = TargetInfo::UnsignedLong;
1973 PtrDiffType = TargetInfo::SignedLong;
1974 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001975 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001976 }
1977};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001978
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001979static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001980 1, // opencl_global
1981 3, // opencl_local
1982 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001983 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 1, // cuda_device
1985 2, // cuda_constant
1986 3 // cuda_shared
1987};
1988
Tom Stellarda96344b2014-08-21 13:58:40 +00001989// If you edit the description strings, make sure you update
1990// getPointerWidthV().
1991
Craig Topper273dbc62015-10-18 05:29:26 +00001992static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001993 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1994 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001995
Craig Topper273dbc62015-10-18 05:29:26 +00001996static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001997 "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 +00001998 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1999 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002000
Matt Arsenault250024f2016-06-08 01:56:42 +00002001class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002002 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002003 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002004
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002005 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002006 enum GPUKind {
2007 GK_NONE,
2008 GK_R600,
2009 GK_R600_DOUBLE_OPS,
2010 GK_R700,
2011 GK_R700_DOUBLE_OPS,
2012 GK_EVERGREEN,
2013 GK_EVERGREEN_DOUBLE_OPS,
2014 GK_NORTHERN_ISLANDS,
2015 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002016 GK_GFX6,
2017 GK_GFX7,
2018 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002019 } GPU;
2020
Jan Veselyeebeaea2015-05-04 19:53:36 +00002021 bool hasFP64:1;
2022 bool hasFMAF:1;
2023 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002024 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002025
Matt Arsenault250024f2016-06-08 01:56:42 +00002026 static bool isAMDGCN(const llvm::Triple &TT) {
2027 return TT.getArch() == llvm::Triple::amdgcn;
2028 }
2029
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002031 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002032 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002033 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002034 hasFP64(false),
2035 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002036 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002037 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002038 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002040 hasFMAF = true;
2041 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002042 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002043
2044 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2045 DataLayoutStringSI : DataLayoutStringR600);
2046
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002047 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002048 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002049 }
2050
Tom Stellarda96344b2014-08-21 13:58:40 +00002051 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2052 if (GPU <= GK_CAYMAN)
2053 return 32;
2054
2055 switch(AddrSpace) {
2056 default:
2057 return 64;
2058 case 0:
2059 case 3:
2060 case 5:
2061 return 32;
2062 }
2063 }
2064
Yaxun Liu26f75662016-08-19 05:17:25 +00002065 uint64_t getMaxPointerWidth() const override {
2066 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2067 }
2068
Craig Topper3164f332014-03-11 03:39:26 +00002069 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002070 return "";
2071 }
2072
Craig Topperf054e3a2015-10-19 03:52:27 +00002073 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074
Craig Topperf054e3a2015-10-19 03:52:27 +00002075 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2076 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002077 }
2078
Craig Topper3164f332014-03-11 03:39:26 +00002079 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002080 TargetInfo::ConstraintInfo &Info) const override {
2081 switch (*Name) {
2082 default: break;
2083 case 'v': // vgpr
2084 case 's': // sgpr
2085 Info.setAllowsRegister();
2086 return true;
2087 }
2088 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002089 }
2090
Matt Arsenault250024f2016-06-08 01:56:42 +00002091 bool initFeatureMap(llvm::StringMap<bool> &Features,
2092 DiagnosticsEngine &Diags, StringRef CPU,
2093 const std::vector<std::string> &FeatureVec) const override;
2094
Yaxun Liu2c17e822016-08-09 19:43:38 +00002095 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2096 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002097 bool hasFP32Denormals = false;
2098 bool hasFP64Denormals = false;
2099 for (auto &I : TargetOpts.FeaturesAsWritten) {
2100 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2101 hasFP32Denormals = true;
2102 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2103 hasFP64Denormals = true;
2104 }
2105 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002106 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2107 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2108 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002110 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 }
2112
Craig Topper6c03a542015-10-19 04:51:35 +00002113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2114 return llvm::makeArrayRef(BuiltinInfo,
2115 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002116 }
2117
Craig Topper3164f332014-03-11 03:39:26 +00002118 void getTargetDefines(const LangOptions &Opts,
2119 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002120 if (getTriple().getArch() == llvm::Triple::amdgcn)
2121 Builder.defineMacro("__AMDGCN__");
2122 else
2123 Builder.defineMacro("__R600__");
2124
Jan Veselyeebeaea2015-05-04 19:53:36 +00002125 if (hasFMAF)
2126 Builder.defineMacro("__HAS_FMAF__");
2127 if (hasLDEXPF)
2128 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002129 if (hasFP64)
2130 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002131 }
2132
Craig Topper3164f332014-03-11 03:39:26 +00002133 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002134 return TargetInfo::CharPtrBuiltinVaList;
2135 }
2136
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 static GPUKind parseR600Name(StringRef Name) {
2138 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002139 .Case("r600" , GK_R600)
2140 .Case("rv610", GK_R600)
2141 .Case("rv620", GK_R600)
2142 .Case("rv630", GK_R600)
2143 .Case("rv635", GK_R600)
2144 .Case("rs780", GK_R600)
2145 .Case("rs880", GK_R600)
2146 .Case("rv670", GK_R600_DOUBLE_OPS)
2147 .Case("rv710", GK_R700)
2148 .Case("rv730", GK_R700)
2149 .Case("rv740", GK_R700_DOUBLE_OPS)
2150 .Case("rv770", GK_R700_DOUBLE_OPS)
2151 .Case("palm", GK_EVERGREEN)
2152 .Case("cedar", GK_EVERGREEN)
2153 .Case("sumo", GK_EVERGREEN)
2154 .Case("sumo2", GK_EVERGREEN)
2155 .Case("redwood", GK_EVERGREEN)
2156 .Case("juniper", GK_EVERGREEN)
2157 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2158 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2159 .Case("barts", GK_NORTHERN_ISLANDS)
2160 .Case("turks", GK_NORTHERN_ISLANDS)
2161 .Case("caicos", GK_NORTHERN_ISLANDS)
2162 .Case("cayman", GK_CAYMAN)
2163 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002164 .Default(GK_NONE);
2165 }
2166
2167 static GPUKind parseAMDGCNName(StringRef Name) {
2168 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002169 .Case("tahiti", GK_GFX6)
2170 .Case("pitcairn", GK_GFX6)
2171 .Case("verde", GK_GFX6)
2172 .Case("oland", GK_GFX6)
2173 .Case("hainan", GK_GFX6)
2174 .Case("bonaire", GK_GFX7)
2175 .Case("kabini", GK_GFX7)
2176 .Case("kaveri", GK_GFX7)
2177 .Case("hawaii", GK_GFX7)
2178 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002179 .Case("gfx700", GK_GFX7)
2180 .Case("gfx701", GK_GFX7)
2181 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002182 .Case("tonga", GK_GFX8)
2183 .Case("iceland", GK_GFX8)
2184 .Case("carrizo", GK_GFX8)
2185 .Case("fiji", GK_GFX8)
2186 .Case("stoney", GK_GFX8)
2187 .Case("polaris10", GK_GFX8)
2188 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002189 .Case("gfx800", GK_GFX8)
2190 .Case("gfx801", GK_GFX8)
2191 .Case("gfx802", GK_GFX8)
2192 .Case("gfx803", GK_GFX8)
2193 .Case("gfx804", GK_GFX8)
2194 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002195 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002196 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002197
Matt Arsenault250024f2016-06-08 01:56:42 +00002198 bool setCPU(const std::string &Name) override {
2199 if (getTriple().getArch() == llvm::Triple::amdgcn)
2200 GPU = parseAMDGCNName(Name);
2201 else
2202 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002203
Matt Arsenault250024f2016-06-08 01:56:42 +00002204 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002205 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002206
Jan Vesely211ba782016-06-17 02:25:03 +00002207 void setSupportedOpenCLOpts() override {
2208 auto &Opts = getSupportedOpenCLOpts();
2209 Opts.cl_clang_storage_class_specifiers = 1;
2210 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002211
Jan Vesely211ba782016-06-17 02:25:03 +00002212 if (hasFP64)
2213 Opts.cl_khr_fp64 = 1;
2214 if (GPU >= GK_EVERGREEN) {
2215 Opts.cl_khr_byte_addressable_store = 1;
2216 Opts.cl_khr_global_int32_base_atomics = 1;
2217 Opts.cl_khr_global_int32_extended_atomics = 1;
2218 Opts.cl_khr_local_int32_base_atomics = 1;
2219 Opts.cl_khr_local_int32_extended_atomics = 1;
2220 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002221 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002222 Opts.cl_khr_fp16 = 1;
2223 Opts.cl_khr_int64_base_atomics = 1;
2224 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002225 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002226 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002227 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002228 Opts.cl_amd_media_ops = 1;
2229 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002230 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002231 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002232
Yaxun Liu99444cb2016-08-03 20:38:06 +00002233 LangAS::ID getOpenCLImageAddrSpace() const override {
2234 return LangAS::opencl_constant;
2235 }
2236
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002237 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2238 switch (CC) {
2239 default:
2240 return CCCR_Warning;
2241 case CC_C:
2242 case CC_OpenCLKernel:
2243 return CCCR_OK;
2244 }
2245 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002246};
2247
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002248const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002249#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002250 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002251#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2252 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002253#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002254};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002255const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002256 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2257 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2258 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2259 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2260 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2261 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2262 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2263 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2264 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2265 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2266 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2267 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2268 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2269 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2270 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2271 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2272 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2273 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2274 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2275 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2276 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2277 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2278 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2279 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2280 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2281 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2282 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2283 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2284 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2285 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2286 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2287 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2288 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2289 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2290 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2291 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2292 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2293 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2294 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2295 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2296 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2297 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2298 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2299 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2300 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2301 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2302 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002303 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002304 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2305 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002306};
2307
Craig Topperf054e3a2015-10-19 03:52:27 +00002308ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2309 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002310}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002311
Matt Arsenault250024f2016-06-08 01:56:42 +00002312bool AMDGPUTargetInfo::initFeatureMap(
2313 llvm::StringMap<bool> &Features,
2314 DiagnosticsEngine &Diags, StringRef CPU,
2315 const std::vector<std::string> &FeatureVec) const {
2316
2317 // XXX - What does the member GPU mean if device name string passed here?
2318 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2319 if (CPU.empty())
2320 CPU = "tahiti";
2321
2322 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002323 case GK_GFX6:
2324 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002325 break;
2326
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002327 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002328 Features["s-memrealtime"] = true;
2329 Features["16-bit-insts"] = true;
2330 break;
2331
2332 case GK_NONE:
2333 return false;
2334 default:
2335 llvm_unreachable("unhandled subtarget");
2336 }
2337 } else {
2338 if (CPU.empty())
2339 CPU = "r600";
2340
2341 switch (parseR600Name(CPU)) {
2342 case GK_R600:
2343 case GK_R700:
2344 case GK_EVERGREEN:
2345 case GK_NORTHERN_ISLANDS:
2346 break;
2347 case GK_R600_DOUBLE_OPS:
2348 case GK_R700_DOUBLE_OPS:
2349 case GK_EVERGREEN_DOUBLE_OPS:
2350 case GK_CAYMAN:
2351 Features["fp64"] = true;
2352 break;
2353 case GK_NONE:
2354 return false;
2355 default:
2356 llvm_unreachable("unhandled subtarget");
2357 }
2358 }
2359
2360 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2361}
2362
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002363const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002364#define BUILTIN(ID, TYPE, ATTRS) \
2365 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002366#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002367 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002368#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2369 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002370#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002371
2372#define BUILTIN(ID, TYPE, ATTRS) \
2373 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002374#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2375 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002376#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2377 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2378#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002379};
Eli Friedmanb5366062008-05-20 14:21:01 +00002380
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002381
Nuno Lopescfca1f02009-12-23 17:49:57 +00002382static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002383 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2384 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002385 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002386 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2387 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2388 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002389 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002390 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2391 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002392 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2393 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2394 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2395 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2396 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2397 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2398 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2399 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002400 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002401};
2402
Eric Christophercdd36352011-06-21 00:05:20 +00002403const TargetInfo::AddlRegName AddlRegNames[] = {
2404 { { "al", "ah", "eax", "rax" }, 0 },
2405 { { "bl", "bh", "ebx", "rbx" }, 3 },
2406 { { "cl", "ch", "ecx", "rcx" }, 2 },
2407 { { "dl", "dh", "edx", "rdx" }, 1 },
2408 { { "esi", "rsi" }, 4 },
2409 { { "edi", "rdi" }, 5 },
2410 { { "esp", "rsp" }, 7 },
2411 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002412 { { "r8d", "r8w", "r8b" }, 38 },
2413 { { "r9d", "r9w", "r9b" }, 39 },
2414 { { "r10d", "r10w", "r10b" }, 40 },
2415 { { "r11d", "r11w", "r11b" }, 41 },
2416 { { "r12d", "r12w", "r12b" }, 42 },
2417 { { "r13d", "r13w", "r13b" }, 43 },
2418 { { "r14d", "r14w", "r14b" }, 44 },
2419 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002420};
2421
2422// X86 target abstract base class; x86-32 and x86-64 are very close, so
2423// most of the implementation can be shared.
2424class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002425 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002426 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002427 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002428 enum MMX3DNowEnum {
2429 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002430 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002431 enum XOPEnum {
2432 NoXOP,
2433 SSE4A,
2434 FMA4,
2435 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002436 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002437
Craig Topper543f3bd2015-10-14 23:47:57 +00002438 bool HasAES = false;
2439 bool HasPCLMUL = false;
2440 bool HasLZCNT = false;
2441 bool HasRDRND = false;
2442 bool HasFSGSBASE = false;
2443 bool HasBMI = false;
2444 bool HasBMI2 = false;
2445 bool HasPOPCNT = false;
2446 bool HasRTM = false;
2447 bool HasPRFCHW = false;
2448 bool HasRDSEED = false;
2449 bool HasADX = false;
2450 bool HasTBM = false;
2451 bool HasFMA = false;
2452 bool HasF16C = false;
2453 bool HasAVX512CD = false;
2454 bool HasAVX512ER = false;
2455 bool HasAVX512PF = false;
2456 bool HasAVX512DQ = false;
2457 bool HasAVX512BW = false;
2458 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002459 bool HasAVX512VBMI = false;
2460 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002461 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002462 bool HasMPX = false;
2463 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002464 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002465 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002466 bool HasXSAVE = false;
2467 bool HasXSAVEOPT = false;
2468 bool HasXSAVEC = false;
2469 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002470 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002471 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002472 bool HasCLFLUSHOPT = false;
2473 bool HasPCOMMIT = false;
2474 bool HasCLWB = false;
2475 bool HasUMIP = false;
2476 bool HasMOVBE = false;
2477 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002478
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002479 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2480 ///
2481 /// Each enumeration represents a particular CPU supported by Clang. These
2482 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2483 enum CPUKind {
2484 CK_Generic,
2485
2486 /// \name i386
2487 /// i386-generation processors.
2488 //@{
2489 CK_i386,
2490 //@}
2491
2492 /// \name i486
2493 /// i486-generation processors.
2494 //@{
2495 CK_i486,
2496 CK_WinChipC6,
2497 CK_WinChip2,
2498 CK_C3,
2499 //@}
2500
2501 /// \name i586
2502 /// i586-generation processors, P5 microarchitecture based.
2503 //@{
2504 CK_i586,
2505 CK_Pentium,
2506 CK_PentiumMMX,
2507 //@}
2508
2509 /// \name i686
2510 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2511 //@{
2512 CK_i686,
2513 CK_PentiumPro,
2514 CK_Pentium2,
2515 CK_Pentium3,
2516 CK_Pentium3M,
2517 CK_PentiumM,
2518 CK_C3_2,
2519
2520 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2521 /// Clang however has some logic to suport this.
2522 // FIXME: Warn, deprecate, and potentially remove this.
2523 CK_Yonah,
2524 //@}
2525
2526 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002527 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002528 //@{
2529 CK_Pentium4,
2530 CK_Pentium4M,
2531 CK_Prescott,
2532 CK_Nocona,
2533 //@}
2534
2535 /// \name Core
2536 /// Core microarchitecture based processors.
2537 //@{
2538 CK_Core2,
2539
2540 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2541 /// codename which GCC no longer accepts as an option to -march, but Clang
2542 /// has some logic for recognizing it.
2543 // FIXME: Warn, deprecate, and potentially remove this.
2544 CK_Penryn,
2545 //@}
2546
2547 /// \name Atom
2548 /// Atom processors
2549 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002550 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002551 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002552 //@}
2553
2554 /// \name Nehalem
2555 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002556 CK_Nehalem,
2557
2558 /// \name Westmere
2559 /// Westmere microarchitecture based processors.
2560 CK_Westmere,
2561
2562 /// \name Sandy Bridge
2563 /// Sandy Bridge microarchitecture based processors.
2564 CK_SandyBridge,
2565
2566 /// \name Ivy Bridge
2567 /// Ivy Bridge microarchitecture based processors.
2568 CK_IvyBridge,
2569
2570 /// \name Haswell
2571 /// Haswell microarchitecture based processors.
2572 CK_Haswell,
2573
2574 /// \name Broadwell
2575 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002576 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002577
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002578 /// \name Skylake Client
2579 /// Skylake client microarchitecture based processors.
2580 CK_SkylakeClient,
2581
2582 /// \name Skylake Server
2583 /// Skylake server microarchitecture based processors.
2584 CK_SkylakeServer,
2585
2586 /// \name Cannonlake Client
2587 /// Cannonlake client microarchitecture based processors.
2588 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002589
Craig Topper449314e2013-08-20 07:09:39 +00002590 /// \name Knights Landing
2591 /// Knights Landing processor.
2592 CK_KNL,
2593
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002594 /// \name Lakemont
2595 /// Lakemont microarchitecture based processors.
2596 CK_Lakemont,
2597
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002598 /// \name K6
2599 /// K6 architecture processors.
2600 //@{
2601 CK_K6,
2602 CK_K6_2,
2603 CK_K6_3,
2604 //@}
2605
2606 /// \name K7
2607 /// K7 architecture processors.
2608 //@{
2609 CK_Athlon,
2610 CK_AthlonThunderbird,
2611 CK_Athlon4,
2612 CK_AthlonXP,
2613 CK_AthlonMP,
2614 //@}
2615
2616 /// \name K8
2617 /// K8 architecture processors.
2618 //@{
2619 CK_Athlon64,
2620 CK_Athlon64SSE3,
2621 CK_AthlonFX,
2622 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002623 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002624 CK_Opteron,
2625 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002626 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002627 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002628
Benjamin Kramer569f2152012-01-10 11:50:18 +00002629 /// \name Bobcat
2630 /// Bobcat architecture processors.
2631 //@{
2632 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002633 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002634 //@}
2635
2636 /// \name Bulldozer
2637 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002638 //@{
2639 CK_BDVER1,
2640 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002641 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002642 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002643 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002644
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002645 /// This specification is deprecated and will be removed in the future.
2646 /// Users should prefer \see CK_K8.
2647 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002648 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002649 CK_x86_64,
2650 //@}
2651
2652 /// \name Geode
2653 /// Geode processors.
2654 //@{
2655 CK_Geode
2656 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002657 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002658
Eric Christopherc50738f2015-08-27 00:05:50 +00002659 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002660 return llvm::StringSwitch<CPUKind>(CPU)
2661 .Case("i386", CK_i386)
2662 .Case("i486", CK_i486)
2663 .Case("winchip-c6", CK_WinChipC6)
2664 .Case("winchip2", CK_WinChip2)
2665 .Case("c3", CK_C3)
2666 .Case("i586", CK_i586)
2667 .Case("pentium", CK_Pentium)
2668 .Case("pentium-mmx", CK_PentiumMMX)
2669 .Case("i686", CK_i686)
2670 .Case("pentiumpro", CK_PentiumPro)
2671 .Case("pentium2", CK_Pentium2)
2672 .Case("pentium3", CK_Pentium3)
2673 .Case("pentium3m", CK_Pentium3M)
2674 .Case("pentium-m", CK_PentiumM)
2675 .Case("c3-2", CK_C3_2)
2676 .Case("yonah", CK_Yonah)
2677 .Case("pentium4", CK_Pentium4)
2678 .Case("pentium4m", CK_Pentium4M)
2679 .Case("prescott", CK_Prescott)
2680 .Case("nocona", CK_Nocona)
2681 .Case("core2", CK_Core2)
2682 .Case("penryn", CK_Penryn)
2683 .Case("bonnell", CK_Bonnell)
2684 .Case("atom", CK_Bonnell) // Legacy name.
2685 .Case("silvermont", CK_Silvermont)
2686 .Case("slm", CK_Silvermont) // Legacy name.
2687 .Case("nehalem", CK_Nehalem)
2688 .Case("corei7", CK_Nehalem) // Legacy name.
2689 .Case("westmere", CK_Westmere)
2690 .Case("sandybridge", CK_SandyBridge)
2691 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2692 .Case("ivybridge", CK_IvyBridge)
2693 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2694 .Case("haswell", CK_Haswell)
2695 .Case("core-avx2", CK_Haswell) // Legacy name.
2696 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002697 .Case("skylake", CK_SkylakeClient)
2698 .Case("skylake-avx512", CK_SkylakeServer)
2699 .Case("skx", CK_SkylakeServer) // Legacy name.
2700 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002701 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002702 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002703 .Case("k6", CK_K6)
2704 .Case("k6-2", CK_K6_2)
2705 .Case("k6-3", CK_K6_3)
2706 .Case("athlon", CK_Athlon)
2707 .Case("athlon-tbird", CK_AthlonThunderbird)
2708 .Case("athlon-4", CK_Athlon4)
2709 .Case("athlon-xp", CK_AthlonXP)
2710 .Case("athlon-mp", CK_AthlonMP)
2711 .Case("athlon64", CK_Athlon64)
2712 .Case("athlon64-sse3", CK_Athlon64SSE3)
2713 .Case("athlon-fx", CK_AthlonFX)
2714 .Case("k8", CK_K8)
2715 .Case("k8-sse3", CK_K8SSE3)
2716 .Case("opteron", CK_Opteron)
2717 .Case("opteron-sse3", CK_OpteronSSE3)
2718 .Case("barcelona", CK_AMDFAM10)
2719 .Case("amdfam10", CK_AMDFAM10)
2720 .Case("btver1", CK_BTVER1)
2721 .Case("btver2", CK_BTVER2)
2722 .Case("bdver1", CK_BDVER1)
2723 .Case("bdver2", CK_BDVER2)
2724 .Case("bdver3", CK_BDVER3)
2725 .Case("bdver4", CK_BDVER4)
2726 .Case("x86-64", CK_x86_64)
2727 .Case("geode", CK_Geode)
2728 .Default(CK_Generic);
2729 }
2730
Rafael Espindolaeb265472013-08-21 21:59:03 +00002731 enum FPMathKind {
2732 FP_Default,
2733 FP_SSE,
2734 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002735 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002736
Eli Friedman3fd920a2008-08-20 02:34:37 +00002737public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002738 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2739 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002740 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002741 }
Craig Topper3164f332014-03-11 03:39:26 +00002742 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002743 // X87 evaluates with 80 bits "long double" precision.
2744 return SSELevel == NoSSE ? 2 : 0;
2745 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002746 ArrayRef<const char *> getGCCRegNames() const override {
2747 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002748 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002749 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2750 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002751 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002752 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2753 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002754 }
Eric Christopherd9832702015-06-29 21:00:05 +00002755 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002756 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002757 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002758
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002759 bool validateGlobalRegisterVariable(StringRef RegName,
2760 unsigned RegSize,
2761 bool &HasSizeMismatch) const override {
2762 // esp and ebp are the only 32-bit registers the x86 backend can currently
2763 // handle.
2764 if (RegName.equals("esp") || RegName.equals("ebp")) {
2765 // Check that the register size is 32-bit.
2766 HasSizeMismatch = RegSize != 32;
2767 return true;
2768 }
2769
2770 return false;
2771 }
2772
Akira Hatanaka974131e2014-09-18 18:17:18 +00002773 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2774
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002775 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2776
Akira Hatanaka974131e2014-09-18 18:17:18 +00002777 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2778
Craig Topper3164f332014-03-11 03:39:26 +00002779 std::string convertConstraint(const char *&Constraint) const override;
2780 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002781 return "~{dirflag},~{fpsr},~{flags}";
2782 }
Craig Topper3164f332014-03-11 03:39:26 +00002783 void getTargetDefines(const LangOptions &Opts,
2784 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002785 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2786 bool Enabled);
2787 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2788 bool Enabled);
2789 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2790 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002791 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2792 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002793 setFeatureEnabledImpl(Features, Name, Enabled);
2794 }
2795 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002796 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002797 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2798 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002799 bool
2800 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2801 StringRef CPU,
2802 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002803 bool hasFeature(StringRef Feature) const override;
2804 bool handleTargetFeatures(std::vector<std::string> &Features,
2805 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002806 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002807 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2808 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002809 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002810 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002811 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002812 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002813 return "no-mmx";
2814 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002815 }
Craig Topper3164f332014-03-11 03:39:26 +00002816 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002817 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002818
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002819 // Perform any per-CPU checks necessary to determine if this CPU is
2820 // acceptable.
2821 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2822 // invalid without explaining *why*.
2823 switch (CPU) {
2824 case CK_Generic:
2825 // No processor selected!
2826 return false;
2827
2828 case CK_i386:
2829 case CK_i486:
2830 case CK_WinChipC6:
2831 case CK_WinChip2:
2832 case CK_C3:
2833 case CK_i586:
2834 case CK_Pentium:
2835 case CK_PentiumMMX:
2836 case CK_i686:
2837 case CK_PentiumPro:
2838 case CK_Pentium2:
2839 case CK_Pentium3:
2840 case CK_Pentium3M:
2841 case CK_PentiumM:
2842 case CK_Yonah:
2843 case CK_C3_2:
2844 case CK_Pentium4:
2845 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002846 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002847 case CK_Prescott:
2848 case CK_K6:
2849 case CK_K6_2:
2850 case CK_K6_3:
2851 case CK_Athlon:
2852 case CK_AthlonThunderbird:
2853 case CK_Athlon4:
2854 case CK_AthlonXP:
2855 case CK_AthlonMP:
2856 case CK_Geode:
2857 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002858 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002859 return false;
2860
2861 // Fallthrough
2862 case CK_Nocona:
2863 case CK_Core2:
2864 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002865 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002866 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002867 case CK_Nehalem:
2868 case CK_Westmere:
2869 case CK_SandyBridge:
2870 case CK_IvyBridge:
2871 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002872 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002873 case CK_SkylakeClient:
2874 case CK_SkylakeServer:
2875 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002876 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002877 case CK_Athlon64:
2878 case CK_Athlon64SSE3:
2879 case CK_AthlonFX:
2880 case CK_K8:
2881 case CK_K8SSE3:
2882 case CK_Opteron:
2883 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002884 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002885 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002886 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002887 case CK_BDVER1:
2888 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002889 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002890 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002891 case CK_x86_64:
2892 return true;
2893 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002894 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002895 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002896
Craig Topper3164f332014-03-11 03:39:26 +00002897 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002898
Craig Topper3164f332014-03-11 03:39:26 +00002899 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002900 // Most of the non-ARM calling conventions are i386 conventions.
2901 switch (CC) {
2902 case CC_X86ThisCall:
2903 case CC_X86FastCall:
2904 case CC_X86StdCall:
2905 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002906 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002907 case CC_C:
2908 case CC_Swift:
2909 case CC_X86Pascal:
2910 case CC_IntelOclBicc:
2911 return CCCR_OK;
2912 default:
2913 return CCCR_Warning;
2914 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002915 }
2916
Craig Topper3164f332014-03-11 03:39:26 +00002917 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002918 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002919 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002920
2921 bool hasSjLjLowering() const override {
2922 return true;
2923 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002924
2925 void setSupportedOpenCLOpts() override {
2926 getSupportedOpenCLOpts().setAll();
2927 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002928};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002929
Rafael Espindolaeb265472013-08-21 21:59:03 +00002930bool X86TargetInfo::setFPMath(StringRef Name) {
2931 if (Name == "387") {
2932 FPMath = FP_387;
2933 return true;
2934 }
2935 if (Name == "sse") {
2936 FPMath = FP_SSE;
2937 return true;
2938 }
2939 return false;
2940}
2941
Eric Christopher007b0a02015-08-28 22:32:01 +00002942bool X86TargetInfo::initFeatureMap(
2943 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002944 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002945 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002946 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002947 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002948 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002949
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002950 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002951
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002952 // Enable X87 for all X86 processors but Lakemont.
2953 if (Kind != CK_Lakemont)
2954 setFeatureEnabledImpl(Features, "x87", true);
2955
2956 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002957 case CK_Generic:
2958 case CK_i386:
2959 case CK_i486:
2960 case CK_i586:
2961 case CK_Pentium:
2962 case CK_i686:
2963 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002964 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002965 break;
2966 case CK_PentiumMMX:
2967 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002968 case CK_K6:
2969 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002970 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002971 break;
2972 case CK_Pentium3:
2973 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002974 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002975 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002976 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002977 break;
2978 case CK_PentiumM:
2979 case CK_Pentium4:
2980 case CK_Pentium4M:
2981 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002982 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002983 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002984 break;
2985 case CK_Yonah:
2986 case CK_Prescott:
2987 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002988 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002990 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002991 break;
2992 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002993 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002994 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002995 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002996 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002997 break;
2998 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002999 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003000 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003001 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003002 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003003 case CK_Cannonlake:
3004 setFeatureEnabledImpl(Features, "avx512ifma", true);
3005 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3006 setFeatureEnabledImpl(Features, "sha", true);
3007 setFeatureEnabledImpl(Features, "umip", true);
3008 // FALLTHROUGH
3009 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003010 setFeatureEnabledImpl(Features, "avx512f", true);
3011 setFeatureEnabledImpl(Features, "avx512cd", true);
3012 setFeatureEnabledImpl(Features, "avx512dq", true);
3013 setFeatureEnabledImpl(Features, "avx512bw", true);
3014 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003015 setFeatureEnabledImpl(Features, "pku", true);
3016 setFeatureEnabledImpl(Features, "pcommit", true);
3017 setFeatureEnabledImpl(Features, "clwb", true);
3018 // FALLTHROUGH
3019 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003020 setFeatureEnabledImpl(Features, "xsavec", true);
3021 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003022 setFeatureEnabledImpl(Features, "mpx", true);
3023 setFeatureEnabledImpl(Features, "sgx", true);
3024 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003025 // FALLTHROUGH
3026 case CK_Broadwell:
3027 setFeatureEnabledImpl(Features, "rdseed", true);
3028 setFeatureEnabledImpl(Features, "adx", true);
3029 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003030 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003031 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003032 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003033 setFeatureEnabledImpl(Features, "bmi", true);
3034 setFeatureEnabledImpl(Features, "bmi2", true);
3035 setFeatureEnabledImpl(Features, "rtm", true);
3036 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003037 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003038 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003039 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003040 setFeatureEnabledImpl(Features, "rdrnd", true);
3041 setFeatureEnabledImpl(Features, "f16c", true);
3042 setFeatureEnabledImpl(Features, "fsgsbase", true);
3043 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003044 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003045 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003046 setFeatureEnabledImpl(Features, "xsave", true);
3047 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003048 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003049 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003050 case CK_Silvermont:
3051 setFeatureEnabledImpl(Features, "aes", true);
3052 setFeatureEnabledImpl(Features, "pclmul", true);
3053 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003054 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003055 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003056 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003057 setFeatureEnabledImpl(Features, "cx16", true);
3058 break;
3059 case CK_KNL:
3060 setFeatureEnabledImpl(Features, "avx512f", true);
3061 setFeatureEnabledImpl(Features, "avx512cd", true);
3062 setFeatureEnabledImpl(Features, "avx512er", true);
3063 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003064 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003065 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003066 setFeatureEnabledImpl(Features, "rdseed", true);
3067 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003068 setFeatureEnabledImpl(Features, "lzcnt", true);
3069 setFeatureEnabledImpl(Features, "bmi", true);
3070 setFeatureEnabledImpl(Features, "bmi2", true);
3071 setFeatureEnabledImpl(Features, "rtm", true);
3072 setFeatureEnabledImpl(Features, "fma", true);
3073 setFeatureEnabledImpl(Features, "rdrnd", true);
3074 setFeatureEnabledImpl(Features, "f16c", true);
3075 setFeatureEnabledImpl(Features, "fsgsbase", true);
3076 setFeatureEnabledImpl(Features, "aes", true);
3077 setFeatureEnabledImpl(Features, "pclmul", true);
3078 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003079 setFeatureEnabledImpl(Features, "xsaveopt", true);
3080 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003081 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003082 break;
3083 case CK_K6_2:
3084 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003085 case CK_WinChip2:
3086 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003087 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003088 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003089 case CK_Athlon:
3090 case CK_AthlonThunderbird:
3091 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003092 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003093 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003094 case CK_Athlon4:
3095 case CK_AthlonXP:
3096 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003097 setFeatureEnabledImpl(Features, "sse", true);
3098 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003099 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003100 break;
3101 case CK_K8:
3102 case CK_Opteron:
3103 case CK_Athlon64:
3104 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003105 setFeatureEnabledImpl(Features, "sse2", true);
3106 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003107 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003108 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003109 case CK_AMDFAM10:
3110 setFeatureEnabledImpl(Features, "sse4a", true);
3111 setFeatureEnabledImpl(Features, "lzcnt", true);
3112 setFeatureEnabledImpl(Features, "popcnt", true);
3113 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003114 case CK_K8SSE3:
3115 case CK_OpteronSSE3:
3116 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003117 setFeatureEnabledImpl(Features, "sse3", true);
3118 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003119 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003120 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003121 case CK_BTVER2:
3122 setFeatureEnabledImpl(Features, "avx", true);
3123 setFeatureEnabledImpl(Features, "aes", true);
3124 setFeatureEnabledImpl(Features, "pclmul", true);
3125 setFeatureEnabledImpl(Features, "bmi", true);
3126 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003127 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003128 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003129 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003130 setFeatureEnabledImpl(Features, "ssse3", true);
3131 setFeatureEnabledImpl(Features, "sse4a", true);
3132 setFeatureEnabledImpl(Features, "lzcnt", true);
3133 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003134 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003135 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003136 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003137 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003138 case CK_BDVER4:
3139 setFeatureEnabledImpl(Features, "avx2", true);
3140 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003141 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003142 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003143 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003144 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003145 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003146 // FALLTHROUGH
3147 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003148 setFeatureEnabledImpl(Features, "bmi", true);
3149 setFeatureEnabledImpl(Features, "fma", true);
3150 setFeatureEnabledImpl(Features, "f16c", true);
3151 setFeatureEnabledImpl(Features, "tbm", true);
3152 // FALLTHROUGH
3153 case CK_BDVER1:
3154 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003155 setFeatureEnabledImpl(Features, "xop", true);
3156 setFeatureEnabledImpl(Features, "lzcnt", true);
3157 setFeatureEnabledImpl(Features, "aes", true);
3158 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003159 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003160 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003161 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003162 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003163 break;
Eli Friedman33465822011-07-08 23:31:17 +00003164 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003165 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3166 return false;
3167
3168 // Can't do this earlier because we need to be able to explicitly enable
3169 // or disable these features and the things that they depend upon.
3170
3171 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3172 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003173 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003174 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3175 FeaturesVec.end())
3176 Features["popcnt"] = true;
3177
3178 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3179 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003180 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003181 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3182 FeaturesVec.end())
3183 Features["prfchw"] = true;
3184
Eric Christophera7260af2015-10-08 20:10:18 +00003185 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3186 // then enable MMX.
3187 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003188 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003189 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3190 FeaturesVec.end())
3191 Features["mmx"] = true;
3192
Eric Christopherbbd746d2015-10-08 20:10:14 +00003193 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003194}
3195
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003197 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003198 if (Enabled) {
3199 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003200 case AVX512F:
3201 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003202 case AVX2:
3203 Features["avx2"] = true;
3204 case AVX:
3205 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003206 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003208 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003210 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003211 case SSSE3:
3212 Features["ssse3"] = true;
3213 case SSE3:
3214 Features["sse3"] = true;
3215 case SSE2:
3216 Features["sse2"] = true;
3217 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003218 Features["sse"] = true;
3219 case NoSSE:
3220 break;
3221 }
3222 return;
3223 }
3224
3225 switch (Level) {
3226 case NoSSE:
3227 case SSE1:
3228 Features["sse"] = false;
3229 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003230 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3231 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003232 case SSE3:
3233 Features["sse3"] = false;
3234 setXOPLevel(Features, NoXOP, false);
3235 case SSSE3:
3236 Features["ssse3"] = false;
3237 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003238 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003239 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003240 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003241 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003242 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3243 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003244 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 case AVX2:
3246 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003247 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003248 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003249 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003250 Features["avx512vl"] = Features["avx512vbmi"] =
3251 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003252 }
3253}
3254
3255void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003256 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003257 if (Enabled) {
3258 switch (Level) {
3259 case AMD3DNowAthlon:
3260 Features["3dnowa"] = true;
3261 case AMD3DNow:
3262 Features["3dnow"] = true;
3263 case MMX:
3264 Features["mmx"] = true;
3265 case NoMMX3DNow:
3266 break;
3267 }
3268 return;
3269 }
3270
3271 switch (Level) {
3272 case NoMMX3DNow:
3273 case MMX:
3274 Features["mmx"] = false;
3275 case AMD3DNow:
3276 Features["3dnow"] = false;
3277 case AMD3DNowAthlon:
3278 Features["3dnowa"] = false;
3279 }
3280}
3281
3282void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003283 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003284 if (Enabled) {
3285 switch (Level) {
3286 case XOP:
3287 Features["xop"] = true;
3288 case FMA4:
3289 Features["fma4"] = true;
3290 setSSELevel(Features, AVX, true);
3291 case SSE4A:
3292 Features["sse4a"] = true;
3293 setSSELevel(Features, SSE3, true);
3294 case NoXOP:
3295 break;
3296 }
3297 return;
3298 }
3299
3300 switch (Level) {
3301 case NoXOP:
3302 case SSE4A:
3303 Features["sse4a"] = false;
3304 case FMA4:
3305 Features["fma4"] = false;
3306 case XOP:
3307 Features["xop"] = false;
3308 }
3309}
3310
Craig Topper86d79ef2013-09-17 04:51:29 +00003311void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3312 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003313 // This is a bit of a hack to deal with the sse4 target feature when used
3314 // as part of the target attribute. We handle sse4 correctly everywhere
3315 // else. See below for more information on how we handle the sse4 options.
3316 if (Name != "sse4")
3317 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003318
Craig Topper29561122013-09-19 01:13:07 +00003319 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003320 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003321 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003322 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003323 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003324 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003325 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003326 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003327 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003328 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003329 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003330 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003331 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003332 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003333 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003334 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003335 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003336 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003337 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003338 if (Enabled)
3339 setSSELevel(Features, SSE2, Enabled);
3340 } else if (Name == "pclmul") {
3341 if (Enabled)
3342 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003343 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003344 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003345 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003346 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003347 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003348 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003349 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3350 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3351 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003352 if (Enabled)
3353 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003354 // Enable BWI instruction if VBMI is being enabled.
3355 if (Name == "avx512vbmi" && Enabled)
3356 Features["avx512bw"] = true;
3357 // Also disable VBMI if BWI is being disabled.
3358 if (Name == "avx512bw" && !Enabled)
3359 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003360 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003361 if (Enabled)
3362 setSSELevel(Features, AVX, Enabled);
3363 } else if (Name == "fma4") {
3364 setXOPLevel(Features, FMA4, Enabled);
3365 } else if (Name == "xop") {
3366 setXOPLevel(Features, XOP, Enabled);
3367 } else if (Name == "sse4a") {
3368 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003369 } else if (Name == "f16c") {
3370 if (Enabled)
3371 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003372 } else if (Name == "sha") {
3373 if (Enabled)
3374 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003375 } else if (Name == "sse4") {
3376 // We can get here via the __target__ attribute since that's not controlled
3377 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3378 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3379 // disabled.
3380 if (Enabled)
3381 setSSELevel(Features, SSE42, Enabled);
3382 else
3383 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003384 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003385 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003386 Features["xsaveopt"] = false;
3387 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003388 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003389 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003390 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003391}
3392
Eric Christopher3ff21b32013-10-16 21:26:26 +00003393/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003394/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003395bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003396 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003397 for (const auto &Feature : Features) {
3398 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003399 continue;
3400
Eric Christopher610fe112015-08-26 08:21:55 +00003401 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003402 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003403 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003404 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003405 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003406 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003407 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003408 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003409 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003410 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003411 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003412 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003413 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003414 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003415 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003416 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003417 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003418 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003419 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003420 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003421 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003422 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003423 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003424 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003425 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003426 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003427 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003428 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003429 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003430 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003431 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003432 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003433 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003434 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003435 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003436 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003437 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003438 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003439 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003440 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003441 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003442 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003443 } else if (Feature == "+avx512vbmi") {
3444 HasAVX512VBMI = true;
3445 } else if (Feature == "+avx512ifma") {
3446 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003447 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003448 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003449 } else if (Feature == "+mpx") {
3450 HasMPX = true;
3451 } else if (Feature == "+movbe") {
3452 HasMOVBE = true;
3453 } else if (Feature == "+sgx") {
3454 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003455 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003456 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003457 } else if (Feature == "+fxsr") {
3458 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003459 } else if (Feature == "+xsave") {
3460 HasXSAVE = true;
3461 } else if (Feature == "+xsaveopt") {
3462 HasXSAVEOPT = true;
3463 } else if (Feature == "+xsavec") {
3464 HasXSAVEC = true;
3465 } else if (Feature == "+xsaves") {
3466 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003467 } else if (Feature == "+mwaitx") {
3468 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003469 } else if (Feature == "+pku") {
3470 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003471 } else if (Feature == "+clflushopt") {
3472 HasCLFLUSHOPT = true;
3473 } else if (Feature == "+pcommit") {
3474 HasPCOMMIT = true;
3475 } else if (Feature == "+clwb") {
3476 HasCLWB = true;
3477 } else if (Feature == "+umip") {
3478 HasUMIP = true;
3479 } else if (Feature == "+prefetchwt1") {
3480 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003481 }
3482
Benjamin Kramer27402c62012-03-05 15:10:44 +00003483 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003484 .Case("+avx512f", AVX512F)
3485 .Case("+avx2", AVX2)
3486 .Case("+avx", AVX)
3487 .Case("+sse4.2", SSE42)
3488 .Case("+sse4.1", SSE41)
3489 .Case("+ssse3", SSSE3)
3490 .Case("+sse3", SSE3)
3491 .Case("+sse2", SSE2)
3492 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003493 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003494 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003495
Eli Friedman33465822011-07-08 23:31:17 +00003496 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003497 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003498 .Case("+3dnowa", AMD3DNowAthlon)
3499 .Case("+3dnow", AMD3DNow)
3500 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003501 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003502 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003503
3504 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003505 .Case("+xop", XOP)
3506 .Case("+fma4", FMA4)
3507 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003508 .Default(NoXOP);
3509 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003510 }
Eli Friedman33465822011-07-08 23:31:17 +00003511
Rafael Espindolaeb265472013-08-21 21:59:03 +00003512 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3513 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003514 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3515 (FPMath == FP_387 && SSELevel >= SSE1)) {
3516 Diags.Report(diag::err_target_unsupported_fpmath) <<
3517 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003518 return false;
3519 }
3520
Alexey Bataev00396512015-07-02 03:40:19 +00003521 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003522 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003523 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003524}
Chris Lattnerecd49032009-03-02 22:27:17 +00003525
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003526/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3527/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003528void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003529 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003530 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003531 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003532 Builder.defineMacro("__amd64__");
3533 Builder.defineMacro("__amd64");
3534 Builder.defineMacro("__x86_64");
3535 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003536 if (getTriple().getArchName() == "x86_64h") {
3537 Builder.defineMacro("__x86_64h");
3538 Builder.defineMacro("__x86_64h__");
3539 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003540 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003541 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003542 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003543
Chris Lattnerecd49032009-03-02 22:27:17 +00003544 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003545 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3546 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003547 switch (CPU) {
3548 case CK_Generic:
3549 break;
3550 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003551 // The rest are coming from the i386 define above.
3552 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003553 break;
3554 case CK_i486:
3555 case CK_WinChipC6:
3556 case CK_WinChip2:
3557 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003558 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003559 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003560 case CK_PentiumMMX:
3561 Builder.defineMacro("__pentium_mmx__");
3562 Builder.defineMacro("__tune_pentium_mmx__");
3563 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003564 case CK_i586:
3565 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003566 defineCPUMacros(Builder, "i586");
3567 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003568 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003569 case CK_Pentium3:
3570 case CK_Pentium3M:
3571 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003572 Builder.defineMacro("__tune_pentium3__");
3573 // Fallthrough
3574 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003575 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003576 Builder.defineMacro("__tune_pentium2__");
3577 // Fallthrough
3578 case CK_PentiumPro:
3579 Builder.defineMacro("__tune_i686__");
3580 Builder.defineMacro("__tune_pentiumpro__");
3581 // Fallthrough
3582 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003583 Builder.defineMacro("__i686");
3584 Builder.defineMacro("__i686__");
3585 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3586 Builder.defineMacro("__pentiumpro");
3587 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003588 break;
3589 case CK_Pentium4:
3590 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003591 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003592 break;
3593 case CK_Yonah:
3594 case CK_Prescott:
3595 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003596 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003597 break;
3598 case CK_Core2:
3599 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003600 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003601 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003602 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003603 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003604 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003605 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003606 defineCPUMacros(Builder, "slm");
3607 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003608 case CK_Nehalem:
3609 case CK_Westmere:
3610 case CK_SandyBridge:
3611 case CK_IvyBridge:
3612 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003613 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003614 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003615 // FIXME: Historically, we defined this legacy name, it would be nice to
3616 // remove it at some point. We've never exposed fine-grained names for
3617 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003618 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003619 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003620 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003621 defineCPUMacros(Builder, "skx");
3622 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003623 case CK_Cannonlake:
3624 break;
Craig Topper449314e2013-08-20 07:09:39 +00003625 case CK_KNL:
3626 defineCPUMacros(Builder, "knl");
3627 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003628 case CK_Lakemont:
3629 Builder.defineMacro("__tune_lakemont__");
3630 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003631 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003632 Builder.defineMacro("__k6_2__");
3633 Builder.defineMacro("__tune_k6_2__");
3634 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003635 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003636 if (CPU != CK_K6_2) { // In case of fallthrough
3637 // FIXME: GCC may be enabling these in cases where some other k6
3638 // architecture is specified but -m3dnow is explicitly provided. The
3639 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003640 Builder.defineMacro("__k6_3__");
3641 Builder.defineMacro("__tune_k6_3__");
3642 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003643 // Fallthrough
3644 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003645 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003646 break;
3647 case CK_Athlon:
3648 case CK_AthlonThunderbird:
3649 case CK_Athlon4:
3650 case CK_AthlonXP:
3651 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003652 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003653 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003654 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003655 Builder.defineMacro("__tune_athlon_sse__");
3656 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003657 break;
3658 case CK_K8:
3659 case CK_K8SSE3:
3660 case CK_x86_64:
3661 case CK_Opteron:
3662 case CK_OpteronSSE3:
3663 case CK_Athlon64:
3664 case CK_Athlon64SSE3:
3665 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003666 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003667 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003668 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003669 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003670 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003671 case CK_BTVER1:
3672 defineCPUMacros(Builder, "btver1");
3673 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003674 case CK_BTVER2:
3675 defineCPUMacros(Builder, "btver2");
3676 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003677 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003678 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003679 break;
3680 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003681 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003682 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003683 case CK_BDVER3:
3684 defineCPUMacros(Builder, "bdver3");
3685 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003686 case CK_BDVER4:
3687 defineCPUMacros(Builder, "bdver4");
3688 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003689 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003690 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003691 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003692 }
Chris Lattner96e43572009-03-02 22:40:39 +00003693
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003694 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003695 Builder.defineMacro("__REGISTER_PREFIX__", "");
3696
Chris Lattner6df41af2009-04-19 17:32:33 +00003697 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3698 // functions in glibc header files that use FP Stack inline asm which the
3699 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003700 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003701
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003702 if (HasAES)
3703 Builder.defineMacro("__AES__");
3704
Craig Topper3f122a72012-05-31 05:18:48 +00003705 if (HasPCLMUL)
3706 Builder.defineMacro("__PCLMUL__");
3707
Craig Topper22967d42011-12-25 05:06:45 +00003708 if (HasLZCNT)
3709 Builder.defineMacro("__LZCNT__");
3710
Benjamin Kramer1e250392012-07-07 09:39:18 +00003711 if (HasRDRND)
3712 Builder.defineMacro("__RDRND__");
3713
Craig Topper8c7f2512014-11-03 06:51:41 +00003714 if (HasFSGSBASE)
3715 Builder.defineMacro("__FSGSBASE__");
3716
Craig Topper22967d42011-12-25 05:06:45 +00003717 if (HasBMI)
3718 Builder.defineMacro("__BMI__");
3719
3720 if (HasBMI2)
3721 Builder.defineMacro("__BMI2__");
3722
Craig Topper1de83482011-12-29 16:10:46 +00003723 if (HasPOPCNT)
3724 Builder.defineMacro("__POPCNT__");
3725
Michael Liao625a8752012-11-10 05:17:46 +00003726 if (HasRTM)
3727 Builder.defineMacro("__RTM__");
3728
Michael Liao74f4eaf2013-03-26 17:52:08 +00003729 if (HasPRFCHW)
3730 Builder.defineMacro("__PRFCHW__");
3731
Michael Liaoffaae352013-03-29 05:17:55 +00003732 if (HasRDSEED)
3733 Builder.defineMacro("__RDSEED__");
3734
Robert Khasanov50e6f582014-09-19 09:53:48 +00003735 if (HasADX)
3736 Builder.defineMacro("__ADX__");
3737
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003738 if (HasTBM)
3739 Builder.defineMacro("__TBM__");
3740
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003741 if (HasMWAITX)
3742 Builder.defineMacro("__MWAITX__");
3743
Rafael Espindolae62e2792013-08-20 13:44:29 +00003744 switch (XOPLevel) {
3745 case XOP:
3746 Builder.defineMacro("__XOP__");
3747 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003748 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003749 case SSE4A:
3750 Builder.defineMacro("__SSE4A__");
3751 case NoXOP:
3752 break;
3753 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003754
Craig Topperbba778b2012-06-03 21:46:30 +00003755 if (HasFMA)
3756 Builder.defineMacro("__FMA__");
3757
Manman Rena45358c2012-10-11 00:59:55 +00003758 if (HasF16C)
3759 Builder.defineMacro("__F16C__");
3760
Craig Topper679b53a2013-08-21 05:29:10 +00003761 if (HasAVX512CD)
3762 Builder.defineMacro("__AVX512CD__");
3763 if (HasAVX512ER)
3764 Builder.defineMacro("__AVX512ER__");
3765 if (HasAVX512PF)
3766 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003767 if (HasAVX512DQ)
3768 Builder.defineMacro("__AVX512DQ__");
3769 if (HasAVX512BW)
3770 Builder.defineMacro("__AVX512BW__");
3771 if (HasAVX512VL)
3772 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003773 if (HasAVX512VBMI)
3774 Builder.defineMacro("__AVX512VBMI__");
3775 if (HasAVX512IFMA)
3776 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003777
Ben Langmuir58078d02013-09-19 13:22:04 +00003778 if (HasSHA)
3779 Builder.defineMacro("__SHA__");
3780
Craig Toppere33f51f2015-10-16 06:22:36 +00003781 if (HasFXSR)
3782 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003783 if (HasXSAVE)
3784 Builder.defineMacro("__XSAVE__");
3785 if (HasXSAVEOPT)
3786 Builder.defineMacro("__XSAVEOPT__");
3787 if (HasXSAVEC)
3788 Builder.defineMacro("__XSAVEC__");
3789 if (HasXSAVES)
3790 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003791 if (HasPKU)
3792 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003793 if (HasCX16)
3794 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3795
Chris Lattner96e43572009-03-02 22:40:39 +00003796 // Each case falls through to the previous one here.
3797 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003798 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003799 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003800 case AVX2:
3801 Builder.defineMacro("__AVX2__");
3802 case AVX:
3803 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003804 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003805 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003806 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003807 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003808 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003809 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003810 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003811 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003812 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003813 Builder.defineMacro("__SSE2__");
3814 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003815 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003816 Builder.defineMacro("__SSE__");
3817 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003818 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003819 break;
3820 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003821
Derek Schuffc7dd7222012-10-11 15:52:22 +00003822 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003823 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003824 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003825 case AVX2:
3826 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003827 case SSE42:
3828 case SSE41:
3829 case SSSE3:
3830 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003831 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003832 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003833 break;
3834 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003835 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003836 break;
3837 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003838 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003839 }
3840 }
3841
Anders Carlssone437c682010-01-27 03:47:49 +00003842 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003843 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003844 case AMD3DNowAthlon:
3845 Builder.defineMacro("__3dNOW_A__");
3846 case AMD3DNow:
3847 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003848 case MMX:
3849 Builder.defineMacro("__MMX__");
3850 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003851 break;
3852 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003853
3854 if (CPU >= CK_i486) {
3855 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3856 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3857 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3858 }
3859 if (CPU >= CK_i586)
3860 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003861}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003862
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003863bool X86TargetInfo::hasFeature(StringRef Feature) const {
3864 return llvm::StringSwitch<bool>(Feature)
3865 .Case("aes", HasAES)
3866 .Case("avx", SSELevel >= AVX)
3867 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003868 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003869 .Case("avx512cd", HasAVX512CD)
3870 .Case("avx512er", HasAVX512ER)
3871 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003872 .Case("avx512dq", HasAVX512DQ)
3873 .Case("avx512bw", HasAVX512BW)
3874 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003875 .Case("avx512vbmi", HasAVX512VBMI)
3876 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003877 .Case("bmi", HasBMI)
3878 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003879 .Case("clflushopt", HasCLFLUSHOPT)
3880 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003881 .Case("cx16", HasCX16)
3882 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003883 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003884 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003885 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003886 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003887 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003888 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3889 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3890 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003891 .Case("movbe", HasMOVBE)
3892 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003893 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003894 .Case("pcommit", HasPCOMMIT)
3895 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003896 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003897 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003898 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003899 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003900 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003901 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003902 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003903 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003904 .Case("sse", SSELevel >= SSE1)
3905 .Case("sse2", SSELevel >= SSE2)
3906 .Case("sse3", SSELevel >= SSE3)
3907 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003908 .Case("sse4.1", SSELevel >= SSE41)
3909 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003910 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003911 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003912 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003913 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003914 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3915 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003916 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003917 .Case("xsave", HasXSAVE)
3918 .Case("xsavec", HasXSAVEC)
3919 .Case("xsaves", HasXSAVES)
3920 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003921 .Default(false);
3922}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003923
Eric Christopherd9832702015-06-29 21:00:05 +00003924// We can't use a generic validation scheme for the features accepted here
3925// versus subtarget features accepted in the target attribute because the
3926// bitfield structure that's initialized in the runtime only supports the
3927// below currently rather than the full range of subtarget features. (See
3928// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3929bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3930 return llvm::StringSwitch<bool>(FeatureStr)
3931 .Case("cmov", true)
3932 .Case("mmx", true)
3933 .Case("popcnt", true)
3934 .Case("sse", true)
3935 .Case("sse2", true)
3936 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003937 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003938 .Case("sse4.1", true)
3939 .Case("sse4.2", true)
3940 .Case("avx", true)
3941 .Case("avx2", true)
3942 .Case("sse4a", true)
3943 .Case("fma4", true)
3944 .Case("xop", true)
3945 .Case("fma", true)
3946 .Case("avx512f", true)
3947 .Case("bmi", true)
3948 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003949 .Case("aes", true)
3950 .Case("pclmul", true)
3951 .Case("avx512vl", true)
3952 .Case("avx512bw", true)
3953 .Case("avx512dq", true)
3954 .Case("avx512cd", true)
3955 .Case("avx512er", true)
3956 .Case("avx512pf", true)
3957 .Case("avx512vbmi", true)
3958 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003959 .Default(false);
3960}
3961
Eli Friedman3fd920a2008-08-20 02:34:37 +00003962bool
Anders Carlsson58436352009-02-28 17:11:49 +00003963X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003964 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003965 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003966 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003967 // Constant constraints.
3968 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3969 // instructions.
3970 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3971 // x86_64 instructions.
3972 case 's':
3973 Info.setRequiresImmediate();
3974 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003975 case 'I':
3976 Info.setRequiresImmediate(0, 31);
3977 return true;
3978 case 'J':
3979 Info.setRequiresImmediate(0, 63);
3980 return true;
3981 case 'K':
3982 Info.setRequiresImmediate(-128, 127);
3983 return true;
3984 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003985 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003986 return true;
3987 case 'M':
3988 Info.setRequiresImmediate(0, 3);
3989 return true;
3990 case 'N':
3991 Info.setRequiresImmediate(0, 255);
3992 return true;
3993 case 'O':
3994 Info.setRequiresImmediate(0, 127);
3995 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003996 // Register constraints.
3997 case 'Y': // 'Y' is the first character for several 2-character constraints.
3998 // Shift the pointer to the second character of the constraint.
3999 Name++;
4000 switch (*Name) {
4001 default:
4002 return false;
4003 case '0': // First SSE register.
4004 case 't': // Any SSE register, when SSE2 is enabled.
4005 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4006 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004007 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004008 Info.setAllowsRegister();
4009 return true;
4010 }
4011 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004012 // Constraint 'f' cannot be used for output operands.
4013 if (Info.ConstraintStr[0] == '=')
4014 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004015 Info.setAllowsRegister();
4016 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004017 case 'a': // eax.
4018 case 'b': // ebx.
4019 case 'c': // ecx.
4020 case 'd': // edx.
4021 case 'S': // esi.
4022 case 'D': // edi.
4023 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004024 case 't': // Top of floating point stack.
4025 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004026 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004027 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004028 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004029 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004030 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4031 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004032 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004033 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4034 case 'l': // "Index" registers: any general register that can be used as an
4035 // index in a base+index memory access.
4036 Info.setAllowsRegister();
4037 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004038 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004039 case 'C': // SSE floating point constant.
4040 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004041 return true;
4042 }
4043}
4044
Akira Hatanaka974131e2014-09-18 18:17:18 +00004045bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4046 unsigned Size) const {
4047 // Strip off constraint modifiers.
4048 while (Constraint[0] == '=' ||
4049 Constraint[0] == '+' ||
4050 Constraint[0] == '&')
4051 Constraint = Constraint.substr(1);
4052
4053 return validateOperandSize(Constraint, Size);
4054}
4055
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004056bool X86TargetInfo::validateInputSize(StringRef Constraint,
4057 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004058 return validateOperandSize(Constraint, Size);
4059}
4060
4061bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4062 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004063 switch (Constraint[0]) {
4064 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004065 case 'k':
4066 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004067 case 'y':
4068 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004069 case 'f':
4070 case 't':
4071 case 'u':
4072 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004073 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004074 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004075 if (SSELevel >= AVX512F)
4076 // 512-bit zmm registers can be used if target supports AVX512F.
4077 return Size <= 512U;
4078 else if (SSELevel >= AVX)
4079 // 256-bit ymm registers can be used if target supports AVX.
4080 return Size <= 256U;
4081 return Size <= 128U;
4082 case 'Y':
4083 // 'Y' is the first character for several 2-character constraints.
4084 switch (Constraint[1]) {
4085 default: break;
4086 case 'm':
4087 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004088 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004089 return Size <= 64;
4090 case 'i':
4091 case 't':
4092 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4093 if (SSELevel >= AVX512F)
4094 return Size <= 512U;
4095 else if (SSELevel >= AVX)
4096 return Size <= 256U;
4097 return SSELevel >= SSE2 && Size <= 128U;
4098 }
4099
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004100 }
4101
4102 return true;
4103}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004104
Eli Friedman3fd920a2008-08-20 02:34:37 +00004105std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004106X86TargetInfo::convertConstraint(const char *&Constraint) const {
4107 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004108 case 'a': return std::string("{ax}");
4109 case 'b': return std::string("{bx}");
4110 case 'c': return std::string("{cx}");
4111 case 'd': return std::string("{dx}");
4112 case 'S': return std::string("{si}");
4113 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004114 case 'p': // address
4115 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004116 case 't': // top of floating point stack.
4117 return std::string("{st}");
4118 case 'u': // second from top of floating point stack.
4119 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004120 case 'Y':
4121 switch (Constraint[1]) {
4122 default:
4123 // Break from inner switch and fall through (copy single char),
4124 // continue parsing after copying the current constraint into
4125 // the return string.
4126 break;
4127 case 'k':
4128 // "^" hints llvm that this is a 2 letter constraint.
4129 // "Constraint++" is used to promote the string iterator
4130 // to the next constraint.
4131 return std::string("^") + std::string(Constraint++, 2);
4132 }
4133 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004134 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004135 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136 }
4137}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004138
Eli Friedman3fd920a2008-08-20 02:34:37 +00004139// X86-32 generic target
4140class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004141public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004142 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4143 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004144 DoubleAlign = LongLongAlign = 32;
4145 LongDoubleWidth = 96;
4146 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004147 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004148 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004149 SizeType = UnsignedInt;
4150 PtrDiffType = SignedInt;
4151 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004152 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004153
4154 // Use fpret for all types.
4155 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4156 (1 << TargetInfo::Double) |
4157 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004158
4159 // x86-32 has atomics up to 8 bytes
4160 // FIXME: Check that we actually have cmpxchg8b before setting
4161 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4162 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004163 }
Craig Topper3164f332014-03-11 03:39:26 +00004164 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004165 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004166 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004167
Craig Topper3164f332014-03-11 03:39:26 +00004168 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004169 if (RegNo == 0) return 0;
4170 if (RegNo == 1) return 2;
4171 return -1;
4172 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004173 bool validateOperandSize(StringRef Constraint,
4174 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004175 switch (Constraint[0]) {
4176 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004177 case 'R':
4178 case 'q':
4179 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004180 case 'a':
4181 case 'b':
4182 case 'c':
4183 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004184 case 'S':
4185 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004186 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004187 case 'A':
4188 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004189 }
4190
Akira Hatanaka974131e2014-09-18 18:17:18 +00004191 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004192 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004193 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4194 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4195 Builtin::FirstTSBuiltin + 1);
4196 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004197};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004198
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004199class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4200public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004201 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4202 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004203
Craig Topper3164f332014-03-11 03:39:26 +00004204 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004205 unsigned Major, Minor, Micro;
4206 getTriple().getOSVersion(Major, Minor, Micro);
4207 // New NetBSD uses the default rounding mode.
4208 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4209 return X86_32TargetInfo::getFloatEvalMethod();
4210 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004211 return 1;
4212 }
4213};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004214
Eli Friedmane3aa4542009-07-05 18:47:56 +00004215class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4216public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004217 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4218 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004219 SizeType = UnsignedLong;
4220 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004221 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004222 }
4223};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004224
Eli Friedman9fa28852012-08-08 23:57:20 +00004225class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4226public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004227 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4228 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004229 SizeType = UnsignedLong;
4230 IntPtrType = SignedLong;
4231 PtrDiffType = SignedLong;
4232 }
4233};
Eli Friedman9fa28852012-08-08 23:57:20 +00004234
Torok Edwinb2b37c62009-06-30 17:10:35 +00004235class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004236public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004237 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4238 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004239 LongDoubleWidth = 128;
4240 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004241 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004242 MaxVectorAlign = 256;
4243 // The watchOS simulator uses the builtin bool type for Objective-C.
4244 llvm::Triple T = llvm::Triple(Triple);
4245 if (T.isWatchOS())
4246 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004247 SizeType = UnsignedLong;
4248 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004249 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004250 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004251 }
4252
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004253 bool handleTargetFeatures(std::vector<std::string> &Features,
4254 DiagnosticsEngine &Diags) override {
4255 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4256 Diags))
4257 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004258 // We now know the features we have: we can decide how to align vectors.
4259 MaxVectorAlign =
4260 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004261 return true;
4262 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004263};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004264
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004265// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004266class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004267public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004268 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4269 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004270 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004271 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004272 bool IsWinCOFF =
4273 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004274 resetDataLayout(IsWinCOFF
4275 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4276 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004277 }
Craig Topper3164f332014-03-11 03:39:26 +00004278 void getTargetDefines(const LangOptions &Opts,
4279 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004280 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4281 }
4282};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004283
4284// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004285class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004286public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004287 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4288 const TargetOptions &Opts)
4289 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004290 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004291 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4292 }
Craig Topper3164f332014-03-11 03:39:26 +00004293 void getTargetDefines(const LangOptions &Opts,
4294 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004295 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4296 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4297 // The value of the following reflects processor type.
4298 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4299 // We lost the original triple, so we use the default.
4300 Builder.defineMacro("_M_IX86", "600");
4301 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004302};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004303
David Majnemerae1ed0e2015-05-28 04:36:18 +00004304static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004305 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4306 // supports __declspec natively under -fms-extensions, but we define a no-op
4307 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004308 if (Opts.MicrosoftExt)
4309 Builder.defineMacro("__declspec", "__declspec");
4310 else
4311 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4312
4313 if (!Opts.MicrosoftExt) {
4314 // Provide macros for all the calling convention keywords. Provide both
4315 // single and double underscore prefixed variants. These are available on
4316 // x64 as well as x86, even though they have no effect.
4317 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4318 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004319 std::string GCCSpelling = "__attribute__((__";
4320 GCCSpelling += CC;
4321 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004322 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4323 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4324 }
4325 }
4326}
4327
David Majnemerae1ed0e2015-05-28 04:36:18 +00004328static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4329 Builder.defineMacro("__MSVCRT__");
4330 Builder.defineMacro("__MINGW32__");
4331 addCygMingDefines(Opts, Builder);
4332}
4333
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004334// x86-32 MinGW target
4335class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4336public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004337 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4338 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004339 void getTargetDefines(const LangOptions &Opts,
4340 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004341 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004342 DefineStd(Builder, "WIN32", Opts);
4343 DefineStd(Builder, "WINNT", Opts);
4344 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004345 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004346 }
4347};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004348
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004349// x86-32 Cygwin target
4350class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4351public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004352 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4353 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004354 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004355 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004356 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 +00004357 }
Craig Topper3164f332014-03-11 03:39:26 +00004358 void getTargetDefines(const LangOptions &Opts,
4359 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004360 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004361 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004362 Builder.defineMacro("__CYGWIN__");
4363 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004364 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004365 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004366 if (Opts.CPlusPlus)
4367 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004368 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004369};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004370
Chris Lattnerb986aba2010-04-11 19:29:39 +00004371// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004372class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004373public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004374 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004375 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004376 }
Craig Topper3164f332014-03-11 03:39:26 +00004377 void getTargetDefines(const LangOptions &Opts,
4378 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004379 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004380 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004381 }
4382};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004383
Alexey Bataevc99b0492015-11-25 09:24:26 +00004384// X86-32 MCU target
4385class MCUX86_32TargetInfo : public X86_32TargetInfo {
4386public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004387 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4388 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004389 LongDoubleWidth = 64;
4390 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004391 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 +00004392 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004393 }
4394
4395 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4396 // On MCU we support only C calling convention.
4397 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4398 }
4399
4400 void getTargetDefines(const LangOptions &Opts,
4401 MacroBuilder &Builder) const override {
4402 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4403 Builder.defineMacro("__iamcu");
4404 Builder.defineMacro("__iamcu__");
4405 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004406
4407 bool allowsLargerPreferedTypeAlignment() const override {
4408 return false;
4409 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004410};
4411
Douglas Gregor9fabd852011-07-01 22:41:14 +00004412// RTEMS Target
4413template<typename Target>
4414class RTEMSTargetInfo : public OSTargetInfo<Target> {
4415protected:
Craig Topper3164f332014-03-11 03:39:26 +00004416 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4417 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004418 // RTEMS defines; list based off of gcc output
4419
Douglas Gregor9fabd852011-07-01 22:41:14 +00004420 Builder.defineMacro("__rtems__");
4421 Builder.defineMacro("__ELF__");
4422 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004423
Douglas Gregor9fabd852011-07-01 22:41:14 +00004424public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004425 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4426 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004427 switch (Triple.getArch()) {
4428 default:
4429 case llvm::Triple::x86:
4430 // this->MCountName = ".mcount";
4431 break;
4432 case llvm::Triple::mips:
4433 case llvm::Triple::mipsel:
4434 case llvm::Triple::ppc:
4435 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004436 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004437 // this->MCountName = "_mcount";
4438 break;
4439 case llvm::Triple::arm:
4440 // this->MCountName = "__mcount";
4441 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004442 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004443 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004444};
4445
Douglas Gregor9fabd852011-07-01 22:41:14 +00004446// x86-32 RTEMS target
4447class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4448public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004449 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4450 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004451 SizeType = UnsignedLong;
4452 IntPtrType = SignedLong;
4453 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004454 }
Craig Topper3164f332014-03-11 03:39:26 +00004455 void getTargetDefines(const LangOptions &Opts,
4456 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004457 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4458 Builder.defineMacro("__INTEL__");
4459 Builder.defineMacro("__rtems__");
4460 }
4461};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004462
Eli Friedman3fd920a2008-08-20 02:34:37 +00004463// x86-64 generic target
4464class X86_64TargetInfo : public X86TargetInfo {
4465public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004466 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4467 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004468 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004469 bool IsWinCOFF =
4470 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004471 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004472 LongDoubleWidth = 128;
4473 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004474 LargeArrayMinWidth = 128;
4475 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004476 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004477 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4478 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4479 IntPtrType = IsX32 ? SignedInt : SignedLong;
4480 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004481 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004482 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004483
Eric Christopher917e9522014-11-18 22:36:15 +00004484 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004485 resetDataLayout(IsX32
4486 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4487 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4488 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004489
4490 // Use fpret only for long double.
4491 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004492
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004493 // Use fp2ret for _Complex long double.
4494 ComplexLongDoubleUsesFP2Ret = true;
4495
Charles Davisc7d5c942015-09-17 20:55:33 +00004496 // Make __builtin_ms_va_list available.
4497 HasBuiltinMSVaList = true;
4498
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004499 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004500 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004501 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004502 }
Craig Topper3164f332014-03-11 03:39:26 +00004503 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004504 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004505 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004506
Craig Topper3164f332014-03-11 03:39:26 +00004507 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004508 if (RegNo == 0) return 0;
4509 if (RegNo == 1) return 1;
4510 return -1;
4511 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004512
Craig Topper3164f332014-03-11 03:39:26 +00004513 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004514 switch (CC) {
4515 case CC_C:
4516 case CC_Swift:
4517 case CC_X86VectorCall:
4518 case CC_IntelOclBicc:
4519 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004520 case CC_PreserveMost:
4521 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004522 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004523 return CCCR_OK;
4524 default:
4525 return CCCR_Warning;
4526 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004527 }
4528
Craig Topper3164f332014-03-11 03:39:26 +00004529 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004530 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004531 }
4532
Pavel Chupinfd223e12014-08-04 12:39:43 +00004533 // for x32 we need it here explicitly
4534 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004535 unsigned getUnwindWordWidth() const override { return 64; }
4536 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004537
4538 bool validateGlobalRegisterVariable(StringRef RegName,
4539 unsigned RegSize,
4540 bool &HasSizeMismatch) const override {
4541 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4542 // handle.
4543 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4544 // Check that the register size is 64-bit.
4545 HasSizeMismatch = RegSize != 64;
4546 return true;
4547 }
4548
4549 // Check if the register is a 32-bit register the backend can handle.
4550 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4551 HasSizeMismatch);
4552 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004553 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4554 return llvm::makeArrayRef(BuiltinInfoX86,
4555 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4556 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004557};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004558
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004559// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004560class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004561public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004562 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4563 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004564 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004565 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004566 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004567 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004568 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004569 SizeType = UnsignedLongLong;
4570 PtrDiffType = SignedLongLong;
4571 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004572 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004573
Craig Topper3164f332014-03-11 03:39:26 +00004574 void getTargetDefines(const LangOptions &Opts,
4575 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004576 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004577 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004578 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004579
Craig Topper3164f332014-03-11 03:39:26 +00004580 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004581 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004582 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004583
Craig Topper3164f332014-03-11 03:39:26 +00004584 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004585 switch (CC) {
4586 case CC_X86StdCall:
4587 case CC_X86ThisCall:
4588 case CC_X86FastCall:
4589 return CCCR_Ignore;
4590 case CC_C:
4591 case CC_X86VectorCall:
4592 case CC_IntelOclBicc:
4593 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004594 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004595 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004596 return CCCR_OK;
4597 default:
4598 return CCCR_Warning;
4599 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004600 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004601};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004602
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004603// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004604class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004605public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004606 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4607 const TargetOptions &Opts)
4608 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004609 LongDoubleWidth = LongDoubleAlign = 64;
4610 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004611 }
Craig Topper3164f332014-03-11 03:39:26 +00004612 void getTargetDefines(const LangOptions &Opts,
4613 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004614 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4615 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004616 Builder.defineMacro("_M_X64", "100");
4617 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004618 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004619};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004620
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004621// x86-64 MinGW target
4622class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4623public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004624 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4625 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004626 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4627 // with x86 FP ops. Weird.
4628 LongDoubleWidth = LongDoubleAlign = 128;
4629 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4630 }
4631
Craig Topper3164f332014-03-11 03:39:26 +00004632 void getTargetDefines(const LangOptions &Opts,
4633 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004634 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004635 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004636 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004637 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004638
4639 // GCC defines this macro when it is using __gxx_personality_seh0.
4640 if (!Opts.SjLjExceptions)
4641 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004642 }
4643};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004644
Yaron Kerend030d112015-07-22 17:38:19 +00004645// x86-64 Cygwin target
4646class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4647public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004648 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4649 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004650 TLSSupported = false;
4651 WCharType = UnsignedShort;
4652 }
4653 void getTargetDefines(const LangOptions &Opts,
4654 MacroBuilder &Builder) const override {
4655 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4656 Builder.defineMacro("__x86_64__");
4657 Builder.defineMacro("__CYGWIN__");
4658 Builder.defineMacro("__CYGWIN64__");
4659 addCygMingDefines(Opts, Builder);
4660 DefineStd(Builder, "unix", Opts);
4661 if (Opts.CPlusPlus)
4662 Builder.defineMacro("_GNU_SOURCE");
4663
4664 // GCC defines this macro when it is using __gxx_personality_seh0.
4665 if (!Opts.SjLjExceptions)
4666 Builder.defineMacro("__SEH__");
4667 }
4668};
4669
Eli Friedman2857ccb2009-07-01 03:36:11 +00004670class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004672 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4673 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004674 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004675 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4676 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004677 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004678 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004679 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004680 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004681
4682 bool handleTargetFeatures(std::vector<std::string> &Features,
4683 DiagnosticsEngine &Diags) override {
4684 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4685 Diags))
4686 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004687 // We now know the features we have: we can decide how to align vectors.
4688 MaxVectorAlign =
4689 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004690 return true;
4691 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004692};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004693
Eli Friedman245f2292009-07-05 22:31:18 +00004694class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4695public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004696 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4697 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004698 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004699 Int64Type = SignedLongLong;
4700 }
4701};
Eli Friedman245f2292009-07-05 22:31:18 +00004702
Eli Friedman9fa28852012-08-08 23:57:20 +00004703class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004705 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4706 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004707 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004708 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004709 }
4710};
Tim Northover9bb857a2013-01-31 12:13:10 +00004711
Eli Friedmanf05b7722008-08-20 07:44:10 +00004712class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004713 // Possible FPU choices.
4714 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004715 VFP2FPU = (1 << 0),
4716 VFP3FPU = (1 << 1),
4717 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004718 NeonFPU = (1 << 3),
4719 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004720 };
4721
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004722 // Possible HWDiv features.
4723 enum HWDivMode {
4724 HWDivThumb = (1 << 0),
4725 HWDivARM = (1 << 1)
4726 };
4727
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004728 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004729 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004730 }
4731
4732 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4733 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004734
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004735 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004736
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004737 StringRef CPUProfile;
4738 StringRef CPUAttr;
4739
Rafael Espindolaeb265472013-08-21 21:59:03 +00004740 enum {
4741 FP_Default,
4742 FP_VFP,
4743 FP_Neon
4744 } FPMath;
4745
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004746 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004747 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004748 unsigned ArchProfile;
4749 unsigned ArchVersion;
4750
Bernard Ogdenda13af32013-10-24 18:32:51 +00004751 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004752
Logan Chien57086ce2012-10-10 06:56:20 +00004753 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004754 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004755
4756 // Initialized via features.
4757 unsigned SoftFloat : 1;
4758 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004759
Bernard Ogden18b57012013-10-29 09:47:51 +00004760 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004761 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004762 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004763 unsigned Unaligned : 1;
4764
4765 enum {
4766 LDREX_B = (1 << 0), /// byte (8-bit)
4767 LDREX_H = (1 << 1), /// half (16-bit)
4768 LDREX_W = (1 << 2), /// word (32-bit)
4769 LDREX_D = (1 << 3), /// double (64-bit)
4770 };
4771
4772 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004773
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004774 // ACLE 6.5.1 Hardware floating point
4775 enum {
4776 HW_FP_HP = (1 << 1), /// half (16-bit)
4777 HW_FP_SP = (1 << 2), /// single (32-bit)
4778 HW_FP_DP = (1 << 3), /// double (64-bit)
4779 };
4780 uint32_t HW_FP;
4781
Chris Lattner5cc15e02010-03-03 19:03:45 +00004782 static const Builtin::Info BuiltinInfo[];
4783
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004784 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004785 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004786
4787 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004788 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004789
Renato Golin0201a9e2016-09-22 19:28:20 +00004790 // size_t is unsigned long on MachO-derived environments, NetBSD,
4791 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004792 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004793 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004794 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004795 SizeType = UnsignedLong;
4796 else
4797 SizeType = UnsignedInt;
4798
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004799 switch (T.getOS()) {
4800 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004801 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004802 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004803 break;
4804 case llvm::Triple::Win32:
4805 WCharType = UnsignedShort;
4806 break;
4807 case llvm::Triple::Linux:
4808 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004809 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4810 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004811 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004812 }
4813
4814 UseBitFieldTypeAlignment = true;
4815
4816 ZeroLengthBitfieldBoundary = 0;
4817
Tim Northover147cd2f2014-10-14 22:12:21 +00004818 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4819 // so set preferred for small types to 32.
4820 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004821 resetDataLayout(BigEndian
4822 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4823 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004824 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004825 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004826 resetDataLayout("e"
4827 "-m:w"
4828 "-p:32:32"
4829 "-i64:64"
4830 "-v128:64:128"
4831 "-a:0:32"
4832 "-n32"
4833 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004834 } else if (T.isOSNaCl()) {
4835 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004836 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004837 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004838 resetDataLayout(BigEndian
4839 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4840 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004841 }
4842
4843 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004844 }
4845
Tim Northover5627d392015-10-30 16:30:45 +00004846 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004847 const llvm::Triple &T = getTriple();
4848
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004849 IsAAPCS = false;
4850
Tim Northover5627d392015-10-30 16:30:45 +00004851 if (IsAAPCS16)
4852 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4853 else
4854 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004855
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004856 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004857 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004858 SizeType = UnsignedInt;
4859 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004860 SizeType = UnsignedLong;
4861
4862 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4863 WCharType = SignedInt;
4864
4865 // Do not respect the alignment of bit-field types when laying out
4866 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4867 UseBitFieldTypeAlignment = false;
4868
4869 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4870 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4871 /// gcc.
4872 ZeroLengthBitfieldBoundary = 32;
4873
Tim Northover5627d392015-10-30 16:30:45 +00004874 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4875 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004876 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004877 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004878 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004879 BigEndian
4880 ? "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 +00004881 : "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 +00004882 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004883 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004884 BigEndian
4885 ? "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 +00004886 : "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 +00004887
4888 // FIXME: Override "preferred align" for double and long long.
4889 }
4890
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004891 void setArchInfo() {
4892 StringRef ArchName = getTriple().getArchName();
4893
Renato Goline84b0002015-10-08 16:43:26 +00004894 ArchISA = llvm::ARM::parseArchISA(ArchName);
4895 CPU = llvm::ARM::getDefaultCPU(ArchName);
4896 unsigned AK = llvm::ARM::parseArch(ArchName);
4897 if (AK != llvm::ARM::AK_INVALID)
4898 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004899 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004900 }
4901
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004902 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004903 StringRef SubArch;
4904
4905 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004906 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004907 SubArch = llvm::ARM::getSubArch(ArchKind);
4908 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4909 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910
4911 // cache CPU related strings
4912 CPUAttr = getCPUAttr();
4913 CPUProfile = getCPUProfile();
4914 }
4915
4916 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004917 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004918 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004919 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004920 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4921 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004922 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004923 if (ArchProfile == llvm::ARM::PK_M) {
4924 MaxAtomicPromoteWidth = 32;
4925 if (ShouldUseInlineAtomic)
4926 MaxAtomicInlineWidth = 32;
4927 }
4928 else {
4929 MaxAtomicPromoteWidth = 64;
4930 if (ShouldUseInlineAtomic)
4931 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004932 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004933 }
4934
4935 bool isThumb() const {
4936 return (ArchISA == llvm::ARM::IK_THUMB);
4937 }
4938
4939 bool supportsThumb() const {
4940 return CPUAttr.count('T') || ArchVersion >= 6;
4941 }
4942
4943 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004944 return CPUAttr.equals("6T2") ||
4945 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004946 }
4947
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004948 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004949 // For most sub-arches, the build attribute CPU name is enough.
4950 // For Cortex variants, it's slightly different.
4951 switch(ArchKind) {
4952 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004953 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004954 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004955 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004956 case llvm::ARM::AK_ARMV7S:
4957 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004958 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004959 return "7A";
4960 case llvm::ARM::AK_ARMV7R:
4961 return "7R";
4962 case llvm::ARM::AK_ARMV7M:
4963 return "7M";
4964 case llvm::ARM::AK_ARMV7EM:
4965 return "7EM";
4966 case llvm::ARM::AK_ARMV8A:
4967 return "8A";
4968 case llvm::ARM::AK_ARMV8_1A:
4969 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004970 case llvm::ARM::AK_ARMV8_2A:
4971 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004972 case llvm::ARM::AK_ARMV8MBaseline:
4973 return "8M_BASE";
4974 case llvm::ARM::AK_ARMV8MMainline:
4975 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00004976 case llvm::ARM::AK_ARMV8R:
4977 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004978 }
4979 }
4980
4981 StringRef getCPUProfile() const {
4982 switch(ArchProfile) {
4983 case llvm::ARM::PK_A:
4984 return "A";
4985 case llvm::ARM::PK_R:
4986 return "R";
4987 case llvm::ARM::PK_M:
4988 return "M";
4989 default:
4990 return "";
4991 }
4992 }
4993
Chris Lattner17df24e2008-04-21 18:56:49 +00004994public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004995 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004996 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4997 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004998
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004999 switch (getTriple().getOS()) {
5000 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005001 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005002 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005003 break;
5004 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005005 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005006 break;
5007 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005008
Renato Goline84b0002015-10-08 16:43:26 +00005009 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005010 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005011
Chris Lattner1a8f3942010-04-23 16:29:58 +00005012 // {} in inline assembly are neon specifiers, not assembly variant
5013 // specifiers.
5014 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005015
Eric Christopher0e261882014-12-05 01:06:59 +00005016 // FIXME: This duplicates code from the driver that sets the -target-abi
5017 // option - this code is used if -target-abi isn't passed and should
5018 // be unified in some way.
5019 if (Triple.isOSBinFormatMachO()) {
5020 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5021 // the frontend matches that.
5022 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5023 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005024 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005025 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005026 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005027 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005028 } else {
5029 setABI("apcs-gnu");
5030 }
5031 } else if (Triple.isOSWindows()) {
5032 // FIXME: this is invalid for WindowsCE
5033 setABI("aapcs");
5034 } else {
5035 // Select the default based on the platform.
5036 switch (Triple.getEnvironment()) {
5037 case llvm::Triple::Android:
5038 case llvm::Triple::GNUEABI:
5039 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005040 case llvm::Triple::MuslEABI:
5041 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005042 setABI("aapcs-linux");
5043 break;
5044 case llvm::Triple::EABIHF:
5045 case llvm::Triple::EABI:
5046 setABI("aapcs");
5047 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005048 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005049 setABI("apcs-gnu");
5050 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005051 default:
5052 if (Triple.getOS() == llvm::Triple::NetBSD)
5053 setABI("apcs-gnu");
5054 else
5055 setABI("aapcs");
5056 break;
5057 }
5058 }
John McCall86353412010-08-21 22:46:04 +00005059
5060 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005061 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005062
Renato Golin15b86152015-07-03 16:41:13 +00005063 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005064 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005065
James Molloya7139222012-03-12 09:14:10 +00005066 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005067 // the alignment of the zero-length bitfield is greater than the member
5068 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005069 // zero length bitfield.
5070 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005071
5072 if (Triple.getOS() == llvm::Triple::Linux ||
5073 Triple.getOS() == llvm::Triple::UnknownOS)
5074 this->MCountName =
5075 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005076 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005077
Alp Toker4925ba72014-06-07 23:30:42 +00005078 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005079
Craig Topper3164f332014-03-11 03:39:26 +00005080 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005081 ABI = Name;
5082
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005083 // The defaults (above) are for AAPCS, check if we need to change them.
5084 //
5085 // FIXME: We need support for -meabi... we could just mangle it into the
5086 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005087 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005088 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005089 return true;
5090 }
5091 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5092 setABIAAPCS();
5093 return true;
5094 }
5095 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005096 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005097
Renato Golinf5c4dec2015-05-27 13:33:00 +00005098 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005099 bool
5100 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5101 StringRef CPU,
5102 const std::vector<std::string> &FeaturesVec) const override {
5103
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005104 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005105 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005106
5107 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005108 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005109 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5110
5111 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005112 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005113 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5114
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005115 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005116 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005117 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005118
Eric Christopher007b0a02015-08-28 22:32:01 +00005119 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005120 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005121
Craig Topper3164f332014-03-11 03:39:26 +00005122 bool handleTargetFeatures(std::vector<std::string> &Features,
5123 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005124 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005125 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005126 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005127 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005128 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005129 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005130 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005131
Ranjeet Singhac08e532015-06-24 23:39:25 +00005132 // This does not diagnose illegal cases like having both
5133 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5134 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005135 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005136 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005137 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005138 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005139 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005140 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005141 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005142 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005143 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005144 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005145 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005146 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005147 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005148 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005149 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005150 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005151 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005152 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005153 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005154 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005155 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005156 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005157 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005158 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005159 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005160 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005161 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005162 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005163 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005164 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005165 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005166 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005167 } else if (Feature == "+strict-align") {
5168 Unaligned = 0;
5169 } else if (Feature == "+fp16") {
5170 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005171 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005172 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005173 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005174
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005175 switch (ArchVersion) {
5176 case 6:
5177 if (ArchProfile == llvm::ARM::PK_M)
5178 LDREX = 0;
5179 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5180 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5181 else
5182 LDREX = LDREX_W;
5183 break;
5184 case 7:
5185 if (ArchProfile == llvm::ARM::PK_M)
5186 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5187 else
5188 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5189 break;
5190 case 8:
5191 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5192 }
5193
Rafael Espindolaeb265472013-08-21 21:59:03 +00005194 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5195 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5196 return false;
5197 }
5198
5199 if (FPMath == FP_Neon)
5200 Features.push_back("+neonfp");
5201 else if (FPMath == FP_VFP)
5202 Features.push_back("-neonfp");
5203
Daniel Dunbar893d4752009-12-19 04:15:38 +00005204 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005205 auto Feature =
5206 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5207 if (Feature != Features.end())
5208 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005209
Rafael Espindolaeb265472013-08-21 21:59:03 +00005210 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005211 }
5212
Craig Topper3164f332014-03-11 03:39:26 +00005213 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005214 return llvm::StringSwitch<bool>(Feature)
5215 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005216 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005217 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005218 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005219 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005220 .Case("hwdiv", HWDiv & HWDivThumb)
5221 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005222 .Default(false);
5223 }
Renato Golin15b86152015-07-03 16:41:13 +00005224
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005225 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005226 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005227 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005228
Renato Golin15b86152015-07-03 16:41:13 +00005229 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005230 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005231 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005232 CPU = Name;
5233 return true;
5234 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005235
Craig Topper3164f332014-03-11 03:39:26 +00005236 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005237
Craig Topper3164f332014-03-11 03:39:26 +00005238 void getTargetDefines(const LangOptions &Opts,
5239 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005240 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005241 Builder.defineMacro("__arm");
5242 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005243 // For bare-metal none-eabi.
5244 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5245 getTriple().getEnvironment() == llvm::Triple::EABI)
5246 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005247
Chris Lattnerecd49032009-03-02 22:27:17 +00005248 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005249 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005250
5251 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5252 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005253 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005254 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5255
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005256 if (!CPUAttr.empty())
5257 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005258
5259 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005260 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005261 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005262
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005263 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005264 // ACLE 6.5.7 Crypto Extension
5265 if (Crypto)
5266 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5267 // ACLE 6.5.8 CRC32 Extension
5268 if (CRC)
5269 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5270 // ACLE 6.5.10 Numeric Maximum and Minimum
5271 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5272 // ACLE 6.5.9 Directed Rounding
5273 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005274 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005275
5276 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5277 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005278 // NOTE that the default profile is assumed to be 'A'
5279 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005280 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5281
Bradley Smithf4affc12016-03-03 13:52:22 +00005282 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5283 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5284 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5285 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005286 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005287 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005288 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005289 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5290
5291 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5292 // instruction set such as ARM or Thumb.
5293 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5294
5295 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5296
5297 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005298 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005299 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005300
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005302 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005303 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005304
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005305 // ACLE 6.4.4 LDREX/STREX
5306 if (LDREX)
5307 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5308
5309 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005310 if (ArchVersion == 5 ||
5311 (ArchVersion == 6 && CPUProfile != "M") ||
5312 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005313 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5314
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005315 // ACLE 6.5.1 Hardware Floating Point
5316 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005317 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005318
Yi Konga44c4d72014-06-27 21:25:42 +00005319 // ACLE predefines.
5320 Builder.defineMacro("__ARM_ACLE", "200");
5321
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005322 // FP16 support (we currently only support IEEE format).
5323 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5324 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5325
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005326 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005327 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005328 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5329
Mike Stump9d54bd72009-04-08 02:07:04 +00005330 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005331
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005332 // FIXME: It's more complicated than this and we don't really support
5333 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005334 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005335 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005336 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005337
David Tweed8f676532012-10-25 13:33:01 +00005338 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005339 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005340 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005341 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005342 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005343 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005344 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005345
Tim Northover28fc0e12016-04-28 13:59:55 +00005346 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5347 ABI == "aapcs16")
5348 Builder.defineMacro("__ARM_PCS_VFP", "1");
5349
Daniel Dunbar893d4752009-12-19 04:15:38 +00005350 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005351 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005352
Zijiao Ma56a83722016-08-17 02:13:33 +00005353 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005354 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005355
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005356 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005357 Builder.defineMacro("__THUMBEL__");
5358 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005359 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005360 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005361 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005362
5363 // ACLE 6.4.9 32-bit SIMD instructions
5364 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5365 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5366
5367 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005368 if (((HWDiv & HWDivThumb) && isThumb()) ||
5369 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005370 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005371 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005372 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005373
5374 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005375 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005376
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005377 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005378 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005379 if (FPU & VFP2FPU)
5380 Builder.defineMacro("__ARM_VFPV2__");
5381 if (FPU & VFP3FPU)
5382 Builder.defineMacro("__ARM_VFPV3__");
5383 if (FPU & VFP4FPU)
5384 Builder.defineMacro("__ARM_VFPV4__");
5385 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005386
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005387 // This only gets set when Neon instructions are actually available, unlike
5388 // the VFP define, hence the soft float and arch check. This is subtly
5389 // different from gcc, we follow the intent which was that it should be set
5390 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005391 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005392 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005393 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005394 // current AArch32 NEON implementations do not support double-precision
5395 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005396 Builder.defineMacro("__ARM_NEON_FP",
5397 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005398 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005399
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005400 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5401 Opts.ShortWChar ? "2" : "4");
5402
5403 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5404 Opts.ShortEnums ? "1" : "4");
5405
Bradley Smithf4affc12016-03-03 13:52:22 +00005406 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005407 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5408 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5409 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5410 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5411 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005412
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005413 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005414 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005415 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005416 }
5417
5418 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005419 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005420 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5421 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005422 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005423 }
5424
5425 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005426 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005427 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005428
5429 if (Opts.UnsafeFPMath)
5430 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005431
5432 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5433 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005434 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005435
Craig Topper6c03a542015-10-19 04:51:35 +00005436 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5437 return llvm::makeArrayRef(BuiltinInfo,
5438 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005439 }
Craig Topper3164f332014-03-11 03:39:26 +00005440 bool isCLZForZeroUndef() const override { return false; }
5441 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005442 return IsAAPCS
5443 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005444 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5445 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005446 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005447 ArrayRef<const char *> getGCCRegNames() const override;
5448 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005449 bool validateAsmConstraint(const char *&Name,
5450 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005451 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005452 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005453 case 'l': // r0-r7
5454 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005455 case 't': // VFP Floating point register single precision
5456 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005457 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005458 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005459 case 'I':
5460 case 'J':
5461 case 'K':
5462 case 'L':
5463 case 'M':
5464 // FIXME
5465 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005466 case 'Q': // A memory address that is a single base register.
5467 Info.setAllowsMemory();
5468 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005469 case 'U': // a memory reference...
5470 switch (Name[1]) {
5471 case 'q': // ...ARMV4 ldrsb
5472 case 'v': // ...VFP load/store (reg+constant offset)
5473 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005474 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005475 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005476 case 'n': // valid address for Neon doubleword vector load/store
5477 case 'm': // valid address for Neon element and structure load/store
5478 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005479 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005480 Info.setAllowsMemory();
5481 Name++;
5482 return true;
5483 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005484 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005485 return false;
5486 }
Craig Topper3164f332014-03-11 03:39:26 +00005487 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005488 std::string R;
5489 switch (*Constraint) {
5490 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005491 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005492 Constraint++;
5493 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005494 case 'p': // 'p' should be translated to 'r' by default.
5495 R = std::string("r");
5496 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005497 default:
5498 return std::string(1, *Constraint);
5499 }
5500 return R;
5501 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005502 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005503 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005504 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005505 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005506 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005507
Bill Wendling9d1ee112012-10-25 23:28:48 +00005508 // Strip off constraint modifiers.
5509 while (Constraint[0] == '=' ||
5510 Constraint[0] == '+' ||
5511 Constraint[0] == '&')
5512 Constraint = Constraint.substr(1);
5513
5514 switch (Constraint[0]) {
5515 default: break;
5516 case 'r': {
5517 switch (Modifier) {
5518 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005519 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005520 case 'q':
5521 // A register of size 32 cannot fit a vector type.
5522 return false;
5523 }
5524 }
5525 }
5526
5527 return true;
5528 }
Craig Topper3164f332014-03-11 03:39:26 +00005529 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005530 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005531 return "";
5532 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005533
Craig Topper3164f332014-03-11 03:39:26 +00005534 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005535 switch (CC) {
5536 case CC_AAPCS:
5537 case CC_AAPCS_VFP:
5538 case CC_Swift:
5539 return CCCR_OK;
5540 default:
5541 return CCCR_Warning;
5542 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005543 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005544
Craig Topper3164f332014-03-11 03:39:26 +00005545 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005546 if (RegNo == 0) return 0;
5547 if (RegNo == 1) return 1;
5548 return -1;
5549 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005550
5551 bool hasSjLjLowering() const override {
5552 return true;
5553 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005554};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005555
Rafael Espindolaeb265472013-08-21 21:59:03 +00005556bool ARMTargetInfo::setFPMath(StringRef Name) {
5557 if (Name == "neon") {
5558 FPMath = FP_Neon;
5559 return true;
5560 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5561 Name == "vfp4") {
5562 FPMath = FP_VFP;
5563 return true;
5564 }
5565 return false;
5566}
5567
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005568const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005569 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005570 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005571 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5572
5573 // Float registers
5574 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5575 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5576 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005577 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005578
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005579 // Double registers
5580 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5581 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005582 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5583 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005584
5585 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005586 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5587 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005588};
5589
Craig Topperf054e3a2015-10-19 03:52:27 +00005590ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5591 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005592}
5593
5594const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005595 { { "a1" }, "r0" },
5596 { { "a2" }, "r1" },
5597 { { "a3" }, "r2" },
5598 { { "a4" }, "r3" },
5599 { { "v1" }, "r4" },
5600 { { "v2" }, "r5" },
5601 { { "v3" }, "r6" },
5602 { { "v4" }, "r7" },
5603 { { "v5" }, "r8" },
5604 { { "v6", "rfp" }, "r9" },
5605 { { "sl" }, "r10" },
5606 { { "fp" }, "r11" },
5607 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005608 { { "r13" }, "sp" },
5609 { { "r14" }, "lr" },
5610 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005611 // The S, D and Q registers overlap, but aren't really aliases; we
5612 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005613};
5614
Craig Topperf054e3a2015-10-19 03:52:27 +00005615ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5616 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005617}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005618
5619const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005620#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005621 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005622#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5623 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005624#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005625
Craig Topper07d3b622015-08-07 05:14:44 +00005626#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005627 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005628#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005629 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005630#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5631 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005632#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5633 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005634#include "clang/Basic/BuiltinsARM.def"
5635};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005636
5637class ARMleTargetInfo : public ARMTargetInfo {
5638public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005639 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005640 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005641 void getTargetDefines(const LangOptions &Opts,
5642 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005643 Builder.defineMacro("__ARMEL__");
5644 ARMTargetInfo::getTargetDefines(Opts, Builder);
5645 }
5646};
5647
5648class ARMbeTargetInfo : public ARMTargetInfo {
5649public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005650 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005651 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005652 void getTargetDefines(const LangOptions &Opts,
5653 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005654 Builder.defineMacro("__ARMEB__");
5655 Builder.defineMacro("__ARM_BIG_ENDIAN");
5656 ARMTargetInfo::getTargetDefines(Opts, Builder);
5657 }
5658};
Chris Lattner17df24e2008-04-21 18:56:49 +00005659
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005660class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5661 const llvm::Triple Triple;
5662public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005663 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5664 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005665 WCharType = UnsignedShort;
5666 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005667 }
5668 void getVisualStudioDefines(const LangOptions &Opts,
5669 MacroBuilder &Builder) const {
5670 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5671
5672 // FIXME: this is invalid for WindowsCE
5673 Builder.defineMacro("_M_ARM_NT", "1");
5674 Builder.defineMacro("_M_ARMT", "_M_ARM");
5675 Builder.defineMacro("_M_THUMB", "_M_ARM");
5676
5677 assert((Triple.getArch() == llvm::Triple::arm ||
5678 Triple.getArch() == llvm::Triple::thumb) &&
5679 "invalid architecture for Windows ARM target info");
5680 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5681 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5682
5683 // TODO map the complete set of values
5684 // 31: VFPv3 40: VFPv4
5685 Builder.defineMacro("_M_ARM_FP", "31");
5686 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005687 BuiltinVaListKind getBuiltinVaListKind() const override {
5688 return TargetInfo::CharPtrBuiltinVaList;
5689 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005690 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5691 switch (CC) {
5692 case CC_X86StdCall:
5693 case CC_X86ThisCall:
5694 case CC_X86FastCall:
5695 case CC_X86VectorCall:
5696 return CCCR_Ignore;
5697 case CC_C:
5698 return CCCR_OK;
5699 default:
5700 return CCCR_Warning;
5701 }
5702 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005703};
5704
5705// Windows ARM + Itanium C++ ABI Target
5706class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5707public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005708 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5709 const TargetOptions &Opts)
5710 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005711 TheCXXABI.set(TargetCXXABI::GenericARM);
5712 }
5713
5714 void getTargetDefines(const LangOptions &Opts,
5715 MacroBuilder &Builder) const override {
5716 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5717
5718 if (Opts.MSVCCompat)
5719 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5720 }
5721};
5722
5723// Windows ARM, MS (C++) ABI
5724class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5725public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005726 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5727 const TargetOptions &Opts)
5728 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005729 TheCXXABI.set(TargetCXXABI::Microsoft);
5730 }
5731
5732 void getTargetDefines(const LangOptions &Opts,
5733 MacroBuilder &Builder) const override {
5734 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5735 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5736 }
5737};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005738
Yaron Keren321249c2015-07-15 13:32:23 +00005739// ARM MinGW target
5740class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5741public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005742 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5743 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005744 TheCXXABI.set(TargetCXXABI::GenericARM);
5745 }
5746
5747 void getTargetDefines(const LangOptions &Opts,
5748 MacroBuilder &Builder) const override {
5749 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5750 DefineStd(Builder, "WIN32", Opts);
5751 DefineStd(Builder, "WINNT", Opts);
5752 Builder.defineMacro("_ARM_");
5753 addMinGWDefines(Opts, Builder);
5754 }
5755};
5756
5757// ARM Cygwin target
5758class CygwinARMTargetInfo : public ARMleTargetInfo {
5759public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005760 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5761 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005762 TLSSupported = false;
5763 WCharType = UnsignedShort;
5764 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005765 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005766 }
5767 void getTargetDefines(const LangOptions &Opts,
5768 MacroBuilder &Builder) const override {
5769 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5770 Builder.defineMacro("_ARM_");
5771 Builder.defineMacro("__CYGWIN__");
5772 Builder.defineMacro("__CYGWIN32__");
5773 DefineStd(Builder, "unix", Opts);
5774 if (Opts.CPlusPlus)
5775 Builder.defineMacro("_GNU_SOURCE");
5776 }
5777};
5778
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005779class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005780protected:
Craig Topper3164f332014-03-11 03:39:26 +00005781 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5782 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005783 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005784 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005785
Torok Edwinb2b37c62009-06-30 17:10:35 +00005786public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005787 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5788 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005789 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005790 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005791 // FIXME: This should be based off of the target features in
5792 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005793 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005794
Tim Northoverd88ecb32016-01-27 19:32:40 +00005795 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005796 // Darwin on iOS uses a variant of the ARM C++ ABI.
5797 TheCXXABI.set(TargetCXXABI::WatchOS);
5798
5799 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5800 // size_t is long, it's a bit weird for it to be int.
5801 PtrDiffType = SignedLong;
5802
5803 // BOOL should be a real boolean on the new ABI
5804 UseSignedCharForObjCBool = false;
5805 } else
5806 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005807 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005808};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005809
Tim Northover573cbee2014-05-24 12:52:07 +00005810class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005811 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005812 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5813 static const char *const GCCRegNames[];
5814
James Molloy75f5f9e2014-04-16 15:33:48 +00005815 enum FPUModeEnum {
5816 FPUMode,
5817 NeonMode
5818 };
5819
5820 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005821 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005822 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005823 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005824 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005825
Tim Northovera2ee4332014-03-29 15:09:45 +00005826 static const Builtin::Info BuiltinInfo[];
5827
5828 std::string ABI;
5829
5830public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005831 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005832 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005833 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5834 WCharType = SignedInt;
5835
5836 // NetBSD apparently prefers consistency across ARM targets to consistency
5837 // across 64-bit targets.
5838 Int64Type = SignedLongLong;
5839 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005840 } else {
5841 WCharType = UnsignedInt;
5842 Int64Type = SignedLong;
5843 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005844 }
5845
Tim Northovera2ee4332014-03-29 15:09:45 +00005846 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005847 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005848 MaxAtomicInlineWidth = 128;
5849 MaxAtomicPromoteWidth = 128;
5850
Tim Northovera6a19f12015-02-06 01:25:07 +00005851 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005852 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5853
Tim Northovera2ee4332014-03-29 15:09:45 +00005854 // {} in inline assembly are neon specifiers, not assembly variant
5855 // specifiers.
5856 NoAsmVariants = true;
5857
Tim Northover7ad87af2015-01-16 18:44:04 +00005858 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5859 // contributes to the alignment of the containing aggregate in the same way
5860 // a plain (non bit-field) member of that type would, without exception for
5861 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005862 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005863 UseZeroLengthBitfieldAlignment = true;
5864
Tim Northover573cbee2014-05-24 12:52:07 +00005865 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005866 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005867
5868 if (Triple.getOS() == llvm::Triple::Linux ||
5869 Triple.getOS() == llvm::Triple::UnknownOS)
5870 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005871 }
5872
Alp Toker4925ba72014-06-07 23:30:42 +00005873 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005874 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005875 if (Name != "aapcs" && Name != "darwinpcs")
5876 return false;
5877
5878 ABI = Name;
5879 return true;
5880 }
5881
David Blaikie1cbb9712014-11-14 19:09:44 +00005882 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005883 return Name == "generic" ||
5884 llvm::AArch64::parseCPUArch(Name) !=
5885 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005886 }
5887
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005888 void getTargetDefines(const LangOptions &Opts,
5889 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005890 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005891 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005892
5893 // Target properties.
5894 Builder.defineMacro("_LP64");
5895 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005896
5897 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5898 Builder.defineMacro("__ARM_ACLE", "200");
5899 Builder.defineMacro("__ARM_ARCH", "8");
5900 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5901
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005902 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005903 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005904 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005905
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005906 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5907 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5908 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5909 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005910 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005911 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5912 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005913
5914 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5915
5916 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005917 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005918
5919 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5920 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005921 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5922 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005923
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005924 if (Opts.UnsafeFPMath)
5925 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005926
5927 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5928
5929 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5930 Opts.ShortEnums ? "1" : "4");
5931
James Molloy75f5f9e2014-04-16 15:33:48 +00005932 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005933 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005934 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005935 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005936 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005937
Bradley Smith418c5932014-05-02 15:17:51 +00005938 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005939 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005940
James Molloy75f5f9e2014-04-16 15:33:48 +00005941 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005942 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5943
5944 if (Unaligned)
5945 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005946
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005947 if (V8_1A)
5948 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5949
Reid Klecknerd167d422015-05-06 15:31:46 +00005950 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5951 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5952 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5953 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5954 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005955 }
5956
Craig Topper6c03a542015-10-19 04:51:35 +00005957 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5958 return llvm::makeArrayRef(BuiltinInfo,
5959 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005960 }
5961
David Blaikie1cbb9712014-11-14 19:09:44 +00005962 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005963 return Feature == "aarch64" ||
5964 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005965 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005966 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005967 }
5968
James Molloy5e73df52014-04-16 15:06:20 +00005969 bool handleTargetFeatures(std::vector<std::string> &Features,
5970 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005971 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005972 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005973 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005974 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005975 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005976
Eric Christopher610fe112015-08-26 08:21:55 +00005977 for (const auto &Feature : Features) {
5978 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005979 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005980 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005981 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005982 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005983 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005984 if (Feature == "+strict-align")
5985 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005986 if (Feature == "+v8.1a")
5987 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005988 }
5989
James Y Knightb214cbc2016-03-04 19:00:41 +00005990 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005991
5992 return true;
5993 }
5994
John McCall477f2bb2016-03-03 06:39:32 +00005995 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5996 switch (CC) {
5997 case CC_C:
5998 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005999 case CC_PreserveMost:
6000 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006001 return CCCR_OK;
6002 default:
6003 return CCCR_Warning;
6004 }
6005 }
6006
David Blaikie1cbb9712014-11-14 19:09:44 +00006007 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006008
David Blaikie1cbb9712014-11-14 19:09:44 +00006009 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006010 return TargetInfo::AArch64ABIBuiltinVaList;
6011 }
6012
Craig Topperf054e3a2015-10-19 03:52:27 +00006013 ArrayRef<const char *> getGCCRegNames() const override;
6014 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006015
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006016 bool validateAsmConstraint(const char *&Name,
6017 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006018 switch (*Name) {
6019 default:
6020 return false;
6021 case 'w': // Floating point and SIMD registers (V0-V31)
6022 Info.setAllowsRegister();
6023 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006024 case 'I': // Constant that can be used with an ADD instruction
6025 case 'J': // Constant that can be used with a SUB instruction
6026 case 'K': // Constant that can be used with a 32-bit logical instruction
6027 case 'L': // Constant that can be used with a 64-bit logical instruction
6028 case 'M': // Constant that can be used as a 32-bit MOV immediate
6029 case 'N': // Constant that can be used as a 64-bit MOV immediate
6030 case 'Y': // Floating point constant zero
6031 case 'Z': // Integer constant zero
6032 return true;
6033 case 'Q': // A memory reference with base register and no offset
6034 Info.setAllowsMemory();
6035 return true;
6036 case 'S': // A symbolic address
6037 Info.setAllowsRegister();
6038 return true;
6039 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006040 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6041 // Utf: A memory address suitable for ldp/stp in TF mode.
6042 // Usa: An absolute symbolic address.
6043 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6044 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006045 case 'z': // Zero register, wzr or xzr
6046 Info.setAllowsRegister();
6047 return true;
6048 case 'x': // Floating point and SIMD registers (V0-V15)
6049 Info.setAllowsRegister();
6050 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006051 }
6052 return false;
6053 }
6054
Akira Hatanaka987f1862014-08-22 06:05:21 +00006055 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006056 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006057 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006058 // Strip off constraint modifiers.
6059 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6060 Constraint = Constraint.substr(1);
6061
6062 switch (Constraint[0]) {
6063 default:
6064 return true;
6065 case 'z':
6066 case 'r': {
6067 switch (Modifier) {
6068 case 'x':
6069 case 'w':
6070 // For now assume that the person knows what they're
6071 // doing with the modifier.
6072 return true;
6073 default:
6074 // By default an 'r' constraint will be in the 'x'
6075 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006076 if (Size == 64)
6077 return true;
6078
6079 SuggestedModifier = "w";
6080 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006081 }
6082 }
6083 }
6084 }
6085
David Blaikie1cbb9712014-11-14 19:09:44 +00006086 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006087
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006088 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006089 if (RegNo == 0)
6090 return 0;
6091 if (RegNo == 1)
6092 return 1;
6093 return -1;
6094 }
6095};
6096
Tim Northover573cbee2014-05-24 12:52:07 +00006097const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006098 // 32-bit Integer registers
6099 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6100 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6101 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6102
6103 // 64-bit Integer registers
6104 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6105 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6106 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6107
6108 // 32-bit floating point regsisters
6109 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6110 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6111 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6112
6113 // 64-bit floating point regsisters
6114 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6115 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6116 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6117
6118 // Vector registers
6119 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6120 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6121 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6122};
6123
Craig Topperf054e3a2015-10-19 03:52:27 +00006124ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6125 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006126}
6127
Tim Northover573cbee2014-05-24 12:52:07 +00006128const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006129 { { "w31" }, "wsp" },
6130 { { "x29" }, "fp" },
6131 { { "x30" }, "lr" },
6132 { { "x31" }, "sp" },
6133 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6134 // don't want to substitute one of these for a different-sized one.
6135};
6136
Craig Topperf054e3a2015-10-19 03:52:27 +00006137ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6138 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006139}
6140
Tim Northover573cbee2014-05-24 12:52:07 +00006141const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006142#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006143 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006144#include "clang/Basic/BuiltinsNEON.def"
6145
6146#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006147 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006148#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006149};
James Molloy5e73df52014-04-16 15:06:20 +00006150
Tim Northover573cbee2014-05-24 12:52:07 +00006151class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006152 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006153 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006154 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006155 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006156 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006157 }
6158
6159public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006160 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6161 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006162 }
James Molloy5e73df52014-04-16 15:06:20 +00006163 void getTargetDefines(const LangOptions &Opts,
6164 MacroBuilder &Builder) const override {
6165 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006166 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006167 }
6168};
6169
Tim Northover573cbee2014-05-24 12:52:07 +00006170class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006171 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006172 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006173 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006174 }
6175
6176public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006177 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6178 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006179 void getTargetDefines(const LangOptions &Opts,
6180 MacroBuilder &Builder) const override {
6181 Builder.defineMacro("__AARCH64EB__");
6182 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6183 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006184 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006185 }
6186};
Tim Northovera2ee4332014-03-29 15:09:45 +00006187
Tim Northover573cbee2014-05-24 12:52:07 +00006188class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006189protected:
6190 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6191 MacroBuilder &Builder) const override {
6192 Builder.defineMacro("__AARCH64_SIMD__");
6193 Builder.defineMacro("__ARM64_ARCH_8__");
6194 Builder.defineMacro("__ARM_NEON__");
6195 Builder.defineMacro("__LITTLE_ENDIAN__");
6196 Builder.defineMacro("__REGISTER_PREFIX__", "");
6197 Builder.defineMacro("__arm64", "1");
6198 Builder.defineMacro("__arm64__", "1");
6199
6200 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6201 }
6202
Tim Northovera2ee4332014-03-29 15:09:45 +00006203public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006204 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6205 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006206 Int64Type = SignedLongLong;
6207 WCharType = SignedInt;
6208 UseSignedCharForObjCBool = false;
6209
Tim Northovera6a19f12015-02-06 01:25:07 +00006210 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006211 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6212
6213 TheCXXABI.set(TargetCXXABI::iOS64);
6214 }
6215
David Blaikie1cbb9712014-11-14 19:09:44 +00006216 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006217 return TargetInfo::CharPtrBuiltinVaList;
6218 }
6219};
Tim Northovera2ee4332014-03-29 15:09:45 +00006220
Tony Linthicum76329bf2011-12-12 21:14:55 +00006221// Hexagon abstract base class
6222class HexagonTargetInfo : public TargetInfo {
6223 static const Builtin::Info BuiltinInfo[];
6224 static const char * const GCCRegNames[];
6225 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6226 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006227 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006228 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006229
Tony Linthicum76329bf2011-12-12 21:14:55 +00006230public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006231 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6232 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006233 // Specify the vector alignment explicitly. For v512x1, the calculated
6234 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6235 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006236 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006237 "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 +00006238 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006239 SizeType = UnsignedInt;
6240 PtrDiffType = SignedInt;
6241 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006242
6243 // {} in inline assembly are packet specifiers, not assembly variant
6244 // specifiers.
6245 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006246
6247 LargeArrayMinWidth = 64;
6248 LargeArrayAlign = 64;
6249 UseBitFieldTypeAlignment = true;
6250 ZeroLengthBitfieldBoundary = 32;
6251 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006252 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253 }
6254
Craig Topper6c03a542015-10-19 04:51:35 +00006255 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6256 return llvm::makeArrayRef(BuiltinInfo,
6257 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006258 }
6259
Craig Topper3164f332014-03-11 03:39:26 +00006260 bool validateAsmConstraint(const char *&Name,
6261 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006262 switch (*Name) {
6263 case 'v':
6264 case 'q':
6265 if (HasHVX) {
6266 Info.setAllowsRegister();
6267 return true;
6268 }
6269 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006270 case 's':
6271 // Relocatable constant.
6272 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006273 }
6274 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006275 }
6276
Craig Topper3164f332014-03-11 03:39:26 +00006277 void getTargetDefines(const LangOptions &Opts,
6278 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006279
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006280 bool isCLZForZeroUndef() const override { return false; }
6281
Craig Topper3164f332014-03-11 03:39:26 +00006282 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006283 return llvm::StringSwitch<bool>(Feature)
6284 .Case("hexagon", true)
6285 .Case("hvx", HasHVX)
6286 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006287 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006288 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006289 }
Craig Topper3164f332014-03-11 03:39:26 +00006290
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006291 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6292 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6293 const override;
6294
6295 bool handleTargetFeatures(std::vector<std::string> &Features,
6296 DiagnosticsEngine &Diags) override;
6297
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006298 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6299 bool Enabled) const override;
6300
Craig Topper3164f332014-03-11 03:39:26 +00006301 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006302 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006303 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006304 ArrayRef<const char *> getGCCRegNames() const override;
6305 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006306 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006307 return "";
6308 }
Sebastian Pop86500282012-01-13 20:37:10 +00006309
6310 static const char *getHexagonCPUSuffix(StringRef Name) {
6311 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006312 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006313 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006314 .Case("hexagonv55", "55")
6315 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006316 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006317 }
6318
Craig Topper3164f332014-03-11 03:39:26 +00006319 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006320 if (!getHexagonCPUSuffix(Name))
6321 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006322 CPU = Name;
6323 return true;
6324 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006325
6326 int getEHDataRegisterNumber(unsigned RegNo) const override {
6327 return RegNo < 2 ? RegNo : -1;
6328 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329};
6330
6331void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006332 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006334 Builder.defineMacro("__hexagon__", "1");
6335
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006336 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006337 Builder.defineMacro("__HEXAGON_V4__");
6338 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006339 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006340 Builder.defineMacro("__QDSP6_V4__");
6341 Builder.defineMacro("__QDSP6_ARCH__", "4");
6342 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006343 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006344 Builder.defineMacro("__HEXAGON_V5__");
6345 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6346 if(Opts.HexagonQdsp6Compat) {
6347 Builder.defineMacro("__QDSP6_V5__");
6348 Builder.defineMacro("__QDSP6_ARCH__", "5");
6349 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006350 } else if (CPU == "hexagonv55") {
6351 Builder.defineMacro("__HEXAGON_V55__");
6352 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6353 Builder.defineMacro("__QDSP6_V55__");
6354 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006355 } else if (CPU == "hexagonv60") {
6356 Builder.defineMacro("__HEXAGON_V60__");
6357 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6358 Builder.defineMacro("__QDSP6_V60__");
6359 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006360 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006361
6362 if (hasFeature("hvx")) {
6363 Builder.defineMacro("__HVX__");
6364 if (hasFeature("hvx-double"))
6365 Builder.defineMacro("__HVXDBL__");
6366 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006367}
6368
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006369bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6370 DiagnosticsEngine &Diags, StringRef CPU,
6371 const std::vector<std::string> &FeaturesVec) const {
6372 // Default for v60: -hvx, -hvx-double.
6373 Features["hvx"] = false;
6374 Features["hvx-double"] = false;
6375 Features["long-calls"] = false;
6376
6377 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6378}
6379
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006380bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6381 DiagnosticsEngine &Diags) {
6382 for (auto &F : Features) {
6383 if (F == "+hvx")
6384 HasHVX = true;
6385 else if (F == "-hvx")
6386 HasHVX = HasHVXDouble = false;
6387 else if (F == "+hvx-double")
6388 HasHVX = HasHVXDouble = true;
6389 else if (F == "-hvx-double")
6390 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006391
6392 if (F == "+long-calls")
6393 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006394 else if (F == "-long-calls")
6395 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006396 }
6397 return true;
6398}
6399
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006400void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6401 StringRef Name, bool Enabled) const {
6402 if (Enabled) {
6403 if (Name == "hvx-double")
6404 Features["hvx"] = true;
6405 } else {
6406 if (Name == "hvx")
6407 Features["hvx-double"] = false;
6408 }
6409 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006410}
6411
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006412const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006413 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6414 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6415 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6416 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6417 "p0", "p1", "p2", "p3",
6418 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6419};
6420
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006421ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006422 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006423}
6424
Tony Linthicum76329bf2011-12-12 21:14:55 +00006425const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6426 { { "sp" }, "r29" },
6427 { { "fp" }, "r30" },
6428 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006429};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006430
Craig Topperf054e3a2015-10-19 03:52:27 +00006431ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6432 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006433}
6434
6435
6436const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006437#define BUILTIN(ID, TYPE, ATTRS) \
6438 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6439#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6440 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006441#include "clang/Basic/BuiltinsHexagon.def"
6442};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006443
Jacques Pienaard964cc22016-03-28 21:02:54 +00006444class LanaiTargetInfo : public TargetInfo {
6445 // Class for Lanai (32-bit).
6446 // The CPU profiles supported by the Lanai backend
6447 enum CPUKind {
6448 CK_NONE,
6449 CK_V11,
6450 } CPU;
6451
6452 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6453 static const char *const GCCRegNames[];
6454
6455public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006456 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6457 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006458 // Description string has to be kept in sync with backend.
6459 resetDataLayout("E" // Big endian
6460 "-m:e" // ELF name manging
6461 "-p:32:32" // 32 bit pointers, 32 bit aligned
6462 "-i64:64" // 64 bit integers, 64 bit aligned
6463 "-a:0:32" // 32 bit alignment of objects of aggregate type
6464 "-n32" // 32 bit native integer width
6465 "-S64" // 64 bit natural stack alignment
6466 );
6467
6468 // Setting RegParmMax equal to what mregparm was set to in the old
6469 // toolchain
6470 RegParmMax = 4;
6471
6472 // Set the default CPU to V11
6473 CPU = CK_V11;
6474
6475 // Temporary approach to make everything at least word-aligned and allow for
6476 // safely casting between pointers with different alignment requirements.
6477 // TODO: Remove this when there are no more cast align warnings on the
6478 // firmware.
6479 MinGlobalAlign = 32;
6480 }
6481
6482 void getTargetDefines(const LangOptions &Opts,
6483 MacroBuilder &Builder) const override {
6484 // Define __lanai__ when building for target lanai.
6485 Builder.defineMacro("__lanai__");
6486
6487 // Set define for the CPU specified.
6488 switch (CPU) {
6489 case CK_V11:
6490 Builder.defineMacro("__LANAI_V11__");
6491 break;
6492 case CK_NONE:
6493 llvm_unreachable("Unhandled target CPU");
6494 }
6495 }
6496
6497 bool setCPU(const std::string &Name) override {
6498 CPU = llvm::StringSwitch<CPUKind>(Name)
6499 .Case("v11", CK_V11)
6500 .Default(CK_NONE);
6501
6502 return CPU != CK_NONE;
6503 }
6504
6505 bool hasFeature(StringRef Feature) const override {
6506 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6507 }
6508
6509 ArrayRef<const char *> getGCCRegNames() const override;
6510
6511 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6512
6513 BuiltinVaListKind getBuiltinVaListKind() const override {
6514 return TargetInfo::VoidPtrBuiltinVaList;
6515 }
6516
6517 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6518
6519 bool validateAsmConstraint(const char *&Name,
6520 TargetInfo::ConstraintInfo &info) const override {
6521 return false;
6522 }
6523
6524 const char *getClobbers() const override { return ""; }
6525};
6526
6527const char *const LanaiTargetInfo::GCCRegNames[] = {
6528 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6529 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6530 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6531
6532ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6533 return llvm::makeArrayRef(GCCRegNames);
6534}
6535
6536const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6537 {{"pc"}, "r2"},
6538 {{"sp"}, "r4"},
6539 {{"fp"}, "r5"},
6540 {{"rv"}, "r8"},
6541 {{"rr1"}, "r10"},
6542 {{"rr2"}, "r11"},
6543 {{"rca"}, "r15"},
6544};
6545
6546ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6547 return llvm::makeArrayRef(GCCRegAliases);
6548}
6549
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006550// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6551class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006552 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6553 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006554 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006555public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006556 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006557 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006558
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006559 int getEHDataRegisterNumber(unsigned RegNo) const override {
6560 if (RegNo == 0) return 24;
6561 if (RegNo == 1) return 25;
6562 return -1;
6563 }
6564
Craig Topper3164f332014-03-11 03:39:26 +00006565 bool handleTargetFeatures(std::vector<std::string> &Features,
6566 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006567 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006568 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6569 if (Feature != Features.end()) {
6570 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006571 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006572 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006573 }
Craig Topper3164f332014-03-11 03:39:26 +00006574 void getTargetDefines(const LangOptions &Opts,
6575 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006576 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006577 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006578
6579 if (SoftFloat)
6580 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006581 }
Craig Topper3164f332014-03-11 03:39:26 +00006582
6583 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006584 return llvm::StringSwitch<bool>(Feature)
6585 .Case("softfloat", SoftFloat)
6586 .Case("sparc", true)
6587 .Default(false);
6588 }
Craig Topper3164f332014-03-11 03:39:26 +00006589
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006590 bool hasSjLjLowering() const override {
6591 return true;
6592 }
6593
Craig Topper6c03a542015-10-19 04:51:35 +00006594 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006595 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006596 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006597 }
Craig Topper3164f332014-03-11 03:39:26 +00006598 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006599 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006600 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006601 ArrayRef<const char *> getGCCRegNames() const override;
6602 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006603 bool validateAsmConstraint(const char *&Name,
6604 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006605 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006606 switch (*Name) {
6607 case 'I': // Signed 13-bit constant
6608 case 'J': // Zero
6609 case 'K': // 32-bit constant with the low 12 bits clear
6610 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6611 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6612 case 'N': // Same as 'K' but zext (required for SIMode)
6613 case 'O': // The constant 4096
6614 return true;
6615 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006616 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006617 }
Craig Topper3164f332014-03-11 03:39:26 +00006618 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006619 // FIXME: Implement!
6620 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006621 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006622
6623 // No Sparc V7 for now, the backend doesn't support it anyway.
6624 enum CPUKind {
6625 CK_GENERIC,
6626 CK_V8,
6627 CK_SUPERSPARC,
6628 CK_SPARCLITE,
6629 CK_F934,
6630 CK_HYPERSPARC,
6631 CK_SPARCLITE86X,
6632 CK_SPARCLET,
6633 CK_TSC701,
6634 CK_V9,
6635 CK_ULTRASPARC,
6636 CK_ULTRASPARC3,
6637 CK_NIAGARA,
6638 CK_NIAGARA2,
6639 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006640 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006641 CK_MYRIAD2100,
6642 CK_MYRIAD2150,
6643 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006644 CK_LEON2,
6645 CK_LEON2_AT697E,
6646 CK_LEON2_AT697F,
6647 CK_LEON3,
6648 CK_LEON3_UT699,
6649 CK_LEON3_GR712RC,
6650 CK_LEON4,
6651 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006652 } CPU = CK_GENERIC;
6653
6654 enum CPUGeneration {
6655 CG_V8,
6656 CG_V9,
6657 };
6658
6659 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6660 switch (Kind) {
6661 case CK_GENERIC:
6662 case CK_V8:
6663 case CK_SUPERSPARC:
6664 case CK_SPARCLITE:
6665 case CK_F934:
6666 case CK_HYPERSPARC:
6667 case CK_SPARCLITE86X:
6668 case CK_SPARCLET:
6669 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006670 case CK_MYRIAD2100:
6671 case CK_MYRIAD2150:
6672 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006673 case CK_LEON2:
6674 case CK_LEON2_AT697E:
6675 case CK_LEON2_AT697F:
6676 case CK_LEON3:
6677 case CK_LEON3_UT699:
6678 case CK_LEON3_GR712RC:
6679 case CK_LEON4:
6680 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006681 return CG_V8;
6682 case CK_V9:
6683 case CK_ULTRASPARC:
6684 case CK_ULTRASPARC3:
6685 case CK_NIAGARA:
6686 case CK_NIAGARA2:
6687 case CK_NIAGARA3:
6688 case CK_NIAGARA4:
6689 return CG_V9;
6690 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006691 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006692 }
6693
6694 CPUKind getCPUKind(StringRef Name) const {
6695 return llvm::StringSwitch<CPUKind>(Name)
6696 .Case("v8", CK_V8)
6697 .Case("supersparc", CK_SUPERSPARC)
6698 .Case("sparclite", CK_SPARCLITE)
6699 .Case("f934", CK_F934)
6700 .Case("hypersparc", CK_HYPERSPARC)
6701 .Case("sparclite86x", CK_SPARCLITE86X)
6702 .Case("sparclet", CK_SPARCLET)
6703 .Case("tsc701", CK_TSC701)
6704 .Case("v9", CK_V9)
6705 .Case("ultrasparc", CK_ULTRASPARC)
6706 .Case("ultrasparc3", CK_ULTRASPARC3)
6707 .Case("niagara", CK_NIAGARA)
6708 .Case("niagara2", CK_NIAGARA2)
6709 .Case("niagara3", CK_NIAGARA3)
6710 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006711 .Case("ma2100", CK_MYRIAD2100)
6712 .Case("ma2150", CK_MYRIAD2150)
6713 .Case("ma2450", CK_MYRIAD2450)
6714 // FIXME: the myriad2[.n] spellings are obsolete,
6715 // but a grace period is needed to allow updating dependent builds.
6716 .Case("myriad2", CK_MYRIAD2100)
6717 .Case("myriad2.1", CK_MYRIAD2100)
6718 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006719 .Case("leon2", CK_LEON2)
6720 .Case("at697e", CK_LEON2_AT697E)
6721 .Case("at697f", CK_LEON2_AT697F)
6722 .Case("leon3", CK_LEON3)
6723 .Case("ut699", CK_LEON3_UT699)
6724 .Case("gr712rc", CK_LEON3_GR712RC)
6725 .Case("leon4", CK_LEON4)
6726 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006727 .Default(CK_GENERIC);
6728 }
6729
6730 bool setCPU(const std::string &Name) override {
6731 CPU = getCPUKind(Name);
6732 return CPU != CK_GENERIC;
6733 }
Gabor Greif49991682008-02-21 16:29:08 +00006734};
6735
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006736const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006737 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6738 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6739 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6740 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6741};
6742
Craig Topperf054e3a2015-10-19 03:52:27 +00006743ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6744 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006745}
6746
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006747const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006748 { { "g0" }, "r0" },
6749 { { "g1" }, "r1" },
6750 { { "g2" }, "r2" },
6751 { { "g3" }, "r3" },
6752 { { "g4" }, "r4" },
6753 { { "g5" }, "r5" },
6754 { { "g6" }, "r6" },
6755 { { "g7" }, "r7" },
6756 { { "o0" }, "r8" },
6757 { { "o1" }, "r9" },
6758 { { "o2" }, "r10" },
6759 { { "o3" }, "r11" },
6760 { { "o4" }, "r12" },
6761 { { "o5" }, "r13" },
6762 { { "o6", "sp" }, "r14" },
6763 { { "o7" }, "r15" },
6764 { { "l0" }, "r16" },
6765 { { "l1" }, "r17" },
6766 { { "l2" }, "r18" },
6767 { { "l3" }, "r19" },
6768 { { "l4" }, "r20" },
6769 { { "l5" }, "r21" },
6770 { { "l6" }, "r22" },
6771 { { "l7" }, "r23" },
6772 { { "i0" }, "r24" },
6773 { { "i1" }, "r25" },
6774 { { "i2" }, "r26" },
6775 { { "i3" }, "r27" },
6776 { { "i4" }, "r28" },
6777 { { "i5" }, "r29" },
6778 { { "i6", "fp" }, "r30" },
6779 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006780};
6781
Craig Topperf054e3a2015-10-19 03:52:27 +00006782ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6783 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006784}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006785
6786// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6787class SparcV8TargetInfo : public SparcTargetInfo {
6788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006789 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6790 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006791 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006792 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6793 switch (getTriple().getOS()) {
6794 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006795 SizeType = UnsignedInt;
6796 IntPtrType = SignedInt;
6797 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006798 break;
6799 case llvm::Triple::NetBSD:
6800 case llvm::Triple::OpenBSD:
6801 SizeType = UnsignedLong;
6802 IntPtrType = SignedLong;
6803 PtrDiffType = SignedLong;
6804 break;
Brad Smith56495d52015-08-13 22:00:53 +00006805 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006806 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6807 // on up to 64 bits.
6808 MaxAtomicPromoteWidth = 64;
6809 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006810 }
6811
Craig Topper3164f332014-03-11 03:39:26 +00006812 void getTargetDefines(const LangOptions &Opts,
6813 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006814 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006815 switch (getCPUGeneration(CPU)) {
6816 case CG_V8:
6817 Builder.defineMacro("__sparcv8");
6818 if (getTriple().getOS() != llvm::Triple::Solaris)
6819 Builder.defineMacro("__sparcv8__");
6820 break;
6821 case CG_V9:
6822 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006823 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006824 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006825 Builder.defineMacro("__sparc_v9__");
6826 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006827 break;
6828 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006829 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006830 std::string MyriadArchValue, Myriad2Value;
6831 Builder.defineMacro("__sparc_v8__");
6832 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006833 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006834 case CK_MYRIAD2150:
6835 MyriadArchValue = "__ma2150";
6836 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006837 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006838 case CK_MYRIAD2450:
6839 MyriadArchValue = "__ma2450";
6840 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006841 break;
6842 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006843 MyriadArchValue = "__ma2100";
6844 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006845 break;
6846 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006847 Builder.defineMacro(MyriadArchValue, "1");
6848 Builder.defineMacro(MyriadArchValue+"__", "1");
6849 Builder.defineMacro("__myriad2__", Myriad2Value);
6850 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006851 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006852 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006853
6854 bool hasSjLjLowering() const override {
6855 return true;
6856 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006857};
6858
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006859// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6860class SparcV8elTargetInfo : public SparcV8TargetInfo {
6861 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006862 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6863 : SparcV8TargetInfo(Triple, Opts) {
6864 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006865 }
6866};
6867
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006868// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6869class SparcV9TargetInfo : public SparcTargetInfo {
6870public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006871 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6872 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006873 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006874 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006875 // This is an LP64 platform.
6876 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006877
6878 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006879 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006880 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006881 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006882 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006883 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006884
6885 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6886 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6887 LongDoubleWidth = 128;
6888 LongDoubleAlign = 128;
6889 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006890 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006891 }
6892
Craig Topper3164f332014-03-11 03:39:26 +00006893 void getTargetDefines(const LangOptions &Opts,
6894 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006895 SparcTargetInfo::getTargetDefines(Opts, Builder);
6896 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006897 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006898 // Solaris doesn't need these variants, but the BSDs do.
6899 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006900 Builder.defineMacro("__sparc64__");
6901 Builder.defineMacro("__sparc_v9__");
6902 Builder.defineMacro("__sparcv9__");
6903 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006904 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006905
Craig Topper3164f332014-03-11 03:39:26 +00006906 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006907 if (!SparcTargetInfo::setCPU(Name))
6908 return false;
6909 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006910 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006911};
6912
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006913class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006914 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006915 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006916 std::string CPU;
6917 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006918 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006919
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006920public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006921 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006922 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6923 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006924 IntMaxType = SignedLong;
6925 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006926 TLSSupported = true;
6927 IntWidth = IntAlign = 32;
6928 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6929 PointerWidth = PointerAlign = 64;
6930 LongDoubleWidth = 128;
6931 LongDoubleAlign = 64;
6932 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006933 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006934 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006935 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 +00006936 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6937 }
6938 void getTargetDefines(const LangOptions &Opts,
6939 MacroBuilder &Builder) const override {
6940 Builder.defineMacro("__s390__");
6941 Builder.defineMacro("__s390x__");
6942 Builder.defineMacro("__zarch__");
6943 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006944
6945 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6946 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6947 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6948 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6949
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006950 if (HasTransactionalExecution)
6951 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006952 if (Opts.ZVector)
6953 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006954 }
Craig Topper6c03a542015-10-19 04:51:35 +00006955 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6956 return llvm::makeArrayRef(BuiltinInfo,
6957 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006958 }
6959
Craig Topperf054e3a2015-10-19 03:52:27 +00006960 ArrayRef<const char *> getGCCRegNames() const override;
6961 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006962 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006963 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006964 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006965 bool validateAsmConstraint(const char *&Name,
6966 TargetInfo::ConstraintInfo &info) const override;
6967 const char *getClobbers() const override {
6968 // FIXME: Is this really right?
6969 return "";
6970 }
6971 BuiltinVaListKind getBuiltinVaListKind() const override {
6972 return TargetInfo::SystemZBuiltinVaList;
6973 }
6974 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006975 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006976 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6977 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006978 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006979 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006980 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006981 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006982 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006983 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006984 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006985 .Default(false);
6986
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006987 return CPUKnown;
6988 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006989 bool
6990 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6991 StringRef CPU,
6992 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006993 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006994 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00006995 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006996 Features["transactional-execution"] = true;
6997 Features["vector"] = true;
6998 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006999 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007000 }
7001
7002 bool handleTargetFeatures(std::vector<std::string> &Features,
7003 DiagnosticsEngine &Diags) override {
7004 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007005 for (const auto &Feature : Features) {
7006 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007007 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007008 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007009 HasVector = true;
7010 }
7011 // If we use the vector ABI, vector types are 64-bit aligned.
7012 if (HasVector) {
7013 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007014 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7015 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007016 }
7017 return true;
7018 }
7019
7020 bool hasFeature(StringRef Feature) const override {
7021 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007022 .Case("systemz", true)
7023 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007024 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007025 .Default(false);
7026 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007027
Bryan Chane3f1ed52016-04-28 13:56:43 +00007028 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7029 switch (CC) {
7030 case CC_C:
7031 case CC_Swift:
7032 return CCCR_OK;
7033 default:
7034 return CCCR_Warning;
7035 }
7036 }
7037
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007038 StringRef getABI() const override {
7039 if (HasVector)
7040 return "vector";
7041 return "";
7042 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007043
7044 bool useFloat128ManglingForLongDouble() const override {
7045 return true;
7046 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007047};
7048
7049const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7050#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007051 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007052#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7053 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007054#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007055};
7056
7057const char *const SystemZTargetInfo::GCCRegNames[] = {
7058 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7059 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7060 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7061 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7062};
7063
Craig Topperf054e3a2015-10-19 03:52:27 +00007064ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7065 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007066}
7067
7068bool SystemZTargetInfo::
7069validateAsmConstraint(const char *&Name,
7070 TargetInfo::ConstraintInfo &Info) const {
7071 switch (*Name) {
7072 default:
7073 return false;
7074
7075 case 'a': // Address register
7076 case 'd': // Data register (equivalent to 'r')
7077 case 'f': // Floating-point register
7078 Info.setAllowsRegister();
7079 return true;
7080
7081 case 'I': // Unsigned 8-bit constant
7082 case 'J': // Unsigned 12-bit constant
7083 case 'K': // Signed 16-bit constant
7084 case 'L': // Signed 20-bit displacement (on all targets we support)
7085 case 'M': // 0x7fffffff
7086 return true;
7087
7088 case 'Q': // Memory with base and unsigned 12-bit displacement
7089 case 'R': // Likewise, plus an index
7090 case 'S': // Memory with base and signed 20-bit displacement
7091 case 'T': // Likewise, plus an index
7092 Info.setAllowsMemory();
7093 return true;
7094 }
7095}
Ulrich Weigand47445072013-05-06 16:26:41 +00007096
Eric Christopherc48497a2015-09-18 21:26:24 +00007097class MSP430TargetInfo : public TargetInfo {
7098 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007099
Eric Christopherc48497a2015-09-18 21:26:24 +00007100public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007101 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7102 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007103 TLSSupported = false;
7104 IntWidth = 16;
7105 IntAlign = 16;
7106 LongWidth = 32;
7107 LongLongWidth = 64;
7108 LongAlign = LongLongAlign = 16;
7109 PointerWidth = 16;
7110 PointerAlign = 16;
7111 SuitableAlign = 16;
7112 SizeType = UnsignedInt;
7113 IntMaxType = SignedLongLong;
7114 IntPtrType = SignedInt;
7115 PtrDiffType = SignedInt;
7116 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007117 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007118 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007119 void getTargetDefines(const LangOptions &Opts,
7120 MacroBuilder &Builder) const override {
7121 Builder.defineMacro("MSP430");
7122 Builder.defineMacro("__MSP430__");
7123 // FIXME: defines for different 'flavours' of MCU
7124 }
Craig Topper6c03a542015-10-19 04:51:35 +00007125 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007126 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007127 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007128 }
7129 bool hasFeature(StringRef Feature) const override {
7130 return Feature == "msp430";
7131 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007132 ArrayRef<const char *> getGCCRegNames() const override;
7133 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007134 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007135 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007136 }
7137 bool validateAsmConstraint(const char *&Name,
7138 TargetInfo::ConstraintInfo &info) const override {
7139 // FIXME: implement
7140 switch (*Name) {
7141 case 'K': // the constant 1
7142 case 'L': // constant -1^20 .. 1^19
7143 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007144 return true;
7145 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007146 // No target constraints for now.
7147 return false;
7148 }
7149 const char *getClobbers() const override {
7150 // FIXME: Is this really right?
7151 return "";
7152 }
7153 BuiltinVaListKind getBuiltinVaListKind() const override {
7154 // FIXME: implement
7155 return TargetInfo::CharPtrBuiltinVaList;
7156 }
7157};
7158
7159const char *const MSP430TargetInfo::GCCRegNames[] = {
7160 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7161 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7162
Craig Topperf054e3a2015-10-19 03:52:27 +00007163ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7164 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007165}
7166
7167// LLVM and Clang cannot be used directly to output native binaries for
7168// target, but is used to compile C code to llvm bitcode with correct
7169// type and alignment information.
7170//
7171// TCE uses the llvm bitcode as input and uses it for generating customized
7172// target processor and program binary. TCE co-design environment is
7173// publicly available in http://tce.cs.tut.fi
7174
7175static const unsigned TCEOpenCLAddrSpaceMap[] = {
7176 3, // opencl_global
7177 4, // opencl_local
7178 5, // opencl_constant
7179 // FIXME: generic has to be added to the target
7180 0, // opencl_generic
7181 0, // cuda_device
7182 0, // cuda_constant
7183 0 // cuda_shared
7184};
7185
7186class TCETargetInfo : public TargetInfo {
7187public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007188 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7189 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007190 TLSSupported = false;
7191 IntWidth = 32;
7192 LongWidth = LongLongWidth = 32;
7193 PointerWidth = 32;
7194 IntAlign = 32;
7195 LongAlign = LongLongAlign = 32;
7196 PointerAlign = 32;
7197 SuitableAlign = 32;
7198 SizeType = UnsignedInt;
7199 IntMaxType = SignedLong;
7200 IntPtrType = SignedInt;
7201 PtrDiffType = SignedInt;
7202 FloatWidth = 32;
7203 FloatAlign = 32;
7204 DoubleWidth = 32;
7205 DoubleAlign = 32;
7206 LongDoubleWidth = 32;
7207 LongDoubleAlign = 32;
7208 FloatFormat = &llvm::APFloat::IEEEsingle;
7209 DoubleFormat = &llvm::APFloat::IEEEsingle;
7210 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007211 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7212 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007213 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7214 UseAddrSpaceMapMangling = true;
7215 }
7216
7217 void getTargetDefines(const LangOptions &Opts,
7218 MacroBuilder &Builder) const override {
7219 DefineStd(Builder, "tce", Opts);
7220 Builder.defineMacro("__TCE__");
7221 Builder.defineMacro("__TCE_V1__");
7222 }
7223 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7224
Craig Topper6c03a542015-10-19 04:51:35 +00007225 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007226 const char *getClobbers() const override { return ""; }
7227 BuiltinVaListKind getBuiltinVaListKind() const override {
7228 return TargetInfo::VoidPtrBuiltinVaList;
7229 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007230 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007231 bool validateAsmConstraint(const char *&Name,
7232 TargetInfo::ConstraintInfo &info) const override {
7233 return true;
7234 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007235 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7236 return None;
7237 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007238};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007239
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007240class BPFTargetInfo : public TargetInfo {
7241public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007242 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7243 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007244 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7245 SizeType = UnsignedLong;
7246 PtrDiffType = SignedLong;
7247 IntPtrType = SignedLong;
7248 IntMaxType = SignedLong;
7249 Int64Type = SignedLong;
7250 RegParmMax = 5;
7251 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007252 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007253 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007254 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007255 }
7256 MaxAtomicPromoteWidth = 64;
7257 MaxAtomicInlineWidth = 64;
7258 TLSSupported = false;
7259 }
7260 void getTargetDefines(const LangOptions &Opts,
7261 MacroBuilder &Builder) const override {
7262 DefineStd(Builder, "bpf", Opts);
7263 Builder.defineMacro("__BPF__");
7264 }
7265 bool hasFeature(StringRef Feature) const override {
7266 return Feature == "bpf";
7267 }
7268
Craig Topper6c03a542015-10-19 04:51:35 +00007269 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007270 const char *getClobbers() const override {
7271 return "";
7272 }
7273 BuiltinVaListKind getBuiltinVaListKind() const override {
7274 return TargetInfo::VoidPtrBuiltinVaList;
7275 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007276 ArrayRef<const char *> getGCCRegNames() const override {
7277 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007278 }
7279 bool validateAsmConstraint(const char *&Name,
7280 TargetInfo::ConstraintInfo &info) const override {
7281 return true;
7282 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007283 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7284 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007285 }
7286};
7287
Daniel Sanders4672af62016-05-27 11:51:02 +00007288class MipsTargetInfo : public TargetInfo {
7289 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007290 StringRef Layout;
7291
7292 if (ABI == "o32")
7293 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7294 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007295 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007296 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007297 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007298 else
7299 llvm_unreachable("Invalid ABI");
7300
7301 if (BigEndian)
7302 resetDataLayout(("E-" + Layout).str());
7303 else
7304 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007305 }
7306
Akira Hatanaka9064e362013-10-29 18:30:33 +00007307
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007308 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007309 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007310 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007311 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007312 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007313 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007314 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007315 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007316 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007317 enum DspRevEnum {
7318 NoDSP, DSP1, DSP2
7319 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007320 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007321
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007322protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007323 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007324 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007325
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007326public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007327 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007328 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7329 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7330 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007331 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007332
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007333 setABI((getTriple().getArch() == llvm::Triple::mips ||
7334 getTriple().getArch() == llvm::Triple::mipsel)
7335 ? "o32"
7336 : "n64");
7337
7338 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007339 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007340
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007341 bool isNaN2008Default() const {
7342 return CPU == "mips32r6" || CPU == "mips64r6";
7343 }
7344
7345 bool isFP64Default() const {
7346 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7347 }
7348
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007349 bool isNan2008() const override {
7350 return IsNan2008;
7351 }
7352
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007353 bool processorSupportsGPR64() const {
7354 return llvm::StringSwitch<bool>(CPU)
7355 .Case("mips3", true)
7356 .Case("mips4", true)
7357 .Case("mips5", true)
7358 .Case("mips64", true)
7359 .Case("mips64r2", true)
7360 .Case("mips64r3", true)
7361 .Case("mips64r5", true)
7362 .Case("mips64r6", true)
7363 .Case("octeon", true)
7364 .Default(false);
7365 return false;
7366 }
7367
Alp Toker4925ba72014-06-07 23:30:42 +00007368 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007369 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007370 if (Name == "o32") {
7371 setO32ABITypes();
7372 ABI = Name;
7373 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007374 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007375
7376 if (Name == "n32") {
7377 setN32ABITypes();
7378 ABI = Name;
7379 return true;
7380 }
7381 if (Name == "n64") {
7382 setN64ABITypes();
7383 ABI = Name;
7384 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007385 }
7386 return false;
7387 }
7388
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007389 void setO32ABITypes() {
7390 Int64Type = SignedLongLong;
7391 IntMaxType = Int64Type;
7392 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7393 LongDoubleWidth = LongDoubleAlign = 64;
7394 LongWidth = LongAlign = 32;
7395 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7396 PointerWidth = PointerAlign = 32;
7397 PtrDiffType = SignedInt;
7398 SizeType = UnsignedInt;
7399 SuitableAlign = 64;
7400 }
7401
7402 void setN32N64ABITypes() {
7403 LongDoubleWidth = LongDoubleAlign = 128;
7404 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7405 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7406 LongDoubleWidth = LongDoubleAlign = 64;
7407 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7408 }
7409 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7410 SuitableAlign = 128;
7411 }
7412
Daniel Sanders4672af62016-05-27 11:51:02 +00007413 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007414 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007415 Int64Type = SignedLong;
7416 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007417 LongWidth = LongAlign = 64;
7418 PointerWidth = PointerAlign = 64;
7419 PtrDiffType = SignedLong;
7420 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007421 }
7422
7423 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007424 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007425 Int64Type = SignedLongLong;
7426 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007427 LongWidth = LongAlign = 32;
7428 PointerWidth = PointerAlign = 32;
7429 PtrDiffType = SignedInt;
7430 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007431 }
7432
Craig Topper3164f332014-03-11 03:39:26 +00007433 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007434 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007435 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007436 .Case("mips1", true)
7437 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007438 .Case("mips3", true)
7439 .Case("mips4", true)
7440 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007441 .Case("mips32", true)
7442 .Case("mips32r2", true)
7443 .Case("mips32r3", true)
7444 .Case("mips32r5", true)
7445 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007446 .Case("mips64", true)
7447 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007448 .Case("mips64r3", true)
7449 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007450 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007451 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007452 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007453 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007454 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007455 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007456 bool
7457 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7458 StringRef CPU,
7459 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007460 if (CPU.empty())
7461 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007462 if (CPU == "octeon")
7463 Features["mips64r2"] = Features["cnmips"] = true;
7464 else
7465 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007466 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007467 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007468
Craig Topper3164f332014-03-11 03:39:26 +00007469 void getTargetDefines(const LangOptions &Opts,
7470 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007471 if (BigEndian) {
7472 DefineStd(Builder, "MIPSEB", Opts);
7473 Builder.defineMacro("_MIPSEB");
7474 } else {
7475 DefineStd(Builder, "MIPSEL", Opts);
7476 Builder.defineMacro("_MIPSEL");
7477 }
7478
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007479 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007480 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007481 if (Opts.GNUMode)
7482 Builder.defineMacro("mips");
7483
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007484 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007485 Builder.defineMacro("__mips", "32");
7486 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7487 } else {
7488 Builder.defineMacro("__mips", "64");
7489 Builder.defineMacro("__mips64");
7490 Builder.defineMacro("__mips64__");
7491 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7492 }
7493
7494 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7495 .Cases("mips32", "mips64", "1")
7496 .Cases("mips32r2", "mips64r2", "2")
7497 .Cases("mips32r3", "mips64r3", "3")
7498 .Cases("mips32r5", "mips64r5", "5")
7499 .Cases("mips32r6", "mips64r6", "6")
7500 .Default("");
7501 if (!ISARev.empty())
7502 Builder.defineMacro("__mips_isa_rev", ISARev);
7503
7504 if (ABI == "o32") {
7505 Builder.defineMacro("__mips_o32");
7506 Builder.defineMacro("_ABIO32", "1");
7507 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007508 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007509 Builder.defineMacro("__mips_n32");
7510 Builder.defineMacro("_ABIN32", "2");
7511 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7512 } else if (ABI == "n64") {
7513 Builder.defineMacro("__mips_n64");
7514 Builder.defineMacro("_ABI64", "3");
7515 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7516 } else
7517 llvm_unreachable("Invalid ABI.");
7518
Simon Atanasyan683535b2012-08-29 19:14:58 +00007519 Builder.defineMacro("__REGISTER_PREFIX__", "");
7520
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007521 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007522 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007523 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007524 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007525 case SoftFloat:
7526 Builder.defineMacro("__mips_soft_float", Twine(1));
7527 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007528 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007529
Simon Atanasyan16071912013-04-14 14:07:30 +00007530 if (IsSingleFloat)
7531 Builder.defineMacro("__mips_single_float", Twine(1));
7532
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007533 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7534 Builder.defineMacro("_MIPS_FPSET",
7535 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7536
Simon Atanasyan72244b62012-07-05 16:06:06 +00007537 if (IsMips16)
7538 Builder.defineMacro("__mips16", Twine(1));
7539
Simon Atanasyan60777612013-04-14 14:07:51 +00007540 if (IsMicromips)
7541 Builder.defineMacro("__mips_micromips", Twine(1));
7542
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007543 if (IsNan2008)
7544 Builder.defineMacro("__mips_nan2008", Twine(1));
7545
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007546 switch (DspRev) {
7547 default:
7548 break;
7549 case DSP1:
7550 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7551 Builder.defineMacro("__mips_dsp", Twine(1));
7552 break;
7553 case DSP2:
7554 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7555 Builder.defineMacro("__mips_dspr2", Twine(1));
7556 Builder.defineMacro("__mips_dsp", Twine(1));
7557 break;
7558 }
7559
Jack Carter44ff1e52013-08-12 17:20:29 +00007560 if (HasMSA)
7561 Builder.defineMacro("__mips_msa", Twine(1));
7562
Simon Atanasyan26f19672012-04-05 19:28:31 +00007563 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7564 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7565 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007566
7567 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7568 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007569
7570 // These shouldn't be defined for MIPS-I but there's no need to check
7571 // for that since MIPS-I isn't supported.
7572 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7573 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7574 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007575
7576 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7577 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7578 // the instructions exist but using them violates the ABI since they
7579 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7580 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007581 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007582 }
7583
Craig Topper6c03a542015-10-19 04:51:35 +00007584 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7585 return llvm::makeArrayRef(BuiltinInfo,
7586 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007587 }
Craig Topper3164f332014-03-11 03:39:26 +00007588 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007589 return llvm::StringSwitch<bool>(Feature)
7590 .Case("mips", true)
7591 .Case("fp64", HasFP64)
7592 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007593 }
Craig Topper3164f332014-03-11 03:39:26 +00007594 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007595 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007596 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007597 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007598 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007599 // CPU register names
7600 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007601 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7602 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7603 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007604 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7605 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007606 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7607 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7608 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7609 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007610 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007611 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007612 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7613 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007614 // MSA register names
7615 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7616 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7617 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7618 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7619 // MSA control register names
7620 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7621 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007622 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007623 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007624 }
Craig Topper3164f332014-03-11 03:39:26 +00007625 bool validateAsmConstraint(const char *&Name,
7626 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007627 switch (*Name) {
7628 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007629 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007630 case 'r': // CPU registers.
7631 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007632 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007633 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007634 case 'c': // $25 for indirect jumps
7635 case 'l': // lo register
7636 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007637 Info.setAllowsRegister();
7638 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007639 case 'I': // Signed 16-bit constant
7640 case 'J': // Integer 0
7641 case 'K': // Unsigned 16-bit constant
7642 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7643 case 'M': // Constants not loadable via lui, addiu, or ori
7644 case 'N': // Constant -1 to -65535
7645 case 'O': // A signed 15-bit constant
7646 case 'P': // A constant between 1 go 65535
7647 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007648 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007649 Info.setAllowsMemory();
7650 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007651 case 'Z':
7652 if (Name[1] == 'C') { // An address usable by ll, and sc.
7653 Info.setAllowsMemory();
7654 Name++; // Skip over 'Z'.
7655 return true;
7656 }
7657 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007658 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007659 }
7660
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007661 std::string convertConstraint(const char *&Constraint) const override {
7662 std::string R;
7663 switch (*Constraint) {
7664 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7665 if (Constraint[1] == 'C') {
7666 R = std::string("^") + std::string(Constraint, 2);
7667 Constraint++;
7668 return R;
7669 }
7670 break;
7671 }
7672 return TargetInfo::convertConstraint(Constraint);
7673 }
7674
Craig Topper3164f332014-03-11 03:39:26 +00007675 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007676 // In GCC, $1 is not widely used in generated code (it's used only in a few
7677 // specific situations), so there is no real need for users to add it to
7678 // the clobbers list if they want to use it in their inline assembly code.
7679 //
7680 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7681 // code generation, so using it in inline assembly without adding it to the
7682 // clobbers list can cause conflicts between the inline assembly code and
7683 // the surrounding generated code.
7684 //
7685 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7686 // operands, which will conflict with the ".set at" assembler option (which
7687 // we use only for inline assembly, in order to maintain compatibility with
7688 // GCC) and will also conflict with the user's usage of $1.
7689 //
7690 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7691 // register for generated code is to automatically clobber $1 for all inline
7692 // assembly code.
7693 //
7694 // FIXME: We should automatically clobber $1 only for inline assembly code
7695 // which actually uses it. This would allow LLVM to use $1 for inline
7696 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007697 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007698 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007699
Craig Topper3164f332014-03-11 03:39:26 +00007700 bool handleTargetFeatures(std::vector<std::string> &Features,
7701 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007702 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007703 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007704 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007705 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007706 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007707 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007708 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007709
Eric Christopher610fe112015-08-26 08:21:55 +00007710 for (const auto &Feature : Features) {
7711 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007712 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007713 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007714 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007715 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007716 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007717 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007718 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007719 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007720 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007721 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007722 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007723 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007724 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007725 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007726 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007727 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007728 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007729 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007730 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007731 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007732 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007733 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007734
James Y Knightb214cbc2016-03-04 19:00:41 +00007735 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007736
Rafael Espindolaeb265472013-08-21 21:59:03 +00007737 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007738 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007739
Craig Topper3164f332014-03-11 03:39:26 +00007740 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007741 if (RegNo == 0) return 4;
7742 if (RegNo == 1) return 5;
7743 return -1;
7744 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007745
7746 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007747
7748 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7749 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7750 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7751 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7752 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7753 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7754 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7755 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7756 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7757 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7758 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7759 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7760 {{"ra"}, "$31"}};
7761 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7762 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7763 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7764 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7765 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7766 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7767 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7768 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7769 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7770 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7771 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7772 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007773 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007774 return llvm::makeArrayRef(O32RegAliases);
7775 return llvm::makeArrayRef(NewABIRegAliases);
7776 }
7777
7778 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007779 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007780 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007781
7782 bool validateTarget(DiagnosticsEngine &Diags) const override {
7783 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7784 // this yet. It's better to fail here than on the backend assertion.
7785 if (processorSupportsGPR64() && ABI == "o32") {
7786 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7787 return false;
7788 }
7789
7790 // 64-bit ABI's require 64-bit CPU's.
7791 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7792 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7793 return false;
7794 }
7795
7796 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7797 // can't handle this yet. It's better to fail here than on the
7798 // backend assertion.
7799 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7800 getTriple().getArch() == llvm::Triple::mips64el) &&
7801 ABI == "o32") {
7802 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7803 << ABI << getTriple().str();
7804 return false;
7805 }
7806
7807 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7808 // can't handle this yet. It's better to fail here than on the
7809 // backend assertion.
7810 if ((getTriple().getArch() == llvm::Triple::mips ||
7811 getTriple().getArch() == llvm::Triple::mipsel) &&
7812 (ABI == "n32" || ABI == "n64")) {
7813 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7814 << ABI << getTriple().str();
7815 return false;
7816 }
7817
7818 return true;
7819 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007820};
7821
Daniel Sanders4672af62016-05-27 11:51:02 +00007822const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007823#define BUILTIN(ID, TYPE, ATTRS) \
7824 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7825#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7826 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007827#include "clang/Basic/BuiltinsMips.def"
7828};
7829
Ivan Krasindd7403e2011-08-24 20:22:22 +00007830class PNaClTargetInfo : public TargetInfo {
7831public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007832 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7833 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007834 this->LongAlign = 32;
7835 this->LongWidth = 32;
7836 this->PointerAlign = 32;
7837 this->PointerWidth = 32;
7838 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007839 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007840 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007841 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007842 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007843 this->SizeType = TargetInfo::UnsignedInt;
7844 this->PtrDiffType = TargetInfo::SignedInt;
7845 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007846 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007847 }
7848
Craig Toppere6f17d02014-03-11 04:07:52 +00007849 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007850 Builder.defineMacro("__le32__");
7851 Builder.defineMacro("__pnacl__");
7852 }
Craig Topper3164f332014-03-11 03:39:26 +00007853 void getTargetDefines(const LangOptions &Opts,
7854 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007855 getArchDefines(Opts, Builder);
7856 }
Craig Topper3164f332014-03-11 03:39:26 +00007857 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007858 return Feature == "pnacl";
7859 }
Craig Topper6c03a542015-10-19 04:51:35 +00007860 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007861 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007862 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007863 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007864 ArrayRef<const char *> getGCCRegNames() const override;
7865 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007866 bool validateAsmConstraint(const char *&Name,
7867 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007868 return false;
7869 }
7870
Craig Topper3164f332014-03-11 03:39:26 +00007871 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007872 return "";
7873 }
7874};
7875
Craig Topperf054e3a2015-10-19 03:52:27 +00007876ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7877 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007878}
7879
Craig Topperf054e3a2015-10-19 03:52:27 +00007880ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7881 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007882}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007883
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007884// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007885class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007886public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007887 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7888 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007889
7890 BuiltinVaListKind getBuiltinVaListKind() const override {
7891 return TargetInfo::PNaClABIBuiltinVaList;
7892 }
7893};
7894
JF Bastien643817d2014-09-12 17:52:47 +00007895class Le64TargetInfo : public TargetInfo {
7896 static const Builtin::Info BuiltinInfo[];
7897
7898public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007899 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7900 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007901 NoAsmVariants = true;
7902 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7903 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007904 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007905 }
7906
7907 void getTargetDefines(const LangOptions &Opts,
7908 MacroBuilder &Builder) const override {
7909 DefineStd(Builder, "unix", Opts);
7910 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7911 Builder.defineMacro("__ELF__");
7912 }
Craig Topper6c03a542015-10-19 04:51:35 +00007913 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7914 return llvm::makeArrayRef(BuiltinInfo,
7915 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007916 }
7917 BuiltinVaListKind getBuiltinVaListKind() const override {
7918 return TargetInfo::PNaClABIBuiltinVaList;
7919 }
7920 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007921 ArrayRef<const char *> getGCCRegNames() const override {
7922 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007923 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007924 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7925 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007926 }
7927 bool validateAsmConstraint(const char *&Name,
7928 TargetInfo::ConstraintInfo &Info) const override {
7929 return false;
7930 }
7931
7932 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007933};
Dan Gohmanc2853072015-09-03 22:51:53 +00007934
7935class WebAssemblyTargetInfo : public TargetInfo {
7936 static const Builtin::Info BuiltinInfo[];
7937
7938 enum SIMDEnum {
7939 NoSIMD,
7940 SIMD128,
7941 } SIMDLevel;
7942
7943public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007944 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007945 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007946 NoAsmVariants = true;
7947 SuitableAlign = 128;
7948 LargeArrayMinWidth = 128;
7949 LargeArrayAlign = 128;
7950 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007951 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007952 LongDoubleWidth = LongDoubleAlign = 128;
7953 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007954 SizeType = UnsignedInt;
7955 PtrDiffType = SignedInt;
7956 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007957 }
7958
7959protected:
7960 void getTargetDefines(const LangOptions &Opts,
7961 MacroBuilder &Builder) const override {
7962 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7963 if (SIMDLevel >= SIMD128)
7964 Builder.defineMacro("__wasm_simd128__");
7965 }
7966
7967private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007968 bool
7969 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7970 StringRef CPU,
7971 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007972 if (CPU == "bleeding-edge")
7973 Features["simd128"] = true;
7974 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7975 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007976 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007977 return llvm::StringSwitch<bool>(Feature)
7978 .Case("simd128", SIMDLevel >= SIMD128)
7979 .Default(false);
7980 }
7981 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007982 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007983 for (const auto &Feature : Features) {
7984 if (Feature == "+simd128") {
7985 SIMDLevel = std::max(SIMDLevel, SIMD128);
7986 continue;
7987 }
7988 if (Feature == "-simd128") {
7989 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7990 continue;
7991 }
7992
7993 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7994 << "-target-feature";
7995 return false;
7996 }
7997 return true;
7998 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007999 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008000 return llvm::StringSwitch<bool>(Name)
8001 .Case("mvp", true)
8002 .Case("bleeding-edge", true)
8003 .Case("generic", true)
8004 .Default(false);
8005 }
Craig Topper6c03a542015-10-19 04:51:35 +00008006 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8007 return llvm::makeArrayRef(BuiltinInfo,
8008 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008009 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008010 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008011 return VoidPtrBuiltinVaList;
8012 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008013 ArrayRef<const char *> getGCCRegNames() const final {
8014 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008015 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008016 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8017 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008018 }
8019 bool
8020 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008021 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008022 return false;
8023 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008024 const char *getClobbers() const final { return ""; }
8025 bool isCLZForZeroUndef() const final { return false; }
8026 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008027 IntType getIntTypeByWidth(unsigned BitWidth,
8028 bool IsSigned) const final {
8029 // WebAssembly prefers long long for explicitly 64-bit integers.
8030 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8031 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8032 }
8033 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8034 bool IsSigned) const final {
8035 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8036 return BitWidth == 64
8037 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8038 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8039 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008040};
8041
8042const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8043#define BUILTIN(ID, TYPE, ATTRS) \
8044 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8045#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8046 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8047#include "clang/Basic/BuiltinsWebAssembly.def"
8048};
8049
8050class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8051public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008052 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8053 const TargetOptions &Opts)
8054 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008055 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008056 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008057 }
8058
8059protected:
8060 void getTargetDefines(const LangOptions &Opts,
8061 MacroBuilder &Builder) const override {
8062 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8063 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8064 }
8065};
8066
8067class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8068public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008069 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8070 const TargetOptions &Opts)
8071 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008072 LongAlign = LongWidth = 64;
8073 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008074 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008075 SizeType = UnsignedLong;
8076 PtrDiffType = SignedLong;
8077 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008078 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008079 }
8080
8081protected:
8082 void getTargetDefines(const LangOptions &Opts,
8083 MacroBuilder &Builder) const override {
8084 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8085 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8086 }
8087};
8088
JF Bastien643817d2014-09-12 17:52:47 +00008089const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8090#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008091 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008092#include "clang/Basic/BuiltinsLe64.def"
8093};
8094
Eric Christopherc48497a2015-09-18 21:26:24 +00008095static const unsigned SPIRAddrSpaceMap[] = {
8096 1, // opencl_global
8097 3, // opencl_local
8098 2, // opencl_constant
8099 4, // opencl_generic
8100 0, // cuda_device
8101 0, // cuda_constant
8102 0 // cuda_shared
8103};
8104class SPIRTargetInfo : public TargetInfo {
8105public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008106 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8107 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008108 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8109 "SPIR target must use unknown OS");
8110 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8111 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008112 TLSSupported = false;
8113 LongWidth = LongAlign = 64;
8114 AddrSpaceMap = &SPIRAddrSpaceMap;
8115 UseAddrSpaceMapMangling = true;
8116 // Define available target features
8117 // These must be defined in sorted order!
8118 NoAsmVariants = true;
8119 }
8120 void getTargetDefines(const LangOptions &Opts,
8121 MacroBuilder &Builder) const override {
8122 DefineStd(Builder, "SPIR", Opts);
8123 }
8124 bool hasFeature(StringRef Feature) const override {
8125 return Feature == "spir";
8126 }
Craig Topper3164f332014-03-11 03:39:26 +00008127
Craig Topper6c03a542015-10-19 04:51:35 +00008128 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008129 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008130 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008131 bool validateAsmConstraint(const char *&Name,
8132 TargetInfo::ConstraintInfo &info) const override {
8133 return true;
8134 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008135 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8136 return None;
8137 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008138 BuiltinVaListKind getBuiltinVaListKind() const override {
8139 return TargetInfo::VoidPtrBuiltinVaList;
8140 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008141
Eric Christopherc48497a2015-09-18 21:26:24 +00008142 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008143 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8144 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008145 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008146
Eric Christopherc48497a2015-09-18 21:26:24 +00008147 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8148 return CC_SpirFunction;
8149 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008150
8151 void setSupportedOpenCLOpts() override {
8152 // Assume all OpenCL extensions and optional core features are supported
8153 // for SPIR since it is a generic target.
8154 getSupportedOpenCLOpts().setAll();
8155 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008156};
Guy Benyeib798fc92012-12-11 21:38:14 +00008157
Eric Christopherc48497a2015-09-18 21:26:24 +00008158class SPIR32TargetInfo : public SPIRTargetInfo {
8159public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008160 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8161 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008162 PointerWidth = PointerAlign = 32;
8163 SizeType = TargetInfo::UnsignedInt;
8164 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008165 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8166 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008167 }
8168 void getTargetDefines(const LangOptions &Opts,
8169 MacroBuilder &Builder) const override {
8170 DefineStd(Builder, "SPIR32", Opts);
8171 }
8172};
Guy Benyeib798fc92012-12-11 21:38:14 +00008173
Eric Christopherc48497a2015-09-18 21:26:24 +00008174class SPIR64TargetInfo : public SPIRTargetInfo {
8175public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8177 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008178 PointerWidth = PointerAlign = 64;
8179 SizeType = TargetInfo::UnsignedLong;
8180 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008181 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8182 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008183 }
8184 void getTargetDefines(const LangOptions &Opts,
8185 MacroBuilder &Builder) const override {
8186 DefineStd(Builder, "SPIR64", Opts);
8187 }
8188};
Guy Benyeib798fc92012-12-11 21:38:14 +00008189
Robert Lytton0e076492013-08-13 09:43:10 +00008190class XCoreTargetInfo : public TargetInfo {
8191 static const Builtin::Info BuiltinInfo[];
8192public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8194 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008195 NoAsmVariants = true;
8196 LongLongAlign = 32;
8197 SuitableAlign = 32;
8198 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008199 SizeType = UnsignedInt;
8200 PtrDiffType = SignedInt;
8201 IntPtrType = SignedInt;
8202 WCharType = UnsignedChar;
8203 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008204 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008205 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8206 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008207 }
Craig Topper3164f332014-03-11 03:39:26 +00008208 void getTargetDefines(const LangOptions &Opts,
8209 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008210 Builder.defineMacro("__XS1B__");
8211 }
Craig Topper6c03a542015-10-19 04:51:35 +00008212 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8213 return llvm::makeArrayRef(BuiltinInfo,
8214 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008215 }
Craig Topper3164f332014-03-11 03:39:26 +00008216 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008217 return TargetInfo::VoidPtrBuiltinVaList;
8218 }
Craig Topper3164f332014-03-11 03:39:26 +00008219 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008220 return "";
8221 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008222 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008223 static const char * const GCCRegNames[] = {
8224 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8225 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8226 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008227 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008228 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008229 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8230 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008231 }
Craig Topper3164f332014-03-11 03:39:26 +00008232 bool validateAsmConstraint(const char *&Name,
8233 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008234 return false;
8235 }
Craig Topper3164f332014-03-11 03:39:26 +00008236 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008237 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8238 return (RegNo < 2)? RegNo : -1;
8239 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008240 bool allowsLargerPreferedTypeAlignment() const override {
8241 return false;
8242 }
Robert Lytton0e076492013-08-13 09:43:10 +00008243};
8244
8245const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008246#define BUILTIN(ID, TYPE, ATTRS) \
8247 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8248#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8249 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008250#include "clang/Basic/BuiltinsXCore.def"
8251};
Robert Lytton0e076492013-08-13 09:43:10 +00008252
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008253// x86_32 Android target
8254class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8255public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8257 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008258 SuitableAlign = 32;
8259 LongDoubleWidth = 64;
8260 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8261 }
8262};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008263
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008264// x86_64 Android target
8265class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8266public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8268 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008269 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8270 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008271
8272 bool useFloat128ManglingForLongDouble() const override {
8273 return true;
8274 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008275};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008276
8277// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8278class RenderScript32TargetInfo : public ARMleTargetInfo {
8279public:
8280 RenderScript32TargetInfo(const llvm::Triple &Triple,
8281 const TargetOptions &Opts)
8282 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8283 Triple.getOSName(),
8284 Triple.getEnvironmentName()),
8285 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008286 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008287 LongWidth = LongAlign = 64;
8288 }
8289 void getTargetDefines(const LangOptions &Opts,
8290 MacroBuilder &Builder) const override {
8291 Builder.defineMacro("__RENDERSCRIPT__");
8292 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8293 }
8294};
8295
8296// 64-bit RenderScript is aarch64
8297class RenderScript64TargetInfo : public AArch64leTargetInfo {
8298public:
8299 RenderScript64TargetInfo(const llvm::Triple &Triple,
8300 const TargetOptions &Opts)
8301 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8302 Triple.getOSName(),
8303 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008304 Opts) {
8305 IsRenderScriptTarget = true;
8306 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008307
8308 void getTargetDefines(const LangOptions &Opts,
8309 MacroBuilder &Builder) const override {
8310 Builder.defineMacro("__RENDERSCRIPT__");
8311 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8312 }
8313};
8314
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008315} // end anonymous namespace
8316
Chris Lattner5ba61f02006-10-14 07:39:34 +00008317//===----------------------------------------------------------------------===//
8318// Driver code
8319//===----------------------------------------------------------------------===//
8320
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8322 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008323 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008324
Daniel Dunbar52322032009-08-18 05:47:58 +00008325 switch (Triple.getArch()) {
8326 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008327 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008328
Tim Northover2a0783d2014-05-30 14:14:07 +00008329 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008330 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008331
8332 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008333 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008334
Jacques Pienaard964cc22016-03-28 21:02:54 +00008335 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008336 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008337
Tim Northover2a0783d2014-05-30 14:14:07 +00008338 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008339 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008340 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008341
8342 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008343 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008344 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008345 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008346 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008347 case llvm::Triple::Fuchsia:
8348 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008349 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008350 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008351 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008352 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008353 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008354 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008355 }
8356
Christian Pirker9b019ae2014-02-25 13:51:00 +00008357 case llvm::Triple::aarch64_be:
8358 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008359 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008361 case llvm::Triple::Fuchsia:
8362 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008363 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008364 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008365 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008367 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008368 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008369 }
8370
Daniel Dunbar52322032009-08-18 05:47:58 +00008371 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008372 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008373 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008375
Daniel Dunbar52322032009-08-18 05:47:58 +00008376 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008377 case llvm::Triple::CloudABI:
8378 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008379 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008381 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008383 case llvm::Triple::Fuchsia:
8384 return new FuchsiaTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008385 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008387 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008389 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008391 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008393 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008395 case llvm::Triple::Win32:
8396 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008397 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008399 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008401 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008403 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008404 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008406 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008407 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008409 }
8410
8411 case llvm::Triple::armeb:
8412 case llvm::Triple::thumbeb:
8413 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008414 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008415
8416 switch (os) {
8417 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008419 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008421 case llvm::Triple::Fuchsia:
8422 return new FuchsiaTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008423 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008425 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008426 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008427 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008428 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008429 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008431 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008432 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008433 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008435 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008436
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008437 case llvm::Triple::bpfeb:
8438 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008440
Daniel Dunbar52322032009-08-18 05:47:58 +00008441 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008443
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008444 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008445 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008446 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008447 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008448 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008449 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008450 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008451 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008452 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008453 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008454 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008455 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008456 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008457
8458 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008459 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008460 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008461 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008462 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008463 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008464 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008465 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008466 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008467 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008468 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008469 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008470 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008471 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008472 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008473
Akira Hatanakabef17452011-09-20 19:21:49 +00008474 case llvm::Triple::mips64:
8475 switch (os) {
8476 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008477 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008478 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008479 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008480 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008481 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008482 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008483 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008484 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008485 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008486 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008487 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008488 }
8489
8490 case llvm::Triple::mips64el:
8491 switch (os) {
8492 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008493 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008494 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008495 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008496 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008497 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008498 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008499 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008500 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008501 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008502 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008503 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008504 }
8505
Ivan Krasindd7403e2011-08-24 20:22:22 +00008506 case llvm::Triple::le32:
8507 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008508 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008510 default:
8511 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008512 }
8513
JF Bastien643817d2014-09-12 17:52:47 +00008514 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008516
Daniel Dunbar52322032009-08-18 05:47:58 +00008517 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008518 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008520 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008521 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008522 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008523 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008524 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008525 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008527 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008528 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008529 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008530 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008531 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008532 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008533 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008534
8535 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008536 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008538 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008539 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008540 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008541 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008542 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008543 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008545 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008546 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008547 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008548 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008549 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008550
Bill Schmidt778d3872013-07-26 01:36:11 +00008551 case llvm::Triple::ppc64le:
8552 switch (os) {
8553 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008555 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008557 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008559 }
8560
Peter Collingbournec947aae2012-05-20 23:28:41 +00008561 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008563 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008564 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008565
Tom Stellardd8e38a32015-01-06 20:34:47 +00008566 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008567 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008569
Daniel Dunbar52322032009-08-18 05:47:58 +00008570 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008571 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008572 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008573 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008574 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008575 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008576 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008577 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008578 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008579 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008580 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008581 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008582 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008584 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008585
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008586 // The 'sparcel' architecture copies all the above cases except for Solaris.
8587 case llvm::Triple::sparcel:
8588 switch (os) {
8589 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008590 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008591 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008592 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008593 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008594 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008595 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008596 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008597 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008599 }
8600
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008601 case llvm::Triple::sparcv9:
8602 switch (os) {
8603 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008604 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008605 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008606 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008607 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008609 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008611 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008612 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008613 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008615 }
8616
Ulrich Weigand47445072013-05-06 16:26:41 +00008617 case llvm::Triple::systemz:
8618 switch (os) {
8619 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008620 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008621 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008622 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008623 }
8624
Eli Friedmana9c3d712009-08-19 20:47:07 +00008625 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008626 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008627
Daniel Dunbar52322032009-08-18 05:47:58 +00008628 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008629 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008630 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008631
Daniel Dunbar52322032009-08-18 05:47:58 +00008632 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008633 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008634 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008635 case llvm::Triple::Linux: {
8636 switch (Triple.getEnvironment()) {
8637 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008638 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008639 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008640 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008641 }
8642 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008643 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008644 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008645 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008646 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008647 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008648 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008649 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008650 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008651 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008652 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008653 case llvm::Triple::Fuchsia:
8654 return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008655 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008656 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008657 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008658 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008659 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008660 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008661 case llvm::Triple::Win32: {
8662 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008663 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008664 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008665 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008666 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008667 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008668 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008669 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008670 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008671 }
8672 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008673 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008674 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008675 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008676 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008677 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008678 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008679 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008680 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008681 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008682 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008683 }
8684
8685 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008686 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008687 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008688
Daniel Dunbar52322032009-08-18 05:47:58 +00008689 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008690 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008691 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008692 case llvm::Triple::Linux: {
8693 switch (Triple.getEnvironment()) {
8694 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008695 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008696 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008697 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008698 }
8699 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008700 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008701 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008702 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008703 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008704 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008705 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008706 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008707 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008708 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008709 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008710 case llvm::Triple::Fuchsia:
8711 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008712 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008713 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008714 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008715 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008716 case llvm::Triple::Win32: {
8717 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008718 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008719 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008720 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008721 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008722 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008723 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008724 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008725 }
8726 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008727 case llvm::Triple::Haiku:
8728 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008729 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008730 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008731 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008732 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008733 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008734 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008735 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008736
Douglas Katzman78d7c542015-05-12 21:18:10 +00008737 case llvm::Triple::spir: {
8738 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8739 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8740 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008741 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008742 }
8743 case llvm::Triple::spir64: {
8744 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8745 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8746 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008747 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008748 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008749 case llvm::Triple::wasm32:
8750 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8751 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008752 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008753 case llvm::Triple::wasm64:
8754 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8755 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008756 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008757
8758 case llvm::Triple::renderscript32:
8759 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8760 case llvm::Triple::renderscript64:
8761 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008762 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008763}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008764
8765/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008766/// options.
Alp Toker80758082014-07-06 05:26:44 +00008767TargetInfo *
8768TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008769 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008770 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008771
8772 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008773 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008774 if (!Target) {
8775 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008776 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008777 }
Alp Toker80758082014-07-06 05:26:44 +00008778 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008779
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008780 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008781 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8782 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008783 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008784 }
8785
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008786 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008787 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8788 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008789 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008790 }
8791
Rafael Espindolaeb265472013-08-21 21:59:03 +00008792 // Set the fp math unit.
8793 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8794 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008795 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008796 }
8797
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008798 // Compute the default target features, we need the target to handle this
8799 // because features may have dependencies on one another.
8800 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008801 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8802 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008803 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008804
8805 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008806 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008807 for (const auto &F : Features)
8808 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8809
Eric Christopher3ff21b32013-10-16 21:26:26 +00008810 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008811 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008812
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008813 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00008814 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008815
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008816 if (!Target->validateTarget(Diags))
8817 return nullptr;
8818
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008819 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008820}