blob: 0fecdceafffa4df2cd09471386bed4ad8283cbe1 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +0000809 // RegParmMax is inherited from the underlying architecture
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000873
Ulrich Weigand8afad612014-07-28 13:17:52 +0000874protected:
875 std::string ABI;
876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000878 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000879 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
880 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000881 HasBPERMD(false), HasExtDiv(false) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000882 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001161 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001162 // TODO: Finish this list and add an assert that we've handled them
1163 // all.
1164 }
Eric Christopher02c33352015-08-25 00:59:11 +00001165
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001166 return true;
1167}
1168
Chris Lattnerecd49032009-03-02 22:27:17 +00001169/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1170/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001171void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001172 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001173 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001175 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001177 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001179 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001181 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001183 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001184 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001185
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001187 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1188 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 } else {
1190 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1191 getTriple().getOS() != llvm::Triple::OpenBSD)
1192 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001193 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194
Ulrich Weigand8afad612014-07-28 13:17:52 +00001195 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001196 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 Builder.defineMacro("_CALL_ELF", "1");
1198 if (ABI == "elfv2")
1199 Builder.defineMacro("_CALL_ELF", "2");
1200
Chris Lattnerecd49032009-03-02 22:27:17 +00001201 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1203 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001204
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001206 if (LongDoubleWidth == 128)
1207 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001208
John Thompsone467e192009-11-19 17:18:50 +00001209 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__VEC__", "10206");
1211 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001212 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001213
1214 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1216 .Case("440", ArchDefineName)
1217 .Case("450", ArchDefineName | ArchDefine440)
1218 .Case("601", ArchDefineName)
1219 .Case("602", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603", ArchDefineName | ArchDefinePpcgr)
1221 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1223 .Case("604", ArchDefineName | ArchDefinePpcgr)
1224 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1225 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001226 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001227 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1228 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1229 .Case("750", ArchDefineName | ArchDefinePpcgr)
1230 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001232 .Case("a2", ArchDefineA2)
1233 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001234 .Case("pwr3", ArchDefinePpcgr)
1235 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1237 | ArchDefinePpcsq)
1238 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1239 | ArchDefinePpcgr | ArchDefinePpcsq)
1240 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1241 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1243 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1244 | ArchDefinePpcsq)
1245 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1246 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001247 | ArchDefinePpcgr | ArchDefinePpcsq)
1248 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1249 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1250 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001251 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1252 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1253 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1254 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power3", ArchDefinePpcgr)
1256 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1257 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1258 | ArchDefinePpcsq)
1259 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1260 | ArchDefinePpcgr | ArchDefinePpcsq)
1261 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1262 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1264 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1265 | ArchDefinePpcsq)
1266 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1267 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001268 | ArchDefinePpcgr | ArchDefinePpcsq)
1269 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1270 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1271 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001272 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1273 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1274 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1275 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001276 .Default(ArchDefineNone);
1277
1278 if (defs & ArchDefineName)
1279 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1280 if (defs & ArchDefinePpcgr)
1281 Builder.defineMacro("_ARCH_PPCGR");
1282 if (defs & ArchDefinePpcsq)
1283 Builder.defineMacro("_ARCH_PPCSQ");
1284 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001285 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001286 if (defs & ArchDefine603)
1287 Builder.defineMacro("_ARCH_603");
1288 if (defs & ArchDefine604)
1289 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001290 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001291 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5x)
1295 Builder.defineMacro("_ARCH_PWR5X");
1296 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001297 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001298 if (defs & ArchDefinePwr6x)
1299 Builder.defineMacro("_ARCH_PWR6X");
1300 if (defs & ArchDefinePwr7)
1301 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001302 if (defs & ArchDefinePwr8)
1303 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001304 if (defs & ArchDefinePwr9)
1305 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001306 if (defs & ArchDefineA2)
1307 Builder.defineMacro("_ARCH_A2");
1308 if (defs & ArchDefineA2q) {
1309 Builder.defineMacro("_ARCH_A2Q");
1310 Builder.defineMacro("_ARCH_QP");
1311 }
1312
1313 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1314 Builder.defineMacro("__bg__");
1315 Builder.defineMacro("__THW_BLUEGENE__");
1316 Builder.defineMacro("__bgq__");
1317 Builder.defineMacro("__TOS_BGQ__");
1318 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001319
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001320 if (HasVSX)
1321 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001322 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001323 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001324 if (HasP8Crypto)
1325 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001326 if (HasHTM)
1327 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001328 if (HasFloat128)
1329 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001330
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1334 if (PointerWidth == 64)
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001336
Bill Schmidt38378a02013-02-01 20:23:10 +00001337 // FIXME: The following are not yet generated here by Clang, but are
1338 // generated by GCC:
1339 //
1340 // _SOFT_FLOAT_
1341 // __RECIP_PRECISION__
1342 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001343 // __RECIP__
1344 // __RECIPF__
1345 // __RSQRTE__
1346 // __RSQRTEF__
1347 // _SOFT_DOUBLE_
1348 // __NO_LWSYNC__
1349 // __HAVE_BSWAP__
1350 // __LONGDOUBLE128
1351 // __CMODEL_MEDIUM__
1352 // __CMODEL_LARGE__
1353 // _CALL_SYSV
1354 // _CALL_DARWIN
1355 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001356}
1357
Eric Christophera8a14c32015-08-31 18:39:16 +00001358// Handle explicit options being passed to the compiler here: if we've
1359// explicitly turned off vsx and turned on power8-vector or direct-move then
1360// go ahead and error since the customer has expressed a somewhat incompatible
1361// set of options.
1362static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001363 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001364
1365 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1366 FeaturesVec.end()) {
1367 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1368 FeaturesVec.end()) {
1369 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1370 << "-mno-vsx";
1371 return false;
1372 }
1373
1374 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1375 FeaturesVec.end()) {
1376 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1377 << "-mno-vsx";
1378 return false;
1379 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001380
1381 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1382 FeaturesVec.end()) {
1383 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1384 << "-mno-vsx";
1385 return false;
1386 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001387 }
1388
1389 return true;
1390}
1391
Eric Christopher8c47b422015-10-09 18:39:55 +00001392bool PPCTargetInfo::initFeatureMap(
1393 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1394 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001395 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1396 .Case("7400", true)
1397 .Case("g4", true)
1398 .Case("7450", true)
1399 .Case("g4+", true)
1400 .Case("970", true)
1401 .Case("g5", true)
1402 .Case("pwr6", true)
1403 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001404 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001405 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001406 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001407 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001408 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001409
1410 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001411 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001414 .Case("pwr8", true)
1415 .Default(false);
1416 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1417 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001418 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001419 .Case("pwr8", true)
1420 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001421 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1422 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001423 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001424 .Case("pwr8", true)
1425 .Case("pwr7", true)
1426 .Default(false);
1427 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001430 .Case("pwr8", true)
1431 .Case("pwr7", true)
1432 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001433 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1434 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001435 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001436 .Case("pwr8", true)
1437 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001438 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1439 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001440 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001441 .Case("pwr8", true)
1442 .Case("pwr7", true)
1443 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001444
Eric Christophera8a14c32015-08-31 18:39:16 +00001445 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1446 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001447
Eric Christopher007b0a02015-08-28 22:32:01 +00001448 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001449}
1450
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001451bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001452 return llvm::StringSwitch<bool>(Feature)
1453 .Case("powerpc", true)
1454 .Case("vsx", HasVSX)
1455 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001456 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001457 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001458 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001459 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001460 .Case("bpermd", HasBPERMD)
1461 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001462 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001463 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001464}
Chris Lattner17df24e2008-04-21 18:56:49 +00001465
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001466void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1467 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001468 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1469 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1470 // incompatible options.
1471 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001472 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001473 Features[Name] = Features["vsx"] = true;
1474 } else if (Name == "power8-vector") {
1475 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001476 } else if (Name == "float128") {
1477 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001478 } else {
1479 Features[Name] = true;
1480 }
1481 } else {
1482 if (Name == "vsx") {
1483 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001484 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 } else {
1486 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001487 }
1488 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001489}
1490
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001491const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1494 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1495 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1496 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1497 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1498 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1499 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001500 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001501 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001502 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001503 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1504 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1505 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1506 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507 "vrsave", "vscr",
1508 "spe_acc", "spefscr",
1509 "sfp"
1510};
Chris Lattner10a5b382007-01-29 05:24:35 +00001511
Craig Topperf054e3a2015-10-19 03:52:27 +00001512ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1513 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001514}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001515
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001516const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1517 // While some of these aliases do map to different registers
1518 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001519 { { "0" }, "r0" },
1520 { { "1"}, "r1" },
1521 { { "2" }, "r2" },
1522 { { "3" }, "r3" },
1523 { { "4" }, "r4" },
1524 { { "5" }, "r5" },
1525 { { "6" }, "r6" },
1526 { { "7" }, "r7" },
1527 { { "8" }, "r8" },
1528 { { "9" }, "r9" },
1529 { { "10" }, "r10" },
1530 { { "11" }, "r11" },
1531 { { "12" }, "r12" },
1532 { { "13" }, "r13" },
1533 { { "14" }, "r14" },
1534 { { "15" }, "r15" },
1535 { { "16" }, "r16" },
1536 { { "17" }, "r17" },
1537 { { "18" }, "r18" },
1538 { { "19" }, "r19" },
1539 { { "20" }, "r20" },
1540 { { "21" }, "r21" },
1541 { { "22" }, "r22" },
1542 { { "23" }, "r23" },
1543 { { "24" }, "r24" },
1544 { { "25" }, "r25" },
1545 { { "26" }, "r26" },
1546 { { "27" }, "r27" },
1547 { { "28" }, "r28" },
1548 { { "29" }, "r29" },
1549 { { "30" }, "r30" },
1550 { { "31" }, "r31" },
1551 { { "fr0" }, "f0" },
1552 { { "fr1" }, "f1" },
1553 { { "fr2" }, "f2" },
1554 { { "fr3" }, "f3" },
1555 { { "fr4" }, "f4" },
1556 { { "fr5" }, "f5" },
1557 { { "fr6" }, "f6" },
1558 { { "fr7" }, "f7" },
1559 { { "fr8" }, "f8" },
1560 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001561 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "fr11" }, "f11" },
1563 { { "fr12" }, "f12" },
1564 { { "fr13" }, "f13" },
1565 { { "fr14" }, "f14" },
1566 { { "fr15" }, "f15" },
1567 { { "fr16" }, "f16" },
1568 { { "fr17" }, "f17" },
1569 { { "fr18" }, "f18" },
1570 { { "fr19" }, "f19" },
1571 { { "fr20" }, "f20" },
1572 { { "fr21" }, "f21" },
1573 { { "fr22" }, "f22" },
1574 { { "fr23" }, "f23" },
1575 { { "fr24" }, "f24" },
1576 { { "fr25" }, "f25" },
1577 { { "fr26" }, "f26" },
1578 { { "fr27" }, "f27" },
1579 { { "fr28" }, "f28" },
1580 { { "fr29" }, "f29" },
1581 { { "fr30" }, "f30" },
1582 { { "fr31" }, "f31" },
1583 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001584};
1585
Craig Topperf054e3a2015-10-19 03:52:27 +00001586ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1587 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001588}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001589
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001590class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001592 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1593 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001594 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001595
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001596 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001597 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001598 case llvm::Triple::FreeBSD:
1599 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001600 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001601 PtrDiffType = SignedInt;
1602 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001603 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001604 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001605 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001606 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001607
Roman Divacky3ffe7462012-03-13 19:20:17 +00001608 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1609 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001610 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001611 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001612
1613 // PPC32 supports atomics up to 4 bytes.
1614 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001615 }
1616
Craig Topper3164f332014-03-11 03:39:26 +00001617 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001618 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001619 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001620 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001622
Bill Schmidt778d3872013-07-26 01:36:11 +00001623// Note: ABI differences may eventually require us to have a separate
1624// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001626public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001627 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1628 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001631 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001632
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001633 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001634 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001635 ABI = "elfv2";
1636 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001638 ABI = "elfv1";
1639 }
1640
1641 switch (getTriple().getOS()) {
1642 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001643 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001644 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001645 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001646 case llvm::Triple::NetBSD:
1647 IntMaxType = SignedLongLong;
1648 Int64Type = SignedLongLong;
1649 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001650 default:
1651 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC64 supports atomics up to 8 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001656 }
Craig Topper3164f332014-03-11 03:39:26 +00001657 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001658 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001660 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001661 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001662 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001663 ABI = Name;
1664 return true;
1665 }
1666 return false;
1667 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001669
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001672 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1673 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001674 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001675 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001676 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001677 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001678 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001680 }
Craig Topper3164f332014-03-11 03:39:26 +00001681 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001682 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001683 }
1684};
1685
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001686class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001687public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001688 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1689 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001691 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001692 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 }
1694};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001695
Eric Christopherc48497a2015-09-18 21:26:24 +00001696static const unsigned NVPTXAddrSpaceMap[] = {
1697 1, // opencl_global
1698 3, // opencl_local
1699 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001700 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001701 0, // opencl_generic
1702 1, // cuda_device
1703 4, // cuda_constant
1704 3, // cuda_shared
1705};
1706
1707class NVPTXTargetInfo : public TargetInfo {
1708 static const char *const GCCRegNames[];
1709 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001710 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001711
Eric Christopherc48497a2015-09-18 21:26:24 +00001712public:
Justin Lebar76945b22016-04-29 23:05:19 +00001713 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001714 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001715 BigEndian = false;
1716 TLSSupported = false;
1717 LongWidth = LongAlign = 64;
1718 AddrSpaceMap = &NVPTXAddrSpaceMap;
1719 UseAddrSpaceMapMangling = true;
1720 // Define available target features
1721 // These must be defined in sorted order!
1722 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001723 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001724
1725 // If possible, get a TargetInfo for our host triple, so we can match its
1726 // types.
1727 llvm::Triple HostTriple(Opts.HostTriple);
1728 if (HostTriple.isNVPTX())
1729 return;
1730 std::unique_ptr<TargetInfo> HostTarget(
1731 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1732 if (!HostTarget) {
1733 return;
1734 }
1735
1736 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1737 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1738 BoolWidth = HostTarget->getBoolWidth();
1739 BoolAlign = HostTarget->getBoolAlign();
1740 IntWidth = HostTarget->getIntWidth();
1741 IntAlign = HostTarget->getIntAlign();
1742 HalfWidth = HostTarget->getHalfWidth();
1743 HalfAlign = HostTarget->getHalfAlign();
1744 FloatWidth = HostTarget->getFloatWidth();
1745 FloatAlign = HostTarget->getFloatAlign();
1746 DoubleWidth = HostTarget->getDoubleWidth();
1747 DoubleAlign = HostTarget->getDoubleAlign();
1748 LongWidth = HostTarget->getLongWidth();
1749 LongAlign = HostTarget->getLongAlign();
1750 LongLongWidth = HostTarget->getLongLongWidth();
1751 LongLongAlign = HostTarget->getLongLongAlign();
1752 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1753 DefaultAlignForAttributeAligned =
1754 HostTarget->getDefaultAlignForAttributeAligned();
1755 SizeType = HostTarget->getSizeType();
1756 IntMaxType = HostTarget->getIntMaxType();
1757 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1758 IntPtrType = HostTarget->getIntPtrType();
1759 WCharType = HostTarget->getWCharType();
1760 WIntType = HostTarget->getWIntType();
1761 Char16Type = HostTarget->getChar16Type();
1762 Char32Type = HostTarget->getChar32Type();
1763 Int64Type = HostTarget->getInt64Type();
1764 SigAtomicType = HostTarget->getSigAtomicType();
1765 ProcessIDType = HostTarget->getProcessIDType();
1766
1767 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1768 UseZeroLengthBitfieldAlignment =
1769 HostTarget->useZeroLengthBitfieldAlignment();
1770 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1771 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1772
1773 // Properties intentionally not copied from host:
1774 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1775 // host/device boundary.
1776 // - SuitableAlign: Not visible across the host/device boundary, and may
1777 // correctly be different on host/device, e.g. if host has wider vector
1778 // types than device.
1779 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1780 // as its double type, but that's not necessarily true on the host.
1781 // TODO: nvcc emits a warning when using long double on device; we should
1782 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 }
1784 void getTargetDefines(const LangOptions &Opts,
1785 MacroBuilder &Builder) const override {
1786 Builder.defineMacro("__PTX__");
1787 Builder.defineMacro("__NVPTX__");
1788 if (Opts.CUDAIsDevice) {
1789 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001790 std::string CUDAArchCode = [this] {
1791 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001792 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001793 assert(false && "No GPU arch when compiling CUDA device code.");
1794 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001795 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001796 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001797 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001798 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "620";
1819 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001820 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001821 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001822 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001823 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001824 }
Craig Topper6c03a542015-10-19 04:51:35 +00001825 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1826 return llvm::makeArrayRef(BuiltinInfo,
1827 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
1829 bool hasFeature(StringRef Feature) const override {
1830 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001831 }
1832
Craig Topperf054e3a2015-10-19 03:52:27 +00001833 ArrayRef<const char *> getGCCRegNames() const override;
1834 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001835 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001836 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001837 }
1838 bool validateAsmConstraint(const char *&Name,
1839 TargetInfo::ConstraintInfo &Info) const override {
1840 switch (*Name) {
1841 default:
1842 return false;
1843 case 'c':
1844 case 'h':
1845 case 'r':
1846 case 'l':
1847 case 'f':
1848 case 'd':
1849 Info.setAllowsRegister();
1850 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001851 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
1853 const char *getClobbers() const override {
1854 // FIXME: Is this really right?
1855 return "";
1856 }
1857 BuiltinVaListKind getBuiltinVaListKind() const override {
1858 // FIXME: implement
1859 return TargetInfo::CharPtrBuiltinVaList;
1860 }
1861 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001862 GPU = StringToCudaArch(Name);
1863 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001864 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001865 void setSupportedOpenCLOpts() override {
1866 auto &Opts = getSupportedOpenCLOpts();
1867 Opts.cl_clang_storage_class_specifiers = 1;
1868 Opts.cl_khr_gl_sharing = 1;
1869 Opts.cl_khr_icd = 1;
1870
1871 Opts.cl_khr_fp64 = 1;
1872 Opts.cl_khr_byte_addressable_store = 1;
1873 Opts.cl_khr_global_int32_base_atomics = 1;
1874 Opts.cl_khr_global_int32_extended_atomics = 1;
1875 Opts.cl_khr_local_int32_base_atomics = 1;
1876 Opts.cl_khr_local_int32_extended_atomics = 1;
1877 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001878};
1879
1880const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1881#define BUILTIN(ID, TYPE, ATTRS) \
1882 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1884 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1885#include "clang/Basic/BuiltinsNVPTX.def"
1886};
1887
1888const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1889
Craig Topperf054e3a2015-10-19 03:52:27 +00001890ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1891 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001892}
1893
1894class NVPTX32TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001898 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 PointerWidth = PointerAlign = 32;
1900 SizeType = TargetInfo::UnsignedInt;
1901 PtrDiffType = TargetInfo::SignedInt;
1902 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001903 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
1905};
1906
1907class NVPTX64TargetInfo : public NVPTXTargetInfo {
1908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001909 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1910 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 PointerWidth = PointerAlign = 64;
1912 SizeType = TargetInfo::UnsignedLong;
1913 PtrDiffType = TargetInfo::SignedLong;
1914 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001915 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001916 }
1917};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001918
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001919static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001920 1, // opencl_global
1921 3, // opencl_local
1922 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001923 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // cuda_device
1925 2, // cuda_constant
1926 3 // cuda_shared
1927};
1928
Tom Stellarda96344b2014-08-21 13:58:40 +00001929// If you edit the description strings, make sure you update
1930// getPointerWidthV().
1931
Craig Topper273dbc62015-10-18 05:29:26 +00001932static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001933 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1934 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001937 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001938 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1939 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001940
Matt Arsenault250024f2016-06-08 01:56:42 +00001941class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001942 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001943 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001944
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001945 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 enum GPUKind {
1947 GK_NONE,
1948 GK_R600,
1949 GK_R600_DOUBLE_OPS,
1950 GK_R700,
1951 GK_R700_DOUBLE_OPS,
1952 GK_EVERGREEN,
1953 GK_EVERGREEN_DOUBLE_OPS,
1954 GK_NORTHERN_ISLANDS,
1955 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001956 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001957 GK_SEA_ISLANDS,
1958 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959 } GPU;
1960
Jan Veselyeebeaea2015-05-04 19:53:36 +00001961 bool hasFP64:1;
1962 bool hasFMAF:1;
1963 bool hasLDEXPF:1;
Yaxun Liu2c17e822016-08-09 19:43:38 +00001964 bool hasDenormSupport:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001965
Matt Arsenault250024f2016-06-08 01:56:42 +00001966 static bool isAMDGCN(const llvm::Triple &TT) {
1967 return TT.getArch() == llvm::Triple::amdgcn;
1968 }
1969
Eli Friedmand13b41e2012-10-12 23:32:00 +00001970public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001971 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001972 : TargetInfo(Triple) ,
1973 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1974 hasFP64(false),
1975 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001976 hasLDEXPF(false),
1977 hasDenormSupport(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001979 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001980 hasFMAF = true;
1981 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001982 }
Yaxun Liu2c17e822016-08-09 19:43:38 +00001983 if (Opts.CPU == "fiji")
1984 hasDenormSupport = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00001985
1986 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1987 DataLayoutStringSI : DataLayoutStringR600);
1988
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001989 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001990 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 }
1992
Tom Stellarda96344b2014-08-21 13:58:40 +00001993 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1994 if (GPU <= GK_CAYMAN)
1995 return 32;
1996
1997 switch(AddrSpace) {
1998 default:
1999 return 64;
2000 case 0:
2001 case 3:
2002 case 5:
2003 return 32;
2004 }
2005 }
2006
Craig Topper3164f332014-03-11 03:39:26 +00002007 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002008 return "";
2009 }
2010
Craig Topperf054e3a2015-10-19 03:52:27 +00002011 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002012
Craig Topperf054e3a2015-10-19 03:52:27 +00002013 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2014 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002015 }
2016
Craig Topper3164f332014-03-11 03:39:26 +00002017 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002018 TargetInfo::ConstraintInfo &Info) const override {
2019 switch (*Name) {
2020 default: break;
2021 case 'v': // vgpr
2022 case 's': // sgpr
2023 Info.setAllowsRegister();
2024 return true;
2025 }
2026 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002027 }
2028
Matt Arsenault250024f2016-06-08 01:56:42 +00002029 bool initFeatureMap(llvm::StringMap<bool> &Features,
2030 DiagnosticsEngine &Diags, StringRef CPU,
2031 const std::vector<std::string> &FeatureVec) const override;
2032
Yaxun Liu2c17e822016-08-09 19:43:38 +00002033 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2034 TargetOptions &TargetOpts) const override {
2035 if (!hasDenormSupport)
2036 return;
2037 bool hasFP32Denormals = false;
2038 bool hasFP64Denormals = false;
2039 for (auto &I : TargetOpts.FeaturesAsWritten) {
2040 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2041 hasFP32Denormals = true;
2042 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2043 hasFP64Denormals = true;
2044 }
2045 if (!hasFP32Denormals)
2046 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2047 Twine("fp32-denormals")).str());
2048 if (!hasFP64Denormals && hasFP64)
2049 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2050 Twine("fp64-denormals")).str());
2051 }
2052
Craig Topper6c03a542015-10-19 04:51:35 +00002053 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2054 return llvm::makeArrayRef(BuiltinInfo,
2055 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002056 }
2057
Craig Topper3164f332014-03-11 03:39:26 +00002058 void getTargetDefines(const LangOptions &Opts,
2059 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002060 if (getTriple().getArch() == llvm::Triple::amdgcn)
2061 Builder.defineMacro("__AMDGCN__");
2062 else
2063 Builder.defineMacro("__R600__");
2064
Jan Veselyeebeaea2015-05-04 19:53:36 +00002065 if (hasFMAF)
2066 Builder.defineMacro("__HAS_FMAF__");
2067 if (hasLDEXPF)
2068 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002069 if (hasFP64)
2070 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002071 }
2072
Craig Topper3164f332014-03-11 03:39:26 +00002073 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074 return TargetInfo::CharPtrBuiltinVaList;
2075 }
2076
Matt Arsenault250024f2016-06-08 01:56:42 +00002077 static GPUKind parseR600Name(StringRef Name) {
2078 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002079 .Case("r600" , GK_R600)
2080 .Case("rv610", GK_R600)
2081 .Case("rv620", GK_R600)
2082 .Case("rv630", GK_R600)
2083 .Case("rv635", GK_R600)
2084 .Case("rs780", GK_R600)
2085 .Case("rs880", GK_R600)
2086 .Case("rv670", GK_R600_DOUBLE_OPS)
2087 .Case("rv710", GK_R700)
2088 .Case("rv730", GK_R700)
2089 .Case("rv740", GK_R700_DOUBLE_OPS)
2090 .Case("rv770", GK_R700_DOUBLE_OPS)
2091 .Case("palm", GK_EVERGREEN)
2092 .Case("cedar", GK_EVERGREEN)
2093 .Case("sumo", GK_EVERGREEN)
2094 .Case("sumo2", GK_EVERGREEN)
2095 .Case("redwood", GK_EVERGREEN)
2096 .Case("juniper", GK_EVERGREEN)
2097 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2098 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2099 .Case("barts", GK_NORTHERN_ISLANDS)
2100 .Case("turks", GK_NORTHERN_ISLANDS)
2101 .Case("caicos", GK_NORTHERN_ISLANDS)
2102 .Case("cayman", GK_CAYMAN)
2103 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002104 .Default(GK_NONE);
2105 }
2106
2107 static GPUKind parseAMDGCNName(StringRef Name) {
2108 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellard785699322013-04-01 20:56:49 +00002109 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002110 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2111 .Case("verde", GK_SOUTHERN_ISLANDS)
2112 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002113 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002114 .Case("bonaire", GK_SEA_ISLANDS)
2115 .Case("kabini", GK_SEA_ISLANDS)
2116 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002117 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002118 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002119 .Case("tonga", GK_VOLCANIC_ISLANDS)
2120 .Case("iceland", GK_VOLCANIC_ISLANDS)
2121 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002122 .Case("fiji", GK_VOLCANIC_ISLANDS)
2123 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002124 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002125 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002126
Matt Arsenault250024f2016-06-08 01:56:42 +00002127 bool setCPU(const std::string &Name) override {
2128 if (getTriple().getArch() == llvm::Triple::amdgcn)
2129 GPU = parseAMDGCNName(Name);
2130 else
2131 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002132
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002134 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002135
Jan Vesely211ba782016-06-17 02:25:03 +00002136 void setSupportedOpenCLOpts() override {
2137 auto &Opts = getSupportedOpenCLOpts();
2138 Opts.cl_clang_storage_class_specifiers = 1;
2139 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002140
Jan Vesely211ba782016-06-17 02:25:03 +00002141 if (hasFP64)
2142 Opts.cl_khr_fp64 = 1;
2143 if (GPU >= GK_EVERGREEN) {
2144 Opts.cl_khr_byte_addressable_store = 1;
2145 Opts.cl_khr_global_int32_base_atomics = 1;
2146 Opts.cl_khr_global_int32_extended_atomics = 1;
2147 Opts.cl_khr_local_int32_base_atomics = 1;
2148 Opts.cl_khr_local_int32_extended_atomics = 1;
2149 }
2150 if (GPU >= GK_SOUTHERN_ISLANDS) {
2151 Opts.cl_khr_fp16 = 1;
2152 Opts.cl_khr_int64_base_atomics = 1;
2153 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002154 Opts.cl_khr_mipmap_image = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002155 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002156 Opts.cl_amd_media_ops = 1;
2157 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002158 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002159 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002160
Yaxun Liu99444cb2016-08-03 20:38:06 +00002161 LangAS::ID getOpenCLImageAddrSpace() const override {
2162 return LangAS::opencl_constant;
2163 }
2164
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002165 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2166 switch (CC) {
2167 default:
2168 return CCCR_Warning;
2169 case CC_C:
2170 case CC_OpenCLKernel:
2171 return CCCR_OK;
2172 }
2173 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002174};
2175
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002176const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002177#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002178 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002179#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2180 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002181#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002182};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002183const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002184 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2185 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2186 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2187 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2188 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2189 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2190 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2191 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2192 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2193 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2194 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2195 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2196 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2197 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2198 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2199 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2200 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2201 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2202 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2203 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2204 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2205 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2206 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2207 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2208 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2209 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2210 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2211 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2212 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2213 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2214 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2215 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2216 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2217 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2218 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2219 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2220 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2221 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2222 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2223 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2224 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2225 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2226 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2227 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2228 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2229 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2230 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002231 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002232 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2233 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002234};
2235
Craig Topperf054e3a2015-10-19 03:52:27 +00002236ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2237 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002238}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002239
Matt Arsenault250024f2016-06-08 01:56:42 +00002240bool AMDGPUTargetInfo::initFeatureMap(
2241 llvm::StringMap<bool> &Features,
2242 DiagnosticsEngine &Diags, StringRef CPU,
2243 const std::vector<std::string> &FeatureVec) const {
2244
2245 // XXX - What does the member GPU mean if device name string passed here?
2246 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2247 if (CPU.empty())
2248 CPU = "tahiti";
2249
2250 switch (parseAMDGCNName(CPU)) {
2251 case GK_SOUTHERN_ISLANDS:
2252 case GK_SEA_ISLANDS:
2253 break;
2254
2255 case GK_VOLCANIC_ISLANDS:
2256 Features["s-memrealtime"] = true;
2257 Features["16-bit-insts"] = true;
2258 break;
2259
2260 case GK_NONE:
2261 return false;
2262 default:
2263 llvm_unreachable("unhandled subtarget");
2264 }
2265 } else {
2266 if (CPU.empty())
2267 CPU = "r600";
2268
2269 switch (parseR600Name(CPU)) {
2270 case GK_R600:
2271 case GK_R700:
2272 case GK_EVERGREEN:
2273 case GK_NORTHERN_ISLANDS:
2274 break;
2275 case GK_R600_DOUBLE_OPS:
2276 case GK_R700_DOUBLE_OPS:
2277 case GK_EVERGREEN_DOUBLE_OPS:
2278 case GK_CAYMAN:
2279 Features["fp64"] = true;
2280 break;
2281 case GK_NONE:
2282 return false;
2283 default:
2284 llvm_unreachable("unhandled subtarget");
2285 }
2286 }
2287
2288 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2289}
2290
Eli Friedman3fd920a2008-08-20 02:34:37 +00002291// Namespace for x86 abstract base class
2292const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002293#define BUILTIN(ID, TYPE, ATTRS) \
2294 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002295#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002296 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002297#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002298 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002299#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002300};
Eli Friedmanb5366062008-05-20 14:21:01 +00002301
Nuno Lopescfca1f02009-12-23 17:49:57 +00002302static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002303 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2304 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002305 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002306 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2307 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2308 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002309 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002310 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2311 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002312 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2313 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2314 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2315 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2316 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2317 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2318 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2319 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002320};
2321
Eric Christophercdd36352011-06-21 00:05:20 +00002322const TargetInfo::AddlRegName AddlRegNames[] = {
2323 { { "al", "ah", "eax", "rax" }, 0 },
2324 { { "bl", "bh", "ebx", "rbx" }, 3 },
2325 { { "cl", "ch", "ecx", "rcx" }, 2 },
2326 { { "dl", "dh", "edx", "rdx" }, 1 },
2327 { { "esi", "rsi" }, 4 },
2328 { { "edi", "rdi" }, 5 },
2329 { { "esp", "rsp" }, 7 },
2330 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002331 { { "r8d", "r8w", "r8b" }, 38 },
2332 { { "r9d", "r9w", "r9b" }, 39 },
2333 { { "r10d", "r10w", "r10b" }, 40 },
2334 { { "r11d", "r11w", "r11b" }, 41 },
2335 { { "r12d", "r12w", "r12b" }, 42 },
2336 { { "r13d", "r13w", "r13b" }, 43 },
2337 { { "r14d", "r14w", "r14b" }, 44 },
2338 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002339};
2340
2341// X86 target abstract base class; x86-32 and x86-64 are very close, so
2342// most of the implementation can be shared.
2343class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002344 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002345 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002346 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002347 enum MMX3DNowEnum {
2348 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002349 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002350 enum XOPEnum {
2351 NoXOP,
2352 SSE4A,
2353 FMA4,
2354 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002355 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002356
Craig Topper543f3bd2015-10-14 23:47:57 +00002357 bool HasAES = false;
2358 bool HasPCLMUL = false;
2359 bool HasLZCNT = false;
2360 bool HasRDRND = false;
2361 bool HasFSGSBASE = false;
2362 bool HasBMI = false;
2363 bool HasBMI2 = false;
2364 bool HasPOPCNT = false;
2365 bool HasRTM = false;
2366 bool HasPRFCHW = false;
2367 bool HasRDSEED = false;
2368 bool HasADX = false;
2369 bool HasTBM = false;
2370 bool HasFMA = false;
2371 bool HasF16C = false;
2372 bool HasAVX512CD = false;
2373 bool HasAVX512ER = false;
2374 bool HasAVX512PF = false;
2375 bool HasAVX512DQ = false;
2376 bool HasAVX512BW = false;
2377 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002378 bool HasAVX512VBMI = false;
2379 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002380 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002381 bool HasMPX = false;
2382 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002383 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002384 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002385 bool HasXSAVE = false;
2386 bool HasXSAVEOPT = false;
2387 bool HasXSAVEC = false;
2388 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002389 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002390 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002391 bool HasCLFLUSHOPT = false;
2392 bool HasPCOMMIT = false;
2393 bool HasCLWB = false;
2394 bool HasUMIP = false;
2395 bool HasMOVBE = false;
2396 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002397
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002398 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2399 ///
2400 /// Each enumeration represents a particular CPU supported by Clang. These
2401 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2402 enum CPUKind {
2403 CK_Generic,
2404
2405 /// \name i386
2406 /// i386-generation processors.
2407 //@{
2408 CK_i386,
2409 //@}
2410
2411 /// \name i486
2412 /// i486-generation processors.
2413 //@{
2414 CK_i486,
2415 CK_WinChipC6,
2416 CK_WinChip2,
2417 CK_C3,
2418 //@}
2419
2420 /// \name i586
2421 /// i586-generation processors, P5 microarchitecture based.
2422 //@{
2423 CK_i586,
2424 CK_Pentium,
2425 CK_PentiumMMX,
2426 //@}
2427
2428 /// \name i686
2429 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2430 //@{
2431 CK_i686,
2432 CK_PentiumPro,
2433 CK_Pentium2,
2434 CK_Pentium3,
2435 CK_Pentium3M,
2436 CK_PentiumM,
2437 CK_C3_2,
2438
2439 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2440 /// Clang however has some logic to suport this.
2441 // FIXME: Warn, deprecate, and potentially remove this.
2442 CK_Yonah,
2443 //@}
2444
2445 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002446 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002447 //@{
2448 CK_Pentium4,
2449 CK_Pentium4M,
2450 CK_Prescott,
2451 CK_Nocona,
2452 //@}
2453
2454 /// \name Core
2455 /// Core microarchitecture based processors.
2456 //@{
2457 CK_Core2,
2458
2459 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2460 /// codename which GCC no longer accepts as an option to -march, but Clang
2461 /// has some logic for recognizing it.
2462 // FIXME: Warn, deprecate, and potentially remove this.
2463 CK_Penryn,
2464 //@}
2465
2466 /// \name Atom
2467 /// Atom processors
2468 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002469 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002470 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002471 //@}
2472
2473 /// \name Nehalem
2474 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002475 CK_Nehalem,
2476
2477 /// \name Westmere
2478 /// Westmere microarchitecture based processors.
2479 CK_Westmere,
2480
2481 /// \name Sandy Bridge
2482 /// Sandy Bridge microarchitecture based processors.
2483 CK_SandyBridge,
2484
2485 /// \name Ivy Bridge
2486 /// Ivy Bridge microarchitecture based processors.
2487 CK_IvyBridge,
2488
2489 /// \name Haswell
2490 /// Haswell microarchitecture based processors.
2491 CK_Haswell,
2492
2493 /// \name Broadwell
2494 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002495 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002496
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002497 /// \name Skylake Client
2498 /// Skylake client microarchitecture based processors.
2499 CK_SkylakeClient,
2500
2501 /// \name Skylake Server
2502 /// Skylake server microarchitecture based processors.
2503 CK_SkylakeServer,
2504
2505 /// \name Cannonlake Client
2506 /// Cannonlake client microarchitecture based processors.
2507 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002508
Craig Topper449314e2013-08-20 07:09:39 +00002509 /// \name Knights Landing
2510 /// Knights Landing processor.
2511 CK_KNL,
2512
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002513 /// \name Lakemont
2514 /// Lakemont microarchitecture based processors.
2515 CK_Lakemont,
2516
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002517 /// \name K6
2518 /// K6 architecture processors.
2519 //@{
2520 CK_K6,
2521 CK_K6_2,
2522 CK_K6_3,
2523 //@}
2524
2525 /// \name K7
2526 /// K7 architecture processors.
2527 //@{
2528 CK_Athlon,
2529 CK_AthlonThunderbird,
2530 CK_Athlon4,
2531 CK_AthlonXP,
2532 CK_AthlonMP,
2533 //@}
2534
2535 /// \name K8
2536 /// K8 architecture processors.
2537 //@{
2538 CK_Athlon64,
2539 CK_Athlon64SSE3,
2540 CK_AthlonFX,
2541 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002542 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002543 CK_Opteron,
2544 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002545 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002546 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002547
Benjamin Kramer569f2152012-01-10 11:50:18 +00002548 /// \name Bobcat
2549 /// Bobcat architecture processors.
2550 //@{
2551 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002552 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002553 //@}
2554
2555 /// \name Bulldozer
2556 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002557 //@{
2558 CK_BDVER1,
2559 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002560 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002561 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002562 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002563
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002564 /// This specification is deprecated and will be removed in the future.
2565 /// Users should prefer \see CK_K8.
2566 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002567 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002568 CK_x86_64,
2569 //@}
2570
2571 /// \name Geode
2572 /// Geode processors.
2573 //@{
2574 CK_Geode
2575 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002576 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002577
Eric Christopherc50738f2015-08-27 00:05:50 +00002578 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002579 return llvm::StringSwitch<CPUKind>(CPU)
2580 .Case("i386", CK_i386)
2581 .Case("i486", CK_i486)
2582 .Case("winchip-c6", CK_WinChipC6)
2583 .Case("winchip2", CK_WinChip2)
2584 .Case("c3", CK_C3)
2585 .Case("i586", CK_i586)
2586 .Case("pentium", CK_Pentium)
2587 .Case("pentium-mmx", CK_PentiumMMX)
2588 .Case("i686", CK_i686)
2589 .Case("pentiumpro", CK_PentiumPro)
2590 .Case("pentium2", CK_Pentium2)
2591 .Case("pentium3", CK_Pentium3)
2592 .Case("pentium3m", CK_Pentium3M)
2593 .Case("pentium-m", CK_PentiumM)
2594 .Case("c3-2", CK_C3_2)
2595 .Case("yonah", CK_Yonah)
2596 .Case("pentium4", CK_Pentium4)
2597 .Case("pentium4m", CK_Pentium4M)
2598 .Case("prescott", CK_Prescott)
2599 .Case("nocona", CK_Nocona)
2600 .Case("core2", CK_Core2)
2601 .Case("penryn", CK_Penryn)
2602 .Case("bonnell", CK_Bonnell)
2603 .Case("atom", CK_Bonnell) // Legacy name.
2604 .Case("silvermont", CK_Silvermont)
2605 .Case("slm", CK_Silvermont) // Legacy name.
2606 .Case("nehalem", CK_Nehalem)
2607 .Case("corei7", CK_Nehalem) // Legacy name.
2608 .Case("westmere", CK_Westmere)
2609 .Case("sandybridge", CK_SandyBridge)
2610 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2611 .Case("ivybridge", CK_IvyBridge)
2612 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2613 .Case("haswell", CK_Haswell)
2614 .Case("core-avx2", CK_Haswell) // Legacy name.
2615 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002616 .Case("skylake", CK_SkylakeClient)
2617 .Case("skylake-avx512", CK_SkylakeServer)
2618 .Case("skx", CK_SkylakeServer) // Legacy name.
2619 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002620 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002621 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002622 .Case("k6", CK_K6)
2623 .Case("k6-2", CK_K6_2)
2624 .Case("k6-3", CK_K6_3)
2625 .Case("athlon", CK_Athlon)
2626 .Case("athlon-tbird", CK_AthlonThunderbird)
2627 .Case("athlon-4", CK_Athlon4)
2628 .Case("athlon-xp", CK_AthlonXP)
2629 .Case("athlon-mp", CK_AthlonMP)
2630 .Case("athlon64", CK_Athlon64)
2631 .Case("athlon64-sse3", CK_Athlon64SSE3)
2632 .Case("athlon-fx", CK_AthlonFX)
2633 .Case("k8", CK_K8)
2634 .Case("k8-sse3", CK_K8SSE3)
2635 .Case("opteron", CK_Opteron)
2636 .Case("opteron-sse3", CK_OpteronSSE3)
2637 .Case("barcelona", CK_AMDFAM10)
2638 .Case("amdfam10", CK_AMDFAM10)
2639 .Case("btver1", CK_BTVER1)
2640 .Case("btver2", CK_BTVER2)
2641 .Case("bdver1", CK_BDVER1)
2642 .Case("bdver2", CK_BDVER2)
2643 .Case("bdver3", CK_BDVER3)
2644 .Case("bdver4", CK_BDVER4)
2645 .Case("x86-64", CK_x86_64)
2646 .Case("geode", CK_Geode)
2647 .Default(CK_Generic);
2648 }
2649
Rafael Espindolaeb265472013-08-21 21:59:03 +00002650 enum FPMathKind {
2651 FP_Default,
2652 FP_SSE,
2653 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002654 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002655
Eli Friedman3fd920a2008-08-20 02:34:37 +00002656public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002657 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2658 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002659 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002660 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002661 }
Craig Topper3164f332014-03-11 03:39:26 +00002662 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002663 // X87 evaluates with 80 bits "long double" precision.
2664 return SSELevel == NoSSE ? 2 : 0;
2665 }
Craig Topper6c03a542015-10-19 04:51:35 +00002666 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2667 return llvm::makeArrayRef(BuiltinInfo,
2668 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002669 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002670 ArrayRef<const char *> getGCCRegNames() const override {
2671 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002672 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002673 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2674 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002675 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002676 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2677 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002678 }
Eric Christopherd9832702015-06-29 21:00:05 +00002679 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002680 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002681 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002682
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002683 bool validateGlobalRegisterVariable(StringRef RegName,
2684 unsigned RegSize,
2685 bool &HasSizeMismatch) const override {
2686 // esp and ebp are the only 32-bit registers the x86 backend can currently
2687 // handle.
2688 if (RegName.equals("esp") || RegName.equals("ebp")) {
2689 // Check that the register size is 32-bit.
2690 HasSizeMismatch = RegSize != 32;
2691 return true;
2692 }
2693
2694 return false;
2695 }
2696
Akira Hatanaka974131e2014-09-18 18:17:18 +00002697 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2698
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002699 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2700
Akira Hatanaka974131e2014-09-18 18:17:18 +00002701 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2702
Craig Topper3164f332014-03-11 03:39:26 +00002703 std::string convertConstraint(const char *&Constraint) const override;
2704 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002705 return "~{dirflag},~{fpsr},~{flags}";
2706 }
Craig Topper3164f332014-03-11 03:39:26 +00002707 void getTargetDefines(const LangOptions &Opts,
2708 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002709 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2710 bool Enabled);
2711 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2712 bool Enabled);
2713 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2714 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002715 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2716 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002717 setFeatureEnabledImpl(Features, Name, Enabled);
2718 }
2719 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002720 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002721 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2722 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002723 bool
2724 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2725 StringRef CPU,
2726 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002727 bool hasFeature(StringRef Feature) const override;
2728 bool handleTargetFeatures(std::vector<std::string> &Features,
2729 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002730 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002731 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2732 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002733 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002734 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002735 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002736 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002737 return "no-mmx";
2738 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002739 }
Craig Topper3164f332014-03-11 03:39:26 +00002740 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002741 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002742
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002743 // Perform any per-CPU checks necessary to determine if this CPU is
2744 // acceptable.
2745 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2746 // invalid without explaining *why*.
2747 switch (CPU) {
2748 case CK_Generic:
2749 // No processor selected!
2750 return false;
2751
2752 case CK_i386:
2753 case CK_i486:
2754 case CK_WinChipC6:
2755 case CK_WinChip2:
2756 case CK_C3:
2757 case CK_i586:
2758 case CK_Pentium:
2759 case CK_PentiumMMX:
2760 case CK_i686:
2761 case CK_PentiumPro:
2762 case CK_Pentium2:
2763 case CK_Pentium3:
2764 case CK_Pentium3M:
2765 case CK_PentiumM:
2766 case CK_Yonah:
2767 case CK_C3_2:
2768 case CK_Pentium4:
2769 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002770 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002771 case CK_Prescott:
2772 case CK_K6:
2773 case CK_K6_2:
2774 case CK_K6_3:
2775 case CK_Athlon:
2776 case CK_AthlonThunderbird:
2777 case CK_Athlon4:
2778 case CK_AthlonXP:
2779 case CK_AthlonMP:
2780 case CK_Geode:
2781 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002782 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002783 return false;
2784
2785 // Fallthrough
2786 case CK_Nocona:
2787 case CK_Core2:
2788 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002789 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002790 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002791 case CK_Nehalem:
2792 case CK_Westmere:
2793 case CK_SandyBridge:
2794 case CK_IvyBridge:
2795 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002796 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002797 case CK_SkylakeClient:
2798 case CK_SkylakeServer:
2799 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002800 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002801 case CK_Athlon64:
2802 case CK_Athlon64SSE3:
2803 case CK_AthlonFX:
2804 case CK_K8:
2805 case CK_K8SSE3:
2806 case CK_Opteron:
2807 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002808 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002809 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002810 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002811 case CK_BDVER1:
2812 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002813 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002814 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002815 case CK_x86_64:
2816 return true;
2817 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002818 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002819 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002820
Craig Topper3164f332014-03-11 03:39:26 +00002821 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002822
Craig Topper3164f332014-03-11 03:39:26 +00002823 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002824 // Most of the non-ARM calling conventions are i386 conventions.
2825 switch (CC) {
2826 case CC_X86ThisCall:
2827 case CC_X86FastCall:
2828 case CC_X86StdCall:
2829 case CC_X86VectorCall:
2830 case CC_C:
2831 case CC_Swift:
2832 case CC_X86Pascal:
2833 case CC_IntelOclBicc:
2834 return CCCR_OK;
2835 default:
2836 return CCCR_Warning;
2837 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002838 }
2839
Craig Topper3164f332014-03-11 03:39:26 +00002840 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002841 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002842 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002843
2844 bool hasSjLjLowering() const override {
2845 return true;
2846 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002847
2848 void setSupportedOpenCLOpts() override {
2849 getSupportedOpenCLOpts().setAll();
2850 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002851};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002852
Rafael Espindolaeb265472013-08-21 21:59:03 +00002853bool X86TargetInfo::setFPMath(StringRef Name) {
2854 if (Name == "387") {
2855 FPMath = FP_387;
2856 return true;
2857 }
2858 if (Name == "sse") {
2859 FPMath = FP_SSE;
2860 return true;
2861 }
2862 return false;
2863}
2864
Eric Christopher007b0a02015-08-28 22:32:01 +00002865bool X86TargetInfo::initFeatureMap(
2866 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002867 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002868 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002869 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002870 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002871 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002872
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002873 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002874
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002875 // Enable X87 for all X86 processors but Lakemont.
2876 if (Kind != CK_Lakemont)
2877 setFeatureEnabledImpl(Features, "x87", true);
2878
2879 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002880 case CK_Generic:
2881 case CK_i386:
2882 case CK_i486:
2883 case CK_i586:
2884 case CK_Pentium:
2885 case CK_i686:
2886 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002887 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002888 break;
2889 case CK_PentiumMMX:
2890 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002891 case CK_K6:
2892 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002893 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002894 break;
2895 case CK_Pentium3:
2896 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002897 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002898 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002899 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002900 break;
2901 case CK_PentiumM:
2902 case CK_Pentium4:
2903 case CK_Pentium4M:
2904 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002905 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002906 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002907 break;
2908 case CK_Yonah:
2909 case CK_Prescott:
2910 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002911 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002912 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002913 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002914 break;
2915 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002916 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002917 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002918 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002919 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002920 break;
2921 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002922 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002923 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002924 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002925 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002926 case CK_Cannonlake:
2927 setFeatureEnabledImpl(Features, "avx512ifma", true);
2928 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2929 setFeatureEnabledImpl(Features, "sha", true);
2930 setFeatureEnabledImpl(Features, "umip", true);
2931 // FALLTHROUGH
2932 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002933 setFeatureEnabledImpl(Features, "avx512f", true);
2934 setFeatureEnabledImpl(Features, "avx512cd", true);
2935 setFeatureEnabledImpl(Features, "avx512dq", true);
2936 setFeatureEnabledImpl(Features, "avx512bw", true);
2937 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002938 setFeatureEnabledImpl(Features, "pku", true);
2939 setFeatureEnabledImpl(Features, "pcommit", true);
2940 setFeatureEnabledImpl(Features, "clwb", true);
2941 // FALLTHROUGH
2942 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002943 setFeatureEnabledImpl(Features, "xsavec", true);
2944 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002945 setFeatureEnabledImpl(Features, "mpx", true);
2946 setFeatureEnabledImpl(Features, "sgx", true);
2947 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002948 // FALLTHROUGH
2949 case CK_Broadwell:
2950 setFeatureEnabledImpl(Features, "rdseed", true);
2951 setFeatureEnabledImpl(Features, "adx", true);
2952 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002953 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002954 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002955 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002956 setFeatureEnabledImpl(Features, "bmi", true);
2957 setFeatureEnabledImpl(Features, "bmi2", true);
2958 setFeatureEnabledImpl(Features, "rtm", true);
2959 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002960 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002961 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002962 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002963 setFeatureEnabledImpl(Features, "rdrnd", true);
2964 setFeatureEnabledImpl(Features, "f16c", true);
2965 setFeatureEnabledImpl(Features, "fsgsbase", true);
2966 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002967 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002968 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002969 setFeatureEnabledImpl(Features, "xsave", true);
2970 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002971 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002972 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002973 case CK_Silvermont:
2974 setFeatureEnabledImpl(Features, "aes", true);
2975 setFeatureEnabledImpl(Features, "pclmul", true);
2976 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002977 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002978 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002979 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002980 setFeatureEnabledImpl(Features, "cx16", true);
2981 break;
2982 case CK_KNL:
2983 setFeatureEnabledImpl(Features, "avx512f", true);
2984 setFeatureEnabledImpl(Features, "avx512cd", true);
2985 setFeatureEnabledImpl(Features, "avx512er", true);
2986 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002987 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002988 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002989 setFeatureEnabledImpl(Features, "rdseed", true);
2990 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002991 setFeatureEnabledImpl(Features, "lzcnt", true);
2992 setFeatureEnabledImpl(Features, "bmi", true);
2993 setFeatureEnabledImpl(Features, "bmi2", true);
2994 setFeatureEnabledImpl(Features, "rtm", true);
2995 setFeatureEnabledImpl(Features, "fma", true);
2996 setFeatureEnabledImpl(Features, "rdrnd", true);
2997 setFeatureEnabledImpl(Features, "f16c", true);
2998 setFeatureEnabledImpl(Features, "fsgsbase", true);
2999 setFeatureEnabledImpl(Features, "aes", true);
3000 setFeatureEnabledImpl(Features, "pclmul", true);
3001 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003002 setFeatureEnabledImpl(Features, "xsaveopt", true);
3003 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003004 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003005 break;
3006 case CK_K6_2:
3007 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003008 case CK_WinChip2:
3009 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003010 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003011 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003012 case CK_Athlon:
3013 case CK_AthlonThunderbird:
3014 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003015 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003016 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003017 case CK_Athlon4:
3018 case CK_AthlonXP:
3019 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003020 setFeatureEnabledImpl(Features, "sse", true);
3021 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003022 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003023 break;
3024 case CK_K8:
3025 case CK_Opteron:
3026 case CK_Athlon64:
3027 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003028 setFeatureEnabledImpl(Features, "sse2", true);
3029 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003030 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003031 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003032 case CK_AMDFAM10:
3033 setFeatureEnabledImpl(Features, "sse4a", true);
3034 setFeatureEnabledImpl(Features, "lzcnt", true);
3035 setFeatureEnabledImpl(Features, "popcnt", true);
3036 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003037 case CK_K8SSE3:
3038 case CK_OpteronSSE3:
3039 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003040 setFeatureEnabledImpl(Features, "sse3", true);
3041 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003042 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003043 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003044 case CK_BTVER2:
3045 setFeatureEnabledImpl(Features, "avx", true);
3046 setFeatureEnabledImpl(Features, "aes", true);
3047 setFeatureEnabledImpl(Features, "pclmul", true);
3048 setFeatureEnabledImpl(Features, "bmi", true);
3049 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003050 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003051 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003052 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003053 setFeatureEnabledImpl(Features, "ssse3", true);
3054 setFeatureEnabledImpl(Features, "sse4a", true);
3055 setFeatureEnabledImpl(Features, "lzcnt", true);
3056 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003057 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003058 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003059 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003060 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003061 case CK_BDVER4:
3062 setFeatureEnabledImpl(Features, "avx2", true);
3063 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003064 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003065 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003066 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003067 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003068 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003069 // FALLTHROUGH
3070 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003071 setFeatureEnabledImpl(Features, "bmi", true);
3072 setFeatureEnabledImpl(Features, "fma", true);
3073 setFeatureEnabledImpl(Features, "f16c", true);
3074 setFeatureEnabledImpl(Features, "tbm", true);
3075 // FALLTHROUGH
3076 case CK_BDVER1:
3077 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003078 setFeatureEnabledImpl(Features, "xop", true);
3079 setFeatureEnabledImpl(Features, "lzcnt", true);
3080 setFeatureEnabledImpl(Features, "aes", true);
3081 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003082 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003083 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003084 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003085 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003086 break;
Eli Friedman33465822011-07-08 23:31:17 +00003087 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003088 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3089 return false;
3090
3091 // Can't do this earlier because we need to be able to explicitly enable
3092 // or disable these features and the things that they depend upon.
3093
3094 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3095 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003096 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003097 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3098 FeaturesVec.end())
3099 Features["popcnt"] = true;
3100
3101 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3102 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003103 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003104 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3105 FeaturesVec.end())
3106 Features["prfchw"] = true;
3107
Eric Christophera7260af2015-10-08 20:10:18 +00003108 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3109 // then enable MMX.
3110 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003111 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003112 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3113 FeaturesVec.end())
3114 Features["mmx"] = true;
3115
Eric Christopherbbd746d2015-10-08 20:10:14 +00003116 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003117}
3118
Rafael Espindolae62e2792013-08-20 13:44:29 +00003119void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003120 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003121 if (Enabled) {
3122 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003123 case AVX512F:
3124 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003125 case AVX2:
3126 Features["avx2"] = true;
3127 case AVX:
3128 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003129 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003131 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003132 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003133 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003134 case SSSE3:
3135 Features["ssse3"] = true;
3136 case SSE3:
3137 Features["sse3"] = true;
3138 case SSE2:
3139 Features["sse2"] = true;
3140 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003141 Features["sse"] = true;
3142 case NoSSE:
3143 break;
3144 }
3145 return;
3146 }
3147
3148 switch (Level) {
3149 case NoSSE:
3150 case SSE1:
3151 Features["sse"] = false;
3152 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003153 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3154 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003155 case SSE3:
3156 Features["sse3"] = false;
3157 setXOPLevel(Features, NoXOP, false);
3158 case SSSE3:
3159 Features["ssse3"] = false;
3160 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003161 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003163 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003164 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003165 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3166 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003167 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003168 case AVX2:
3169 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003170 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003171 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003172 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003173 Features["avx512vl"] = Features["avx512vbmi"] =
3174 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003175 }
3176}
3177
3178void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003179 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003180 if (Enabled) {
3181 switch (Level) {
3182 case AMD3DNowAthlon:
3183 Features["3dnowa"] = true;
3184 case AMD3DNow:
3185 Features["3dnow"] = true;
3186 case MMX:
3187 Features["mmx"] = true;
3188 case NoMMX3DNow:
3189 break;
3190 }
3191 return;
3192 }
3193
3194 switch (Level) {
3195 case NoMMX3DNow:
3196 case MMX:
3197 Features["mmx"] = false;
3198 case AMD3DNow:
3199 Features["3dnow"] = false;
3200 case AMD3DNowAthlon:
3201 Features["3dnowa"] = false;
3202 }
3203}
3204
3205void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003206 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 if (Enabled) {
3208 switch (Level) {
3209 case XOP:
3210 Features["xop"] = true;
3211 case FMA4:
3212 Features["fma4"] = true;
3213 setSSELevel(Features, AVX, true);
3214 case SSE4A:
3215 Features["sse4a"] = true;
3216 setSSELevel(Features, SSE3, true);
3217 case NoXOP:
3218 break;
3219 }
3220 return;
3221 }
3222
3223 switch (Level) {
3224 case NoXOP:
3225 case SSE4A:
3226 Features["sse4a"] = false;
3227 case FMA4:
3228 Features["fma4"] = false;
3229 case XOP:
3230 Features["xop"] = false;
3231 }
3232}
3233
Craig Topper86d79ef2013-09-17 04:51:29 +00003234void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3235 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003236 // This is a bit of a hack to deal with the sse4 target feature when used
3237 // as part of the target attribute. We handle sse4 correctly everywhere
3238 // else. See below for more information on how we handle the sse4 options.
3239 if (Name != "sse4")
3240 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003241
Craig Topper29561122013-09-19 01:13:07 +00003242 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003243 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003244 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003245 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003246 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003247 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003248 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003249 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003250 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003251 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003252 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003253 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003254 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003255 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003256 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003257 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003258 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003259 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003260 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 if (Enabled)
3262 setSSELevel(Features, SSE2, Enabled);
3263 } else if (Name == "pclmul") {
3264 if (Enabled)
3265 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003266 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003268 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003269 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003270 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003271 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003272 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3273 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3274 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003275 if (Enabled)
3276 setSSELevel(Features, AVX512F, Enabled);
3277 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003278 if (Enabled)
3279 setSSELevel(Features, AVX, Enabled);
3280 } else if (Name == "fma4") {
3281 setXOPLevel(Features, FMA4, Enabled);
3282 } else if (Name == "xop") {
3283 setXOPLevel(Features, XOP, Enabled);
3284 } else if (Name == "sse4a") {
3285 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003286 } else if (Name == "f16c") {
3287 if (Enabled)
3288 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003289 } else if (Name == "sha") {
3290 if (Enabled)
3291 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003292 } else if (Name == "sse4") {
3293 // We can get here via the __target__ attribute since that's not controlled
3294 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3295 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3296 // disabled.
3297 if (Enabled)
3298 setSSELevel(Features, SSE42, Enabled);
3299 else
3300 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003301 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003302 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003303 Features["xsaveopt"] = false;
3304 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003305 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003306 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003307 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003308}
3309
Eric Christopher3ff21b32013-10-16 21:26:26 +00003310/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003311/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003312bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003313 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003314 for (const auto &Feature : Features) {
3315 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003316 continue;
3317
Eric Christopher610fe112015-08-26 08:21:55 +00003318 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003319 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003320 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003321 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003322 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003323 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003324 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003325 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003326 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003327 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003328 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003329 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003331 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003333 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003334 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003335 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003336 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003337 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003338 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003339 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003341 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003342 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003343 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003344 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003345 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003346 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003347 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003349 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003350 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003351 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003352 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003353 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003354 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003355 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003356 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003357 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003358 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003359 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003360 } else if (Feature == "+avx512vbmi") {
3361 HasAVX512VBMI = true;
3362 } else if (Feature == "+avx512ifma") {
3363 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003365 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003366 } else if (Feature == "+mpx") {
3367 HasMPX = true;
3368 } else if (Feature == "+movbe") {
3369 HasMOVBE = true;
3370 } else if (Feature == "+sgx") {
3371 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003372 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003373 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003374 } else if (Feature == "+fxsr") {
3375 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003376 } else if (Feature == "+xsave") {
3377 HasXSAVE = true;
3378 } else if (Feature == "+xsaveopt") {
3379 HasXSAVEOPT = true;
3380 } else if (Feature == "+xsavec") {
3381 HasXSAVEC = true;
3382 } else if (Feature == "+xsaves") {
3383 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003384 } else if (Feature == "+mwaitx") {
3385 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003386 } else if (Feature == "+pku") {
3387 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003388 } else if (Feature == "+clflushopt") {
3389 HasCLFLUSHOPT = true;
3390 } else if (Feature == "+pcommit") {
3391 HasPCOMMIT = true;
3392 } else if (Feature == "+clwb") {
3393 HasCLWB = true;
3394 } else if (Feature == "+umip") {
3395 HasUMIP = true;
3396 } else if (Feature == "+prefetchwt1") {
3397 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003398 }
3399
Benjamin Kramer27402c62012-03-05 15:10:44 +00003400 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003401 .Case("+avx512f", AVX512F)
3402 .Case("+avx2", AVX2)
3403 .Case("+avx", AVX)
3404 .Case("+sse4.2", SSE42)
3405 .Case("+sse4.1", SSE41)
3406 .Case("+ssse3", SSSE3)
3407 .Case("+sse3", SSE3)
3408 .Case("+sse2", SSE2)
3409 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003410 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003411 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003412
Eli Friedman33465822011-07-08 23:31:17 +00003413 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003414 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003415 .Case("+3dnowa", AMD3DNowAthlon)
3416 .Case("+3dnow", AMD3DNow)
3417 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003418 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003419 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420
3421 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003422 .Case("+xop", XOP)
3423 .Case("+fma4", FMA4)
3424 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003425 .Default(NoXOP);
3426 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003427 }
Eli Friedman33465822011-07-08 23:31:17 +00003428
Rafael Espindolaeb265472013-08-21 21:59:03 +00003429 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3430 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003431 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3432 (FPMath == FP_387 && SSELevel >= SSE1)) {
3433 Diags.Report(diag::err_target_unsupported_fpmath) <<
3434 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003435 return false;
3436 }
3437
Alexey Bataev00396512015-07-02 03:40:19 +00003438 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003439 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003440 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003441}
Chris Lattnerecd49032009-03-02 22:27:17 +00003442
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003443/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3444/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003445void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003446 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003447 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003448 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003449 Builder.defineMacro("__amd64__");
3450 Builder.defineMacro("__amd64");
3451 Builder.defineMacro("__x86_64");
3452 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003453 if (getTriple().getArchName() == "x86_64h") {
3454 Builder.defineMacro("__x86_64h");
3455 Builder.defineMacro("__x86_64h__");
3456 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003457 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003458 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003459 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003460
Chris Lattnerecd49032009-03-02 22:27:17 +00003461 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003462 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3463 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003464 switch (CPU) {
3465 case CK_Generic:
3466 break;
3467 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003468 // The rest are coming from the i386 define above.
3469 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003470 break;
3471 case CK_i486:
3472 case CK_WinChipC6:
3473 case CK_WinChip2:
3474 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003475 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003476 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003477 case CK_PentiumMMX:
3478 Builder.defineMacro("__pentium_mmx__");
3479 Builder.defineMacro("__tune_pentium_mmx__");
3480 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003481 case CK_i586:
3482 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003483 defineCPUMacros(Builder, "i586");
3484 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003485 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003486 case CK_Pentium3:
3487 case CK_Pentium3M:
3488 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003489 Builder.defineMacro("__tune_pentium3__");
3490 // Fallthrough
3491 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003492 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003493 Builder.defineMacro("__tune_pentium2__");
3494 // Fallthrough
3495 case CK_PentiumPro:
3496 Builder.defineMacro("__tune_i686__");
3497 Builder.defineMacro("__tune_pentiumpro__");
3498 // Fallthrough
3499 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003500 Builder.defineMacro("__i686");
3501 Builder.defineMacro("__i686__");
3502 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3503 Builder.defineMacro("__pentiumpro");
3504 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003505 break;
3506 case CK_Pentium4:
3507 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003508 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003509 break;
3510 case CK_Yonah:
3511 case CK_Prescott:
3512 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003513 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003514 break;
3515 case CK_Core2:
3516 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003517 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003518 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003519 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003520 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003521 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003522 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003523 defineCPUMacros(Builder, "slm");
3524 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003525 case CK_Nehalem:
3526 case CK_Westmere:
3527 case CK_SandyBridge:
3528 case CK_IvyBridge:
3529 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003530 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003531 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003532 // FIXME: Historically, we defined this legacy name, it would be nice to
3533 // remove it at some point. We've never exposed fine-grained names for
3534 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003535 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003536 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003537 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003538 defineCPUMacros(Builder, "skx");
3539 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003540 case CK_Cannonlake:
3541 break;
Craig Topper449314e2013-08-20 07:09:39 +00003542 case CK_KNL:
3543 defineCPUMacros(Builder, "knl");
3544 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003545 case CK_Lakemont:
3546 Builder.defineMacro("__tune_lakemont__");
3547 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003548 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003549 Builder.defineMacro("__k6_2__");
3550 Builder.defineMacro("__tune_k6_2__");
3551 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003552 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003553 if (CPU != CK_K6_2) { // In case of fallthrough
3554 // FIXME: GCC may be enabling these in cases where some other k6
3555 // architecture is specified but -m3dnow is explicitly provided. The
3556 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003557 Builder.defineMacro("__k6_3__");
3558 Builder.defineMacro("__tune_k6_3__");
3559 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003560 // Fallthrough
3561 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003562 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003563 break;
3564 case CK_Athlon:
3565 case CK_AthlonThunderbird:
3566 case CK_Athlon4:
3567 case CK_AthlonXP:
3568 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003569 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003570 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003571 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003572 Builder.defineMacro("__tune_athlon_sse__");
3573 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003574 break;
3575 case CK_K8:
3576 case CK_K8SSE3:
3577 case CK_x86_64:
3578 case CK_Opteron:
3579 case CK_OpteronSSE3:
3580 case CK_Athlon64:
3581 case CK_Athlon64SSE3:
3582 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003583 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003584 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003585 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003586 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003587 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003588 case CK_BTVER1:
3589 defineCPUMacros(Builder, "btver1");
3590 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003591 case CK_BTVER2:
3592 defineCPUMacros(Builder, "btver2");
3593 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003594 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003595 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003596 break;
3597 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003598 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003599 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003600 case CK_BDVER3:
3601 defineCPUMacros(Builder, "bdver3");
3602 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003603 case CK_BDVER4:
3604 defineCPUMacros(Builder, "bdver4");
3605 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003606 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003607 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003608 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003609 }
Chris Lattner96e43572009-03-02 22:40:39 +00003610
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003611 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003612 Builder.defineMacro("__REGISTER_PREFIX__", "");
3613
Chris Lattner6df41af2009-04-19 17:32:33 +00003614 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3615 // functions in glibc header files that use FP Stack inline asm which the
3616 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003617 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003618
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003619 if (HasAES)
3620 Builder.defineMacro("__AES__");
3621
Craig Topper3f122a72012-05-31 05:18:48 +00003622 if (HasPCLMUL)
3623 Builder.defineMacro("__PCLMUL__");
3624
Craig Topper22967d42011-12-25 05:06:45 +00003625 if (HasLZCNT)
3626 Builder.defineMacro("__LZCNT__");
3627
Benjamin Kramer1e250392012-07-07 09:39:18 +00003628 if (HasRDRND)
3629 Builder.defineMacro("__RDRND__");
3630
Craig Topper8c7f2512014-11-03 06:51:41 +00003631 if (HasFSGSBASE)
3632 Builder.defineMacro("__FSGSBASE__");
3633
Craig Topper22967d42011-12-25 05:06:45 +00003634 if (HasBMI)
3635 Builder.defineMacro("__BMI__");
3636
3637 if (HasBMI2)
3638 Builder.defineMacro("__BMI2__");
3639
Craig Topper1de83482011-12-29 16:10:46 +00003640 if (HasPOPCNT)
3641 Builder.defineMacro("__POPCNT__");
3642
Michael Liao625a8752012-11-10 05:17:46 +00003643 if (HasRTM)
3644 Builder.defineMacro("__RTM__");
3645
Michael Liao74f4eaf2013-03-26 17:52:08 +00003646 if (HasPRFCHW)
3647 Builder.defineMacro("__PRFCHW__");
3648
Michael Liaoffaae352013-03-29 05:17:55 +00003649 if (HasRDSEED)
3650 Builder.defineMacro("__RDSEED__");
3651
Robert Khasanov50e6f582014-09-19 09:53:48 +00003652 if (HasADX)
3653 Builder.defineMacro("__ADX__");
3654
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003655 if (HasTBM)
3656 Builder.defineMacro("__TBM__");
3657
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003658 if (HasMWAITX)
3659 Builder.defineMacro("__MWAITX__");
3660
Rafael Espindolae62e2792013-08-20 13:44:29 +00003661 switch (XOPLevel) {
3662 case XOP:
3663 Builder.defineMacro("__XOP__");
3664 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003665 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003666 case SSE4A:
3667 Builder.defineMacro("__SSE4A__");
3668 case NoXOP:
3669 break;
3670 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003671
Craig Topperbba778b2012-06-03 21:46:30 +00003672 if (HasFMA)
3673 Builder.defineMacro("__FMA__");
3674
Manman Rena45358c2012-10-11 00:59:55 +00003675 if (HasF16C)
3676 Builder.defineMacro("__F16C__");
3677
Craig Topper679b53a2013-08-21 05:29:10 +00003678 if (HasAVX512CD)
3679 Builder.defineMacro("__AVX512CD__");
3680 if (HasAVX512ER)
3681 Builder.defineMacro("__AVX512ER__");
3682 if (HasAVX512PF)
3683 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003684 if (HasAVX512DQ)
3685 Builder.defineMacro("__AVX512DQ__");
3686 if (HasAVX512BW)
3687 Builder.defineMacro("__AVX512BW__");
3688 if (HasAVX512VL)
3689 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003690 if (HasAVX512VBMI)
3691 Builder.defineMacro("__AVX512VBMI__");
3692 if (HasAVX512IFMA)
3693 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003694
Ben Langmuir58078d02013-09-19 13:22:04 +00003695 if (HasSHA)
3696 Builder.defineMacro("__SHA__");
3697
Craig Toppere33f51f2015-10-16 06:22:36 +00003698 if (HasFXSR)
3699 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003700 if (HasXSAVE)
3701 Builder.defineMacro("__XSAVE__");
3702 if (HasXSAVEOPT)
3703 Builder.defineMacro("__XSAVEOPT__");
3704 if (HasXSAVEC)
3705 Builder.defineMacro("__XSAVEC__");
3706 if (HasXSAVES)
3707 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003708 if (HasPKU)
3709 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003710 if (HasCX16)
3711 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3712
Chris Lattner96e43572009-03-02 22:40:39 +00003713 // Each case falls through to the previous one here.
3714 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003715 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003716 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003717 case AVX2:
3718 Builder.defineMacro("__AVX2__");
3719 case AVX:
3720 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003721 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003722 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003723 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003724 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003725 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003726 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003727 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003728 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003729 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003730 Builder.defineMacro("__SSE2__");
3731 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003732 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003733 Builder.defineMacro("__SSE__");
3734 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003735 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003736 break;
3737 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003738
Derek Schuffc7dd7222012-10-11 15:52:22 +00003739 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003740 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003741 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003742 case AVX2:
3743 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003744 case SSE42:
3745 case SSE41:
3746 case SSSE3:
3747 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003748 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003749 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003750 break;
3751 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003752 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003753 break;
3754 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003755 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003756 }
3757 }
3758
Anders Carlssone437c682010-01-27 03:47:49 +00003759 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003760 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003761 case AMD3DNowAthlon:
3762 Builder.defineMacro("__3dNOW_A__");
3763 case AMD3DNow:
3764 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003765 case MMX:
3766 Builder.defineMacro("__MMX__");
3767 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003768 break;
3769 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003770
3771 if (CPU >= CK_i486) {
3772 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3773 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3774 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3775 }
3776 if (CPU >= CK_i586)
3777 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003778}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003779
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003780bool X86TargetInfo::hasFeature(StringRef Feature) const {
3781 return llvm::StringSwitch<bool>(Feature)
3782 .Case("aes", HasAES)
3783 .Case("avx", SSELevel >= AVX)
3784 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003785 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003786 .Case("avx512cd", HasAVX512CD)
3787 .Case("avx512er", HasAVX512ER)
3788 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003789 .Case("avx512dq", HasAVX512DQ)
3790 .Case("avx512bw", HasAVX512BW)
3791 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003792 .Case("avx512vbmi", HasAVX512VBMI)
3793 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003794 .Case("bmi", HasBMI)
3795 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003796 .Case("clflushopt", HasCLFLUSHOPT)
3797 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003798 .Case("cx16", HasCX16)
3799 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003800 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003801 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003802 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003803 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003804 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003805 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3806 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3807 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003808 .Case("movbe", HasMOVBE)
3809 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003810 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003811 .Case("pcommit", HasPCOMMIT)
3812 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003813 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003814 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003815 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003816 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003817 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003818 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003819 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003820 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003821 .Case("sse", SSELevel >= SSE1)
3822 .Case("sse2", SSELevel >= SSE2)
3823 .Case("sse3", SSELevel >= SSE3)
3824 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003825 .Case("sse4.1", SSELevel >= SSE41)
3826 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003827 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003828 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003829 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003830 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003831 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3832 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003833 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003834 .Case("xsave", HasXSAVE)
3835 .Case("xsavec", HasXSAVEC)
3836 .Case("xsaves", HasXSAVES)
3837 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003838 .Default(false);
3839}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003840
Eric Christopherd9832702015-06-29 21:00:05 +00003841// We can't use a generic validation scheme for the features accepted here
3842// versus subtarget features accepted in the target attribute because the
3843// bitfield structure that's initialized in the runtime only supports the
3844// below currently rather than the full range of subtarget features. (See
3845// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3846bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3847 return llvm::StringSwitch<bool>(FeatureStr)
3848 .Case("cmov", true)
3849 .Case("mmx", true)
3850 .Case("popcnt", true)
3851 .Case("sse", true)
3852 .Case("sse2", true)
3853 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003854 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003855 .Case("sse4.1", true)
3856 .Case("sse4.2", true)
3857 .Case("avx", true)
3858 .Case("avx2", true)
3859 .Case("sse4a", true)
3860 .Case("fma4", true)
3861 .Case("xop", true)
3862 .Case("fma", true)
3863 .Case("avx512f", true)
3864 .Case("bmi", true)
3865 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003866 .Case("aes", true)
3867 .Case("pclmul", true)
3868 .Case("avx512vl", true)
3869 .Case("avx512bw", true)
3870 .Case("avx512dq", true)
3871 .Case("avx512cd", true)
3872 .Case("avx512er", true)
3873 .Case("avx512pf", true)
3874 .Case("avx512vbmi", true)
3875 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003876 .Default(false);
3877}
3878
Eli Friedman3fd920a2008-08-20 02:34:37 +00003879bool
Anders Carlsson58436352009-02-28 17:11:49 +00003880X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003881 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003882 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003883 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003884 // Constant constraints.
3885 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3886 // instructions.
3887 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3888 // x86_64 instructions.
3889 case 's':
3890 Info.setRequiresImmediate();
3891 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003892 case 'I':
3893 Info.setRequiresImmediate(0, 31);
3894 return true;
3895 case 'J':
3896 Info.setRequiresImmediate(0, 63);
3897 return true;
3898 case 'K':
3899 Info.setRequiresImmediate(-128, 127);
3900 return true;
3901 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003902 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003903 return true;
3904 case 'M':
3905 Info.setRequiresImmediate(0, 3);
3906 return true;
3907 case 'N':
3908 Info.setRequiresImmediate(0, 255);
3909 return true;
3910 case 'O':
3911 Info.setRequiresImmediate(0, 127);
3912 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003913 // Register constraints.
3914 case 'Y': // 'Y' is the first character for several 2-character constraints.
3915 // Shift the pointer to the second character of the constraint.
3916 Name++;
3917 switch (*Name) {
3918 default:
3919 return false;
3920 case '0': // First SSE register.
3921 case 't': // Any SSE register, when SSE2 is enabled.
3922 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3923 case 'm': // Any MMX register, when inter-unit moves enabled.
3924 Info.setAllowsRegister();
3925 return true;
3926 }
3927 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003928 // Constraint 'f' cannot be used for output operands.
3929 if (Info.ConstraintStr[0] == '=')
3930 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003931 Info.setAllowsRegister();
3932 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003933 case 'a': // eax.
3934 case 'b': // ebx.
3935 case 'c': // ecx.
3936 case 'd': // edx.
3937 case 'S': // esi.
3938 case 'D': // edi.
3939 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003940 case 't': // Top of floating point stack.
3941 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003942 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003943 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003944 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003945 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003946 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3947 case 'l': // "Index" registers: any general register that can be used as an
3948 // index in a base+index memory access.
3949 Info.setAllowsRegister();
3950 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003951 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003952 case 'C': // SSE floating point constant.
3953 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003954 return true;
3955 }
3956}
3957
Akira Hatanaka974131e2014-09-18 18:17:18 +00003958bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3959 unsigned Size) const {
3960 // Strip off constraint modifiers.
3961 while (Constraint[0] == '=' ||
3962 Constraint[0] == '+' ||
3963 Constraint[0] == '&')
3964 Constraint = Constraint.substr(1);
3965
3966 return validateOperandSize(Constraint, Size);
3967}
3968
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003969bool X86TargetInfo::validateInputSize(StringRef Constraint,
3970 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003971 return validateOperandSize(Constraint, Size);
3972}
3973
3974bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3975 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003976 switch (Constraint[0]) {
3977 default: break;
3978 case 'y':
3979 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003980 case 'f':
3981 case 't':
3982 case 'u':
3983 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003984 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003985 if (SSELevel >= AVX512F)
3986 // 512-bit zmm registers can be used if target supports AVX512F.
3987 return Size <= 512U;
3988 else if (SSELevel >= AVX)
3989 // 256-bit ymm registers can be used if target supports AVX.
3990 return Size <= 256U;
3991 return Size <= 128U;
3992 case 'Y':
3993 // 'Y' is the first character for several 2-character constraints.
3994 switch (Constraint[1]) {
3995 default: break;
3996 case 'm':
3997 // 'Ym' is synonymous with 'y'.
3998 return Size <= 64;
3999 case 'i':
4000 case 't':
4001 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4002 if (SSELevel >= AVX512F)
4003 return Size <= 512U;
4004 else if (SSELevel >= AVX)
4005 return Size <= 256U;
4006 return SSELevel >= SSE2 && Size <= 128U;
4007 }
4008
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004009 }
4010
4011 return true;
4012}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004013
Eli Friedman3fd920a2008-08-20 02:34:37 +00004014std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004015X86TargetInfo::convertConstraint(const char *&Constraint) const {
4016 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004017 case 'a': return std::string("{ax}");
4018 case 'b': return std::string("{bx}");
4019 case 'c': return std::string("{cx}");
4020 case 'd': return std::string("{dx}");
4021 case 'S': return std::string("{si}");
4022 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004023 case 'p': // address
4024 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004025 case 't': // top of floating point stack.
4026 return std::string("{st}");
4027 case 'u': // second from top of floating point stack.
4028 return std::string("{st(1)}"); // second from top of floating point stack.
4029 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004030 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004031 }
4032}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004033
Eli Friedman3fd920a2008-08-20 02:34:37 +00004034// X86-32 generic target
4035class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004036public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004037 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4038 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004039 DoubleAlign = LongLongAlign = 32;
4040 LongDoubleWidth = 96;
4041 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004042 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004043 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004044 SizeType = UnsignedInt;
4045 PtrDiffType = SignedInt;
4046 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004047 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004048
4049 // Use fpret for all types.
4050 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4051 (1 << TargetInfo::Double) |
4052 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004053
4054 // x86-32 has atomics up to 8 bytes
4055 // FIXME: Check that we actually have cmpxchg8b before setting
4056 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4057 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004058 }
Craig Topper3164f332014-03-11 03:39:26 +00004059 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004060 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004061 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004062
Craig Topper3164f332014-03-11 03:39:26 +00004063 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004064 if (RegNo == 0) return 0;
4065 if (RegNo == 1) return 2;
4066 return -1;
4067 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004068 bool validateOperandSize(StringRef Constraint,
4069 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004070 switch (Constraint[0]) {
4071 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004072 case 'R':
4073 case 'q':
4074 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004075 case 'a':
4076 case 'b':
4077 case 'c':
4078 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004079 case 'S':
4080 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004081 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004082 case 'A':
4083 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004084 }
4085
Akira Hatanaka974131e2014-09-18 18:17:18 +00004086 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004087 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004088};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004089
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004090class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4091public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004092 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4093 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004094
Craig Topper3164f332014-03-11 03:39:26 +00004095 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004096 unsigned Major, Minor, Micro;
4097 getTriple().getOSVersion(Major, Minor, Micro);
4098 // New NetBSD uses the default rounding mode.
4099 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4100 return X86_32TargetInfo::getFloatEvalMethod();
4101 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004102 return 1;
4103 }
4104};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004105
Eli Friedmane3aa4542009-07-05 18:47:56 +00004106class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4107public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004108 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4109 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004110 SizeType = UnsignedLong;
4111 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004112 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004113 }
4114};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004115
Eli Friedman9fa28852012-08-08 23:57:20 +00004116class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4117public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004118 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4119 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004120 SizeType = UnsignedLong;
4121 IntPtrType = SignedLong;
4122 PtrDiffType = SignedLong;
4123 }
4124};
Eli Friedman9fa28852012-08-08 23:57:20 +00004125
Torok Edwinb2b37c62009-06-30 17:10:35 +00004126class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004127public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004128 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4129 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004130 LongDoubleWidth = 128;
4131 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004132 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004133 MaxVectorAlign = 256;
4134 // The watchOS simulator uses the builtin bool type for Objective-C.
4135 llvm::Triple T = llvm::Triple(Triple);
4136 if (T.isWatchOS())
4137 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004138 SizeType = UnsignedLong;
4139 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004140 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004141 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004142 }
4143
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004144 bool handleTargetFeatures(std::vector<std::string> &Features,
4145 DiagnosticsEngine &Diags) override {
4146 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4147 Diags))
4148 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004149 // We now know the features we have: we can decide how to align vectors.
4150 MaxVectorAlign =
4151 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004152 return true;
4153 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004154};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004155
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004156// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004157class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004158public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004159 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4160 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004161 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004162 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004163 bool IsWinCOFF =
4164 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004165 resetDataLayout(IsWinCOFF
4166 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4167 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004168 }
Craig Topper3164f332014-03-11 03:39:26 +00004169 void getTargetDefines(const LangOptions &Opts,
4170 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004171 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4172 }
4173};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004174
4175// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004176class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004177public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004178 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4179 const TargetOptions &Opts)
4180 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004181 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004182 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4183 }
Craig Topper3164f332014-03-11 03:39:26 +00004184 void getTargetDefines(const LangOptions &Opts,
4185 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004186 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4187 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4188 // The value of the following reflects processor type.
4189 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4190 // We lost the original triple, so we use the default.
4191 Builder.defineMacro("_M_IX86", "600");
4192 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004193};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004194
David Majnemerae1ed0e2015-05-28 04:36:18 +00004195static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004196 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4197 // supports __declspec natively under -fms-extensions, but we define a no-op
4198 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004199 if (Opts.MicrosoftExt)
4200 Builder.defineMacro("__declspec", "__declspec");
4201 else
4202 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4203
4204 if (!Opts.MicrosoftExt) {
4205 // Provide macros for all the calling convention keywords. Provide both
4206 // single and double underscore prefixed variants. These are available on
4207 // x64 as well as x86, even though they have no effect.
4208 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4209 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004210 std::string GCCSpelling = "__attribute__((__";
4211 GCCSpelling += CC;
4212 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004213 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4214 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4215 }
4216 }
4217}
4218
David Majnemerae1ed0e2015-05-28 04:36:18 +00004219static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4220 Builder.defineMacro("__MSVCRT__");
4221 Builder.defineMacro("__MINGW32__");
4222 addCygMingDefines(Opts, Builder);
4223}
4224
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004225// x86-32 MinGW target
4226class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4227public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004228 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4229 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004230 void getTargetDefines(const LangOptions &Opts,
4231 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004232 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004233 DefineStd(Builder, "WIN32", Opts);
4234 DefineStd(Builder, "WINNT", Opts);
4235 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004236 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004237 }
4238};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004239
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004240// x86-32 Cygwin target
4241class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4242public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004243 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4244 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004245 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004246 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004247 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 +00004248 }
Craig Topper3164f332014-03-11 03:39:26 +00004249 void getTargetDefines(const LangOptions &Opts,
4250 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004251 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004252 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004253 Builder.defineMacro("__CYGWIN__");
4254 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004255 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004256 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004257 if (Opts.CPlusPlus)
4258 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004259 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004260};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004261
Chris Lattnerb986aba2010-04-11 19:29:39 +00004262// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004263class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004264public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004265 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004266 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004267 }
Craig Topper3164f332014-03-11 03:39:26 +00004268 void getTargetDefines(const LangOptions &Opts,
4269 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004270 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004271 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004272 }
4273};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004274
Alexey Bataevc99b0492015-11-25 09:24:26 +00004275// X86-32 MCU target
4276class MCUX86_32TargetInfo : public X86_32TargetInfo {
4277public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004278 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4279 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004280 LongDoubleWidth = 64;
4281 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004282 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 +00004283 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004284 }
4285
4286 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4287 // On MCU we support only C calling convention.
4288 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4289 }
4290
4291 void getTargetDefines(const LangOptions &Opts,
4292 MacroBuilder &Builder) const override {
4293 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4294 Builder.defineMacro("__iamcu");
4295 Builder.defineMacro("__iamcu__");
4296 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004297
4298 bool allowsLargerPreferedTypeAlignment() const override {
4299 return false;
4300 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004301};
4302
Douglas Gregor9fabd852011-07-01 22:41:14 +00004303// RTEMS Target
4304template<typename Target>
4305class RTEMSTargetInfo : public OSTargetInfo<Target> {
4306protected:
Craig Topper3164f332014-03-11 03:39:26 +00004307 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4308 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004309 // RTEMS defines; list based off of gcc output
4310
Douglas Gregor9fabd852011-07-01 22:41:14 +00004311 Builder.defineMacro("__rtems__");
4312 Builder.defineMacro("__ELF__");
4313 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004314
Douglas Gregor9fabd852011-07-01 22:41:14 +00004315public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004316 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4317 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004318 switch (Triple.getArch()) {
4319 default:
4320 case llvm::Triple::x86:
4321 // this->MCountName = ".mcount";
4322 break;
4323 case llvm::Triple::mips:
4324 case llvm::Triple::mipsel:
4325 case llvm::Triple::ppc:
4326 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004327 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004328 // this->MCountName = "_mcount";
4329 break;
4330 case llvm::Triple::arm:
4331 // this->MCountName = "__mcount";
4332 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004333 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004334 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004335};
4336
Douglas Gregor9fabd852011-07-01 22:41:14 +00004337// x86-32 RTEMS target
4338class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004340 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4341 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004342 SizeType = UnsignedLong;
4343 IntPtrType = SignedLong;
4344 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004345 }
Craig Topper3164f332014-03-11 03:39:26 +00004346 void getTargetDefines(const LangOptions &Opts,
4347 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004348 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4349 Builder.defineMacro("__INTEL__");
4350 Builder.defineMacro("__rtems__");
4351 }
4352};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004353
Eli Friedman3fd920a2008-08-20 02:34:37 +00004354// x86-64 generic target
4355class X86_64TargetInfo : public X86TargetInfo {
4356public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004357 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4358 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004359 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004360 bool IsWinCOFF =
4361 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004362 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004363 LongDoubleWidth = 128;
4364 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004365 LargeArrayMinWidth = 128;
4366 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004367 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004368 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4369 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4370 IntPtrType = IsX32 ? SignedInt : SignedLong;
4371 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004372 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004373 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004374
Eric Christopher917e9522014-11-18 22:36:15 +00004375 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004376 resetDataLayout(IsX32
4377 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4378 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4379 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004380
4381 // Use fpret only for long double.
4382 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004383
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004384 // Use fp2ret for _Complex long double.
4385 ComplexLongDoubleUsesFP2Ret = true;
4386
Charles Davisc7d5c942015-09-17 20:55:33 +00004387 // Make __builtin_ms_va_list available.
4388 HasBuiltinMSVaList = true;
4389
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004390 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004391 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004392 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004393 }
Craig Topper3164f332014-03-11 03:39:26 +00004394 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004395 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004396 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004397
Craig Topper3164f332014-03-11 03:39:26 +00004398 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004399 if (RegNo == 0) return 0;
4400 if (RegNo == 1) return 1;
4401 return -1;
4402 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004403
Craig Topper3164f332014-03-11 03:39:26 +00004404 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004405 switch (CC) {
4406 case CC_C:
4407 case CC_Swift:
4408 case CC_X86VectorCall:
4409 case CC_IntelOclBicc:
4410 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004411 case CC_PreserveMost:
4412 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004413 return CCCR_OK;
4414 default:
4415 return CCCR_Warning;
4416 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004417 }
4418
Craig Topper3164f332014-03-11 03:39:26 +00004419 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004420 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004421 }
4422
Pavel Chupinfd223e12014-08-04 12:39:43 +00004423 // for x32 we need it here explicitly
4424 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004425 unsigned getUnwindWordWidth() const override { return 64; }
4426 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004427
4428 bool validateGlobalRegisterVariable(StringRef RegName,
4429 unsigned RegSize,
4430 bool &HasSizeMismatch) const override {
4431 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4432 // handle.
4433 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4434 // Check that the register size is 64-bit.
4435 HasSizeMismatch = RegSize != 64;
4436 return true;
4437 }
4438
4439 // Check if the register is a 32-bit register the backend can handle.
4440 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4441 HasSizeMismatch);
4442 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004443};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004444
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004445// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004446class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004447public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004448 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4449 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004450 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004451 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004452 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004453 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004454 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004455 SizeType = UnsignedLongLong;
4456 PtrDiffType = SignedLongLong;
4457 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004458 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004459
Craig Topper3164f332014-03-11 03:39:26 +00004460 void getTargetDefines(const LangOptions &Opts,
4461 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004462 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004463 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004464 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004465
Craig Topper3164f332014-03-11 03:39:26 +00004466 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004467 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004468 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004469
Craig Topper3164f332014-03-11 03:39:26 +00004470 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004471 switch (CC) {
4472 case CC_X86StdCall:
4473 case CC_X86ThisCall:
4474 case CC_X86FastCall:
4475 return CCCR_Ignore;
4476 case CC_C:
4477 case CC_X86VectorCall:
4478 case CC_IntelOclBicc:
4479 case CC_X86_64SysV:
4480 return CCCR_OK;
4481 default:
4482 return CCCR_Warning;
4483 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004484 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004485};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004486
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004487// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004488class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004489public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004490 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4491 const TargetOptions &Opts)
4492 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004493 LongDoubleWidth = LongDoubleAlign = 64;
4494 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495 }
Craig Topper3164f332014-03-11 03:39:26 +00004496 void getTargetDefines(const LangOptions &Opts,
4497 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004498 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4499 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004500 Builder.defineMacro("_M_X64", "100");
4501 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004502 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004503};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004504
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004505// x86-64 MinGW target
4506class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4507public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004508 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4509 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004510 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4511 // with x86 FP ops. Weird.
4512 LongDoubleWidth = LongDoubleAlign = 128;
4513 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4514 }
4515
Craig Topper3164f332014-03-11 03:39:26 +00004516 void getTargetDefines(const LangOptions &Opts,
4517 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004518 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004519 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004520 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004521 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004522
4523 // GCC defines this macro when it is using __gxx_personality_seh0.
4524 if (!Opts.SjLjExceptions)
4525 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004526 }
4527};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004528
Yaron Kerend030d112015-07-22 17:38:19 +00004529// x86-64 Cygwin target
4530class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4531public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004532 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4533 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004534 TLSSupported = false;
4535 WCharType = UnsignedShort;
4536 }
4537 void getTargetDefines(const LangOptions &Opts,
4538 MacroBuilder &Builder) const override {
4539 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4540 Builder.defineMacro("__x86_64__");
4541 Builder.defineMacro("__CYGWIN__");
4542 Builder.defineMacro("__CYGWIN64__");
4543 addCygMingDefines(Opts, Builder);
4544 DefineStd(Builder, "unix", Opts);
4545 if (Opts.CPlusPlus)
4546 Builder.defineMacro("_GNU_SOURCE");
4547
4548 // GCC defines this macro when it is using __gxx_personality_seh0.
4549 if (!Opts.SjLjExceptions)
4550 Builder.defineMacro("__SEH__");
4551 }
4552};
4553
Eli Friedman2857ccb2009-07-01 03:36:11 +00004554class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4555public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004556 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4557 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004558 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004559 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4560 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004561 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004562 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004563 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004564 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004565
4566 bool handleTargetFeatures(std::vector<std::string> &Features,
4567 DiagnosticsEngine &Diags) override {
4568 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4569 Diags))
4570 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004571 // We now know the features we have: we can decide how to align vectors.
4572 MaxVectorAlign =
4573 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004574 return true;
4575 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004576};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004577
Eli Friedman245f2292009-07-05 22:31:18 +00004578class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004580 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4581 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004582 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004583 Int64Type = SignedLongLong;
4584 }
4585};
Eli Friedman245f2292009-07-05 22:31:18 +00004586
Eli Friedman9fa28852012-08-08 23:57:20 +00004587class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4588public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004589 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4590 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004591 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004592 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004593 }
4594};
Tim Northover9bb857a2013-01-31 12:13:10 +00004595
Eli Friedmanf05b7722008-08-20 07:44:10 +00004596class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004597 // Possible FPU choices.
4598 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004599 VFP2FPU = (1 << 0),
4600 VFP3FPU = (1 << 1),
4601 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004602 NeonFPU = (1 << 3),
4603 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004604 };
4605
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004606 // Possible HWDiv features.
4607 enum HWDivMode {
4608 HWDivThumb = (1 << 0),
4609 HWDivARM = (1 << 1)
4610 };
4611
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004612 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004613 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004614 }
4615
4616 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4617 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004618
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004619 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004620
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004621 StringRef CPUProfile;
4622 StringRef CPUAttr;
4623
Rafael Espindolaeb265472013-08-21 21:59:03 +00004624 enum {
4625 FP_Default,
4626 FP_VFP,
4627 FP_Neon
4628 } FPMath;
4629
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004630 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004631 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004632 unsigned ArchProfile;
4633 unsigned ArchVersion;
4634
Bernard Ogdenda13af32013-10-24 18:32:51 +00004635 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004636
Logan Chien57086ce2012-10-10 06:56:20 +00004637 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004638 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004639
4640 // Initialized via features.
4641 unsigned SoftFloat : 1;
4642 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004643
Bernard Ogden18b57012013-10-29 09:47:51 +00004644 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004645 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004646 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004647 unsigned Unaligned : 1;
4648
4649 enum {
4650 LDREX_B = (1 << 0), /// byte (8-bit)
4651 LDREX_H = (1 << 1), /// half (16-bit)
4652 LDREX_W = (1 << 2), /// word (32-bit)
4653 LDREX_D = (1 << 3), /// double (64-bit)
4654 };
4655
4656 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004657
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004658 // ACLE 6.5.1 Hardware floating point
4659 enum {
4660 HW_FP_HP = (1 << 1), /// half (16-bit)
4661 HW_FP_SP = (1 << 2), /// single (32-bit)
4662 HW_FP_DP = (1 << 3), /// double (64-bit)
4663 };
4664 uint32_t HW_FP;
4665
Chris Lattner5cc15e02010-03-03 19:03:45 +00004666 static const Builtin::Info BuiltinInfo[];
4667
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004668 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004669 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004670
4671 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004672 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004673
Renato Golin9ba39232015-02-27 16:35:48 +00004674 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4675 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4676 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004677 SizeType = UnsignedLong;
4678 else
4679 SizeType = UnsignedInt;
4680
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004681 switch (T.getOS()) {
4682 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004683 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004684 break;
4685 case llvm::Triple::Win32:
4686 WCharType = UnsignedShort;
4687 break;
4688 case llvm::Triple::Linux:
4689 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004690 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4691 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004692 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004693 }
4694
4695 UseBitFieldTypeAlignment = true;
4696
4697 ZeroLengthBitfieldBoundary = 0;
4698
Tim Northover147cd2f2014-10-14 22:12:21 +00004699 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4700 // so set preferred for small types to 32.
4701 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004702 resetDataLayout(BigEndian
4703 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4704 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004705 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004706 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004707 resetDataLayout("e"
4708 "-m:w"
4709 "-p:32:32"
4710 "-i64:64"
4711 "-v128:64:128"
4712 "-a:0:32"
4713 "-n32"
4714 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004715 } else if (T.isOSNaCl()) {
4716 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004717 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004718 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004719 resetDataLayout(BigEndian
4720 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4721 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004722 }
4723
4724 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004725 }
4726
Tim Northover5627d392015-10-30 16:30:45 +00004727 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004728 const llvm::Triple &T = getTriple();
4729
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004730 IsAAPCS = false;
4731
Tim Northover5627d392015-10-30 16:30:45 +00004732 if (IsAAPCS16)
4733 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4734 else
4735 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004736
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004737 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004738 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004739 SizeType = UnsignedInt;
4740 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004741 SizeType = UnsignedLong;
4742
4743 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4744 WCharType = SignedInt;
4745
4746 // Do not respect the alignment of bit-field types when laying out
4747 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4748 UseBitFieldTypeAlignment = false;
4749
4750 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4751 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4752 /// gcc.
4753 ZeroLengthBitfieldBoundary = 32;
4754
Tim Northover5627d392015-10-30 16:30:45 +00004755 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4756 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004757 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004758 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004759 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004760 BigEndian
4761 ? "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 +00004762 : "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 +00004763 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004764 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004765 BigEndian
4766 ? "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 +00004767 : "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 +00004768
4769 // FIXME: Override "preferred align" for double and long long.
4770 }
4771
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004772 void setArchInfo() {
4773 StringRef ArchName = getTriple().getArchName();
4774
Renato Goline84b0002015-10-08 16:43:26 +00004775 ArchISA = llvm::ARM::parseArchISA(ArchName);
4776 CPU = llvm::ARM::getDefaultCPU(ArchName);
4777 unsigned AK = llvm::ARM::parseArch(ArchName);
4778 if (AK != llvm::ARM::AK_INVALID)
4779 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004780 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004781 }
4782
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004783 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004784 StringRef SubArch;
4785
4786 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004787 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004788 SubArch = llvm::ARM::getSubArch(ArchKind);
4789 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4790 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791
4792 // cache CPU related strings
4793 CPUAttr = getCPUAttr();
4794 CPUProfile = getCPUProfile();
4795 }
4796
4797 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004798 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004799 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004800 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004801 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4802 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004803 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004804 if (ArchProfile == llvm::ARM::PK_M) {
4805 MaxAtomicPromoteWidth = 32;
4806 if (ShouldUseInlineAtomic)
4807 MaxAtomicInlineWidth = 32;
4808 }
4809 else {
4810 MaxAtomicPromoteWidth = 64;
4811 if (ShouldUseInlineAtomic)
4812 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004813 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004814 }
4815
4816 bool isThumb() const {
4817 return (ArchISA == llvm::ARM::IK_THUMB);
4818 }
4819
4820 bool supportsThumb() const {
4821 return CPUAttr.count('T') || ArchVersion >= 6;
4822 }
4823
4824 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004825 return CPUAttr.equals("6T2") ||
4826 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004827 }
4828
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004829 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004830 // For most sub-arches, the build attribute CPU name is enough.
4831 // For Cortex variants, it's slightly different.
4832 switch(ArchKind) {
4833 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004834 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004835 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004837 case llvm::ARM::AK_ARMV7S:
4838 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004839 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 return "7A";
4841 case llvm::ARM::AK_ARMV7R:
4842 return "7R";
4843 case llvm::ARM::AK_ARMV7M:
4844 return "7M";
4845 case llvm::ARM::AK_ARMV7EM:
4846 return "7EM";
4847 case llvm::ARM::AK_ARMV8A:
4848 return "8A";
4849 case llvm::ARM::AK_ARMV8_1A:
4850 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004851 case llvm::ARM::AK_ARMV8_2A:
4852 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004853 case llvm::ARM::AK_ARMV8MBaseline:
4854 return "8M_BASE";
4855 case llvm::ARM::AK_ARMV8MMainline:
4856 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004857 }
4858 }
4859
4860 StringRef getCPUProfile() const {
4861 switch(ArchProfile) {
4862 case llvm::ARM::PK_A:
4863 return "A";
4864 case llvm::ARM::PK_R:
4865 return "R";
4866 case llvm::ARM::PK_M:
4867 return "M";
4868 default:
4869 return "";
4870 }
4871 }
4872
Chris Lattner17df24e2008-04-21 18:56:49 +00004873public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004874 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4875 bool IsBigEndian)
4876 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4877 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004878 BigEndian = IsBigEndian;
4879
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004880 switch (getTriple().getOS()) {
4881 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004882 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004883 break;
4884 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004885 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004886 break;
4887 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004888
Renato Goline84b0002015-10-08 16:43:26 +00004889 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004890 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004891
Chris Lattner1a8f3942010-04-23 16:29:58 +00004892 // {} in inline assembly are neon specifiers, not assembly variant
4893 // specifiers.
4894 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004895
Eric Christopher0e261882014-12-05 01:06:59 +00004896 // FIXME: This duplicates code from the driver that sets the -target-abi
4897 // option - this code is used if -target-abi isn't passed and should
4898 // be unified in some way.
4899 if (Triple.isOSBinFormatMachO()) {
4900 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4901 // the frontend matches that.
4902 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4903 Triple.getOS() == llvm::Triple::UnknownOS ||
4904 StringRef(CPU).startswith("cortex-m")) {
4905 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004906 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004907 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004908 } else {
4909 setABI("apcs-gnu");
4910 }
4911 } else if (Triple.isOSWindows()) {
4912 // FIXME: this is invalid for WindowsCE
4913 setABI("aapcs");
4914 } else {
4915 // Select the default based on the platform.
4916 switch (Triple.getEnvironment()) {
4917 case llvm::Triple::Android:
4918 case llvm::Triple::GNUEABI:
4919 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004920 case llvm::Triple::MuslEABI:
4921 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004922 setABI("aapcs-linux");
4923 break;
4924 case llvm::Triple::EABIHF:
4925 case llvm::Triple::EABI:
4926 setABI("aapcs");
4927 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004928 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004929 setABI("apcs-gnu");
4930 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004931 default:
4932 if (Triple.getOS() == llvm::Triple::NetBSD)
4933 setABI("apcs-gnu");
4934 else
4935 setABI("aapcs");
4936 break;
4937 }
4938 }
John McCall86353412010-08-21 22:46:04 +00004939
4940 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004941 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004942
Renato Golin15b86152015-07-03 16:41:13 +00004943 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004944 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004945
James Molloya7139222012-03-12 09:14:10 +00004946 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004947 // the alignment of the zero-length bitfield is greater than the member
4948 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004949 // zero length bitfield.
4950 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004951
4952 if (Triple.getOS() == llvm::Triple::Linux ||
4953 Triple.getOS() == llvm::Triple::UnknownOS)
4954 this->MCountName =
4955 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004956 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004957
Alp Toker4925ba72014-06-07 23:30:42 +00004958 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004959
Craig Topper3164f332014-03-11 03:39:26 +00004960 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004961 ABI = Name;
4962
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004963 // The defaults (above) are for AAPCS, check if we need to change them.
4964 //
4965 // FIXME: We need support for -meabi... we could just mangle it into the
4966 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004967 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004968 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004969 return true;
4970 }
4971 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4972 setABIAAPCS();
4973 return true;
4974 }
4975 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004976 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004977
Renato Golinf5c4dec2015-05-27 13:33:00 +00004978 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004979 bool
4980 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4981 StringRef CPU,
4982 const std::vector<std::string> &FeaturesVec) const override {
4983
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004984 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004985 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004986
4987 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004988 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004989 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4990
4991 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004992 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004993 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4994
4995 for (const char *Feature : TargetFeatures)
4996 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00004997 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004998
Eric Christopher007b0a02015-08-28 22:32:01 +00004999 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005000 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005001
Craig Topper3164f332014-03-11 03:39:26 +00005002 bool handleTargetFeatures(std::vector<std::string> &Features,
5003 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005004 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005005 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005006 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005007 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005008 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005009 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005010 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005011
Ranjeet Singhac08e532015-06-24 23:39:25 +00005012 // This does not diagnose illegal cases like having both
5013 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5014 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005015 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005016 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005017 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005018 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005019 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005020 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005021 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005022 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005023 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005024 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005025 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005026 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005027 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005028 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005029 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005030 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005031 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005032 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005033 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005034 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005035 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005036 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005037 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005038 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005039 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005040 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005041 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005042 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005043 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005044 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005045 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005046 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005047 } else if (Feature == "+strict-align") {
5048 Unaligned = 0;
5049 } else if (Feature == "+fp16") {
5050 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005051 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005052 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005053 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005054
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005055 switch (ArchVersion) {
5056 case 6:
5057 if (ArchProfile == llvm::ARM::PK_M)
5058 LDREX = 0;
5059 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5060 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5061 else
5062 LDREX = LDREX_W;
5063 break;
5064 case 7:
5065 if (ArchProfile == llvm::ARM::PK_M)
5066 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5067 else
5068 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5069 break;
5070 case 8:
5071 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5072 }
5073
Rafael Espindolaeb265472013-08-21 21:59:03 +00005074 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5075 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5076 return false;
5077 }
5078
5079 if (FPMath == FP_Neon)
5080 Features.push_back("+neonfp");
5081 else if (FPMath == FP_VFP)
5082 Features.push_back("-neonfp");
5083
Daniel Dunbar893d4752009-12-19 04:15:38 +00005084 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005085 auto Feature =
5086 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5087 if (Feature != Features.end())
5088 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005089
Rafael Espindolaeb265472013-08-21 21:59:03 +00005090 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005091 }
5092
Craig Topper3164f332014-03-11 03:39:26 +00005093 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005094 return llvm::StringSwitch<bool>(Feature)
5095 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005096 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005097 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005098 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005099 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005100 .Case("hwdiv", HWDiv & HWDivThumb)
5101 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005102 .Default(false);
5103 }
Renato Golin15b86152015-07-03 16:41:13 +00005104
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005105 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005106 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005107 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005108
Renato Golin15b86152015-07-03 16:41:13 +00005109 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005110 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005111 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005112 CPU = Name;
5113 return true;
5114 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005115
Craig Topper3164f332014-03-11 03:39:26 +00005116 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005117
Craig Topper3164f332014-03-11 03:39:26 +00005118 void getTargetDefines(const LangOptions &Opts,
5119 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005120 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005121 Builder.defineMacro("__arm");
5122 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005123 // For bare-metal none-eabi.
5124 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5125 getTriple().getEnvironment() == llvm::Triple::EABI)
5126 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005127
Chris Lattnerecd49032009-03-02 22:27:17 +00005128 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005129 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005130
5131 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5132 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005133 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005134 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5135
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005136 if (!CPUAttr.empty())
5137 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005138
5139 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005140 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005141 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005142
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005143 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005144 // ACLE 6.5.7 Crypto Extension
5145 if (Crypto)
5146 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5147 // ACLE 6.5.8 CRC32 Extension
5148 if (CRC)
5149 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5150 // ACLE 6.5.10 Numeric Maximum and Minimum
5151 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5152 // ACLE 6.5.9 Directed Rounding
5153 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005154 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005155
5156 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5157 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005158 // NOTE that the default profile is assumed to be 'A'
5159 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005160 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5161
Bradley Smithf4affc12016-03-03 13:52:22 +00005162 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5163 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5164 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5165 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005166 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005167 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005168 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005169 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5170
5171 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5172 // instruction set such as ARM or Thumb.
5173 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5174
5175 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5176
5177 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005178 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005179 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005180
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005181 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005182 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005183 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005184
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005185 // ACLE 6.4.4 LDREX/STREX
5186 if (LDREX)
5187 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5188
5189 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005190 if (ArchVersion == 5 ||
5191 (ArchVersion == 6 && CPUProfile != "M") ||
5192 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005193 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5194
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005195 // ACLE 6.5.1 Hardware Floating Point
5196 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005197 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005198
Yi Konga44c4d72014-06-27 21:25:42 +00005199 // ACLE predefines.
5200 Builder.defineMacro("__ARM_ACLE", "200");
5201
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005202 // FP16 support (we currently only support IEEE format).
5203 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5204 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5205
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005206 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005207 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005208 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5209
Mike Stump9d54bd72009-04-08 02:07:04 +00005210 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005211
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005212 // FIXME: It's more complicated than this and we don't really support
5213 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005214 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005215 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005216 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005217
David Tweed8f676532012-10-25 13:33:01 +00005218 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005219 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005220 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005221 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005222 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005223 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005224 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005225
Tim Northover28fc0e12016-04-28 13:59:55 +00005226 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5227 ABI == "aapcs16")
5228 Builder.defineMacro("__ARM_PCS_VFP", "1");
5229
Daniel Dunbar893d4752009-12-19 04:15:38 +00005230 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005231 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005232
5233 if (CPU == "xscale")
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005234 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005235
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005236 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005237 Builder.defineMacro("__THUMBEL__");
5238 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005239 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005240 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005241 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005242
5243 // ACLE 6.4.9 32-bit SIMD instructions
5244 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5245 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5246
5247 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005248 if (((HWDiv & HWDivThumb) && isThumb()) ||
5249 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005251 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005253
5254 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005255 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005256
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005257 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005258 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005259 if (FPU & VFP2FPU)
5260 Builder.defineMacro("__ARM_VFPV2__");
5261 if (FPU & VFP3FPU)
5262 Builder.defineMacro("__ARM_VFPV3__");
5263 if (FPU & VFP4FPU)
5264 Builder.defineMacro("__ARM_VFPV4__");
5265 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005266
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005267 // This only gets set when Neon instructions are actually available, unlike
5268 // the VFP define, hence the soft float and arch check. This is subtly
5269 // different from gcc, we follow the intent which was that it should be set
5270 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005271 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005272 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005273 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005274 // current AArch32 NEON implementations do not support double-precision
5275 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005276 Builder.defineMacro("__ARM_NEON_FP",
5277 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005278 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005279
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005280 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5281 Opts.ShortWChar ? "2" : "4");
5282
5283 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5284 Opts.ShortEnums ? "1" : "4");
5285
Bradley Smithf4affc12016-03-03 13:52:22 +00005286 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005287 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5288 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5289 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5290 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5291 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005292
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005293 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005294 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005295 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005296 }
5297
5298 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005299 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005300 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5301 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005302 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005303 }
5304
5305 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005306 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005307 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005308
5309 if (Opts.UnsafeFPMath)
5310 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005311
5312 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5313 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005314 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005315
Craig Topper6c03a542015-10-19 04:51:35 +00005316 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5317 return llvm::makeArrayRef(BuiltinInfo,
5318 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005319 }
Craig Topper3164f332014-03-11 03:39:26 +00005320 bool isCLZForZeroUndef() const override { return false; }
5321 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005322 return IsAAPCS
5323 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005324 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5325 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005326 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005327 ArrayRef<const char *> getGCCRegNames() const override;
5328 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005329 bool validateAsmConstraint(const char *&Name,
5330 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005331 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005332 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005333 case 'l': // r0-r7
5334 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005335 case 't': // VFP Floating point register single precision
5336 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005337 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005338 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005339 case 'I':
5340 case 'J':
5341 case 'K':
5342 case 'L':
5343 case 'M':
5344 // FIXME
5345 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005346 case 'Q': // A memory address that is a single base register.
5347 Info.setAllowsMemory();
5348 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005349 case 'U': // a memory reference...
5350 switch (Name[1]) {
5351 case 'q': // ...ARMV4 ldrsb
5352 case 'v': // ...VFP load/store (reg+constant offset)
5353 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005354 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005355 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005356 case 'n': // valid address for Neon doubleword vector load/store
5357 case 'm': // valid address for Neon element and structure load/store
5358 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005359 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005360 Info.setAllowsMemory();
5361 Name++;
5362 return true;
5363 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005364 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005365 return false;
5366 }
Craig Topper3164f332014-03-11 03:39:26 +00005367 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005368 std::string R;
5369 switch (*Constraint) {
5370 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005371 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005372 Constraint++;
5373 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005374 case 'p': // 'p' should be translated to 'r' by default.
5375 R = std::string("r");
5376 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005377 default:
5378 return std::string(1, *Constraint);
5379 }
5380 return R;
5381 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005382 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005383 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005384 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005385 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005386 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005387
Bill Wendling9d1ee112012-10-25 23:28:48 +00005388 // Strip off constraint modifiers.
5389 while (Constraint[0] == '=' ||
5390 Constraint[0] == '+' ||
5391 Constraint[0] == '&')
5392 Constraint = Constraint.substr(1);
5393
5394 switch (Constraint[0]) {
5395 default: break;
5396 case 'r': {
5397 switch (Modifier) {
5398 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005399 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005400 case 'q':
5401 // A register of size 32 cannot fit a vector type.
5402 return false;
5403 }
5404 }
5405 }
5406
5407 return true;
5408 }
Craig Topper3164f332014-03-11 03:39:26 +00005409 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005410 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005411 return "";
5412 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005413
Craig Topper3164f332014-03-11 03:39:26 +00005414 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005415 switch (CC) {
5416 case CC_AAPCS:
5417 case CC_AAPCS_VFP:
5418 case CC_Swift:
5419 return CCCR_OK;
5420 default:
5421 return CCCR_Warning;
5422 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005423 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005424
Craig Topper3164f332014-03-11 03:39:26 +00005425 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005426 if (RegNo == 0) return 0;
5427 if (RegNo == 1) return 1;
5428 return -1;
5429 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005430
5431 bool hasSjLjLowering() const override {
5432 return true;
5433 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005434};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005435
Rafael Espindolaeb265472013-08-21 21:59:03 +00005436bool ARMTargetInfo::setFPMath(StringRef Name) {
5437 if (Name == "neon") {
5438 FPMath = FP_Neon;
5439 return true;
5440 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5441 Name == "vfp4") {
5442 FPMath = FP_VFP;
5443 return true;
5444 }
5445 return false;
5446}
5447
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005448const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005449 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005450 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005451 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5452
5453 // Float registers
5454 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5455 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5456 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005457 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005458
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005459 // Double registers
5460 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5461 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005462 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5463 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005464
5465 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005466 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5467 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005468};
5469
Craig Topperf054e3a2015-10-19 03:52:27 +00005470ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5471 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005472}
5473
5474const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005475 { { "a1" }, "r0" },
5476 { { "a2" }, "r1" },
5477 { { "a3" }, "r2" },
5478 { { "a4" }, "r3" },
5479 { { "v1" }, "r4" },
5480 { { "v2" }, "r5" },
5481 { { "v3" }, "r6" },
5482 { { "v4" }, "r7" },
5483 { { "v5" }, "r8" },
5484 { { "v6", "rfp" }, "r9" },
5485 { { "sl" }, "r10" },
5486 { { "fp" }, "r11" },
5487 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005488 { { "r13" }, "sp" },
5489 { { "r14" }, "lr" },
5490 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005491 // The S, D and Q registers overlap, but aren't really aliases; we
5492 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005493};
5494
Craig Topperf054e3a2015-10-19 03:52:27 +00005495ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5496 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005497}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005498
5499const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005500#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005501 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005502#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5503 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005504#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005505
Craig Topper07d3b622015-08-07 05:14:44 +00005506#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005507 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005508#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005509 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005510#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5511 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005512#include "clang/Basic/BuiltinsARM.def"
5513};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005514
5515class ARMleTargetInfo : public ARMTargetInfo {
5516public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005517 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5518 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005519 void getTargetDefines(const LangOptions &Opts,
5520 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005521 Builder.defineMacro("__ARMEL__");
5522 ARMTargetInfo::getTargetDefines(Opts, Builder);
5523 }
5524};
5525
5526class ARMbeTargetInfo : public ARMTargetInfo {
5527public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005528 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5529 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005530 void getTargetDefines(const LangOptions &Opts,
5531 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005532 Builder.defineMacro("__ARMEB__");
5533 Builder.defineMacro("__ARM_BIG_ENDIAN");
5534 ARMTargetInfo::getTargetDefines(Opts, Builder);
5535 }
5536};
Chris Lattner17df24e2008-04-21 18:56:49 +00005537
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005538class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5539 const llvm::Triple Triple;
5540public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005541 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5542 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005543 WCharType = UnsignedShort;
5544 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005545 }
5546 void getVisualStudioDefines(const LangOptions &Opts,
5547 MacroBuilder &Builder) const {
5548 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5549
5550 // FIXME: this is invalid for WindowsCE
5551 Builder.defineMacro("_M_ARM_NT", "1");
5552 Builder.defineMacro("_M_ARMT", "_M_ARM");
5553 Builder.defineMacro("_M_THUMB", "_M_ARM");
5554
5555 assert((Triple.getArch() == llvm::Triple::arm ||
5556 Triple.getArch() == llvm::Triple::thumb) &&
5557 "invalid architecture for Windows ARM target info");
5558 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5559 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5560
5561 // TODO map the complete set of values
5562 // 31: VFPv3 40: VFPv4
5563 Builder.defineMacro("_M_ARM_FP", "31");
5564 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005565 BuiltinVaListKind getBuiltinVaListKind() const override {
5566 return TargetInfo::CharPtrBuiltinVaList;
5567 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005568 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5569 switch (CC) {
5570 case CC_X86StdCall:
5571 case CC_X86ThisCall:
5572 case CC_X86FastCall:
5573 case CC_X86VectorCall:
5574 return CCCR_Ignore;
5575 case CC_C:
5576 return CCCR_OK;
5577 default:
5578 return CCCR_Warning;
5579 }
5580 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005581};
5582
5583// Windows ARM + Itanium C++ ABI Target
5584class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5585public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005586 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5587 const TargetOptions &Opts)
5588 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005589 TheCXXABI.set(TargetCXXABI::GenericARM);
5590 }
5591
5592 void getTargetDefines(const LangOptions &Opts,
5593 MacroBuilder &Builder) const override {
5594 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5595
5596 if (Opts.MSVCCompat)
5597 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5598 }
5599};
5600
5601// Windows ARM, MS (C++) ABI
5602class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5603public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005604 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5605 const TargetOptions &Opts)
5606 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005607 TheCXXABI.set(TargetCXXABI::Microsoft);
5608 }
5609
5610 void getTargetDefines(const LangOptions &Opts,
5611 MacroBuilder &Builder) const override {
5612 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5613 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5614 }
5615};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005616
Yaron Keren321249c2015-07-15 13:32:23 +00005617// ARM MinGW target
5618class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5619public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005620 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5621 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005622 TheCXXABI.set(TargetCXXABI::GenericARM);
5623 }
5624
5625 void getTargetDefines(const LangOptions &Opts,
5626 MacroBuilder &Builder) const override {
5627 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5628 DefineStd(Builder, "WIN32", Opts);
5629 DefineStd(Builder, "WINNT", Opts);
5630 Builder.defineMacro("_ARM_");
5631 addMinGWDefines(Opts, Builder);
5632 }
5633};
5634
5635// ARM Cygwin target
5636class CygwinARMTargetInfo : public ARMleTargetInfo {
5637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005638 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5639 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005640 TLSSupported = false;
5641 WCharType = UnsignedShort;
5642 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005643 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005644 }
5645 void getTargetDefines(const LangOptions &Opts,
5646 MacroBuilder &Builder) const override {
5647 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5648 Builder.defineMacro("_ARM_");
5649 Builder.defineMacro("__CYGWIN__");
5650 Builder.defineMacro("__CYGWIN32__");
5651 DefineStd(Builder, "unix", Opts);
5652 if (Opts.CPlusPlus)
5653 Builder.defineMacro("_GNU_SOURCE");
5654 }
5655};
5656
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005657class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005658protected:
Craig Topper3164f332014-03-11 03:39:26 +00005659 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5660 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005661 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005662 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005663
Torok Edwinb2b37c62009-06-30 17:10:35 +00005664public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005665 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5666 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005667 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005668 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005669 // FIXME: This should be based off of the target features in
5670 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005671 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005672
Tim Northoverd88ecb32016-01-27 19:32:40 +00005673 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005674 // Darwin on iOS uses a variant of the ARM C++ ABI.
5675 TheCXXABI.set(TargetCXXABI::WatchOS);
5676
5677 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5678 // size_t is long, it's a bit weird for it to be int.
5679 PtrDiffType = SignedLong;
5680
5681 // BOOL should be a real boolean on the new ABI
5682 UseSignedCharForObjCBool = false;
5683 } else
5684 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005685 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005686};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005687
Tim Northover573cbee2014-05-24 12:52:07 +00005688class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005689 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005690 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5691 static const char *const GCCRegNames[];
5692
James Molloy75f5f9e2014-04-16 15:33:48 +00005693 enum FPUModeEnum {
5694 FPUMode,
5695 NeonMode
5696 };
5697
5698 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005699 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005700 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005701 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005702 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005703
Tim Northovera2ee4332014-03-29 15:09:45 +00005704 static const Builtin::Info BuiltinInfo[];
5705
5706 std::string ABI;
5707
5708public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005709 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005710 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005711 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5712 WCharType = SignedInt;
5713
5714 // NetBSD apparently prefers consistency across ARM targets to consistency
5715 // across 64-bit targets.
5716 Int64Type = SignedLongLong;
5717 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005718 } else {
5719 WCharType = UnsignedInt;
5720 Int64Type = SignedLong;
5721 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005722 }
5723
Tim Northovera2ee4332014-03-29 15:09:45 +00005724 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005725 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005726 MaxAtomicInlineWidth = 128;
5727 MaxAtomicPromoteWidth = 128;
5728
Tim Northovera6a19f12015-02-06 01:25:07 +00005729 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005730 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5731
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 // {} in inline assembly are neon specifiers, not assembly variant
5733 // specifiers.
5734 NoAsmVariants = true;
5735
Tim Northover7ad87af2015-01-16 18:44:04 +00005736 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5737 // contributes to the alignment of the containing aggregate in the same way
5738 // a plain (non bit-field) member of that type would, without exception for
5739 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005740 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005741 UseZeroLengthBitfieldAlignment = true;
5742
Tim Northover573cbee2014-05-24 12:52:07 +00005743 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005744 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005745
5746 if (Triple.getOS() == llvm::Triple::Linux ||
5747 Triple.getOS() == llvm::Triple::UnknownOS)
5748 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005749 }
5750
Alp Toker4925ba72014-06-07 23:30:42 +00005751 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005752 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005753 if (Name != "aapcs" && Name != "darwinpcs")
5754 return false;
5755
5756 ABI = Name;
5757 return true;
5758 }
5759
David Blaikie1cbb9712014-11-14 19:09:44 +00005760 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005761 return Name == "generic" ||
5762 llvm::AArch64::parseCPUArch(Name) !=
5763 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005764 }
5765
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005766 void getTargetDefines(const LangOptions &Opts,
5767 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005768 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005770
5771 // Target properties.
5772 Builder.defineMacro("_LP64");
5773 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005774
5775 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5776 Builder.defineMacro("__ARM_ACLE", "200");
5777 Builder.defineMacro("__ARM_ARCH", "8");
5778 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5779
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005780 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005781 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005782 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005783
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005784 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5785 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5786 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5787 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005788 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005789 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5790 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005791
5792 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5793
5794 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005795 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005796
5797 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5798 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005799 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5800 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005801
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005802 if (Opts.UnsafeFPMath)
5803 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005804
5805 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5806
5807 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5808 Opts.ShortEnums ? "1" : "4");
5809
James Molloy75f5f9e2014-04-16 15:33:48 +00005810 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005811 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005812 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005813 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005814 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005815
Bradley Smith418c5932014-05-02 15:17:51 +00005816 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005817 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005818
James Molloy75f5f9e2014-04-16 15:33:48 +00005819 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005820 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5821
5822 if (Unaligned)
5823 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005824
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005825 if (V8_1A)
5826 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5827
Reid Klecknerd167d422015-05-06 15:31:46 +00005828 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5829 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5830 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5831 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5832 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005833 }
5834
Craig Topper6c03a542015-10-19 04:51:35 +00005835 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5836 return llvm::makeArrayRef(BuiltinInfo,
5837 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005838 }
5839
David Blaikie1cbb9712014-11-14 19:09:44 +00005840 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005841 return Feature == "aarch64" ||
5842 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005843 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005844 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005845 }
5846
James Molloy5e73df52014-04-16 15:06:20 +00005847 bool handleTargetFeatures(std::vector<std::string> &Features,
5848 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005849 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005850 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005851 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005852 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005853 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005854
Eric Christopher610fe112015-08-26 08:21:55 +00005855 for (const auto &Feature : Features) {
5856 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005857 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005858 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005859 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005860 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005861 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005862 if (Feature == "+strict-align")
5863 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005864 if (Feature == "+v8.1a")
5865 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005866 }
5867
James Y Knightb214cbc2016-03-04 19:00:41 +00005868 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005869
5870 return true;
5871 }
5872
John McCall477f2bb2016-03-03 06:39:32 +00005873 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5874 switch (CC) {
5875 case CC_C:
5876 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005877 case CC_PreserveMost:
5878 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005879 return CCCR_OK;
5880 default:
5881 return CCCR_Warning;
5882 }
5883 }
5884
David Blaikie1cbb9712014-11-14 19:09:44 +00005885 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005886
David Blaikie1cbb9712014-11-14 19:09:44 +00005887 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005888 return TargetInfo::AArch64ABIBuiltinVaList;
5889 }
5890
Craig Topperf054e3a2015-10-19 03:52:27 +00005891 ArrayRef<const char *> getGCCRegNames() const override;
5892 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005893
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005894 bool validateAsmConstraint(const char *&Name,
5895 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005896 switch (*Name) {
5897 default:
5898 return false;
5899 case 'w': // Floating point and SIMD registers (V0-V31)
5900 Info.setAllowsRegister();
5901 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005902 case 'I': // Constant that can be used with an ADD instruction
5903 case 'J': // Constant that can be used with a SUB instruction
5904 case 'K': // Constant that can be used with a 32-bit logical instruction
5905 case 'L': // Constant that can be used with a 64-bit logical instruction
5906 case 'M': // Constant that can be used as a 32-bit MOV immediate
5907 case 'N': // Constant that can be used as a 64-bit MOV immediate
5908 case 'Y': // Floating point constant zero
5909 case 'Z': // Integer constant zero
5910 return true;
5911 case 'Q': // A memory reference with base register and no offset
5912 Info.setAllowsMemory();
5913 return true;
5914 case 'S': // A symbolic address
5915 Info.setAllowsRegister();
5916 return true;
5917 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005918 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5919 // Utf: A memory address suitable for ldp/stp in TF mode.
5920 // Usa: An absolute symbolic address.
5921 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5922 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005923 case 'z': // Zero register, wzr or xzr
5924 Info.setAllowsRegister();
5925 return true;
5926 case 'x': // Floating point and SIMD registers (V0-V15)
5927 Info.setAllowsRegister();
5928 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005929 }
5930 return false;
5931 }
5932
Akira Hatanaka987f1862014-08-22 06:05:21 +00005933 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005934 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005935 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005936 // Strip off constraint modifiers.
5937 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5938 Constraint = Constraint.substr(1);
5939
5940 switch (Constraint[0]) {
5941 default:
5942 return true;
5943 case 'z':
5944 case 'r': {
5945 switch (Modifier) {
5946 case 'x':
5947 case 'w':
5948 // For now assume that the person knows what they're
5949 // doing with the modifier.
5950 return true;
5951 default:
5952 // By default an 'r' constraint will be in the 'x'
5953 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005954 if (Size == 64)
5955 return true;
5956
5957 SuggestedModifier = "w";
5958 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005959 }
5960 }
5961 }
5962 }
5963
David Blaikie1cbb9712014-11-14 19:09:44 +00005964 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005965
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005966 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005967 if (RegNo == 0)
5968 return 0;
5969 if (RegNo == 1)
5970 return 1;
5971 return -1;
5972 }
5973};
5974
Tim Northover573cbee2014-05-24 12:52:07 +00005975const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005976 // 32-bit Integer registers
5977 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5978 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5979 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5980
5981 // 64-bit Integer registers
5982 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5983 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5984 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5985
5986 // 32-bit floating point regsisters
5987 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5988 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5989 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5990
5991 // 64-bit floating point regsisters
5992 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5993 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5994 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
5995
5996 // Vector registers
5997 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
5998 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
5999 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6000};
6001
Craig Topperf054e3a2015-10-19 03:52:27 +00006002ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6003 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006004}
6005
Tim Northover573cbee2014-05-24 12:52:07 +00006006const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006007 { { "w31" }, "wsp" },
6008 { { "x29" }, "fp" },
6009 { { "x30" }, "lr" },
6010 { { "x31" }, "sp" },
6011 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6012 // don't want to substitute one of these for a different-sized one.
6013};
6014
Craig Topperf054e3a2015-10-19 03:52:27 +00006015ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6016 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006017}
6018
Tim Northover573cbee2014-05-24 12:52:07 +00006019const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006020#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006021 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006022#include "clang/Basic/BuiltinsNEON.def"
6023
6024#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006025 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006026#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006027};
James Molloy5e73df52014-04-16 15:06:20 +00006028
Tim Northover573cbee2014-05-24 12:52:07 +00006029class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006030 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006031 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006032 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006033 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006034 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006035 }
6036
6037public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006038 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6039 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006040 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006041 }
James Molloy5e73df52014-04-16 15:06:20 +00006042 void getTargetDefines(const LangOptions &Opts,
6043 MacroBuilder &Builder) const override {
6044 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006045 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006046 }
6047};
6048
Tim Northover573cbee2014-05-24 12:52:07 +00006049class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006050 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006051 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006052 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006053 }
6054
6055public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006056 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6057 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006058 void getTargetDefines(const LangOptions &Opts,
6059 MacroBuilder &Builder) const override {
6060 Builder.defineMacro("__AARCH64EB__");
6061 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6062 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006063 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006064 }
6065};
Tim Northovera2ee4332014-03-29 15:09:45 +00006066
Tim Northover573cbee2014-05-24 12:52:07 +00006067class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006068protected:
6069 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6070 MacroBuilder &Builder) const override {
6071 Builder.defineMacro("__AARCH64_SIMD__");
6072 Builder.defineMacro("__ARM64_ARCH_8__");
6073 Builder.defineMacro("__ARM_NEON__");
6074 Builder.defineMacro("__LITTLE_ENDIAN__");
6075 Builder.defineMacro("__REGISTER_PREFIX__", "");
6076 Builder.defineMacro("__arm64", "1");
6077 Builder.defineMacro("__arm64__", "1");
6078
6079 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6080 }
6081
Tim Northovera2ee4332014-03-29 15:09:45 +00006082public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006083 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6084 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006085 Int64Type = SignedLongLong;
6086 WCharType = SignedInt;
6087 UseSignedCharForObjCBool = false;
6088
Tim Northovera6a19f12015-02-06 01:25:07 +00006089 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006090 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6091
6092 TheCXXABI.set(TargetCXXABI::iOS64);
6093 }
6094
David Blaikie1cbb9712014-11-14 19:09:44 +00006095 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006096 return TargetInfo::CharPtrBuiltinVaList;
6097 }
6098};
Tim Northovera2ee4332014-03-29 15:09:45 +00006099
Tony Linthicum76329bf2011-12-12 21:14:55 +00006100// Hexagon abstract base class
6101class HexagonTargetInfo : public TargetInfo {
6102 static const Builtin::Info BuiltinInfo[];
6103 static const char * const GCCRegNames[];
6104 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6105 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006106 bool HasHVX, HasHVXDouble;
6107
Tony Linthicum76329bf2011-12-12 21:14:55 +00006108public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006109 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6110 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006111 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006112 // Specify the vector alignment explicitly. For v512x1, the calculated
6113 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6114 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006115 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006116 "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 +00006117 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006118 SizeType = UnsignedInt;
6119 PtrDiffType = SignedInt;
6120 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006121
6122 // {} in inline assembly are packet specifiers, not assembly variant
6123 // specifiers.
6124 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006125
6126 LargeArrayMinWidth = 64;
6127 LargeArrayAlign = 64;
6128 UseBitFieldTypeAlignment = true;
6129 ZeroLengthBitfieldBoundary = 32;
6130 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006131 }
6132
Craig Topper6c03a542015-10-19 04:51:35 +00006133 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6134 return llvm::makeArrayRef(BuiltinInfo,
6135 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006136 }
6137
Craig Topper3164f332014-03-11 03:39:26 +00006138 bool validateAsmConstraint(const char *&Name,
6139 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006140 switch (*Name) {
6141 case 'v':
6142 case 'q':
6143 if (HasHVX) {
6144 Info.setAllowsRegister();
6145 return true;
6146 }
6147 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006148 case 's':
6149 // Relocatable constant.
6150 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006151 }
6152 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006153 }
6154
Craig Topper3164f332014-03-11 03:39:26 +00006155 void getTargetDefines(const LangOptions &Opts,
6156 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006157
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006158 bool isCLZForZeroUndef() const override { return false; }
6159
Craig Topper3164f332014-03-11 03:39:26 +00006160 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006161 return llvm::StringSwitch<bool>(Feature)
6162 .Case("hexagon", true)
6163 .Case("hvx", HasHVX)
6164 .Case("hvx-double", HasHVXDouble)
6165 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006166 }
Craig Topper3164f332014-03-11 03:39:26 +00006167
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006168 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6169 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6170 const override;
6171
6172 bool handleTargetFeatures(std::vector<std::string> &Features,
6173 DiagnosticsEngine &Diags) override;
6174
Craig Topper3164f332014-03-11 03:39:26 +00006175 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006176 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006177 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006178 ArrayRef<const char *> getGCCRegNames() const override;
6179 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006180 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006181 return "";
6182 }
Sebastian Pop86500282012-01-13 20:37:10 +00006183
6184 static const char *getHexagonCPUSuffix(StringRef Name) {
6185 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006186 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006187 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006188 .Case("hexagonv55", "55")
6189 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006190 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006191 }
6192
Craig Topper3164f332014-03-11 03:39:26 +00006193 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006194 if (!getHexagonCPUSuffix(Name))
6195 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006196 CPU = Name;
6197 return true;
6198 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006199
6200 int getEHDataRegisterNumber(unsigned RegNo) const override {
6201 return RegNo < 2 ? RegNo : -1;
6202 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006203};
6204
6205void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006206 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006207 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208 Builder.defineMacro("__hexagon__", "1");
6209
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006210 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006211 Builder.defineMacro("__HEXAGON_V4__");
6212 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006213 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006214 Builder.defineMacro("__QDSP6_V4__");
6215 Builder.defineMacro("__QDSP6_ARCH__", "4");
6216 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006217 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006218 Builder.defineMacro("__HEXAGON_V5__");
6219 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6220 if(Opts.HexagonQdsp6Compat) {
6221 Builder.defineMacro("__QDSP6_V5__");
6222 Builder.defineMacro("__QDSP6_ARCH__", "5");
6223 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006224 } else if (CPU == "hexagonv55") {
6225 Builder.defineMacro("__HEXAGON_V55__");
6226 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6227 Builder.defineMacro("__QDSP6_V55__");
6228 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006229 } else if (CPU == "hexagonv60") {
6230 Builder.defineMacro("__HEXAGON_V60__");
6231 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6232 Builder.defineMacro("__QDSP6_V60__");
6233 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006234 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006235
6236 if (hasFeature("hvx")) {
6237 Builder.defineMacro("__HVX__");
6238 if (hasFeature("hvx-double"))
6239 Builder.defineMacro("__HVXDBL__");
6240 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006241}
6242
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006243bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6244 DiagnosticsEngine &Diags) {
6245 for (auto &F : Features) {
6246 if (F == "+hvx")
6247 HasHVX = true;
6248 else if (F == "-hvx")
6249 HasHVX = HasHVXDouble = false;
6250 else if (F == "+hvx-double")
6251 HasHVX = HasHVXDouble = true;
6252 else if (F == "-hvx-double")
6253 HasHVXDouble = false;
6254 }
6255 return true;
6256}
6257
6258bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6259 DiagnosticsEngine &Diags, StringRef CPU,
6260 const std::vector<std::string> &FeaturesVec) const {
6261 // Default for v60: -hvx, -hvx-double.
6262 Features["hvx"] = false;
6263 Features["hvx-double"] = false;
6264
6265 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6266}
6267
6268
6269const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006270 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6271 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6272 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6273 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6274 "p0", "p1", "p2", "p3",
6275 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6276};
6277
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006278ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006279 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006280}
6281
Tony Linthicum76329bf2011-12-12 21:14:55 +00006282const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6283 { { "sp" }, "r29" },
6284 { { "fp" }, "r30" },
6285 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006286};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006287
Craig Topperf054e3a2015-10-19 03:52:27 +00006288ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6289 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006290}
6291
6292
6293const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006294#define BUILTIN(ID, TYPE, ATTRS) \
6295 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6296#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6297 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006298#include "clang/Basic/BuiltinsHexagon.def"
6299};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006300
Jacques Pienaard964cc22016-03-28 21:02:54 +00006301class LanaiTargetInfo : public TargetInfo {
6302 // Class for Lanai (32-bit).
6303 // The CPU profiles supported by the Lanai backend
6304 enum CPUKind {
6305 CK_NONE,
6306 CK_V11,
6307 } CPU;
6308
6309 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6310 static const char *const GCCRegNames[];
6311
6312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006313 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6314 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006315 // Description string has to be kept in sync with backend.
6316 resetDataLayout("E" // Big endian
6317 "-m:e" // ELF name manging
6318 "-p:32:32" // 32 bit pointers, 32 bit aligned
6319 "-i64:64" // 64 bit integers, 64 bit aligned
6320 "-a:0:32" // 32 bit alignment of objects of aggregate type
6321 "-n32" // 32 bit native integer width
6322 "-S64" // 64 bit natural stack alignment
6323 );
6324
6325 // Setting RegParmMax equal to what mregparm was set to in the old
6326 // toolchain
6327 RegParmMax = 4;
6328
6329 // Set the default CPU to V11
6330 CPU = CK_V11;
6331
6332 // Temporary approach to make everything at least word-aligned and allow for
6333 // safely casting between pointers with different alignment requirements.
6334 // TODO: Remove this when there are no more cast align warnings on the
6335 // firmware.
6336 MinGlobalAlign = 32;
6337 }
6338
6339 void getTargetDefines(const LangOptions &Opts,
6340 MacroBuilder &Builder) const override {
6341 // Define __lanai__ when building for target lanai.
6342 Builder.defineMacro("__lanai__");
6343
6344 // Set define for the CPU specified.
6345 switch (CPU) {
6346 case CK_V11:
6347 Builder.defineMacro("__LANAI_V11__");
6348 break;
6349 case CK_NONE:
6350 llvm_unreachable("Unhandled target CPU");
6351 }
6352 }
6353
6354 bool setCPU(const std::string &Name) override {
6355 CPU = llvm::StringSwitch<CPUKind>(Name)
6356 .Case("v11", CK_V11)
6357 .Default(CK_NONE);
6358
6359 return CPU != CK_NONE;
6360 }
6361
6362 bool hasFeature(StringRef Feature) const override {
6363 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6364 }
6365
6366 ArrayRef<const char *> getGCCRegNames() const override;
6367
6368 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6369
6370 BuiltinVaListKind getBuiltinVaListKind() const override {
6371 return TargetInfo::VoidPtrBuiltinVaList;
6372 }
6373
6374 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6375
6376 bool validateAsmConstraint(const char *&Name,
6377 TargetInfo::ConstraintInfo &info) const override {
6378 return false;
6379 }
6380
6381 const char *getClobbers() const override { return ""; }
6382};
6383
6384const char *const LanaiTargetInfo::GCCRegNames[] = {
6385 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6386 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6387 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6388
6389ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6390 return llvm::makeArrayRef(GCCRegNames);
6391}
6392
6393const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6394 {{"pc"}, "r2"},
6395 {{"sp"}, "r4"},
6396 {{"fp"}, "r5"},
6397 {{"rv"}, "r8"},
6398 {{"rr1"}, "r10"},
6399 {{"rr2"}, "r11"},
6400 {{"rca"}, "r15"},
6401};
6402
6403ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6404 return llvm::makeArrayRef(GCCRegAliases);
6405}
6406
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006407// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6408class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006409 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6410 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006411 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006412public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006413 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006414 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006415
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006416 int getEHDataRegisterNumber(unsigned RegNo) const override {
6417 if (RegNo == 0) return 24;
6418 if (RegNo == 1) return 25;
6419 return -1;
6420 }
6421
Craig Topper3164f332014-03-11 03:39:26 +00006422 bool handleTargetFeatures(std::vector<std::string> &Features,
6423 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006424 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006425 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6426 if (Feature != Features.end()) {
6427 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006428 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006429 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006430 }
Craig Topper3164f332014-03-11 03:39:26 +00006431 void getTargetDefines(const LangOptions &Opts,
6432 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006433 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006434 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006435
6436 if (SoftFloat)
6437 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006438 }
Craig Topper3164f332014-03-11 03:39:26 +00006439
6440 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006441 return llvm::StringSwitch<bool>(Feature)
6442 .Case("softfloat", SoftFloat)
6443 .Case("sparc", true)
6444 .Default(false);
6445 }
Craig Topper3164f332014-03-11 03:39:26 +00006446
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006447 bool hasSjLjLowering() const override {
6448 return true;
6449 }
6450
Craig Topper6c03a542015-10-19 04:51:35 +00006451 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006452 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006453 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006454 }
Craig Topper3164f332014-03-11 03:39:26 +00006455 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006456 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006457 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006458 ArrayRef<const char *> getGCCRegNames() const override;
6459 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006460 bool validateAsmConstraint(const char *&Name,
6461 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006462 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006463 switch (*Name) {
6464 case 'I': // Signed 13-bit constant
6465 case 'J': // Zero
6466 case 'K': // 32-bit constant with the low 12 bits clear
6467 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6468 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6469 case 'N': // Same as 'K' but zext (required for SIMode)
6470 case 'O': // The constant 4096
6471 return true;
6472 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006473 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006474 }
Craig Topper3164f332014-03-11 03:39:26 +00006475 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006476 // FIXME: Implement!
6477 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006478 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006479
6480 // No Sparc V7 for now, the backend doesn't support it anyway.
6481 enum CPUKind {
6482 CK_GENERIC,
6483 CK_V8,
6484 CK_SUPERSPARC,
6485 CK_SPARCLITE,
6486 CK_F934,
6487 CK_HYPERSPARC,
6488 CK_SPARCLITE86X,
6489 CK_SPARCLET,
6490 CK_TSC701,
6491 CK_V9,
6492 CK_ULTRASPARC,
6493 CK_ULTRASPARC3,
6494 CK_NIAGARA,
6495 CK_NIAGARA2,
6496 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006497 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006498 CK_MYRIAD2100,
6499 CK_MYRIAD2150,
6500 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006501 CK_LEON2,
6502 CK_LEON2_AT697E,
6503 CK_LEON2_AT697F,
6504 CK_LEON3,
6505 CK_LEON3_UT699,
6506 CK_LEON3_GR712RC,
6507 CK_LEON4,
6508 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006509 } CPU = CK_GENERIC;
6510
6511 enum CPUGeneration {
6512 CG_V8,
6513 CG_V9,
6514 };
6515
6516 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6517 switch (Kind) {
6518 case CK_GENERIC:
6519 case CK_V8:
6520 case CK_SUPERSPARC:
6521 case CK_SPARCLITE:
6522 case CK_F934:
6523 case CK_HYPERSPARC:
6524 case CK_SPARCLITE86X:
6525 case CK_SPARCLET:
6526 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006527 case CK_MYRIAD2100:
6528 case CK_MYRIAD2150:
6529 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006530 case CK_LEON2:
6531 case CK_LEON2_AT697E:
6532 case CK_LEON2_AT697F:
6533 case CK_LEON3:
6534 case CK_LEON3_UT699:
6535 case CK_LEON3_GR712RC:
6536 case CK_LEON4:
6537 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006538 return CG_V8;
6539 case CK_V9:
6540 case CK_ULTRASPARC:
6541 case CK_ULTRASPARC3:
6542 case CK_NIAGARA:
6543 case CK_NIAGARA2:
6544 case CK_NIAGARA3:
6545 case CK_NIAGARA4:
6546 return CG_V9;
6547 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006548 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006549 }
6550
6551 CPUKind getCPUKind(StringRef Name) const {
6552 return llvm::StringSwitch<CPUKind>(Name)
6553 .Case("v8", CK_V8)
6554 .Case("supersparc", CK_SUPERSPARC)
6555 .Case("sparclite", CK_SPARCLITE)
6556 .Case("f934", CK_F934)
6557 .Case("hypersparc", CK_HYPERSPARC)
6558 .Case("sparclite86x", CK_SPARCLITE86X)
6559 .Case("sparclet", CK_SPARCLET)
6560 .Case("tsc701", CK_TSC701)
6561 .Case("v9", CK_V9)
6562 .Case("ultrasparc", CK_ULTRASPARC)
6563 .Case("ultrasparc3", CK_ULTRASPARC3)
6564 .Case("niagara", CK_NIAGARA)
6565 .Case("niagara2", CK_NIAGARA2)
6566 .Case("niagara3", CK_NIAGARA3)
6567 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006568 .Case("ma2100", CK_MYRIAD2100)
6569 .Case("ma2150", CK_MYRIAD2150)
6570 .Case("ma2450", CK_MYRIAD2450)
6571 // FIXME: the myriad2[.n] spellings are obsolete,
6572 // but a grace period is needed to allow updating dependent builds.
6573 .Case("myriad2", CK_MYRIAD2100)
6574 .Case("myriad2.1", CK_MYRIAD2100)
6575 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006576 .Case("leon2", CK_LEON2)
6577 .Case("at697e", CK_LEON2_AT697E)
6578 .Case("at697f", CK_LEON2_AT697F)
6579 .Case("leon3", CK_LEON3)
6580 .Case("ut699", CK_LEON3_UT699)
6581 .Case("gr712rc", CK_LEON3_GR712RC)
6582 .Case("leon4", CK_LEON4)
6583 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006584 .Default(CK_GENERIC);
6585 }
6586
6587 bool setCPU(const std::string &Name) override {
6588 CPU = getCPUKind(Name);
6589 return CPU != CK_GENERIC;
6590 }
Gabor Greif49991682008-02-21 16:29:08 +00006591};
6592
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006593const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006594 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6595 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6596 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6597 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6598};
6599
Craig Topperf054e3a2015-10-19 03:52:27 +00006600ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6601 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006602}
6603
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006604const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006605 { { "g0" }, "r0" },
6606 { { "g1" }, "r1" },
6607 { { "g2" }, "r2" },
6608 { { "g3" }, "r3" },
6609 { { "g4" }, "r4" },
6610 { { "g5" }, "r5" },
6611 { { "g6" }, "r6" },
6612 { { "g7" }, "r7" },
6613 { { "o0" }, "r8" },
6614 { { "o1" }, "r9" },
6615 { { "o2" }, "r10" },
6616 { { "o3" }, "r11" },
6617 { { "o4" }, "r12" },
6618 { { "o5" }, "r13" },
6619 { { "o6", "sp" }, "r14" },
6620 { { "o7" }, "r15" },
6621 { { "l0" }, "r16" },
6622 { { "l1" }, "r17" },
6623 { { "l2" }, "r18" },
6624 { { "l3" }, "r19" },
6625 { { "l4" }, "r20" },
6626 { { "l5" }, "r21" },
6627 { { "l6" }, "r22" },
6628 { { "l7" }, "r23" },
6629 { { "i0" }, "r24" },
6630 { { "i1" }, "r25" },
6631 { { "i2" }, "r26" },
6632 { { "i3" }, "r27" },
6633 { { "i4" }, "r28" },
6634 { { "i5" }, "r29" },
6635 { { "i6", "fp" }, "r30" },
6636 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006637};
6638
Craig Topperf054e3a2015-10-19 03:52:27 +00006639ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6640 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006641}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006642
6643// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6644class SparcV8TargetInfo : public SparcTargetInfo {
6645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006646 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6647 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006648 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006649 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6650 switch (getTriple().getOS()) {
6651 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006652 SizeType = UnsignedInt;
6653 IntPtrType = SignedInt;
6654 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006655 break;
6656 case llvm::Triple::NetBSD:
6657 case llvm::Triple::OpenBSD:
6658 SizeType = UnsignedLong;
6659 IntPtrType = SignedLong;
6660 PtrDiffType = SignedLong;
6661 break;
Brad Smith56495d52015-08-13 22:00:53 +00006662 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006663 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006664 }
6665
Craig Topper3164f332014-03-11 03:39:26 +00006666 void getTargetDefines(const LangOptions &Opts,
6667 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006668 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006669 switch (getCPUGeneration(CPU)) {
6670 case CG_V8:
6671 Builder.defineMacro("__sparcv8");
6672 if (getTriple().getOS() != llvm::Triple::Solaris)
6673 Builder.defineMacro("__sparcv8__");
6674 break;
6675 case CG_V9:
6676 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006677 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006678 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006679 Builder.defineMacro("__sparc_v9__");
6680 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006681 break;
6682 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006683 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006684 std::string MyriadArchValue, Myriad2Value;
6685 Builder.defineMacro("__sparc_v8__");
6686 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006687 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006688 case CK_MYRIAD2150:
6689 MyriadArchValue = "__ma2150";
6690 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006691 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006692 case CK_MYRIAD2450:
6693 MyriadArchValue = "__ma2450";
6694 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006695 break;
6696 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006697 MyriadArchValue = "__ma2100";
6698 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006699 break;
6700 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006701 Builder.defineMacro(MyriadArchValue, "1");
6702 Builder.defineMacro(MyriadArchValue+"__", "1");
6703 Builder.defineMacro("__myriad2__", Myriad2Value);
6704 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006705 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006706 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006707
6708 bool hasSjLjLowering() const override {
6709 return true;
6710 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006711};
6712
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006713// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6714class SparcV8elTargetInfo : public SparcV8TargetInfo {
6715 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006716 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6717 : SparcV8TargetInfo(Triple, Opts) {
6718 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6719 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006720 }
6721};
6722
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006723// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6724class SparcV9TargetInfo : public SparcTargetInfo {
6725public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006726 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6727 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006728 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006729 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006730 // This is an LP64 platform.
6731 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006732
6733 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006734 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006735 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006736 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006737 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006738 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006739
6740 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6741 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6742 LongDoubleWidth = 128;
6743 LongDoubleAlign = 128;
6744 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006745 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006746 }
6747
Craig Topper3164f332014-03-11 03:39:26 +00006748 void getTargetDefines(const LangOptions &Opts,
6749 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006750 SparcTargetInfo::getTargetDefines(Opts, Builder);
6751 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006752 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006753 // Solaris doesn't need these variants, but the BSDs do.
6754 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006755 Builder.defineMacro("__sparc64__");
6756 Builder.defineMacro("__sparc_v9__");
6757 Builder.defineMacro("__sparcv9__");
6758 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006759 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006760
Craig Topper3164f332014-03-11 03:39:26 +00006761 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006762 if (!SparcTargetInfo::setCPU(Name))
6763 return false;
6764 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006765 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006766};
6767
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006768class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006769 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006770 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006771 std::string CPU;
6772 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006773 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006774
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006775public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006776 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006777 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6778 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006779 IntMaxType = SignedLong;
6780 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006781 TLSSupported = true;
6782 IntWidth = IntAlign = 32;
6783 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6784 PointerWidth = PointerAlign = 64;
6785 LongDoubleWidth = 128;
6786 LongDoubleAlign = 64;
6787 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006788 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006789 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006790 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 +00006791 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6792 }
6793 void getTargetDefines(const LangOptions &Opts,
6794 MacroBuilder &Builder) const override {
6795 Builder.defineMacro("__s390__");
6796 Builder.defineMacro("__s390x__");
6797 Builder.defineMacro("__zarch__");
6798 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006799
6800 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6801 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6803 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6804
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006805 if (HasTransactionalExecution)
6806 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006807 if (Opts.ZVector)
6808 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006809 }
Craig Topper6c03a542015-10-19 04:51:35 +00006810 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6811 return llvm::makeArrayRef(BuiltinInfo,
6812 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006813 }
6814
Craig Topperf054e3a2015-10-19 03:52:27 +00006815 ArrayRef<const char *> getGCCRegNames() const override;
6816 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006817 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006818 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006819 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006820 bool validateAsmConstraint(const char *&Name,
6821 TargetInfo::ConstraintInfo &info) const override;
6822 const char *getClobbers() const override {
6823 // FIXME: Is this really right?
6824 return "";
6825 }
6826 BuiltinVaListKind getBuiltinVaListKind() const override {
6827 return TargetInfo::SystemZBuiltinVaList;
6828 }
6829 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006830 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006831 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6832 .Case("z10", true)
6833 .Case("z196", true)
6834 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006835 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006836 .Default(false);
6837
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006838 return CPUKnown;
6839 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006840 bool
6841 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6842 StringRef CPU,
6843 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006844 if (CPU == "zEC12")
6845 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006846 if (CPU == "z13") {
6847 Features["transactional-execution"] = true;
6848 Features["vector"] = true;
6849 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006850 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006851 }
6852
6853 bool handleTargetFeatures(std::vector<std::string> &Features,
6854 DiagnosticsEngine &Diags) override {
6855 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006856 for (const auto &Feature : Features) {
6857 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006858 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006859 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006860 HasVector = true;
6861 }
6862 // If we use the vector ABI, vector types are 64-bit aligned.
6863 if (HasVector) {
6864 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006865 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6866 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006867 }
6868 return true;
6869 }
6870
6871 bool hasFeature(StringRef Feature) const override {
6872 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006873 .Case("systemz", true)
6874 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006875 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006876 .Default(false);
6877 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006878
Bryan Chane3f1ed52016-04-28 13:56:43 +00006879 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6880 switch (CC) {
6881 case CC_C:
6882 case CC_Swift:
6883 return CCCR_OK;
6884 default:
6885 return CCCR_Warning;
6886 }
6887 }
6888
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006889 StringRef getABI() const override {
6890 if (HasVector)
6891 return "vector";
6892 return "";
6893 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006894
6895 bool useFloat128ManglingForLongDouble() const override {
6896 return true;
6897 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006898};
6899
6900const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6901#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006902 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006903#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6904 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006905#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006906};
6907
6908const char *const SystemZTargetInfo::GCCRegNames[] = {
6909 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6910 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6911 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6912 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6913};
6914
Craig Topperf054e3a2015-10-19 03:52:27 +00006915ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6916 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006917}
6918
6919bool SystemZTargetInfo::
6920validateAsmConstraint(const char *&Name,
6921 TargetInfo::ConstraintInfo &Info) const {
6922 switch (*Name) {
6923 default:
6924 return false;
6925
6926 case 'a': // Address register
6927 case 'd': // Data register (equivalent to 'r')
6928 case 'f': // Floating-point register
6929 Info.setAllowsRegister();
6930 return true;
6931
6932 case 'I': // Unsigned 8-bit constant
6933 case 'J': // Unsigned 12-bit constant
6934 case 'K': // Signed 16-bit constant
6935 case 'L': // Signed 20-bit displacement (on all targets we support)
6936 case 'M': // 0x7fffffff
6937 return true;
6938
6939 case 'Q': // Memory with base and unsigned 12-bit displacement
6940 case 'R': // Likewise, plus an index
6941 case 'S': // Memory with base and signed 20-bit displacement
6942 case 'T': // Likewise, plus an index
6943 Info.setAllowsMemory();
6944 return true;
6945 }
6946}
Ulrich Weigand47445072013-05-06 16:26:41 +00006947
Eric Christopherc48497a2015-09-18 21:26:24 +00006948class MSP430TargetInfo : public TargetInfo {
6949 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006950
Eric Christopherc48497a2015-09-18 21:26:24 +00006951public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006952 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6953 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006954 BigEndian = false;
6955 TLSSupported = false;
6956 IntWidth = 16;
6957 IntAlign = 16;
6958 LongWidth = 32;
6959 LongLongWidth = 64;
6960 LongAlign = LongLongAlign = 16;
6961 PointerWidth = 16;
6962 PointerAlign = 16;
6963 SuitableAlign = 16;
6964 SizeType = UnsignedInt;
6965 IntMaxType = SignedLongLong;
6966 IntPtrType = SignedInt;
6967 PtrDiffType = SignedInt;
6968 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006969 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006970 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006971 void getTargetDefines(const LangOptions &Opts,
6972 MacroBuilder &Builder) const override {
6973 Builder.defineMacro("MSP430");
6974 Builder.defineMacro("__MSP430__");
6975 // FIXME: defines for different 'flavours' of MCU
6976 }
Craig Topper6c03a542015-10-19 04:51:35 +00006977 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006978 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006979 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006980 }
6981 bool hasFeature(StringRef Feature) const override {
6982 return Feature == "msp430";
6983 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006984 ArrayRef<const char *> getGCCRegNames() const override;
6985 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006986 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006987 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006988 }
6989 bool validateAsmConstraint(const char *&Name,
6990 TargetInfo::ConstraintInfo &info) const override {
6991 // FIXME: implement
6992 switch (*Name) {
6993 case 'K': // the constant 1
6994 case 'L': // constant -1^20 .. 1^19
6995 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00006996 return true;
6997 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006998 // No target constraints for now.
6999 return false;
7000 }
7001 const char *getClobbers() const override {
7002 // FIXME: Is this really right?
7003 return "";
7004 }
7005 BuiltinVaListKind getBuiltinVaListKind() const override {
7006 // FIXME: implement
7007 return TargetInfo::CharPtrBuiltinVaList;
7008 }
7009};
7010
7011const char *const MSP430TargetInfo::GCCRegNames[] = {
7012 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7013 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7014
Craig Topperf054e3a2015-10-19 03:52:27 +00007015ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7016 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007017}
7018
7019// LLVM and Clang cannot be used directly to output native binaries for
7020// target, but is used to compile C code to llvm bitcode with correct
7021// type and alignment information.
7022//
7023// TCE uses the llvm bitcode as input and uses it for generating customized
7024// target processor and program binary. TCE co-design environment is
7025// publicly available in http://tce.cs.tut.fi
7026
7027static const unsigned TCEOpenCLAddrSpaceMap[] = {
7028 3, // opencl_global
7029 4, // opencl_local
7030 5, // opencl_constant
7031 // FIXME: generic has to be added to the target
7032 0, // opencl_generic
7033 0, // cuda_device
7034 0, // cuda_constant
7035 0 // cuda_shared
7036};
7037
7038class TCETargetInfo : public TargetInfo {
7039public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007040 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7041 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007042 TLSSupported = false;
7043 IntWidth = 32;
7044 LongWidth = LongLongWidth = 32;
7045 PointerWidth = 32;
7046 IntAlign = 32;
7047 LongAlign = LongLongAlign = 32;
7048 PointerAlign = 32;
7049 SuitableAlign = 32;
7050 SizeType = UnsignedInt;
7051 IntMaxType = SignedLong;
7052 IntPtrType = SignedInt;
7053 PtrDiffType = SignedInt;
7054 FloatWidth = 32;
7055 FloatAlign = 32;
7056 DoubleWidth = 32;
7057 DoubleAlign = 32;
7058 LongDoubleWidth = 32;
7059 LongDoubleAlign = 32;
7060 FloatFormat = &llvm::APFloat::IEEEsingle;
7061 DoubleFormat = &llvm::APFloat::IEEEsingle;
7062 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007063 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7064 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007065 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7066 UseAddrSpaceMapMangling = true;
7067 }
7068
7069 void getTargetDefines(const LangOptions &Opts,
7070 MacroBuilder &Builder) const override {
7071 DefineStd(Builder, "tce", Opts);
7072 Builder.defineMacro("__TCE__");
7073 Builder.defineMacro("__TCE_V1__");
7074 }
7075 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7076
Craig Topper6c03a542015-10-19 04:51:35 +00007077 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007078 const char *getClobbers() const override { return ""; }
7079 BuiltinVaListKind getBuiltinVaListKind() const override {
7080 return TargetInfo::VoidPtrBuiltinVaList;
7081 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007082 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007083 bool validateAsmConstraint(const char *&Name,
7084 TargetInfo::ConstraintInfo &info) const override {
7085 return true;
7086 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007087 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7088 return None;
7089 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007090};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007091
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007092class BPFTargetInfo : public TargetInfo {
7093public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007094 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7095 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007096 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7097 SizeType = UnsignedLong;
7098 PtrDiffType = SignedLong;
7099 IntPtrType = SignedLong;
7100 IntMaxType = SignedLong;
7101 Int64Type = SignedLong;
7102 RegParmMax = 5;
7103 if (Triple.getArch() == llvm::Triple::bpfeb) {
7104 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007105 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007106 } else {
7107 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007108 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007109 }
7110 MaxAtomicPromoteWidth = 64;
7111 MaxAtomicInlineWidth = 64;
7112 TLSSupported = false;
7113 }
7114 void getTargetDefines(const LangOptions &Opts,
7115 MacroBuilder &Builder) const override {
7116 DefineStd(Builder, "bpf", Opts);
7117 Builder.defineMacro("__BPF__");
7118 }
7119 bool hasFeature(StringRef Feature) const override {
7120 return Feature == "bpf";
7121 }
7122
Craig Topper6c03a542015-10-19 04:51:35 +00007123 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007124 const char *getClobbers() const override {
7125 return "";
7126 }
7127 BuiltinVaListKind getBuiltinVaListKind() const override {
7128 return TargetInfo::VoidPtrBuiltinVaList;
7129 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007130 ArrayRef<const char *> getGCCRegNames() const override {
7131 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007132 }
7133 bool validateAsmConstraint(const char *&Name,
7134 TargetInfo::ConstraintInfo &info) const override {
7135 return true;
7136 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007137 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7138 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007139 }
7140};
7141
Daniel Sanders4672af62016-05-27 11:51:02 +00007142class MipsTargetInfo : public TargetInfo {
7143 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007144 StringRef Layout;
7145
7146 if (ABI == "o32")
7147 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7148 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007149 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007150 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007151 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007152 else
7153 llvm_unreachable("Invalid ABI");
7154
7155 if (BigEndian)
7156 resetDataLayout(("E-" + Layout).str());
7157 else
7158 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007159 }
7160
Akira Hatanaka9064e362013-10-29 18:30:33 +00007161
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007162 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007163 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007164 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007165 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007166 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007167 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007168 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007169 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007170 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007171 enum DspRevEnum {
7172 NoDSP, DSP1, DSP2
7173 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007174 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007175
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007176protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007177 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007178 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007179
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007180public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007181 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007182 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7183 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7184 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007185 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007186 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7187 getTriple().getArch() == llvm::Triple::mips64;
7188
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007189 setABI((getTriple().getArch() == llvm::Triple::mips ||
7190 getTriple().getArch() == llvm::Triple::mipsel)
7191 ? "o32"
7192 : "n64");
7193
7194 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007195 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007196
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007197 bool isNaN2008Default() const {
7198 return CPU == "mips32r6" || CPU == "mips64r6";
7199 }
7200
7201 bool isFP64Default() const {
7202 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7203 }
7204
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007205 bool isNan2008() const override {
7206 return IsNan2008;
7207 }
7208
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007209 bool processorSupportsGPR64() const {
7210 return llvm::StringSwitch<bool>(CPU)
7211 .Case("mips3", true)
7212 .Case("mips4", true)
7213 .Case("mips5", true)
7214 .Case("mips64", true)
7215 .Case("mips64r2", true)
7216 .Case("mips64r3", true)
7217 .Case("mips64r5", true)
7218 .Case("mips64r6", true)
7219 .Case("octeon", true)
7220 .Default(false);
7221 return false;
7222 }
7223
Alp Toker4925ba72014-06-07 23:30:42 +00007224 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007225 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007226 if (Name == "o32") {
7227 setO32ABITypes();
7228 ABI = Name;
7229 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007230 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007231
7232 if (Name == "n32") {
7233 setN32ABITypes();
7234 ABI = Name;
7235 return true;
7236 }
7237 if (Name == "n64") {
7238 setN64ABITypes();
7239 ABI = Name;
7240 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007241 }
7242 return false;
7243 }
7244
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007245 void setO32ABITypes() {
7246 Int64Type = SignedLongLong;
7247 IntMaxType = Int64Type;
7248 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7249 LongDoubleWidth = LongDoubleAlign = 64;
7250 LongWidth = LongAlign = 32;
7251 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7252 PointerWidth = PointerAlign = 32;
7253 PtrDiffType = SignedInt;
7254 SizeType = UnsignedInt;
7255 SuitableAlign = 64;
7256 }
7257
7258 void setN32N64ABITypes() {
7259 LongDoubleWidth = LongDoubleAlign = 128;
7260 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7261 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7262 LongDoubleWidth = LongDoubleAlign = 64;
7263 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7264 }
7265 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7266 SuitableAlign = 128;
7267 }
7268
Daniel Sanders4672af62016-05-27 11:51:02 +00007269 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007270 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007271 Int64Type = SignedLong;
7272 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007273 LongWidth = LongAlign = 64;
7274 PointerWidth = PointerAlign = 64;
7275 PtrDiffType = SignedLong;
7276 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007277 }
7278
7279 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007280 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007281 Int64Type = SignedLongLong;
7282 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007283 LongWidth = LongAlign = 32;
7284 PointerWidth = PointerAlign = 32;
7285 PtrDiffType = SignedInt;
7286 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007287 }
7288
Craig Topper3164f332014-03-11 03:39:26 +00007289 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007290 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007291 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007292 .Case("mips1", true)
7293 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007294 .Case("mips3", true)
7295 .Case("mips4", true)
7296 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007297 .Case("mips32", true)
7298 .Case("mips32r2", true)
7299 .Case("mips32r3", true)
7300 .Case("mips32r5", true)
7301 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007302 .Case("mips64", true)
7303 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007304 .Case("mips64r3", true)
7305 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007306 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007307 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007308 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007309 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007310 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007311 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007312 bool
7313 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7314 StringRef CPU,
7315 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007316 if (CPU.empty())
7317 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007318 if (CPU == "octeon")
7319 Features["mips64r2"] = Features["cnmips"] = true;
7320 else
7321 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007322 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007323 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007324
Craig Topper3164f332014-03-11 03:39:26 +00007325 void getTargetDefines(const LangOptions &Opts,
7326 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007327 if (BigEndian) {
7328 DefineStd(Builder, "MIPSEB", Opts);
7329 Builder.defineMacro("_MIPSEB");
7330 } else {
7331 DefineStd(Builder, "MIPSEL", Opts);
7332 Builder.defineMacro("_MIPSEL");
7333 }
7334
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007335 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007336 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007337 if (Opts.GNUMode)
7338 Builder.defineMacro("mips");
7339
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007340 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007341 Builder.defineMacro("__mips", "32");
7342 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7343 } else {
7344 Builder.defineMacro("__mips", "64");
7345 Builder.defineMacro("__mips64");
7346 Builder.defineMacro("__mips64__");
7347 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7348 }
7349
7350 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7351 .Cases("mips32", "mips64", "1")
7352 .Cases("mips32r2", "mips64r2", "2")
7353 .Cases("mips32r3", "mips64r3", "3")
7354 .Cases("mips32r5", "mips64r5", "5")
7355 .Cases("mips32r6", "mips64r6", "6")
7356 .Default("");
7357 if (!ISARev.empty())
7358 Builder.defineMacro("__mips_isa_rev", ISARev);
7359
7360 if (ABI == "o32") {
7361 Builder.defineMacro("__mips_o32");
7362 Builder.defineMacro("_ABIO32", "1");
7363 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007364 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007365 Builder.defineMacro("__mips_n32");
7366 Builder.defineMacro("_ABIN32", "2");
7367 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7368 } else if (ABI == "n64") {
7369 Builder.defineMacro("__mips_n64");
7370 Builder.defineMacro("_ABI64", "3");
7371 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7372 } else
7373 llvm_unreachable("Invalid ABI.");
7374
Simon Atanasyan683535b2012-08-29 19:14:58 +00007375 Builder.defineMacro("__REGISTER_PREFIX__", "");
7376
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007377 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007378 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007379 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007380 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007381 case SoftFloat:
7382 Builder.defineMacro("__mips_soft_float", Twine(1));
7383 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007384 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007385
Simon Atanasyan16071912013-04-14 14:07:30 +00007386 if (IsSingleFloat)
7387 Builder.defineMacro("__mips_single_float", Twine(1));
7388
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007389 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7390 Builder.defineMacro("_MIPS_FPSET",
7391 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7392
Simon Atanasyan72244b62012-07-05 16:06:06 +00007393 if (IsMips16)
7394 Builder.defineMacro("__mips16", Twine(1));
7395
Simon Atanasyan60777612013-04-14 14:07:51 +00007396 if (IsMicromips)
7397 Builder.defineMacro("__mips_micromips", Twine(1));
7398
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007399 if (IsNan2008)
7400 Builder.defineMacro("__mips_nan2008", Twine(1));
7401
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007402 switch (DspRev) {
7403 default:
7404 break;
7405 case DSP1:
7406 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7407 Builder.defineMacro("__mips_dsp", Twine(1));
7408 break;
7409 case DSP2:
7410 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7411 Builder.defineMacro("__mips_dspr2", Twine(1));
7412 Builder.defineMacro("__mips_dsp", Twine(1));
7413 break;
7414 }
7415
Jack Carter44ff1e52013-08-12 17:20:29 +00007416 if (HasMSA)
7417 Builder.defineMacro("__mips_msa", Twine(1));
7418
Simon Atanasyan26f19672012-04-05 19:28:31 +00007419 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7420 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7421 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007422
7423 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7424 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007425
7426 // These shouldn't be defined for MIPS-I but there's no need to check
7427 // for that since MIPS-I isn't supported.
7428 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7429 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7430 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007431
7432 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7433 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7434 // the instructions exist but using them violates the ABI since they
7435 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7436 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007437 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007438 }
7439
Craig Topper6c03a542015-10-19 04:51:35 +00007440 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7441 return llvm::makeArrayRef(BuiltinInfo,
7442 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007443 }
Craig Topper3164f332014-03-11 03:39:26 +00007444 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007445 return llvm::StringSwitch<bool>(Feature)
7446 .Case("mips", true)
7447 .Case("fp64", HasFP64)
7448 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007449 }
Craig Topper3164f332014-03-11 03:39:26 +00007450 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007451 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007452 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007453 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007454 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007455 // CPU register names
7456 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007457 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7458 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7459 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007460 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7461 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007462 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7463 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7464 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7465 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007466 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007467 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007468 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7469 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007470 // MSA register names
7471 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7472 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7473 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7474 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7475 // MSA control register names
7476 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7477 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007478 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007479 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007480 }
Craig Topper3164f332014-03-11 03:39:26 +00007481 bool validateAsmConstraint(const char *&Name,
7482 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007483 switch (*Name) {
7484 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007485 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007486 case 'r': // CPU registers.
7487 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007488 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007489 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007490 case 'c': // $25 for indirect jumps
7491 case 'l': // lo register
7492 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007493 Info.setAllowsRegister();
7494 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007495 case 'I': // Signed 16-bit constant
7496 case 'J': // Integer 0
7497 case 'K': // Unsigned 16-bit constant
7498 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7499 case 'M': // Constants not loadable via lui, addiu, or ori
7500 case 'N': // Constant -1 to -65535
7501 case 'O': // A signed 15-bit constant
7502 case 'P': // A constant between 1 go 65535
7503 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007504 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007505 Info.setAllowsMemory();
7506 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007507 case 'Z':
7508 if (Name[1] == 'C') { // An address usable by ll, and sc.
7509 Info.setAllowsMemory();
7510 Name++; // Skip over 'Z'.
7511 return true;
7512 }
7513 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007514 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007515 }
7516
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007517 std::string convertConstraint(const char *&Constraint) const override {
7518 std::string R;
7519 switch (*Constraint) {
7520 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7521 if (Constraint[1] == 'C') {
7522 R = std::string("^") + std::string(Constraint, 2);
7523 Constraint++;
7524 return R;
7525 }
7526 break;
7527 }
7528 return TargetInfo::convertConstraint(Constraint);
7529 }
7530
Craig Topper3164f332014-03-11 03:39:26 +00007531 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007532 // In GCC, $1 is not widely used in generated code (it's used only in a few
7533 // specific situations), so there is no real need for users to add it to
7534 // the clobbers list if they want to use it in their inline assembly code.
7535 //
7536 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7537 // code generation, so using it in inline assembly without adding it to the
7538 // clobbers list can cause conflicts between the inline assembly code and
7539 // the surrounding generated code.
7540 //
7541 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7542 // operands, which will conflict with the ".set at" assembler option (which
7543 // we use only for inline assembly, in order to maintain compatibility with
7544 // GCC) and will also conflict with the user's usage of $1.
7545 //
7546 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7547 // register for generated code is to automatically clobber $1 for all inline
7548 // assembly code.
7549 //
7550 // FIXME: We should automatically clobber $1 only for inline assembly code
7551 // which actually uses it. This would allow LLVM to use $1 for inline
7552 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007553 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007554 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007555
Craig Topper3164f332014-03-11 03:39:26 +00007556 bool handleTargetFeatures(std::vector<std::string> &Features,
7557 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007558 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007559 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007560 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007561 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007562 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007563 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007564 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007565
Eric Christopher610fe112015-08-26 08:21:55 +00007566 for (const auto &Feature : Features) {
7567 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007568 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007569 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007570 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007571 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007572 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007573 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007574 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007575 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007576 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007577 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007578 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007579 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007580 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007581 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007582 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007583 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007584 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007585 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007586 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007587 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007588 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007589 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007590
James Y Knightb214cbc2016-03-04 19:00:41 +00007591 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007592
Rafael Espindolaeb265472013-08-21 21:59:03 +00007593 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007594 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007595
Craig Topper3164f332014-03-11 03:39:26 +00007596 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007597 if (RegNo == 0) return 4;
7598 if (RegNo == 1) return 5;
7599 return -1;
7600 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007601
7602 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007603
7604 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7605 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7606 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7607 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7608 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7609 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7610 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7611 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7612 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7613 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7614 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7615 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7616 {{"ra"}, "$31"}};
7617 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7618 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7619 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7620 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7621 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7622 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7623 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7624 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7625 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7626 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7627 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7628 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007629 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007630 return llvm::makeArrayRef(O32RegAliases);
7631 return llvm::makeArrayRef(NewABIRegAliases);
7632 }
7633
7634 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007635 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007636 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007637
7638 bool validateTarget(DiagnosticsEngine &Diags) const override {
7639 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7640 // this yet. It's better to fail here than on the backend assertion.
7641 if (processorSupportsGPR64() && ABI == "o32") {
7642 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7643 return false;
7644 }
7645
7646 // 64-bit ABI's require 64-bit CPU's.
7647 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7648 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7649 return false;
7650 }
7651
7652 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7653 // can't handle this yet. It's better to fail here than on the
7654 // backend assertion.
7655 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7656 getTriple().getArch() == llvm::Triple::mips64el) &&
7657 ABI == "o32") {
7658 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7659 << ABI << getTriple().str();
7660 return false;
7661 }
7662
7663 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7664 // can't handle this yet. It's better to fail here than on the
7665 // backend assertion.
7666 if ((getTriple().getArch() == llvm::Triple::mips ||
7667 getTriple().getArch() == llvm::Triple::mipsel) &&
7668 (ABI == "n32" || ABI == "n64")) {
7669 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7670 << ABI << getTriple().str();
7671 return false;
7672 }
7673
7674 return true;
7675 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007676};
7677
Daniel Sanders4672af62016-05-27 11:51:02 +00007678const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007679#define BUILTIN(ID, TYPE, ATTRS) \
7680 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7681#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7682 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007683#include "clang/Basic/BuiltinsMips.def"
7684};
7685
Ivan Krasindd7403e2011-08-24 20:22:22 +00007686class PNaClTargetInfo : public TargetInfo {
7687public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007688 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7689 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007690 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007691 this->LongAlign = 32;
7692 this->LongWidth = 32;
7693 this->PointerAlign = 32;
7694 this->PointerWidth = 32;
7695 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007696 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007697 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007698 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007699 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007700 this->SizeType = TargetInfo::UnsignedInt;
7701 this->PtrDiffType = TargetInfo::SignedInt;
7702 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007703 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007704 }
7705
Craig Toppere6f17d02014-03-11 04:07:52 +00007706 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007707 Builder.defineMacro("__le32__");
7708 Builder.defineMacro("__pnacl__");
7709 }
Craig Topper3164f332014-03-11 03:39:26 +00007710 void getTargetDefines(const LangOptions &Opts,
7711 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007712 getArchDefines(Opts, Builder);
7713 }
Craig Topper3164f332014-03-11 03:39:26 +00007714 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007715 return Feature == "pnacl";
7716 }
Craig Topper6c03a542015-10-19 04:51:35 +00007717 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007718 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007719 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007720 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007721 ArrayRef<const char *> getGCCRegNames() const override;
7722 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007723 bool validateAsmConstraint(const char *&Name,
7724 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007725 return false;
7726 }
7727
Craig Topper3164f332014-03-11 03:39:26 +00007728 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007729 return "";
7730 }
7731};
7732
Craig Topperf054e3a2015-10-19 03:52:27 +00007733ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7734 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007735}
7736
Craig Topperf054e3a2015-10-19 03:52:27 +00007737ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7738 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007739}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007740
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007741// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007742class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007743public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007744 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7745 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007746
7747 BuiltinVaListKind getBuiltinVaListKind() const override {
7748 return TargetInfo::PNaClABIBuiltinVaList;
7749 }
7750};
7751
JF Bastien643817d2014-09-12 17:52:47 +00007752class Le64TargetInfo : public TargetInfo {
7753 static const Builtin::Info BuiltinInfo[];
7754
7755public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007756 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7757 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007758 BigEndian = false;
7759 NoAsmVariants = true;
7760 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7761 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007762 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007763 }
7764
7765 void getTargetDefines(const LangOptions &Opts,
7766 MacroBuilder &Builder) const override {
7767 DefineStd(Builder, "unix", Opts);
7768 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7769 Builder.defineMacro("__ELF__");
7770 }
Craig Topper6c03a542015-10-19 04:51:35 +00007771 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7772 return llvm::makeArrayRef(BuiltinInfo,
7773 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007774 }
7775 BuiltinVaListKind getBuiltinVaListKind() const override {
7776 return TargetInfo::PNaClABIBuiltinVaList;
7777 }
7778 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007779 ArrayRef<const char *> getGCCRegNames() const override {
7780 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007781 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007782 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7783 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007784 }
7785 bool validateAsmConstraint(const char *&Name,
7786 TargetInfo::ConstraintInfo &Info) const override {
7787 return false;
7788 }
7789
7790 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007791};
Dan Gohmanc2853072015-09-03 22:51:53 +00007792
7793class WebAssemblyTargetInfo : public TargetInfo {
7794 static const Builtin::Info BuiltinInfo[];
7795
7796 enum SIMDEnum {
7797 NoSIMD,
7798 SIMD128,
7799 } SIMDLevel;
7800
7801public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007802 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007803 : TargetInfo(T), SIMDLevel(NoSIMD) {
7804 BigEndian = false;
7805 NoAsmVariants = true;
7806 SuitableAlign = 128;
7807 LargeArrayMinWidth = 128;
7808 LargeArrayAlign = 128;
7809 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007810 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007811 LongDoubleWidth = LongDoubleAlign = 128;
7812 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007813 }
7814
7815protected:
7816 void getTargetDefines(const LangOptions &Opts,
7817 MacroBuilder &Builder) const override {
7818 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7819 if (SIMDLevel >= SIMD128)
7820 Builder.defineMacro("__wasm_simd128__");
7821 }
7822
7823private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007824 bool
7825 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7826 StringRef CPU,
7827 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007828 if (CPU == "bleeding-edge")
7829 Features["simd128"] = true;
7830 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7831 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007832 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007833 return llvm::StringSwitch<bool>(Feature)
7834 .Case("simd128", SIMDLevel >= SIMD128)
7835 .Default(false);
7836 }
7837 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007838 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007839 for (const auto &Feature : Features) {
7840 if (Feature == "+simd128") {
7841 SIMDLevel = std::max(SIMDLevel, SIMD128);
7842 continue;
7843 }
7844 if (Feature == "-simd128") {
7845 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7846 continue;
7847 }
7848
7849 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7850 << "-target-feature";
7851 return false;
7852 }
7853 return true;
7854 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007855 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007856 return llvm::StringSwitch<bool>(Name)
7857 .Case("mvp", true)
7858 .Case("bleeding-edge", true)
7859 .Case("generic", true)
7860 .Default(false);
7861 }
Craig Topper6c03a542015-10-19 04:51:35 +00007862 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7863 return llvm::makeArrayRef(BuiltinInfo,
7864 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007865 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007866 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007867 return VoidPtrBuiltinVaList;
7868 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007869 ArrayRef<const char *> getGCCRegNames() const final {
7870 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007871 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007872 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7873 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007874 }
7875 bool
7876 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007877 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007878 return false;
7879 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007880 const char *getClobbers() const final { return ""; }
7881 bool isCLZForZeroUndef() const final { return false; }
7882 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007883 IntType getIntTypeByWidth(unsigned BitWidth,
7884 bool IsSigned) const final {
7885 // WebAssembly prefers long long for explicitly 64-bit integers.
7886 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7887 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7888 }
7889 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7890 bool IsSigned) const final {
7891 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7892 return BitWidth == 64
7893 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7894 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7895 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007896};
7897
7898const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7899#define BUILTIN(ID, TYPE, ATTRS) \
7900 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7901#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7902 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7903#include "clang/Basic/BuiltinsWebAssembly.def"
7904};
7905
7906class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7907public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007908 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7909 const TargetOptions &Opts)
7910 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007911 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007912 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007913 }
7914
7915protected:
7916 void getTargetDefines(const LangOptions &Opts,
7917 MacroBuilder &Builder) const override {
7918 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7919 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7920 }
7921};
7922
7923class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7924public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007925 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7926 const TargetOptions &Opts)
7927 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007928 LongAlign = LongWidth = 64;
7929 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007930 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007931 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007932 }
7933
7934protected:
7935 void getTargetDefines(const LangOptions &Opts,
7936 MacroBuilder &Builder) const override {
7937 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7938 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7939 }
7940};
7941
JF Bastien643817d2014-09-12 17:52:47 +00007942const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7943#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007945#include "clang/Basic/BuiltinsLe64.def"
7946};
7947
Eric Christopherc48497a2015-09-18 21:26:24 +00007948static const unsigned SPIRAddrSpaceMap[] = {
7949 1, // opencl_global
7950 3, // opencl_local
7951 2, // opencl_constant
7952 4, // opencl_generic
7953 0, // cuda_device
7954 0, // cuda_constant
7955 0 // cuda_shared
7956};
7957class SPIRTargetInfo : public TargetInfo {
7958public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007959 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7960 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007961 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7962 "SPIR target must use unknown OS");
7963 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7964 "SPIR target must use unknown environment type");
7965 BigEndian = false;
7966 TLSSupported = false;
7967 LongWidth = LongAlign = 64;
7968 AddrSpaceMap = &SPIRAddrSpaceMap;
7969 UseAddrSpaceMapMangling = true;
7970 // Define available target features
7971 // These must be defined in sorted order!
7972 NoAsmVariants = true;
7973 }
7974 void getTargetDefines(const LangOptions &Opts,
7975 MacroBuilder &Builder) const override {
7976 DefineStd(Builder, "SPIR", Opts);
7977 }
7978 bool hasFeature(StringRef Feature) const override {
7979 return Feature == "spir";
7980 }
Craig Topper3164f332014-03-11 03:39:26 +00007981
Craig Topper6c03a542015-10-19 04:51:35 +00007982 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007983 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007984 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007985 bool validateAsmConstraint(const char *&Name,
7986 TargetInfo::ConstraintInfo &info) const override {
7987 return true;
7988 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007989 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7990 return None;
7991 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007992 BuiltinVaListKind getBuiltinVaListKind() const override {
7993 return TargetInfo::VoidPtrBuiltinVaList;
7994 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00007995
Eric Christopherc48497a2015-09-18 21:26:24 +00007996 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00007997 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
7998 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00007999 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008000
Eric Christopherc48497a2015-09-18 21:26:24 +00008001 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8002 return CC_SpirFunction;
8003 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008004
8005 void setSupportedOpenCLOpts() override {
8006 // Assume all OpenCL extensions and optional core features are supported
8007 // for SPIR since it is a generic target.
8008 getSupportedOpenCLOpts().setAll();
8009 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008010};
Guy Benyeib798fc92012-12-11 21:38:14 +00008011
Eric Christopherc48497a2015-09-18 21:26:24 +00008012class SPIR32TargetInfo : public SPIRTargetInfo {
8013public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008014 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8015 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008016 PointerWidth = PointerAlign = 32;
8017 SizeType = TargetInfo::UnsignedInt;
8018 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008019 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8020 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008021 }
8022 void getTargetDefines(const LangOptions &Opts,
8023 MacroBuilder &Builder) const override {
8024 DefineStd(Builder, "SPIR32", Opts);
8025 }
8026};
Guy Benyeib798fc92012-12-11 21:38:14 +00008027
Eric Christopherc48497a2015-09-18 21:26:24 +00008028class SPIR64TargetInfo : public SPIRTargetInfo {
8029public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008030 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8031 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008032 PointerWidth = PointerAlign = 64;
8033 SizeType = TargetInfo::UnsignedLong;
8034 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008035 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8036 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008037 }
8038 void getTargetDefines(const LangOptions &Opts,
8039 MacroBuilder &Builder) const override {
8040 DefineStd(Builder, "SPIR64", Opts);
8041 }
8042};
Guy Benyeib798fc92012-12-11 21:38:14 +00008043
Robert Lytton0e076492013-08-13 09:43:10 +00008044class XCoreTargetInfo : public TargetInfo {
8045 static const Builtin::Info BuiltinInfo[];
8046public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008047 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8048 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008049 BigEndian = false;
8050 NoAsmVariants = true;
8051 LongLongAlign = 32;
8052 SuitableAlign = 32;
8053 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008054 SizeType = UnsignedInt;
8055 PtrDiffType = SignedInt;
8056 IntPtrType = SignedInt;
8057 WCharType = UnsignedChar;
8058 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008059 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008060 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8061 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008062 }
Craig Topper3164f332014-03-11 03:39:26 +00008063 void getTargetDefines(const LangOptions &Opts,
8064 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008065 Builder.defineMacro("__XS1B__");
8066 }
Craig Topper6c03a542015-10-19 04:51:35 +00008067 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8068 return llvm::makeArrayRef(BuiltinInfo,
8069 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008070 }
Craig Topper3164f332014-03-11 03:39:26 +00008071 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008072 return TargetInfo::VoidPtrBuiltinVaList;
8073 }
Craig Topper3164f332014-03-11 03:39:26 +00008074 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008075 return "";
8076 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008077 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008078 static const char * const GCCRegNames[] = {
8079 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8080 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8081 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008082 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008083 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008084 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8085 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008086 }
Craig Topper3164f332014-03-11 03:39:26 +00008087 bool validateAsmConstraint(const char *&Name,
8088 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008089 return false;
8090 }
Craig Topper3164f332014-03-11 03:39:26 +00008091 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008092 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8093 return (RegNo < 2)? RegNo : -1;
8094 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008095 bool allowsLargerPreferedTypeAlignment() const override {
8096 return false;
8097 }
Robert Lytton0e076492013-08-13 09:43:10 +00008098};
8099
8100const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008101#define BUILTIN(ID, TYPE, ATTRS) \
8102 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8103#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8104 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008105#include "clang/Basic/BuiltinsXCore.def"
8106};
Robert Lytton0e076492013-08-13 09:43:10 +00008107
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008108// x86_32 Android target
8109class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8110public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008111 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8112 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008113 SuitableAlign = 32;
8114 LongDoubleWidth = 64;
8115 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8116 }
8117};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008118
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008119// x86_64 Android target
8120class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8121public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008122 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8123 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008124 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8125 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008126
8127 bool useFloat128ManglingForLongDouble() const override {
8128 return true;
8129 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008130};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008131
8132// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8133class RenderScript32TargetInfo : public ARMleTargetInfo {
8134public:
8135 RenderScript32TargetInfo(const llvm::Triple &Triple,
8136 const TargetOptions &Opts)
8137 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8138 Triple.getOSName(),
8139 Triple.getEnvironmentName()),
8140 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008141 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008142 LongWidth = LongAlign = 64;
8143 }
8144 void getTargetDefines(const LangOptions &Opts,
8145 MacroBuilder &Builder) const override {
8146 Builder.defineMacro("__RENDERSCRIPT__");
8147 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8148 }
8149};
8150
8151// 64-bit RenderScript is aarch64
8152class RenderScript64TargetInfo : public AArch64leTargetInfo {
8153public:
8154 RenderScript64TargetInfo(const llvm::Triple &Triple,
8155 const TargetOptions &Opts)
8156 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8157 Triple.getOSName(),
8158 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008159 Opts) {
8160 IsRenderScriptTarget = true;
8161 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008162
8163 void getTargetDefines(const LangOptions &Opts,
8164 MacroBuilder &Builder) const override {
8165 Builder.defineMacro("__RENDERSCRIPT__");
8166 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8167 }
8168};
8169
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008170} // end anonymous namespace
8171
Chris Lattner5ba61f02006-10-14 07:39:34 +00008172//===----------------------------------------------------------------------===//
8173// Driver code
8174//===----------------------------------------------------------------------===//
8175
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008176static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8177 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008178 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008179
Daniel Dunbar52322032009-08-18 05:47:58 +00008180 switch (Triple.getArch()) {
8181 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008182 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008183
Tim Northover2a0783d2014-05-30 14:14:07 +00008184 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008185 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008186
8187 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008188 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008189
Jacques Pienaard964cc22016-03-28 21:02:54 +00008190 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008191 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008192
Tim Northover2a0783d2014-05-30 14:14:07 +00008193 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008194 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008195 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008196
8197 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008198 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008199 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008200 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008201 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008202 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008204 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008205 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008206 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008208 }
8209
Christian Pirker9b019ae2014-02-25 13:51:00 +00008210 case llvm::Triple::aarch64_be:
8211 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008212 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008214 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008216 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008218 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008220 }
8221
Daniel Dunbar52322032009-08-18 05:47:58 +00008222 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008223 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008224 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008226
Daniel Dunbar52322032009-08-18 05:47:58 +00008227 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008228 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008230 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008232 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008233 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008234 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008236 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008238 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008240 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008242 case llvm::Triple::Win32:
8243 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008244 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008246 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008248 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008250 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008251 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008253 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008254 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008256 }
8257
8258 case llvm::Triple::armeb:
8259 case llvm::Triple::thumbeb:
8260 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008262
8263 switch (os) {
8264 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008266 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008268 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008270 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008272 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008274 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008276 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008278 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008280 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008281
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008282 case llvm::Triple::bpfeb:
8283 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008285
Daniel Dunbar52322032009-08-18 05:47:58 +00008286 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008288
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008289 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008290 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008291 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008292 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008293 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008294 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008295 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008296 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008297 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008298 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008299 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008300 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008301 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008302
8303 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008304 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008305 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008306 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008307 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008308 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008309 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008310 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008311 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008312 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008313 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008314 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008315 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008316 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008317 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008318
Akira Hatanakabef17452011-09-20 19:21:49 +00008319 case llvm::Triple::mips64:
8320 switch (os) {
8321 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008322 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008323 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008324 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008325 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008326 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008327 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008328 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008329 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008330 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008331 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008332 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008333 }
8334
8335 case llvm::Triple::mips64el:
8336 switch (os) {
8337 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008338 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008339 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008340 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008341 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008342 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008343 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008344 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008345 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008346 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008347 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008348 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008349 }
8350
Ivan Krasindd7403e2011-08-24 20:22:22 +00008351 case llvm::Triple::le32:
8352 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008353 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008354 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008355 default:
8356 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008357 }
8358
JF Bastien643817d2014-09-12 17:52:47 +00008359 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008360 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008361
Daniel Dunbar52322032009-08-18 05:47:58 +00008362 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008363 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008364 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008365 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008366 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008367 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008368 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008370 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008371 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008372 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008373 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008374 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008376 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008377 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008378 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008379
8380 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008381 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008383 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008384 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008386 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008388 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008390 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008392 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008394 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008395
Bill Schmidt778d3872013-07-26 01:36:11 +00008396 case llvm::Triple::ppc64le:
8397 switch (os) {
8398 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008400 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008402 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008404 }
8405
Peter Collingbournec947aae2012-05-20 23:28:41 +00008406 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008408 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008410
Tom Stellardd8e38a32015-01-06 20:34:47 +00008411 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008412 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008414
Daniel Dunbar52322032009-08-18 05:47:58 +00008415 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008416 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008417 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008419 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008420 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008421 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008422 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008423 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008425 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008426 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008427 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008428 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008429 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008430
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008431 // The 'sparcel' architecture copies all the above cases except for Solaris.
8432 case llvm::Triple::sparcel:
8433 switch (os) {
8434 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008436 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008438 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008440 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008442 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008444 }
8445
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008446 case llvm::Triple::sparcv9:
8447 switch (os) {
8448 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008450 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008451 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008452 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008453 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008454 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008456 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008458 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008460 }
8461
Ulrich Weigand47445072013-05-06 16:26:41 +00008462 case llvm::Triple::systemz:
8463 switch (os) {
8464 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008466 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008468 }
8469
Eli Friedmana9c3d712009-08-19 20:47:07 +00008470 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008472
Daniel Dunbar52322032009-08-18 05:47:58 +00008473 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008474 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008476
Daniel Dunbar52322032009-08-18 05:47:58 +00008477 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008478 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008480 case llvm::Triple::Linux: {
8481 switch (Triple.getEnvironment()) {
8482 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008484 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008486 }
8487 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008488 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008490 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008492 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008494 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008495 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008496 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008498 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008499 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008500 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008502 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008504 case llvm::Triple::Win32: {
8505 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008506 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008508 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008510 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008511 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008512 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008514 }
8515 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008516 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008518 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008520 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008522 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008524 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008526 }
8527
8528 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008529 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008530 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008531
Daniel Dunbar52322032009-08-18 05:47:58 +00008532 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008533 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008534 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008535 case llvm::Triple::Linux: {
8536 switch (Triple.getEnvironment()) {
8537 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008538 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008539 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008540 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008541 }
8542 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008543 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008545 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008546 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008547 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008548 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008549 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008550 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008551 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008552 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008553 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008555 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008557 case llvm::Triple::Win32: {
8558 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008559 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008560 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008561 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008563 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008564 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008566 }
8567 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008568 case llvm::Triple::Haiku:
8569 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008570 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008571 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008572 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008573 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008574 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008575 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008576 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008577
Douglas Katzman78d7c542015-05-12 21:18:10 +00008578 case llvm::Triple::spir: {
8579 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8580 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8581 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008583 }
8584 case llvm::Triple::spir64: {
8585 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8586 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8587 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008588 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008589 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008590 case llvm::Triple::wasm32:
8591 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8592 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008594 case llvm::Triple::wasm64:
8595 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8596 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008597 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008598
8599 case llvm::Triple::renderscript32:
8600 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8601 case llvm::Triple::renderscript64:
8602 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008603 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008604}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008605
8606/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008607/// options.
Alp Toker80758082014-07-06 05:26:44 +00008608TargetInfo *
8609TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008610 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008611 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008612
8613 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008615 if (!Target) {
8616 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008617 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008618 }
Alp Toker80758082014-07-06 05:26:44 +00008619 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008620
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008621 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008622 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8623 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008624 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008625 }
8626
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008627 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008628 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8629 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008630 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008631 }
8632
Rafael Espindolaeb265472013-08-21 21:59:03 +00008633 // Set the fp math unit.
8634 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8635 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008636 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008637 }
8638
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008639 // Compute the default target features, we need the target to handle this
8640 // because features may have dependencies on one another.
8641 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008642 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8643 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008644 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008645
8646 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008647 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008648 for (const auto &F : Features)
8649 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8650
Eric Christopher3ff21b32013-10-16 21:26:26 +00008651 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008652 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008653
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008654 Target->setSupportedOpenCLOpts();
8655
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008656 if (!Target->validateTarget(Diags))
8657 return nullptr;
8658
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008659 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008660}