blob: 7843fde5c45626536b6e1899d1f5a368fb70b211 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
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) {
Alexey Bataev00396512015-07-02 03:40:19 +0000882 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000883 LongDoubleWidth = LongDoubleAlign = 128;
884 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
885 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000886
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 /// \brief Flags for architecture specific defines.
888 typedef enum {
889 ArchDefineNone = 0,
890 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
891 ArchDefinePpcgr = 1 << 1,
892 ArchDefinePpcsq = 1 << 2,
893 ArchDefine440 = 1 << 3,
894 ArchDefine603 = 1 << 4,
895 ArchDefine604 = 1 << 5,
896 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000897 ArchDefinePwr5 = 1 << 7,
898 ArchDefinePwr5x = 1 << 8,
899 ArchDefinePwr6 = 1 << 9,
900 ArchDefinePwr6x = 1 << 10,
901 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000902 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000903 ArchDefinePwr9 = 1 << 13,
904 ArchDefineA2 = 1 << 14,
905 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000906 } ArchDefineTypes;
907
Bill Schmidt38378a02013-02-01 20:23:10 +0000908 // Note: GCC recognizes the following additional cpus:
909 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
910 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
911 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000912 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000913 bool CPUKnown = llvm::StringSwitch<bool>(Name)
914 .Case("generic", true)
915 .Case("440", true)
916 .Case("450", true)
917 .Case("601", true)
918 .Case("602", true)
919 .Case("603", true)
920 .Case("603e", true)
921 .Case("603ev", true)
922 .Case("604", true)
923 .Case("604e", true)
924 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000925 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000926 .Case("g3", true)
927 .Case("7400", true)
928 .Case("g4", true)
929 .Case("7450", true)
930 .Case("g4+", true)
931 .Case("750", true)
932 .Case("970", true)
933 .Case("g5", true)
934 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000935 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000936 .Case("e500mc", true)
937 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000938 .Case("power3", true)
939 .Case("pwr3", true)
940 .Case("power4", true)
941 .Case("pwr4", true)
942 .Case("power5", true)
943 .Case("pwr5", true)
944 .Case("power5x", true)
945 .Case("pwr5x", true)
946 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000947 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("power6x", true)
949 .Case("pwr6x", true)
950 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000952 .Case("power8", true)
953 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000954 .Case("power9", true)
955 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000956 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000957 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000958 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000959 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000960 .Case("powerpc64le", true)
961 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Default(false);
963
964 if (CPUKnown)
965 CPU = Name;
966
967 return CPUKnown;
968 }
969
Ulrich Weigand8afad612014-07-28 13:17:52 +0000970
971 StringRef getABI() const override { return ABI; }
972
Craig Topper6c03a542015-10-19 04:51:35 +0000973 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
974 return llvm::makeArrayRef(BuiltinInfo,
975 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000976 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000977
Craig Topper3164f332014-03-11 03:39:26 +0000978 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000979
Craig Topper3164f332014-03-11 03:39:26 +0000980 void getTargetDefines(const LangOptions &Opts,
981 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000982
Eric Christopher8c47b422015-10-09 18:39:55 +0000983 bool
984 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
985 StringRef CPU,
986 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000987
Craig Topper3164f332014-03-11 03:39:26 +0000988 bool handleTargetFeatures(std::vector<std::string> &Features,
989 DiagnosticsEngine &Diags) override;
990 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000991 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
992 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000993
Craig Topperf054e3a2015-10-19 03:52:27 +0000994 ArrayRef<const char *> getGCCRegNames() const override;
995 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000996 bool validateAsmConstraint(const char *&Name,
997 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000998 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000999 default: return false;
1000 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001002 case 'b': // Base register
1003 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001004 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001005 break;
1006 // FIXME: The following are added to allow parsing.
1007 // I just took a guess at what the actions should be.
1008 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001009 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001010 case 'v': // Altivec vector register
1011 Info.setAllowsRegister();
1012 break;
1013 case 'w':
1014 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'd':// VSX vector register to hold vector double data
1016 case 'f':// VSX vector register to hold vector float data
1017 case 's':// VSX vector register to hold scalar float data
1018 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001019 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001020 break;
1021 default:
1022 return false;
1023 }
1024 Info.setAllowsRegister();
1025 Name++; // Skip over 'w'.
1026 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001027 case 'h': // `MQ', `CTR', or `LINK' register
1028 case 'q': // `MQ' register
1029 case 'c': // `CTR' register
1030 case 'l': // `LINK' register
1031 case 'x': // `CR' register (condition register) number 0
1032 case 'y': // `CR' register (condition register)
1033 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001034 Info.setAllowsRegister();
1035 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // (use `L' instead for SImode constants)
1039 case 'K': // Unsigned 16-bit constant
1040 case 'L': // Signed 16-bit constant shifted left 16 bits
1041 case 'M': // Constant larger than 31
1042 case 'N': // Exact power of 2
1043 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001044 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001048 break;
1049 case 'm': // Memory operand. Note that on PowerPC targets, m can
1050 // include addresses that update the base register. It
1051 // is therefore only safe to use `m' in an asm statement
1052 // if that asm statement accesses the operand exactly once.
1053 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001054 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001055 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001056 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001058 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1059 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001060 // register to be updated.
1061 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001062 if (Name[1] != 's')
1063 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001064 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001065 // include any automodification of the base register. Unlike
1066 // `m', this constraint can be used in asm statements that
1067 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001068 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001069 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001070 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 'Z': // Memory operand that is an indexed or indirect from a
1075 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001076 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001077 Info.setAllowsMemory();
1078 Info.setAllowsRegister();
1079 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001081 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // register (`p' is preferable for asm statements)
1083 case 'S': // Constant suitable as a 64-bit mask operand
1084 case 'T': // Constant suitable as a 32-bit mask operand
1085 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001086 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001087 // instructions
1088 case 'W': // Vector constant that does not require memory
1089 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001090 break;
1091 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
John Thompson07a61a42010-06-24 22:44:13 +00001093 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001094 }
Craig Topper3164f332014-03-11 03:39:26 +00001095 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001096 std::string R;
1097 switch (*Constraint) {
1098 case 'e':
1099 case 'w':
1100 // Two-character constraint; add "^" hint for later parsing.
1101 R = std::string("^") + std::string(Constraint, 2);
1102 Constraint++;
1103 break;
1104 default:
1105 return TargetInfo::convertConstraint(Constraint);
1106 }
1107 return R;
1108 }
Craig Topper3164f332014-03-11 03:39:26 +00001109 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001111 }
Craig Topper3164f332014-03-11 03:39:26 +00001112 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001113 if (RegNo == 0) return 3;
1114 if (RegNo == 1) return 4;
1115 return -1;
1116 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001117
1118 bool hasSjLjLowering() const override {
1119 return true;
1120 }
David Majnemer2617ea62015-06-09 18:05:33 +00001121
1122 bool useFloat128ManglingForLongDouble() const override {
1123 return LongDoubleWidth == 128 &&
1124 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1125 getTriple().isOSBinFormatELF();
1126 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001127};
Anders Carlssonf511f642007-11-27 04:11:28 +00001128
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001129const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001130#define BUILTIN(ID, TYPE, ATTRS) \
1131 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1132#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1133 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001134#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001136
Eric Christopher917e9522014-11-18 22:36:15 +00001137/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001138/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001139bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001140 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001141 for (const auto &Feature : Features) {
1142 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001143 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001144 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001145 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001146 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001147 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001148 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001149 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001150 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001151 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001152 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001153 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001154 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001155 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001156 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001157 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001158 } else if (Feature == "+float128") {
1159 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001160 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161 // TODO: Finish this list and add an assert that we've handled them
1162 // all.
1163 }
Eric Christopher02c33352015-08-25 00:59:11 +00001164
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001165 return true;
1166}
1167
Chris Lattnerecd49032009-03-02 22:27:17 +00001168/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1169/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001170void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001171 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001172 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001173 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001174 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001176 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001177 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001179 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001180 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001181 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001182 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001183 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001186 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1187 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001188 } else {
1189 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1190 getTriple().getOS() != llvm::Triple::OpenBSD)
1191 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001192 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001193
Ulrich Weigand8afad612014-07-28 13:17:52 +00001194 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001195 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001196 Builder.defineMacro("_CALL_ELF", "1");
1197 if (ABI == "elfv2")
1198 Builder.defineMacro("_CALL_ELF", "2");
1199
Chris Lattnerecd49032009-03-02 22:27:17 +00001200 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001201 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1202 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001203
Chris Lattnerecd49032009-03-02 22:27:17 +00001204 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001205 if (LongDoubleWidth == 128)
1206 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001207
John Thompsone467e192009-11-19 17:18:50 +00001208 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001209 Builder.defineMacro("__VEC__", "10206");
1210 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001211 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001212
1213 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1215 .Case("440", ArchDefineName)
1216 .Case("450", ArchDefineName | ArchDefine440)
1217 .Case("601", ArchDefineName)
1218 .Case("602", ArchDefineName | ArchDefinePpcgr)
1219 .Case("603", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1221 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("604", ArchDefineName | ArchDefinePpcgr)
1223 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1224 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001225 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001226 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1227 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1228 .Case("750", ArchDefineName | ArchDefinePpcgr)
1229 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1230 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001231 .Case("a2", ArchDefineA2)
1232 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001233 .Case("pwr3", ArchDefinePpcgr)
1234 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1235 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1236 | ArchDefinePpcsq)
1237 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1238 | ArchDefinePpcgr | ArchDefinePpcsq)
1239 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1240 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1242 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1243 | ArchDefinePpcsq)
1244 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1245 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001246 | ArchDefinePpcgr | ArchDefinePpcsq)
1247 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1248 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1249 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001250 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1251 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1252 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1253 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001254 .Case("power3", ArchDefinePpcgr)
1255 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1256 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
1258 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1259 | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1261 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1263 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1264 | ArchDefinePpcsq)
1265 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1266 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001267 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1269 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1270 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001271 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1272 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1273 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1274 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001275 .Default(ArchDefineNone);
1276
1277 if (defs & ArchDefineName)
1278 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1279 if (defs & ArchDefinePpcgr)
1280 Builder.defineMacro("_ARCH_PPCGR");
1281 if (defs & ArchDefinePpcsq)
1282 Builder.defineMacro("_ARCH_PPCSQ");
1283 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001285 if (defs & ArchDefine603)
1286 Builder.defineMacro("_ARCH_603");
1287 if (defs & ArchDefine604)
1288 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001289 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001290 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001291 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001292 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001293 if (defs & ArchDefinePwr5x)
1294 Builder.defineMacro("_ARCH_PWR5X");
1295 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001297 if (defs & ArchDefinePwr6x)
1298 Builder.defineMacro("_ARCH_PWR6X");
1299 if (defs & ArchDefinePwr7)
1300 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001301 if (defs & ArchDefinePwr8)
1302 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001303 if (defs & ArchDefinePwr9)
1304 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001305 if (defs & ArchDefineA2)
1306 Builder.defineMacro("_ARCH_A2");
1307 if (defs & ArchDefineA2q) {
1308 Builder.defineMacro("_ARCH_A2Q");
1309 Builder.defineMacro("_ARCH_QP");
1310 }
1311
1312 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1313 Builder.defineMacro("__bg__");
1314 Builder.defineMacro("__THW_BLUEGENE__");
1315 Builder.defineMacro("__bgq__");
1316 Builder.defineMacro("__TOS_BGQ__");
1317 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001318
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001319 if (HasVSX)
1320 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001321 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001322 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001323 if (HasP8Crypto)
1324 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001325 if (HasHTM)
1326 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001327 if (HasFloat128)
1328 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001329
1330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1333 if (PointerWidth == 64)
1334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001335
Bill Schmidt38378a02013-02-01 20:23:10 +00001336 // FIXME: The following are not yet generated here by Clang, but are
1337 // generated by GCC:
1338 //
1339 // _SOFT_FLOAT_
1340 // __RECIP_PRECISION__
1341 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001342 // __RECIP__
1343 // __RECIPF__
1344 // __RSQRTE__
1345 // __RSQRTEF__
1346 // _SOFT_DOUBLE_
1347 // __NO_LWSYNC__
1348 // __HAVE_BSWAP__
1349 // __LONGDOUBLE128
1350 // __CMODEL_MEDIUM__
1351 // __CMODEL_LARGE__
1352 // _CALL_SYSV
1353 // _CALL_DARWIN
1354 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001355}
1356
Eric Christophera8a14c32015-08-31 18:39:16 +00001357// Handle explicit options being passed to the compiler here: if we've
1358// explicitly turned off vsx and turned on power8-vector or direct-move then
1359// go ahead and error since the customer has expressed a somewhat incompatible
1360// set of options.
1361static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001362 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001363
1364 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1365 FeaturesVec.end()) {
1366 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1367 FeaturesVec.end()) {
1368 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1369 << "-mno-vsx";
1370 return false;
1371 }
1372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1374 FeaturesVec.end()) {
1375 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1376 << "-mno-vsx";
1377 return false;
1378 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001379
1380 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1381 FeaturesVec.end()) {
1382 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1383 << "-mno-vsx";
1384 return false;
1385 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001386 }
1387
1388 return true;
1389}
1390
Eric Christopher8c47b422015-10-09 18:39:55 +00001391bool PPCTargetInfo::initFeatureMap(
1392 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1393 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001394 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("7400", true)
1396 .Case("g4", true)
1397 .Case("7450", true)
1398 .Case("g4+", true)
1399 .Case("970", true)
1400 .Case("g5", true)
1401 .Case("pwr6", true)
1402 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001403 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001404 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001405 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001406 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001407 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001408
1409 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001410 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001412 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001413 .Case("pwr8", true)
1414 .Default(false);
1415 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1416 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001417 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001418 .Case("pwr8", true)
1419 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001420 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1421 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001422 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001423 .Case("pwr8", true)
1424 .Case("pwr7", true)
1425 .Default(false);
1426 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1427 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001428 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001429 .Case("pwr8", true)
1430 .Case("pwr7", true)
1431 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001432 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001437 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001443
Eric Christophera8a14c32015-08-31 18:39:16 +00001444 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1445 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001446
Eric Christopher007b0a02015-08-28 22:32:01 +00001447 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001448}
1449
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001450bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001451 return llvm::StringSwitch<bool>(Feature)
1452 .Case("powerpc", true)
1453 .Case("vsx", HasVSX)
1454 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001455 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001456 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001457 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001458 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 .Case("bpermd", HasBPERMD)
1460 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001461 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001462 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001463}
Chris Lattner17df24e2008-04-21 18:56:49 +00001464
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001465void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1466 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001467 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1468 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1469 // incompatible options.
1470 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001471 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001472 Features[Name] = Features["vsx"] = true;
1473 } else if (Name == "power8-vector") {
1474 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001475 } else if (Name == "float128") {
1476 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001477 } else {
1478 Features[Name] = true;
1479 }
1480 } else {
1481 if (Name == "vsx") {
1482 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001483 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001484 } else {
1485 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001486 }
1487 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001488}
1489
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001490const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001491 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1492 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1493 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1494 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1495 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1496 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1497 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1498 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001499 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001500 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001502 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1503 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1504 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1505 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001506 "vrsave", "vscr",
1507 "spe_acc", "spefscr",
1508 "sfp"
1509};
Chris Lattner10a5b382007-01-29 05:24:35 +00001510
Craig Topperf054e3a2015-10-19 03:52:27 +00001511ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1512 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001513}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001514
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001515const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1516 // While some of these aliases do map to different registers
1517 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001518 { { "0" }, "r0" },
1519 { { "1"}, "r1" },
1520 { { "2" }, "r2" },
1521 { { "3" }, "r3" },
1522 { { "4" }, "r4" },
1523 { { "5" }, "r5" },
1524 { { "6" }, "r6" },
1525 { { "7" }, "r7" },
1526 { { "8" }, "r8" },
1527 { { "9" }, "r9" },
1528 { { "10" }, "r10" },
1529 { { "11" }, "r11" },
1530 { { "12" }, "r12" },
1531 { { "13" }, "r13" },
1532 { { "14" }, "r14" },
1533 { { "15" }, "r15" },
1534 { { "16" }, "r16" },
1535 { { "17" }, "r17" },
1536 { { "18" }, "r18" },
1537 { { "19" }, "r19" },
1538 { { "20" }, "r20" },
1539 { { "21" }, "r21" },
1540 { { "22" }, "r22" },
1541 { { "23" }, "r23" },
1542 { { "24" }, "r24" },
1543 { { "25" }, "r25" },
1544 { { "26" }, "r26" },
1545 { { "27" }, "r27" },
1546 { { "28" }, "r28" },
1547 { { "29" }, "r29" },
1548 { { "30" }, "r30" },
1549 { { "31" }, "r31" },
1550 { { "fr0" }, "f0" },
1551 { { "fr1" }, "f1" },
1552 { { "fr2" }, "f2" },
1553 { { "fr3" }, "f3" },
1554 { { "fr4" }, "f4" },
1555 { { "fr5" }, "f5" },
1556 { { "fr6" }, "f6" },
1557 { { "fr7" }, "f7" },
1558 { { "fr8" }, "f8" },
1559 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001560 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001561 { { "fr11" }, "f11" },
1562 { { "fr12" }, "f12" },
1563 { { "fr13" }, "f13" },
1564 { { "fr14" }, "f14" },
1565 { { "fr15" }, "f15" },
1566 { { "fr16" }, "f16" },
1567 { { "fr17" }, "f17" },
1568 { { "fr18" }, "f18" },
1569 { { "fr19" }, "f19" },
1570 { { "fr20" }, "f20" },
1571 { { "fr21" }, "f21" },
1572 { { "fr22" }, "f22" },
1573 { { "fr23" }, "f23" },
1574 { { "fr24" }, "f24" },
1575 { { "fr25" }, "f25" },
1576 { { "fr26" }, "f26" },
1577 { { "fr27" }, "f27" },
1578 { { "fr28" }, "f28" },
1579 { { "fr29" }, "f29" },
1580 { { "fr30" }, "f30" },
1581 { { "fr31" }, "f31" },
1582 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001583};
1584
Craig Topperf054e3a2015-10-19 03:52:27 +00001585ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1586 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001588
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001591 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1592 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001593 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001594
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001595 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001596 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001597 case llvm::Triple::FreeBSD:
1598 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001599 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001600 PtrDiffType = SignedInt;
1601 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001602 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001603 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001604 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001605 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001606
Roman Divacky3ffe7462012-03-13 19:20:17 +00001607 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1608 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001609 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001610 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001611
1612 // PPC32 supports atomics up to 4 bytes.
1613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001614 }
1615
Craig Topper3164f332014-03-11 03:39:26 +00001616 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001617 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001618 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001619 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001620};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621
Bill Schmidt778d3872013-07-26 01:36:11 +00001622// Note: ABI differences may eventually require us to have a separate
1623// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001624class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001626 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1627 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001628 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001629 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001631
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001632 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001633 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001634 ABI = "elfv2";
1635 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001636 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001637 ABI = "elfv1";
1638 }
1639
1640 switch (getTriple().getOS()) {
1641 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001642 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001643 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001644 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001645 case llvm::Triple::NetBSD:
1646 IntMaxType = SignedLongLong;
1647 Int64Type = SignedLongLong;
1648 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001649 default:
1650 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001651 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001652
1653 // PPC64 supports atomics up to 8 bytes.
1654 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001655 }
Craig Topper3164f332014-03-11 03:39:26 +00001656 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001657 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001659 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001660 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001661 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001662 ABI = Name;
1663 return true;
1664 }
1665 return false;
1666 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001667};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001669class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001671 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1672 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001674 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001675 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001676 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001677 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001679 }
Craig Topper3164f332014-03-11 03:39:26 +00001680 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001681 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001682 }
1683};
1684
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001685class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001686public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001687 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1688 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001689 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001690 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001691 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001692 }
1693};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695static const unsigned NVPTXAddrSpaceMap[] = {
1696 1, // opencl_global
1697 3, // opencl_local
1698 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001699 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001700 0, // opencl_generic
1701 1, // cuda_device
1702 4, // cuda_constant
1703 3, // cuda_shared
1704};
1705
1706class NVPTXTargetInfo : public TargetInfo {
1707 static const char *const GCCRegNames[];
1708 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001709 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001710
Eric Christopherc48497a2015-09-18 21:26:24 +00001711public:
Justin Lebar76945b22016-04-29 23:05:19 +00001712 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 TLSSupported = false;
1715 LongWidth = LongAlign = 64;
1716 AddrSpaceMap = &NVPTXAddrSpaceMap;
1717 UseAddrSpaceMapMangling = true;
1718 // Define available target features
1719 // These must be defined in sorted order!
1720 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001721 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001722
1723 // If possible, get a TargetInfo for our host triple, so we can match its
1724 // types.
1725 llvm::Triple HostTriple(Opts.HostTriple);
1726 if (HostTriple.isNVPTX())
1727 return;
1728 std::unique_ptr<TargetInfo> HostTarget(
1729 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1730 if (!HostTarget) {
1731 return;
1732 }
1733
1734 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1735 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1736 BoolWidth = HostTarget->getBoolWidth();
1737 BoolAlign = HostTarget->getBoolAlign();
1738 IntWidth = HostTarget->getIntWidth();
1739 IntAlign = HostTarget->getIntAlign();
1740 HalfWidth = HostTarget->getHalfWidth();
1741 HalfAlign = HostTarget->getHalfAlign();
1742 FloatWidth = HostTarget->getFloatWidth();
1743 FloatAlign = HostTarget->getFloatAlign();
1744 DoubleWidth = HostTarget->getDoubleWidth();
1745 DoubleAlign = HostTarget->getDoubleAlign();
1746 LongWidth = HostTarget->getLongWidth();
1747 LongAlign = HostTarget->getLongAlign();
1748 LongLongWidth = HostTarget->getLongLongWidth();
1749 LongLongAlign = HostTarget->getLongLongAlign();
1750 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1751 DefaultAlignForAttributeAligned =
1752 HostTarget->getDefaultAlignForAttributeAligned();
1753 SizeType = HostTarget->getSizeType();
1754 IntMaxType = HostTarget->getIntMaxType();
1755 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1756 IntPtrType = HostTarget->getIntPtrType();
1757 WCharType = HostTarget->getWCharType();
1758 WIntType = HostTarget->getWIntType();
1759 Char16Type = HostTarget->getChar16Type();
1760 Char32Type = HostTarget->getChar32Type();
1761 Int64Type = HostTarget->getInt64Type();
1762 SigAtomicType = HostTarget->getSigAtomicType();
1763 ProcessIDType = HostTarget->getProcessIDType();
1764
1765 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1766 UseZeroLengthBitfieldAlignment =
1767 HostTarget->useZeroLengthBitfieldAlignment();
1768 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1769 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1770
Justin Lebar5057f172016-09-09 20:35:43 +00001771 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1772 // we need those macros to be identical on host and device, because (among
1773 // other things) they affect which standard library classes are defined, and
1774 // we need all classes to be defined on both the host and device.
1775 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // Properties intentionally not copied from host:
1778 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1779 // host/device boundary.
1780 // - SuitableAlign: Not visible across the host/device boundary, and may
1781 // correctly be different on host/device, e.g. if host has wider vector
1782 // types than device.
1783 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1784 // as its double type, but that's not necessarily true on the host.
1785 // TODO: nvcc emits a warning when using long double on device; we should
1786 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001787 }
1788 void getTargetDefines(const LangOptions &Opts,
1789 MacroBuilder &Builder) const override {
1790 Builder.defineMacro("__PTX__");
1791 Builder.defineMacro("__NVPTX__");
1792 if (Opts.CUDAIsDevice) {
1793 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001794 std::string CUDAArchCode = [this] {
1795 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001796 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001797 assert(false && "No GPU arch when compiling CUDA device code.");
1798 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001819 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001821 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001822 return "620";
1823 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001824 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001825 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001826 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001827 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
Craig Topper6c03a542015-10-19 04:51:35 +00001829 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1830 return llvm::makeArrayRef(BuiltinInfo,
1831 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 }
1833 bool hasFeature(StringRef Feature) const override {
1834 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001835 }
1836
Craig Topperf054e3a2015-10-19 03:52:27 +00001837 ArrayRef<const char *> getGCCRegNames() const override;
1838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001839 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001840 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 }
1842 bool validateAsmConstraint(const char *&Name,
1843 TargetInfo::ConstraintInfo &Info) const override {
1844 switch (*Name) {
1845 default:
1846 return false;
1847 case 'c':
1848 case 'h':
1849 case 'r':
1850 case 'l':
1851 case 'f':
1852 case 'd':
1853 Info.setAllowsRegister();
1854 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001855 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001856 }
1857 const char *getClobbers() const override {
1858 // FIXME: Is this really right?
1859 return "";
1860 }
1861 BuiltinVaListKind getBuiltinVaListKind() const override {
1862 // FIXME: implement
1863 return TargetInfo::CharPtrBuiltinVaList;
1864 }
1865 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001866 GPU = StringToCudaArch(Name);
1867 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001868 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001869 void setSupportedOpenCLOpts() override {
1870 auto &Opts = getSupportedOpenCLOpts();
1871 Opts.cl_clang_storage_class_specifiers = 1;
1872 Opts.cl_khr_gl_sharing = 1;
1873 Opts.cl_khr_icd = 1;
1874
1875 Opts.cl_khr_fp64 = 1;
1876 Opts.cl_khr_byte_addressable_store = 1;
1877 Opts.cl_khr_global_int32_base_atomics = 1;
1878 Opts.cl_khr_global_int32_extended_atomics = 1;
1879 Opts.cl_khr_local_int32_base_atomics = 1;
1880 Opts.cl_khr_local_int32_extended_atomics = 1;
1881 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001882};
1883
1884const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1885#define BUILTIN(ID, TYPE, ATTRS) \
1886 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1887#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1888 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1889#include "clang/Basic/BuiltinsNVPTX.def"
1890};
1891
1892const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1893
Craig Topperf054e3a2015-10-19 03:52:27 +00001894ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1895 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001896}
1897
1898class NVPTX32TargetInfo : public NVPTXTargetInfo {
1899public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001900 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1901 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001902 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 PointerWidth = PointerAlign = 32;
1904 SizeType = TargetInfo::UnsignedInt;
1905 PtrDiffType = TargetInfo::SignedInt;
1906 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001907 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001908 }
1909};
1910
1911class NVPTX64TargetInfo : public NVPTXTargetInfo {
1912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001913 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1914 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001915 PointerWidth = PointerAlign = 64;
1916 SizeType = TargetInfo::UnsignedLong;
1917 PtrDiffType = TargetInfo::SignedLong;
1918 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001919 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 }
1921};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001922
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001923static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // opencl_global
1925 3, // opencl_local
1926 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001927 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001928 1, // cuda_device
1929 2, // cuda_constant
1930 3 // cuda_shared
1931};
1932
Tom Stellarda96344b2014-08-21 13:58:40 +00001933// If you edit the description strings, make sure you update
1934// getPointerWidthV().
1935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001937 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1938 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001939
Craig Topper273dbc62015-10-18 05:29:26 +00001940static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001941 "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 +00001942 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1943 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944
Matt Arsenault250024f2016-06-08 01:56:42 +00001945class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001946 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001947 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001948
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001949 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001950 enum GPUKind {
1951 GK_NONE,
1952 GK_R600,
1953 GK_R600_DOUBLE_OPS,
1954 GK_R700,
1955 GK_R700_DOUBLE_OPS,
1956 GK_EVERGREEN,
1957 GK_EVERGREEN_DOUBLE_OPS,
1958 GK_NORTHERN_ISLANDS,
1959 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001960 GK_GFX6,
1961 GK_GFX7,
1962 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001963 } GPU;
1964
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 bool hasFP64:1;
1966 bool hasFMAF:1;
1967 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00001968 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001969
Matt Arsenault250024f2016-06-08 01:56:42 +00001970 static bool isAMDGCN(const llvm::Triple &TT) {
1971 return TT.getArch() == llvm::Triple::amdgcn;
1972 }
1973
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001975 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001976 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001977 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 hasFP64(false),
1979 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001980 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00001981 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001982 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001983 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001984 hasFMAF = true;
1985 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001986 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001987
1988 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1989 DataLayoutStringSI : DataLayoutStringR600);
1990
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001991 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001992 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001993 }
1994
Tom Stellarda96344b2014-08-21 13:58:40 +00001995 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1996 if (GPU <= GK_CAYMAN)
1997 return 32;
1998
1999 switch(AddrSpace) {
2000 default:
2001 return 64;
2002 case 0:
2003 case 3:
2004 case 5:
2005 return 32;
2006 }
2007 }
2008
Yaxun Liu26f75662016-08-19 05:17:25 +00002009 uint64_t getMaxPointerWidth() const override {
2010 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2011 }
2012
Craig Topper3164f332014-03-11 03:39:26 +00002013 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002014 return "";
2015 }
2016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002018
Craig Topperf054e3a2015-10-19 03:52:27 +00002019 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2020 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002021 }
2022
Craig Topper3164f332014-03-11 03:39:26 +00002023 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002024 TargetInfo::ConstraintInfo &Info) const override {
2025 switch (*Name) {
2026 default: break;
2027 case 'v': // vgpr
2028 case 's': // sgpr
2029 Info.setAllowsRegister();
2030 return true;
2031 }
2032 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002033 }
2034
Matt Arsenault250024f2016-06-08 01:56:42 +00002035 bool initFeatureMap(llvm::StringMap<bool> &Features,
2036 DiagnosticsEngine &Diags, StringRef CPU,
2037 const std::vector<std::string> &FeatureVec) const override;
2038
Yaxun Liu2c17e822016-08-09 19:43:38 +00002039 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2040 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002041 bool hasFP32Denormals = false;
2042 bool hasFP64Denormals = false;
2043 for (auto &I : TargetOpts.FeaturesAsWritten) {
2044 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2045 hasFP32Denormals = true;
2046 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2047 hasFP64Denormals = true;
2048 }
2049 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002050 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2051 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2052 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002053 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002054 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002055 }
2056
Craig Topper6c03a542015-10-19 04:51:35 +00002057 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2058 return llvm::makeArrayRef(BuiltinInfo,
2059 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002060 }
2061
Craig Topper3164f332014-03-11 03:39:26 +00002062 void getTargetDefines(const LangOptions &Opts,
2063 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002064 if (getTriple().getArch() == llvm::Triple::amdgcn)
2065 Builder.defineMacro("__AMDGCN__");
2066 else
2067 Builder.defineMacro("__R600__");
2068
Jan Veselyeebeaea2015-05-04 19:53:36 +00002069 if (hasFMAF)
2070 Builder.defineMacro("__HAS_FMAF__");
2071 if (hasLDEXPF)
2072 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002073 if (hasFP64)
2074 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002075 }
2076
Craig Topper3164f332014-03-11 03:39:26 +00002077 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002078 return TargetInfo::CharPtrBuiltinVaList;
2079 }
2080
Matt Arsenault250024f2016-06-08 01:56:42 +00002081 static GPUKind parseR600Name(StringRef Name) {
2082 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002083 .Case("r600" , GK_R600)
2084 .Case("rv610", GK_R600)
2085 .Case("rv620", GK_R600)
2086 .Case("rv630", GK_R600)
2087 .Case("rv635", GK_R600)
2088 .Case("rs780", GK_R600)
2089 .Case("rs880", GK_R600)
2090 .Case("rv670", GK_R600_DOUBLE_OPS)
2091 .Case("rv710", GK_R700)
2092 .Case("rv730", GK_R700)
2093 .Case("rv740", GK_R700_DOUBLE_OPS)
2094 .Case("rv770", GK_R700_DOUBLE_OPS)
2095 .Case("palm", GK_EVERGREEN)
2096 .Case("cedar", GK_EVERGREEN)
2097 .Case("sumo", GK_EVERGREEN)
2098 .Case("sumo2", GK_EVERGREEN)
2099 .Case("redwood", GK_EVERGREEN)
2100 .Case("juniper", GK_EVERGREEN)
2101 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2102 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2103 .Case("barts", GK_NORTHERN_ISLANDS)
2104 .Case("turks", GK_NORTHERN_ISLANDS)
2105 .Case("caicos", GK_NORTHERN_ISLANDS)
2106 .Case("cayman", GK_CAYMAN)
2107 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 .Default(GK_NONE);
2109 }
2110
2111 static GPUKind parseAMDGCNName(StringRef Name) {
2112 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002113 .Case("tahiti", GK_GFX6)
2114 .Case("pitcairn", GK_GFX6)
2115 .Case("verde", GK_GFX6)
2116 .Case("oland", GK_GFX6)
2117 .Case("hainan", GK_GFX6)
2118 .Case("bonaire", GK_GFX7)
2119 .Case("kabini", GK_GFX7)
2120 .Case("kaveri", GK_GFX7)
2121 .Case("hawaii", GK_GFX7)
2122 .Case("mullins", GK_GFX7)
2123 .Case("tonga", GK_GFX8)
2124 .Case("iceland", GK_GFX8)
2125 .Case("carrizo", GK_GFX8)
2126 .Case("fiji", GK_GFX8)
2127 .Case("stoney", GK_GFX8)
2128 .Case("polaris10", GK_GFX8)
2129 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002130 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002131 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002132
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 bool setCPU(const std::string &Name) override {
2134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 GPU = parseAMDGCNName(Name);
2136 else
2137 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002138
Matt Arsenault250024f2016-06-08 01:56:42 +00002139 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002140 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002141
Jan Vesely211ba782016-06-17 02:25:03 +00002142 void setSupportedOpenCLOpts() override {
2143 auto &Opts = getSupportedOpenCLOpts();
2144 Opts.cl_clang_storage_class_specifiers = 1;
2145 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002146
Jan Vesely211ba782016-06-17 02:25:03 +00002147 if (hasFP64)
2148 Opts.cl_khr_fp64 = 1;
2149 if (GPU >= GK_EVERGREEN) {
2150 Opts.cl_khr_byte_addressable_store = 1;
2151 Opts.cl_khr_global_int32_base_atomics = 1;
2152 Opts.cl_khr_global_int32_extended_atomics = 1;
2153 Opts.cl_khr_local_int32_base_atomics = 1;
2154 Opts.cl_khr_local_int32_extended_atomics = 1;
2155 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002156 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002157 Opts.cl_khr_fp16 = 1;
2158 Opts.cl_khr_int64_base_atomics = 1;
2159 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002160 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002161 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002162 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002163 Opts.cl_amd_media_ops = 1;
2164 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002165 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002166 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002167
Yaxun Liu99444cb2016-08-03 20:38:06 +00002168 LangAS::ID getOpenCLImageAddrSpace() const override {
2169 return LangAS::opencl_constant;
2170 }
2171
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002172 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2173 switch (CC) {
2174 default:
2175 return CCCR_Warning;
2176 case CC_C:
2177 case CC_OpenCLKernel:
2178 return CCCR_OK;
2179 }
2180 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002181};
2182
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002183const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002184#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002186#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2187 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002188#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002189};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002190const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002191 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2192 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2193 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2194 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2195 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2196 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2197 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2198 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2199 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2200 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2201 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2202 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2203 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2204 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2205 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2206 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2207 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2208 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2209 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2210 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2211 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2212 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2213 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2214 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2215 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2216 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2217 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2218 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2219 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2220 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2221 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2222 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2223 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2224 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2225 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2226 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2227 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2228 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2229 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2230 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2231 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2232 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2233 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2234 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2235 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2236 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2237 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002238 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002239 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2240 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002241};
2242
Craig Topperf054e3a2015-10-19 03:52:27 +00002243ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2244 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002245}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002246
Matt Arsenault250024f2016-06-08 01:56:42 +00002247bool AMDGPUTargetInfo::initFeatureMap(
2248 llvm::StringMap<bool> &Features,
2249 DiagnosticsEngine &Diags, StringRef CPU,
2250 const std::vector<std::string> &FeatureVec) const {
2251
2252 // XXX - What does the member GPU mean if device name string passed here?
2253 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2254 if (CPU.empty())
2255 CPU = "tahiti";
2256
2257 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002258 case GK_GFX6:
2259 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002260 break;
2261
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002262 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002263 Features["s-memrealtime"] = true;
2264 Features["16-bit-insts"] = true;
2265 break;
2266
2267 case GK_NONE:
2268 return false;
2269 default:
2270 llvm_unreachable("unhandled subtarget");
2271 }
2272 } else {
2273 if (CPU.empty())
2274 CPU = "r600";
2275
2276 switch (parseR600Name(CPU)) {
2277 case GK_R600:
2278 case GK_R700:
2279 case GK_EVERGREEN:
2280 case GK_NORTHERN_ISLANDS:
2281 break;
2282 case GK_R600_DOUBLE_OPS:
2283 case GK_R700_DOUBLE_OPS:
2284 case GK_EVERGREEN_DOUBLE_OPS:
2285 case GK_CAYMAN:
2286 Features["fp64"] = true;
2287 break;
2288 case GK_NONE:
2289 return false;
2290 default:
2291 llvm_unreachable("unhandled subtarget");
2292 }
2293 }
2294
2295 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2296}
2297
Eli Friedman3fd920a2008-08-20 02:34:37 +00002298// Namespace for x86 abstract base class
2299const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002300#define BUILTIN(ID, TYPE, ATTRS) \
2301 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002302#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002303 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002304#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002305 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002306#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2307 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002308#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002309};
Eli Friedmanb5366062008-05-20 14:21:01 +00002310
Nuno Lopescfca1f02009-12-23 17:49:57 +00002311static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002312 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2313 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002314 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002315 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2316 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2317 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002318 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002319 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2320 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002321 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2322 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2323 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2324 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2325 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2326 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2327 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2328 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002329};
2330
Eric Christophercdd36352011-06-21 00:05:20 +00002331const TargetInfo::AddlRegName AddlRegNames[] = {
2332 { { "al", "ah", "eax", "rax" }, 0 },
2333 { { "bl", "bh", "ebx", "rbx" }, 3 },
2334 { { "cl", "ch", "ecx", "rcx" }, 2 },
2335 { { "dl", "dh", "edx", "rdx" }, 1 },
2336 { { "esi", "rsi" }, 4 },
2337 { { "edi", "rdi" }, 5 },
2338 { { "esp", "rsp" }, 7 },
2339 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002340 { { "r8d", "r8w", "r8b" }, 38 },
2341 { { "r9d", "r9w", "r9b" }, 39 },
2342 { { "r10d", "r10w", "r10b" }, 40 },
2343 { { "r11d", "r11w", "r11b" }, 41 },
2344 { { "r12d", "r12w", "r12b" }, 42 },
2345 { { "r13d", "r13w", "r13b" }, 43 },
2346 { { "r14d", "r14w", "r14b" }, 44 },
2347 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002348};
2349
2350// X86 target abstract base class; x86-32 and x86-64 are very close, so
2351// most of the implementation can be shared.
2352class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002353 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002354 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002355 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002356 enum MMX3DNowEnum {
2357 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002358 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002359 enum XOPEnum {
2360 NoXOP,
2361 SSE4A,
2362 FMA4,
2363 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002364 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002365
Craig Topper543f3bd2015-10-14 23:47:57 +00002366 bool HasAES = false;
2367 bool HasPCLMUL = false;
2368 bool HasLZCNT = false;
2369 bool HasRDRND = false;
2370 bool HasFSGSBASE = false;
2371 bool HasBMI = false;
2372 bool HasBMI2 = false;
2373 bool HasPOPCNT = false;
2374 bool HasRTM = false;
2375 bool HasPRFCHW = false;
2376 bool HasRDSEED = false;
2377 bool HasADX = false;
2378 bool HasTBM = false;
2379 bool HasFMA = false;
2380 bool HasF16C = false;
2381 bool HasAVX512CD = false;
2382 bool HasAVX512ER = false;
2383 bool HasAVX512PF = false;
2384 bool HasAVX512DQ = false;
2385 bool HasAVX512BW = false;
2386 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002387 bool HasAVX512VBMI = false;
2388 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002389 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002390 bool HasMPX = false;
2391 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002392 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002393 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002394 bool HasXSAVE = false;
2395 bool HasXSAVEOPT = false;
2396 bool HasXSAVEC = false;
2397 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002398 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002399 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002400 bool HasCLFLUSHOPT = false;
2401 bool HasPCOMMIT = false;
2402 bool HasCLWB = false;
2403 bool HasUMIP = false;
2404 bool HasMOVBE = false;
2405 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002406
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002407 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2408 ///
2409 /// Each enumeration represents a particular CPU supported by Clang. These
2410 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2411 enum CPUKind {
2412 CK_Generic,
2413
2414 /// \name i386
2415 /// i386-generation processors.
2416 //@{
2417 CK_i386,
2418 //@}
2419
2420 /// \name i486
2421 /// i486-generation processors.
2422 //@{
2423 CK_i486,
2424 CK_WinChipC6,
2425 CK_WinChip2,
2426 CK_C3,
2427 //@}
2428
2429 /// \name i586
2430 /// i586-generation processors, P5 microarchitecture based.
2431 //@{
2432 CK_i586,
2433 CK_Pentium,
2434 CK_PentiumMMX,
2435 //@}
2436
2437 /// \name i686
2438 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2439 //@{
2440 CK_i686,
2441 CK_PentiumPro,
2442 CK_Pentium2,
2443 CK_Pentium3,
2444 CK_Pentium3M,
2445 CK_PentiumM,
2446 CK_C3_2,
2447
2448 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2449 /// Clang however has some logic to suport this.
2450 // FIXME: Warn, deprecate, and potentially remove this.
2451 CK_Yonah,
2452 //@}
2453
2454 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002455 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002456 //@{
2457 CK_Pentium4,
2458 CK_Pentium4M,
2459 CK_Prescott,
2460 CK_Nocona,
2461 //@}
2462
2463 /// \name Core
2464 /// Core microarchitecture based processors.
2465 //@{
2466 CK_Core2,
2467
2468 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2469 /// codename which GCC no longer accepts as an option to -march, but Clang
2470 /// has some logic for recognizing it.
2471 // FIXME: Warn, deprecate, and potentially remove this.
2472 CK_Penryn,
2473 //@}
2474
2475 /// \name Atom
2476 /// Atom processors
2477 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002478 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002479 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002480 //@}
2481
2482 /// \name Nehalem
2483 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002484 CK_Nehalem,
2485
2486 /// \name Westmere
2487 /// Westmere microarchitecture based processors.
2488 CK_Westmere,
2489
2490 /// \name Sandy Bridge
2491 /// Sandy Bridge microarchitecture based processors.
2492 CK_SandyBridge,
2493
2494 /// \name Ivy Bridge
2495 /// Ivy Bridge microarchitecture based processors.
2496 CK_IvyBridge,
2497
2498 /// \name Haswell
2499 /// Haswell microarchitecture based processors.
2500 CK_Haswell,
2501
2502 /// \name Broadwell
2503 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002504 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002505
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002506 /// \name Skylake Client
2507 /// Skylake client microarchitecture based processors.
2508 CK_SkylakeClient,
2509
2510 /// \name Skylake Server
2511 /// Skylake server microarchitecture based processors.
2512 CK_SkylakeServer,
2513
2514 /// \name Cannonlake Client
2515 /// Cannonlake client microarchitecture based processors.
2516 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002517
Craig Topper449314e2013-08-20 07:09:39 +00002518 /// \name Knights Landing
2519 /// Knights Landing processor.
2520 CK_KNL,
2521
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002522 /// \name Lakemont
2523 /// Lakemont microarchitecture based processors.
2524 CK_Lakemont,
2525
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002526 /// \name K6
2527 /// K6 architecture processors.
2528 //@{
2529 CK_K6,
2530 CK_K6_2,
2531 CK_K6_3,
2532 //@}
2533
2534 /// \name K7
2535 /// K7 architecture processors.
2536 //@{
2537 CK_Athlon,
2538 CK_AthlonThunderbird,
2539 CK_Athlon4,
2540 CK_AthlonXP,
2541 CK_AthlonMP,
2542 //@}
2543
2544 /// \name K8
2545 /// K8 architecture processors.
2546 //@{
2547 CK_Athlon64,
2548 CK_Athlon64SSE3,
2549 CK_AthlonFX,
2550 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002552 CK_Opteron,
2553 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002554 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002555 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002556
Benjamin Kramer569f2152012-01-10 11:50:18 +00002557 /// \name Bobcat
2558 /// Bobcat architecture processors.
2559 //@{
2560 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002561 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002562 //@}
2563
2564 /// \name Bulldozer
2565 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002566 //@{
2567 CK_BDVER1,
2568 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002569 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002570 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002571 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002572
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002573 /// This specification is deprecated and will be removed in the future.
2574 /// Users should prefer \see CK_K8.
2575 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002576 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002577 CK_x86_64,
2578 //@}
2579
2580 /// \name Geode
2581 /// Geode processors.
2582 //@{
2583 CK_Geode
2584 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002585 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002586
Eric Christopherc50738f2015-08-27 00:05:50 +00002587 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002588 return llvm::StringSwitch<CPUKind>(CPU)
2589 .Case("i386", CK_i386)
2590 .Case("i486", CK_i486)
2591 .Case("winchip-c6", CK_WinChipC6)
2592 .Case("winchip2", CK_WinChip2)
2593 .Case("c3", CK_C3)
2594 .Case("i586", CK_i586)
2595 .Case("pentium", CK_Pentium)
2596 .Case("pentium-mmx", CK_PentiumMMX)
2597 .Case("i686", CK_i686)
2598 .Case("pentiumpro", CK_PentiumPro)
2599 .Case("pentium2", CK_Pentium2)
2600 .Case("pentium3", CK_Pentium3)
2601 .Case("pentium3m", CK_Pentium3M)
2602 .Case("pentium-m", CK_PentiumM)
2603 .Case("c3-2", CK_C3_2)
2604 .Case("yonah", CK_Yonah)
2605 .Case("pentium4", CK_Pentium4)
2606 .Case("pentium4m", CK_Pentium4M)
2607 .Case("prescott", CK_Prescott)
2608 .Case("nocona", CK_Nocona)
2609 .Case("core2", CK_Core2)
2610 .Case("penryn", CK_Penryn)
2611 .Case("bonnell", CK_Bonnell)
2612 .Case("atom", CK_Bonnell) // Legacy name.
2613 .Case("silvermont", CK_Silvermont)
2614 .Case("slm", CK_Silvermont) // Legacy name.
2615 .Case("nehalem", CK_Nehalem)
2616 .Case("corei7", CK_Nehalem) // Legacy name.
2617 .Case("westmere", CK_Westmere)
2618 .Case("sandybridge", CK_SandyBridge)
2619 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2620 .Case("ivybridge", CK_IvyBridge)
2621 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2622 .Case("haswell", CK_Haswell)
2623 .Case("core-avx2", CK_Haswell) // Legacy name.
2624 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002625 .Case("skylake", CK_SkylakeClient)
2626 .Case("skylake-avx512", CK_SkylakeServer)
2627 .Case("skx", CK_SkylakeServer) // Legacy name.
2628 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002629 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002630 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002631 .Case("k6", CK_K6)
2632 .Case("k6-2", CK_K6_2)
2633 .Case("k6-3", CK_K6_3)
2634 .Case("athlon", CK_Athlon)
2635 .Case("athlon-tbird", CK_AthlonThunderbird)
2636 .Case("athlon-4", CK_Athlon4)
2637 .Case("athlon-xp", CK_AthlonXP)
2638 .Case("athlon-mp", CK_AthlonMP)
2639 .Case("athlon64", CK_Athlon64)
2640 .Case("athlon64-sse3", CK_Athlon64SSE3)
2641 .Case("athlon-fx", CK_AthlonFX)
2642 .Case("k8", CK_K8)
2643 .Case("k8-sse3", CK_K8SSE3)
2644 .Case("opteron", CK_Opteron)
2645 .Case("opteron-sse3", CK_OpteronSSE3)
2646 .Case("barcelona", CK_AMDFAM10)
2647 .Case("amdfam10", CK_AMDFAM10)
2648 .Case("btver1", CK_BTVER1)
2649 .Case("btver2", CK_BTVER2)
2650 .Case("bdver1", CK_BDVER1)
2651 .Case("bdver2", CK_BDVER2)
2652 .Case("bdver3", CK_BDVER3)
2653 .Case("bdver4", CK_BDVER4)
2654 .Case("x86-64", CK_x86_64)
2655 .Case("geode", CK_Geode)
2656 .Default(CK_Generic);
2657 }
2658
Rafael Espindolaeb265472013-08-21 21:59:03 +00002659 enum FPMathKind {
2660 FP_Default,
2661 FP_SSE,
2662 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002663 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002664
Eli Friedman3fd920a2008-08-20 02:34:37 +00002665public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002666 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2667 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002668 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002669 }
Craig Topper3164f332014-03-11 03:39:26 +00002670 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002671 // X87 evaluates with 80 bits "long double" precision.
2672 return SSELevel == NoSSE ? 2 : 0;
2673 }
Craig Topper6c03a542015-10-19 04:51:35 +00002674 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2675 return llvm::makeArrayRef(BuiltinInfo,
2676 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002677 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002678 ArrayRef<const char *> getGCCRegNames() const override {
2679 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002680 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002681 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2682 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002683 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002684 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2685 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002686 }
Eric Christopherd9832702015-06-29 21:00:05 +00002687 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002688 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002689 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002690
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002691 bool validateGlobalRegisterVariable(StringRef RegName,
2692 unsigned RegSize,
2693 bool &HasSizeMismatch) const override {
2694 // esp and ebp are the only 32-bit registers the x86 backend can currently
2695 // handle.
2696 if (RegName.equals("esp") || RegName.equals("ebp")) {
2697 // Check that the register size is 32-bit.
2698 HasSizeMismatch = RegSize != 32;
2699 return true;
2700 }
2701
2702 return false;
2703 }
2704
Akira Hatanaka974131e2014-09-18 18:17:18 +00002705 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2706
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002707 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2708
Akira Hatanaka974131e2014-09-18 18:17:18 +00002709 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2710
Craig Topper3164f332014-03-11 03:39:26 +00002711 std::string convertConstraint(const char *&Constraint) const override;
2712 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002713 return "~{dirflag},~{fpsr},~{flags}";
2714 }
Craig Topper3164f332014-03-11 03:39:26 +00002715 void getTargetDefines(const LangOptions &Opts,
2716 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002717 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2718 bool Enabled);
2719 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2720 bool Enabled);
2721 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2722 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002723 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2724 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002725 setFeatureEnabledImpl(Features, Name, Enabled);
2726 }
2727 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002728 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002729 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2730 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002731 bool
2732 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2733 StringRef CPU,
2734 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002735 bool hasFeature(StringRef Feature) const override;
2736 bool handleTargetFeatures(std::vector<std::string> &Features,
2737 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002738 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002739 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2740 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002741 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002742 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002743 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002744 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002745 return "no-mmx";
2746 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002747 }
Craig Topper3164f332014-03-11 03:39:26 +00002748 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002749 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002750
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002751 // Perform any per-CPU checks necessary to determine if this CPU is
2752 // acceptable.
2753 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2754 // invalid without explaining *why*.
2755 switch (CPU) {
2756 case CK_Generic:
2757 // No processor selected!
2758 return false;
2759
2760 case CK_i386:
2761 case CK_i486:
2762 case CK_WinChipC6:
2763 case CK_WinChip2:
2764 case CK_C3:
2765 case CK_i586:
2766 case CK_Pentium:
2767 case CK_PentiumMMX:
2768 case CK_i686:
2769 case CK_PentiumPro:
2770 case CK_Pentium2:
2771 case CK_Pentium3:
2772 case CK_Pentium3M:
2773 case CK_PentiumM:
2774 case CK_Yonah:
2775 case CK_C3_2:
2776 case CK_Pentium4:
2777 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002778 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002779 case CK_Prescott:
2780 case CK_K6:
2781 case CK_K6_2:
2782 case CK_K6_3:
2783 case CK_Athlon:
2784 case CK_AthlonThunderbird:
2785 case CK_Athlon4:
2786 case CK_AthlonXP:
2787 case CK_AthlonMP:
2788 case CK_Geode:
2789 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002790 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002791 return false;
2792
2793 // Fallthrough
2794 case CK_Nocona:
2795 case CK_Core2:
2796 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002797 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002798 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002799 case CK_Nehalem:
2800 case CK_Westmere:
2801 case CK_SandyBridge:
2802 case CK_IvyBridge:
2803 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002804 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002805 case CK_SkylakeClient:
2806 case CK_SkylakeServer:
2807 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002808 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002809 case CK_Athlon64:
2810 case CK_Athlon64SSE3:
2811 case CK_AthlonFX:
2812 case CK_K8:
2813 case CK_K8SSE3:
2814 case CK_Opteron:
2815 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002816 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002817 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002818 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002819 case CK_BDVER1:
2820 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002821 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002822 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002823 case CK_x86_64:
2824 return true;
2825 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002826 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002827 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002828
Craig Topper3164f332014-03-11 03:39:26 +00002829 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002830
Craig Topper3164f332014-03-11 03:39:26 +00002831 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002832 // Most of the non-ARM calling conventions are i386 conventions.
2833 switch (CC) {
2834 case CC_X86ThisCall:
2835 case CC_X86FastCall:
2836 case CC_X86StdCall:
2837 case CC_X86VectorCall:
2838 case CC_C:
2839 case CC_Swift:
2840 case CC_X86Pascal:
2841 case CC_IntelOclBicc:
2842 return CCCR_OK;
2843 default:
2844 return CCCR_Warning;
2845 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002846 }
2847
Craig Topper3164f332014-03-11 03:39:26 +00002848 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002849 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002850 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002851
2852 bool hasSjLjLowering() const override {
2853 return true;
2854 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002855
2856 void setSupportedOpenCLOpts() override {
2857 getSupportedOpenCLOpts().setAll();
2858 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002859};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002860
Rafael Espindolaeb265472013-08-21 21:59:03 +00002861bool X86TargetInfo::setFPMath(StringRef Name) {
2862 if (Name == "387") {
2863 FPMath = FP_387;
2864 return true;
2865 }
2866 if (Name == "sse") {
2867 FPMath = FP_SSE;
2868 return true;
2869 }
2870 return false;
2871}
2872
Eric Christopher007b0a02015-08-28 22:32:01 +00002873bool X86TargetInfo::initFeatureMap(
2874 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002875 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002876 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002877 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002878 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002879 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002880
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002881 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002882
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002883 // Enable X87 for all X86 processors but Lakemont.
2884 if (Kind != CK_Lakemont)
2885 setFeatureEnabledImpl(Features, "x87", true);
2886
2887 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002888 case CK_Generic:
2889 case CK_i386:
2890 case CK_i486:
2891 case CK_i586:
2892 case CK_Pentium:
2893 case CK_i686:
2894 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002895 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002896 break;
2897 case CK_PentiumMMX:
2898 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002899 case CK_K6:
2900 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002901 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002902 break;
2903 case CK_Pentium3:
2904 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002905 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002906 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002907 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 break;
2909 case CK_PentiumM:
2910 case CK_Pentium4:
2911 case CK_Pentium4M:
2912 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002913 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002914 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002915 break;
2916 case CK_Yonah:
2917 case CK_Prescott:
2918 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002919 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002920 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002921 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002922 break;
2923 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002924 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002925 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002926 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002927 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002928 break;
2929 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002930 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002931 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002932 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002933 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002934 case CK_Cannonlake:
2935 setFeatureEnabledImpl(Features, "avx512ifma", true);
2936 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2937 setFeatureEnabledImpl(Features, "sha", true);
2938 setFeatureEnabledImpl(Features, "umip", true);
2939 // FALLTHROUGH
2940 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002941 setFeatureEnabledImpl(Features, "avx512f", true);
2942 setFeatureEnabledImpl(Features, "avx512cd", true);
2943 setFeatureEnabledImpl(Features, "avx512dq", true);
2944 setFeatureEnabledImpl(Features, "avx512bw", true);
2945 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002946 setFeatureEnabledImpl(Features, "pku", true);
2947 setFeatureEnabledImpl(Features, "pcommit", true);
2948 setFeatureEnabledImpl(Features, "clwb", true);
2949 // FALLTHROUGH
2950 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002951 setFeatureEnabledImpl(Features, "xsavec", true);
2952 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002953 setFeatureEnabledImpl(Features, "mpx", true);
2954 setFeatureEnabledImpl(Features, "sgx", true);
2955 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002956 // FALLTHROUGH
2957 case CK_Broadwell:
2958 setFeatureEnabledImpl(Features, "rdseed", true);
2959 setFeatureEnabledImpl(Features, "adx", true);
2960 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002961 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002962 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002963 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002964 setFeatureEnabledImpl(Features, "bmi", true);
2965 setFeatureEnabledImpl(Features, "bmi2", true);
2966 setFeatureEnabledImpl(Features, "rtm", true);
2967 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002968 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002969 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002970 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002971 setFeatureEnabledImpl(Features, "rdrnd", true);
2972 setFeatureEnabledImpl(Features, "f16c", true);
2973 setFeatureEnabledImpl(Features, "fsgsbase", true);
2974 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002975 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002976 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002977 setFeatureEnabledImpl(Features, "xsave", true);
2978 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002979 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002980 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002981 case CK_Silvermont:
2982 setFeatureEnabledImpl(Features, "aes", true);
2983 setFeatureEnabledImpl(Features, "pclmul", true);
2984 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002985 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002986 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002987 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002988 setFeatureEnabledImpl(Features, "cx16", true);
2989 break;
2990 case CK_KNL:
2991 setFeatureEnabledImpl(Features, "avx512f", true);
2992 setFeatureEnabledImpl(Features, "avx512cd", true);
2993 setFeatureEnabledImpl(Features, "avx512er", true);
2994 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002995 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002996 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002997 setFeatureEnabledImpl(Features, "rdseed", true);
2998 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002999 setFeatureEnabledImpl(Features, "lzcnt", true);
3000 setFeatureEnabledImpl(Features, "bmi", true);
3001 setFeatureEnabledImpl(Features, "bmi2", true);
3002 setFeatureEnabledImpl(Features, "rtm", true);
3003 setFeatureEnabledImpl(Features, "fma", true);
3004 setFeatureEnabledImpl(Features, "rdrnd", true);
3005 setFeatureEnabledImpl(Features, "f16c", true);
3006 setFeatureEnabledImpl(Features, "fsgsbase", true);
3007 setFeatureEnabledImpl(Features, "aes", true);
3008 setFeatureEnabledImpl(Features, "pclmul", true);
3009 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003010 setFeatureEnabledImpl(Features, "xsaveopt", true);
3011 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003012 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003013 break;
3014 case CK_K6_2:
3015 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003016 case CK_WinChip2:
3017 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003018 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003019 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003020 case CK_Athlon:
3021 case CK_AthlonThunderbird:
3022 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003023 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003024 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003025 case CK_Athlon4:
3026 case CK_AthlonXP:
3027 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003028 setFeatureEnabledImpl(Features, "sse", 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;
3032 case CK_K8:
3033 case CK_Opteron:
3034 case CK_Athlon64:
3035 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003036 setFeatureEnabledImpl(Features, "sse2", true);
3037 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003038 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003040 case CK_AMDFAM10:
3041 setFeatureEnabledImpl(Features, "sse4a", true);
3042 setFeatureEnabledImpl(Features, "lzcnt", true);
3043 setFeatureEnabledImpl(Features, "popcnt", true);
3044 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 case CK_K8SSE3:
3046 case CK_OpteronSSE3:
3047 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003048 setFeatureEnabledImpl(Features, "sse3", true);
3049 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003050 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003051 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003052 case CK_BTVER2:
3053 setFeatureEnabledImpl(Features, "avx", true);
3054 setFeatureEnabledImpl(Features, "aes", true);
3055 setFeatureEnabledImpl(Features, "pclmul", true);
3056 setFeatureEnabledImpl(Features, "bmi", true);
3057 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003058 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003059 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003060 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003061 setFeatureEnabledImpl(Features, "ssse3", true);
3062 setFeatureEnabledImpl(Features, "sse4a", true);
3063 setFeatureEnabledImpl(Features, "lzcnt", true);
3064 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003065 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003066 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003067 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003068 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003069 case CK_BDVER4:
3070 setFeatureEnabledImpl(Features, "avx2", true);
3071 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003072 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003073 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003074 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003075 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003076 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003077 // FALLTHROUGH
3078 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003079 setFeatureEnabledImpl(Features, "bmi", true);
3080 setFeatureEnabledImpl(Features, "fma", true);
3081 setFeatureEnabledImpl(Features, "f16c", true);
3082 setFeatureEnabledImpl(Features, "tbm", true);
3083 // FALLTHROUGH
3084 case CK_BDVER1:
3085 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003086 setFeatureEnabledImpl(Features, "xop", true);
3087 setFeatureEnabledImpl(Features, "lzcnt", true);
3088 setFeatureEnabledImpl(Features, "aes", true);
3089 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003090 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003091 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003092 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003093 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003094 break;
Eli Friedman33465822011-07-08 23:31:17 +00003095 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003096 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3097 return false;
3098
3099 // Can't do this earlier because we need to be able to explicitly enable
3100 // or disable these features and the things that they depend upon.
3101
3102 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3103 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003104 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003105 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3106 FeaturesVec.end())
3107 Features["popcnt"] = true;
3108
3109 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3110 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003111 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003112 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3113 FeaturesVec.end())
3114 Features["prfchw"] = true;
3115
Eric Christophera7260af2015-10-08 20:10:18 +00003116 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3117 // then enable MMX.
3118 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003119 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003120 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3121 FeaturesVec.end())
3122 Features["mmx"] = true;
3123
Eric Christopherbbd746d2015-10-08 20:10:14 +00003124 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003125}
3126
Rafael Espindolae62e2792013-08-20 13:44:29 +00003127void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003128 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003129 if (Enabled) {
3130 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003131 case AVX512F:
3132 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003133 case AVX2:
3134 Features["avx2"] = true;
3135 case AVX:
3136 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003137 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003138 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003139 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003141 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 case SSSE3:
3143 Features["ssse3"] = true;
3144 case SSE3:
3145 Features["sse3"] = true;
3146 case SSE2:
3147 Features["sse2"] = true;
3148 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003149 Features["sse"] = true;
3150 case NoSSE:
3151 break;
3152 }
3153 return;
3154 }
3155
3156 switch (Level) {
3157 case NoSSE:
3158 case SSE1:
3159 Features["sse"] = false;
3160 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003161 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3162 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 case SSE3:
3164 Features["sse3"] = false;
3165 setXOPLevel(Features, NoXOP, false);
3166 case SSSE3:
3167 Features["ssse3"] = false;
3168 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003169 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003170 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003171 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003172 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003173 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3174 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003175 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003176 case AVX2:
3177 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003178 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003179 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003180 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003181 Features["avx512vl"] = Features["avx512vbmi"] =
3182 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183 }
3184}
3185
3186void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003187 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003188 if (Enabled) {
3189 switch (Level) {
3190 case AMD3DNowAthlon:
3191 Features["3dnowa"] = true;
3192 case AMD3DNow:
3193 Features["3dnow"] = true;
3194 case MMX:
3195 Features["mmx"] = true;
3196 case NoMMX3DNow:
3197 break;
3198 }
3199 return;
3200 }
3201
3202 switch (Level) {
3203 case NoMMX3DNow:
3204 case MMX:
3205 Features["mmx"] = false;
3206 case AMD3DNow:
3207 Features["3dnow"] = false;
3208 case AMD3DNowAthlon:
3209 Features["3dnowa"] = false;
3210 }
3211}
3212
3213void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003214 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003215 if (Enabled) {
3216 switch (Level) {
3217 case XOP:
3218 Features["xop"] = true;
3219 case FMA4:
3220 Features["fma4"] = true;
3221 setSSELevel(Features, AVX, true);
3222 case SSE4A:
3223 Features["sse4a"] = true;
3224 setSSELevel(Features, SSE3, true);
3225 case NoXOP:
3226 break;
3227 }
3228 return;
3229 }
3230
3231 switch (Level) {
3232 case NoXOP:
3233 case SSE4A:
3234 Features["sse4a"] = false;
3235 case FMA4:
3236 Features["fma4"] = false;
3237 case XOP:
3238 Features["xop"] = false;
3239 }
3240}
3241
Craig Topper86d79ef2013-09-17 04:51:29 +00003242void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3243 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003244 // This is a bit of a hack to deal with the sse4 target feature when used
3245 // as part of the target attribute. We handle sse4 correctly everywhere
3246 // else. See below for more information on how we handle the sse4 options.
3247 if (Name != "sse4")
3248 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003249
Craig Topper29561122013-09-19 01:13:07 +00003250 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003251 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003252 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003253 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003254 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003255 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003256 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003257 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003258 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003259 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003260 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003262 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003263 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003264 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003265 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003266 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003268 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003269 if (Enabled)
3270 setSSELevel(Features, SSE2, Enabled);
3271 } else if (Name == "pclmul") {
3272 if (Enabled)
3273 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003274 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003275 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003276 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003277 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003278 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003279 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003280 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3281 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3282 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003283 if (Enabled)
3284 setSSELevel(Features, AVX512F, Enabled);
3285 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286 if (Enabled)
3287 setSSELevel(Features, AVX, Enabled);
3288 } else if (Name == "fma4") {
3289 setXOPLevel(Features, FMA4, Enabled);
3290 } else if (Name == "xop") {
3291 setXOPLevel(Features, XOP, Enabled);
3292 } else if (Name == "sse4a") {
3293 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003294 } else if (Name == "f16c") {
3295 if (Enabled)
3296 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003297 } else if (Name == "sha") {
3298 if (Enabled)
3299 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003300 } else if (Name == "sse4") {
3301 // We can get here via the __target__ attribute since that's not controlled
3302 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3303 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3304 // disabled.
3305 if (Enabled)
3306 setSSELevel(Features, SSE42, Enabled);
3307 else
3308 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003309 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003310 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003311 Features["xsaveopt"] = false;
3312 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003313 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003314 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003315 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003316}
3317
Eric Christopher3ff21b32013-10-16 21:26:26 +00003318/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003319/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003320bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003321 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003322 for (const auto &Feature : Features) {
3323 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003324 continue;
3325
Eric Christopher610fe112015-08-26 08:21:55 +00003326 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003327 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003328 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003329 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003331 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003333 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003334 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003335 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003336 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003337 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003338 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003339 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003341 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003342 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003343 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003344 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003345 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003346 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003347 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003349 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003350 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003351 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003352 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003353 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003354 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003355 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003356 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003357 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003358 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003359 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003360 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003361 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003363 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003365 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003366 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003367 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003368 } else if (Feature == "+avx512vbmi") {
3369 HasAVX512VBMI = true;
3370 } else if (Feature == "+avx512ifma") {
3371 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003372 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003373 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003374 } else if (Feature == "+mpx") {
3375 HasMPX = true;
3376 } else if (Feature == "+movbe") {
3377 HasMOVBE = true;
3378 } else if (Feature == "+sgx") {
3379 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003380 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003381 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003382 } else if (Feature == "+fxsr") {
3383 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003384 } else if (Feature == "+xsave") {
3385 HasXSAVE = true;
3386 } else if (Feature == "+xsaveopt") {
3387 HasXSAVEOPT = true;
3388 } else if (Feature == "+xsavec") {
3389 HasXSAVEC = true;
3390 } else if (Feature == "+xsaves") {
3391 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003392 } else if (Feature == "+mwaitx") {
3393 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003394 } else if (Feature == "+pku") {
3395 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003396 } else if (Feature == "+clflushopt") {
3397 HasCLFLUSHOPT = true;
3398 } else if (Feature == "+pcommit") {
3399 HasPCOMMIT = true;
3400 } else if (Feature == "+clwb") {
3401 HasCLWB = true;
3402 } else if (Feature == "+umip") {
3403 HasUMIP = true;
3404 } else if (Feature == "+prefetchwt1") {
3405 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003406 }
3407
Benjamin Kramer27402c62012-03-05 15:10:44 +00003408 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003409 .Case("+avx512f", AVX512F)
3410 .Case("+avx2", AVX2)
3411 .Case("+avx", AVX)
3412 .Case("+sse4.2", SSE42)
3413 .Case("+sse4.1", SSE41)
3414 .Case("+ssse3", SSSE3)
3415 .Case("+sse3", SSE3)
3416 .Case("+sse2", SSE2)
3417 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003418 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003419 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003420
Eli Friedman33465822011-07-08 23:31:17 +00003421 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003422 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003423 .Case("+3dnowa", AMD3DNowAthlon)
3424 .Case("+3dnow", AMD3DNow)
3425 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003426 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003427 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003428
3429 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003430 .Case("+xop", XOP)
3431 .Case("+fma4", FMA4)
3432 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003433 .Default(NoXOP);
3434 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003435 }
Eli Friedman33465822011-07-08 23:31:17 +00003436
Rafael Espindolaeb265472013-08-21 21:59:03 +00003437 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3438 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003439 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3440 (FPMath == FP_387 && SSELevel >= SSE1)) {
3441 Diags.Report(diag::err_target_unsupported_fpmath) <<
3442 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003443 return false;
3444 }
3445
Alexey Bataev00396512015-07-02 03:40:19 +00003446 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003447 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003448 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003449}
Chris Lattnerecd49032009-03-02 22:27:17 +00003450
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003451/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3452/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003453void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003454 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003455 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003456 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003457 Builder.defineMacro("__amd64__");
3458 Builder.defineMacro("__amd64");
3459 Builder.defineMacro("__x86_64");
3460 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003461 if (getTriple().getArchName() == "x86_64h") {
3462 Builder.defineMacro("__x86_64h");
3463 Builder.defineMacro("__x86_64h__");
3464 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003465 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003466 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003467 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003468
Chris Lattnerecd49032009-03-02 22:27:17 +00003469 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003470 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3471 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003472 switch (CPU) {
3473 case CK_Generic:
3474 break;
3475 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003476 // The rest are coming from the i386 define above.
3477 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003478 break;
3479 case CK_i486:
3480 case CK_WinChipC6:
3481 case CK_WinChip2:
3482 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003483 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003484 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003485 case CK_PentiumMMX:
3486 Builder.defineMacro("__pentium_mmx__");
3487 Builder.defineMacro("__tune_pentium_mmx__");
3488 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003489 case CK_i586:
3490 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003491 defineCPUMacros(Builder, "i586");
3492 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003494 case CK_Pentium3:
3495 case CK_Pentium3M:
3496 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003497 Builder.defineMacro("__tune_pentium3__");
3498 // Fallthrough
3499 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003500 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003501 Builder.defineMacro("__tune_pentium2__");
3502 // Fallthrough
3503 case CK_PentiumPro:
3504 Builder.defineMacro("__tune_i686__");
3505 Builder.defineMacro("__tune_pentiumpro__");
3506 // Fallthrough
3507 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003508 Builder.defineMacro("__i686");
3509 Builder.defineMacro("__i686__");
3510 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3511 Builder.defineMacro("__pentiumpro");
3512 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003513 break;
3514 case CK_Pentium4:
3515 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003516 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003517 break;
3518 case CK_Yonah:
3519 case CK_Prescott:
3520 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003521 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003522 break;
3523 case CK_Core2:
3524 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003525 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003526 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003527 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003528 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003529 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003530 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003531 defineCPUMacros(Builder, "slm");
3532 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003533 case CK_Nehalem:
3534 case CK_Westmere:
3535 case CK_SandyBridge:
3536 case CK_IvyBridge:
3537 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003538 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003539 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003540 // FIXME: Historically, we defined this legacy name, it would be nice to
3541 // remove it at some point. We've never exposed fine-grained names for
3542 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003543 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003544 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003545 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003546 defineCPUMacros(Builder, "skx");
3547 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003548 case CK_Cannonlake:
3549 break;
Craig Topper449314e2013-08-20 07:09:39 +00003550 case CK_KNL:
3551 defineCPUMacros(Builder, "knl");
3552 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003553 case CK_Lakemont:
3554 Builder.defineMacro("__tune_lakemont__");
3555 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003557 Builder.defineMacro("__k6_2__");
3558 Builder.defineMacro("__tune_k6_2__");
3559 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003560 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003561 if (CPU != CK_K6_2) { // In case of fallthrough
3562 // FIXME: GCC may be enabling these in cases where some other k6
3563 // architecture is specified but -m3dnow is explicitly provided. The
3564 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003565 Builder.defineMacro("__k6_3__");
3566 Builder.defineMacro("__tune_k6_3__");
3567 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003568 // Fallthrough
3569 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003570 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003571 break;
3572 case CK_Athlon:
3573 case CK_AthlonThunderbird:
3574 case CK_Athlon4:
3575 case CK_AthlonXP:
3576 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003577 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003578 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003579 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003580 Builder.defineMacro("__tune_athlon_sse__");
3581 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003582 break;
3583 case CK_K8:
3584 case CK_K8SSE3:
3585 case CK_x86_64:
3586 case CK_Opteron:
3587 case CK_OpteronSSE3:
3588 case CK_Athlon64:
3589 case CK_Athlon64SSE3:
3590 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003591 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003592 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003593 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003594 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003595 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003596 case CK_BTVER1:
3597 defineCPUMacros(Builder, "btver1");
3598 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003599 case CK_BTVER2:
3600 defineCPUMacros(Builder, "btver2");
3601 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003602 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003603 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003604 break;
3605 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003606 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003607 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003608 case CK_BDVER3:
3609 defineCPUMacros(Builder, "bdver3");
3610 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003611 case CK_BDVER4:
3612 defineCPUMacros(Builder, "bdver4");
3613 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003614 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003615 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003616 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003617 }
Chris Lattner96e43572009-03-02 22:40:39 +00003618
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003619 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003620 Builder.defineMacro("__REGISTER_PREFIX__", "");
3621
Chris Lattner6df41af2009-04-19 17:32:33 +00003622 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3623 // functions in glibc header files that use FP Stack inline asm which the
3624 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003625 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003626
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003627 if (HasAES)
3628 Builder.defineMacro("__AES__");
3629
Craig Topper3f122a72012-05-31 05:18:48 +00003630 if (HasPCLMUL)
3631 Builder.defineMacro("__PCLMUL__");
3632
Craig Topper22967d42011-12-25 05:06:45 +00003633 if (HasLZCNT)
3634 Builder.defineMacro("__LZCNT__");
3635
Benjamin Kramer1e250392012-07-07 09:39:18 +00003636 if (HasRDRND)
3637 Builder.defineMacro("__RDRND__");
3638
Craig Topper8c7f2512014-11-03 06:51:41 +00003639 if (HasFSGSBASE)
3640 Builder.defineMacro("__FSGSBASE__");
3641
Craig Topper22967d42011-12-25 05:06:45 +00003642 if (HasBMI)
3643 Builder.defineMacro("__BMI__");
3644
3645 if (HasBMI2)
3646 Builder.defineMacro("__BMI2__");
3647
Craig Topper1de83482011-12-29 16:10:46 +00003648 if (HasPOPCNT)
3649 Builder.defineMacro("__POPCNT__");
3650
Michael Liao625a8752012-11-10 05:17:46 +00003651 if (HasRTM)
3652 Builder.defineMacro("__RTM__");
3653
Michael Liao74f4eaf2013-03-26 17:52:08 +00003654 if (HasPRFCHW)
3655 Builder.defineMacro("__PRFCHW__");
3656
Michael Liaoffaae352013-03-29 05:17:55 +00003657 if (HasRDSEED)
3658 Builder.defineMacro("__RDSEED__");
3659
Robert Khasanov50e6f582014-09-19 09:53:48 +00003660 if (HasADX)
3661 Builder.defineMacro("__ADX__");
3662
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003663 if (HasTBM)
3664 Builder.defineMacro("__TBM__");
3665
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003666 if (HasMWAITX)
3667 Builder.defineMacro("__MWAITX__");
3668
Rafael Espindolae62e2792013-08-20 13:44:29 +00003669 switch (XOPLevel) {
3670 case XOP:
3671 Builder.defineMacro("__XOP__");
3672 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003673 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003674 case SSE4A:
3675 Builder.defineMacro("__SSE4A__");
3676 case NoXOP:
3677 break;
3678 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003679
Craig Topperbba778b2012-06-03 21:46:30 +00003680 if (HasFMA)
3681 Builder.defineMacro("__FMA__");
3682
Manman Rena45358c2012-10-11 00:59:55 +00003683 if (HasF16C)
3684 Builder.defineMacro("__F16C__");
3685
Craig Topper679b53a2013-08-21 05:29:10 +00003686 if (HasAVX512CD)
3687 Builder.defineMacro("__AVX512CD__");
3688 if (HasAVX512ER)
3689 Builder.defineMacro("__AVX512ER__");
3690 if (HasAVX512PF)
3691 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003692 if (HasAVX512DQ)
3693 Builder.defineMacro("__AVX512DQ__");
3694 if (HasAVX512BW)
3695 Builder.defineMacro("__AVX512BW__");
3696 if (HasAVX512VL)
3697 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003698 if (HasAVX512VBMI)
3699 Builder.defineMacro("__AVX512VBMI__");
3700 if (HasAVX512IFMA)
3701 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003702
Ben Langmuir58078d02013-09-19 13:22:04 +00003703 if (HasSHA)
3704 Builder.defineMacro("__SHA__");
3705
Craig Toppere33f51f2015-10-16 06:22:36 +00003706 if (HasFXSR)
3707 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003708 if (HasXSAVE)
3709 Builder.defineMacro("__XSAVE__");
3710 if (HasXSAVEOPT)
3711 Builder.defineMacro("__XSAVEOPT__");
3712 if (HasXSAVEC)
3713 Builder.defineMacro("__XSAVEC__");
3714 if (HasXSAVES)
3715 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003716 if (HasPKU)
3717 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003718 if (HasCX16)
3719 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3720
Chris Lattner96e43572009-03-02 22:40:39 +00003721 // Each case falls through to the previous one here.
3722 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003723 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003724 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003725 case AVX2:
3726 Builder.defineMacro("__AVX2__");
3727 case AVX:
3728 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003729 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003730 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003731 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003732 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003733 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003735 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003737 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003738 Builder.defineMacro("__SSE2__");
3739 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003740 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003741 Builder.defineMacro("__SSE__");
3742 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003743 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003744 break;
3745 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003746
Derek Schuffc7dd7222012-10-11 15:52:22 +00003747 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003748 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003749 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003750 case AVX2:
3751 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003752 case SSE42:
3753 case SSE41:
3754 case SSSE3:
3755 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003756 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003757 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003758 break;
3759 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003760 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003761 break;
3762 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003763 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003764 }
3765 }
3766
Anders Carlssone437c682010-01-27 03:47:49 +00003767 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003768 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003769 case AMD3DNowAthlon:
3770 Builder.defineMacro("__3dNOW_A__");
3771 case AMD3DNow:
3772 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003773 case MMX:
3774 Builder.defineMacro("__MMX__");
3775 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003776 break;
3777 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003778
3779 if (CPU >= CK_i486) {
3780 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3781 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3782 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3783 }
3784 if (CPU >= CK_i586)
3785 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003786}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003787
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003788bool X86TargetInfo::hasFeature(StringRef Feature) const {
3789 return llvm::StringSwitch<bool>(Feature)
3790 .Case("aes", HasAES)
3791 .Case("avx", SSELevel >= AVX)
3792 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003793 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003794 .Case("avx512cd", HasAVX512CD)
3795 .Case("avx512er", HasAVX512ER)
3796 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003797 .Case("avx512dq", HasAVX512DQ)
3798 .Case("avx512bw", HasAVX512BW)
3799 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003800 .Case("avx512vbmi", HasAVX512VBMI)
3801 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003802 .Case("bmi", HasBMI)
3803 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003804 .Case("clflushopt", HasCLFLUSHOPT)
3805 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003806 .Case("cx16", HasCX16)
3807 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003808 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003809 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003810 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003811 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003812 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003813 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3814 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3815 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003816 .Case("movbe", HasMOVBE)
3817 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003818 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003819 .Case("pcommit", HasPCOMMIT)
3820 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003821 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003822 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003823 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003824 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003825 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003826 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003827 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003828 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003829 .Case("sse", SSELevel >= SSE1)
3830 .Case("sse2", SSELevel >= SSE2)
3831 .Case("sse3", SSELevel >= SSE3)
3832 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003833 .Case("sse4.1", SSELevel >= SSE41)
3834 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003835 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003836 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003837 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003838 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003839 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3840 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003841 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003842 .Case("xsave", HasXSAVE)
3843 .Case("xsavec", HasXSAVEC)
3844 .Case("xsaves", HasXSAVES)
3845 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003846 .Default(false);
3847}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003848
Eric Christopherd9832702015-06-29 21:00:05 +00003849// We can't use a generic validation scheme for the features accepted here
3850// versus subtarget features accepted in the target attribute because the
3851// bitfield structure that's initialized in the runtime only supports the
3852// below currently rather than the full range of subtarget features. (See
3853// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3854bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3855 return llvm::StringSwitch<bool>(FeatureStr)
3856 .Case("cmov", true)
3857 .Case("mmx", true)
3858 .Case("popcnt", true)
3859 .Case("sse", true)
3860 .Case("sse2", true)
3861 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003862 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003863 .Case("sse4.1", true)
3864 .Case("sse4.2", true)
3865 .Case("avx", true)
3866 .Case("avx2", true)
3867 .Case("sse4a", true)
3868 .Case("fma4", true)
3869 .Case("xop", true)
3870 .Case("fma", true)
3871 .Case("avx512f", true)
3872 .Case("bmi", true)
3873 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003874 .Case("aes", true)
3875 .Case("pclmul", true)
3876 .Case("avx512vl", true)
3877 .Case("avx512bw", true)
3878 .Case("avx512dq", true)
3879 .Case("avx512cd", true)
3880 .Case("avx512er", true)
3881 .Case("avx512pf", true)
3882 .Case("avx512vbmi", true)
3883 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003884 .Default(false);
3885}
3886
Eli Friedman3fd920a2008-08-20 02:34:37 +00003887bool
Anders Carlsson58436352009-02-28 17:11:49 +00003888X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003889 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003890 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003891 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003892 // Constant constraints.
3893 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3894 // instructions.
3895 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3896 // x86_64 instructions.
3897 case 's':
3898 Info.setRequiresImmediate();
3899 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003900 case 'I':
3901 Info.setRequiresImmediate(0, 31);
3902 return true;
3903 case 'J':
3904 Info.setRequiresImmediate(0, 63);
3905 return true;
3906 case 'K':
3907 Info.setRequiresImmediate(-128, 127);
3908 return true;
3909 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003910 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003911 return true;
3912 case 'M':
3913 Info.setRequiresImmediate(0, 3);
3914 return true;
3915 case 'N':
3916 Info.setRequiresImmediate(0, 255);
3917 return true;
3918 case 'O':
3919 Info.setRequiresImmediate(0, 127);
3920 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003921 // Register constraints.
3922 case 'Y': // 'Y' is the first character for several 2-character constraints.
3923 // Shift the pointer to the second character of the constraint.
3924 Name++;
3925 switch (*Name) {
3926 default:
3927 return false;
3928 case '0': // First SSE register.
3929 case 't': // Any SSE register, when SSE2 is enabled.
3930 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3931 case 'm': // Any MMX register, when inter-unit moves enabled.
3932 Info.setAllowsRegister();
3933 return true;
3934 }
3935 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003936 // Constraint 'f' cannot be used for output operands.
3937 if (Info.ConstraintStr[0] == '=')
3938 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003939 Info.setAllowsRegister();
3940 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003941 case 'a': // eax.
3942 case 'b': // ebx.
3943 case 'c': // ecx.
3944 case 'd': // edx.
3945 case 'S': // esi.
3946 case 'D': // edi.
3947 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003948 case 't': // Top of floating point stack.
3949 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003950 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003951 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003952 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003953 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003954 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3955 case 'l': // "Index" registers: any general register that can be used as an
3956 // index in a base+index memory access.
3957 Info.setAllowsRegister();
3958 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003959 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003960 case 'C': // SSE floating point constant.
3961 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003962 return true;
3963 }
3964}
3965
Akira Hatanaka974131e2014-09-18 18:17:18 +00003966bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3967 unsigned Size) const {
3968 // Strip off constraint modifiers.
3969 while (Constraint[0] == '=' ||
3970 Constraint[0] == '+' ||
3971 Constraint[0] == '&')
3972 Constraint = Constraint.substr(1);
3973
3974 return validateOperandSize(Constraint, Size);
3975}
3976
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003977bool X86TargetInfo::validateInputSize(StringRef Constraint,
3978 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003979 return validateOperandSize(Constraint, Size);
3980}
3981
3982bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3983 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003984 switch (Constraint[0]) {
3985 default: break;
3986 case 'y':
3987 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003988 case 'f':
3989 case 't':
3990 case 'u':
3991 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003992 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003993 if (SSELevel >= AVX512F)
3994 // 512-bit zmm registers can be used if target supports AVX512F.
3995 return Size <= 512U;
3996 else if (SSELevel >= AVX)
3997 // 256-bit ymm registers can be used if target supports AVX.
3998 return Size <= 256U;
3999 return Size <= 128U;
4000 case 'Y':
4001 // 'Y' is the first character for several 2-character constraints.
4002 switch (Constraint[1]) {
4003 default: break;
4004 case 'm':
4005 // 'Ym' is synonymous with 'y'.
4006 return Size <= 64;
4007 case 'i':
4008 case 't':
4009 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4010 if (SSELevel >= AVX512F)
4011 return Size <= 512U;
4012 else if (SSELevel >= AVX)
4013 return Size <= 256U;
4014 return SSELevel >= SSE2 && Size <= 128U;
4015 }
4016
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004017 }
4018
4019 return true;
4020}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004021
Eli Friedman3fd920a2008-08-20 02:34:37 +00004022std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004023X86TargetInfo::convertConstraint(const char *&Constraint) const {
4024 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004025 case 'a': return std::string("{ax}");
4026 case 'b': return std::string("{bx}");
4027 case 'c': return std::string("{cx}");
4028 case 'd': return std::string("{dx}");
4029 case 'S': return std::string("{si}");
4030 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004031 case 'p': // address
4032 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004033 case 't': // top of floating point stack.
4034 return std::string("{st}");
4035 case 'u': // second from top of floating point stack.
4036 return std::string("{st(1)}"); // second from top of floating point stack.
4037 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004038 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004039 }
4040}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004041
Eli Friedman3fd920a2008-08-20 02:34:37 +00004042// X86-32 generic target
4043class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004044public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004045 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4046 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004047 DoubleAlign = LongLongAlign = 32;
4048 LongDoubleWidth = 96;
4049 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004050 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004051 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004052 SizeType = UnsignedInt;
4053 PtrDiffType = SignedInt;
4054 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004055 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004056
4057 // Use fpret for all types.
4058 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4059 (1 << TargetInfo::Double) |
4060 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004061
4062 // x86-32 has atomics up to 8 bytes
4063 // FIXME: Check that we actually have cmpxchg8b before setting
4064 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4065 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004066 }
Craig Topper3164f332014-03-11 03:39:26 +00004067 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004068 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004069 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004070
Craig Topper3164f332014-03-11 03:39:26 +00004071 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004072 if (RegNo == 0) return 0;
4073 if (RegNo == 1) return 2;
4074 return -1;
4075 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004076 bool validateOperandSize(StringRef Constraint,
4077 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004078 switch (Constraint[0]) {
4079 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004080 case 'R':
4081 case 'q':
4082 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004083 case 'a':
4084 case 'b':
4085 case 'c':
4086 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004087 case 'S':
4088 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004089 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004090 case 'A':
4091 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004092 }
4093
Akira Hatanaka974131e2014-09-18 18:17:18 +00004094 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004095 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004096};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004097
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004098class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4099public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004100 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4101 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004102
Craig Topper3164f332014-03-11 03:39:26 +00004103 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004104 unsigned Major, Minor, Micro;
4105 getTriple().getOSVersion(Major, Minor, Micro);
4106 // New NetBSD uses the default rounding mode.
4107 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4108 return X86_32TargetInfo::getFloatEvalMethod();
4109 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004110 return 1;
4111 }
4112};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004113
Eli Friedmane3aa4542009-07-05 18:47:56 +00004114class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4115public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004116 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4117 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004118 SizeType = UnsignedLong;
4119 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004120 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004121 }
4122};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004123
Eli Friedman9fa28852012-08-08 23:57:20 +00004124class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4125public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004126 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4127 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004128 SizeType = UnsignedLong;
4129 IntPtrType = SignedLong;
4130 PtrDiffType = SignedLong;
4131 }
4132};
Eli Friedman9fa28852012-08-08 23:57:20 +00004133
Torok Edwinb2b37c62009-06-30 17:10:35 +00004134class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004135public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004136 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4137 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004138 LongDoubleWidth = 128;
4139 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004140 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004141 MaxVectorAlign = 256;
4142 // The watchOS simulator uses the builtin bool type for Objective-C.
4143 llvm::Triple T = llvm::Triple(Triple);
4144 if (T.isWatchOS())
4145 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004146 SizeType = UnsignedLong;
4147 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004148 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004149 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004150 }
4151
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004152 bool handleTargetFeatures(std::vector<std::string> &Features,
4153 DiagnosticsEngine &Diags) override {
4154 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4155 Diags))
4156 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004157 // We now know the features we have: we can decide how to align vectors.
4158 MaxVectorAlign =
4159 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004160 return true;
4161 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004162};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004163
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004164// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004165class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004166public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004167 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4168 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004169 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004170 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004171 bool IsWinCOFF =
4172 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004173 resetDataLayout(IsWinCOFF
4174 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4175 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004176 }
Craig Topper3164f332014-03-11 03:39:26 +00004177 void getTargetDefines(const LangOptions &Opts,
4178 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4180 }
4181};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004182
4183// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004184class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004185public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004186 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4187 const TargetOptions &Opts)
4188 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004189 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004190 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4191 }
Craig Topper3164f332014-03-11 03:39:26 +00004192 void getTargetDefines(const LangOptions &Opts,
4193 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004194 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4195 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4196 // The value of the following reflects processor type.
4197 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4198 // We lost the original triple, so we use the default.
4199 Builder.defineMacro("_M_IX86", "600");
4200 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004201};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004202
David Majnemerae1ed0e2015-05-28 04:36:18 +00004203static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004204 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4205 // supports __declspec natively under -fms-extensions, but we define a no-op
4206 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004207 if (Opts.MicrosoftExt)
4208 Builder.defineMacro("__declspec", "__declspec");
4209 else
4210 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4211
4212 if (!Opts.MicrosoftExt) {
4213 // Provide macros for all the calling convention keywords. Provide both
4214 // single and double underscore prefixed variants. These are available on
4215 // x64 as well as x86, even though they have no effect.
4216 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4217 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004218 std::string GCCSpelling = "__attribute__((__";
4219 GCCSpelling += CC;
4220 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004221 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4222 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4223 }
4224 }
4225}
4226
David Majnemerae1ed0e2015-05-28 04:36:18 +00004227static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4228 Builder.defineMacro("__MSVCRT__");
4229 Builder.defineMacro("__MINGW32__");
4230 addCygMingDefines(Opts, Builder);
4231}
4232
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004233// x86-32 MinGW target
4234class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4235public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004236 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4237 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004238 void getTargetDefines(const LangOptions &Opts,
4239 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004240 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004241 DefineStd(Builder, "WIN32", Opts);
4242 DefineStd(Builder, "WINNT", Opts);
4243 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004244 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004245 }
4246};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004247
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004248// x86-32 Cygwin target
4249class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4250public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004251 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4252 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004253 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004254 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004255 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 +00004256 }
Craig Topper3164f332014-03-11 03:39:26 +00004257 void getTargetDefines(const LangOptions &Opts,
4258 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004259 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004260 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004261 Builder.defineMacro("__CYGWIN__");
4262 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004263 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004264 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004265 if (Opts.CPlusPlus)
4266 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004267 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004268};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004269
Chris Lattnerb986aba2010-04-11 19:29:39 +00004270// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004271class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004272public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004273 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004274 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004275 }
Craig Topper3164f332014-03-11 03:39:26 +00004276 void getTargetDefines(const LangOptions &Opts,
4277 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004278 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004279 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004280 }
4281};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004282
Alexey Bataevc99b0492015-11-25 09:24:26 +00004283// X86-32 MCU target
4284class MCUX86_32TargetInfo : public X86_32TargetInfo {
4285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004286 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4287 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004288 LongDoubleWidth = 64;
4289 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004290 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 +00004291 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004292 }
4293
4294 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4295 // On MCU we support only C calling convention.
4296 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4297 }
4298
4299 void getTargetDefines(const LangOptions &Opts,
4300 MacroBuilder &Builder) const override {
4301 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4302 Builder.defineMacro("__iamcu");
4303 Builder.defineMacro("__iamcu__");
4304 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004305
4306 bool allowsLargerPreferedTypeAlignment() const override {
4307 return false;
4308 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004309};
4310
Douglas Gregor9fabd852011-07-01 22:41:14 +00004311// RTEMS Target
4312template<typename Target>
4313class RTEMSTargetInfo : public OSTargetInfo<Target> {
4314protected:
Craig Topper3164f332014-03-11 03:39:26 +00004315 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4316 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004317 // RTEMS defines; list based off of gcc output
4318
Douglas Gregor9fabd852011-07-01 22:41:14 +00004319 Builder.defineMacro("__rtems__");
4320 Builder.defineMacro("__ELF__");
4321 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004322
Douglas Gregor9fabd852011-07-01 22:41:14 +00004323public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004324 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4325 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004326 switch (Triple.getArch()) {
4327 default:
4328 case llvm::Triple::x86:
4329 // this->MCountName = ".mcount";
4330 break;
4331 case llvm::Triple::mips:
4332 case llvm::Triple::mipsel:
4333 case llvm::Triple::ppc:
4334 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004335 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004336 // this->MCountName = "_mcount";
4337 break;
4338 case llvm::Triple::arm:
4339 // this->MCountName = "__mcount";
4340 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004341 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004342 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004343};
4344
Douglas Gregor9fabd852011-07-01 22:41:14 +00004345// x86-32 RTEMS target
4346class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004348 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4349 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004350 SizeType = UnsignedLong;
4351 IntPtrType = SignedLong;
4352 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004353 }
Craig Topper3164f332014-03-11 03:39:26 +00004354 void getTargetDefines(const LangOptions &Opts,
4355 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004356 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4357 Builder.defineMacro("__INTEL__");
4358 Builder.defineMacro("__rtems__");
4359 }
4360};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004361
Eli Friedman3fd920a2008-08-20 02:34:37 +00004362// x86-64 generic target
4363class X86_64TargetInfo : public X86TargetInfo {
4364public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004365 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4366 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004367 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004368 bool IsWinCOFF =
4369 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004370 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004371 LongDoubleWidth = 128;
4372 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004373 LargeArrayMinWidth = 128;
4374 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004375 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004376 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4377 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4378 IntPtrType = IsX32 ? SignedInt : SignedLong;
4379 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004380 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004381 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004382
Eric Christopher917e9522014-11-18 22:36:15 +00004383 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004384 resetDataLayout(IsX32
4385 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4386 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4387 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004388
4389 // Use fpret only for long double.
4390 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004391
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004392 // Use fp2ret for _Complex long double.
4393 ComplexLongDoubleUsesFP2Ret = true;
4394
Charles Davisc7d5c942015-09-17 20:55:33 +00004395 // Make __builtin_ms_va_list available.
4396 HasBuiltinMSVaList = true;
4397
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004398 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004399 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004400 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004401 }
Craig Topper3164f332014-03-11 03:39:26 +00004402 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004403 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004404 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004405
Craig Topper3164f332014-03-11 03:39:26 +00004406 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004407 if (RegNo == 0) return 0;
4408 if (RegNo == 1) return 1;
4409 return -1;
4410 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004411
Craig Topper3164f332014-03-11 03:39:26 +00004412 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004413 switch (CC) {
4414 case CC_C:
4415 case CC_Swift:
4416 case CC_X86VectorCall:
4417 case CC_IntelOclBicc:
4418 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004419 case CC_PreserveMost:
4420 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004421 return CCCR_OK;
4422 default:
4423 return CCCR_Warning;
4424 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004425 }
4426
Craig Topper3164f332014-03-11 03:39:26 +00004427 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004428 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004429 }
4430
Pavel Chupinfd223e12014-08-04 12:39:43 +00004431 // for x32 we need it here explicitly
4432 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004433 unsigned getUnwindWordWidth() const override { return 64; }
4434 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004435
4436 bool validateGlobalRegisterVariable(StringRef RegName,
4437 unsigned RegSize,
4438 bool &HasSizeMismatch) const override {
4439 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4440 // handle.
4441 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4442 // Check that the register size is 64-bit.
4443 HasSizeMismatch = RegSize != 64;
4444 return true;
4445 }
4446
4447 // Check if the register is a 32-bit register the backend can handle.
4448 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4449 HasSizeMismatch);
4450 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004451};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004452
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004453// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004454class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004455public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004456 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4457 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004458 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004459 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004460 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004461 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004462 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004463 SizeType = UnsignedLongLong;
4464 PtrDiffType = SignedLongLong;
4465 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004466 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004467
Craig Topper3164f332014-03-11 03:39:26 +00004468 void getTargetDefines(const LangOptions &Opts,
4469 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004470 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004471 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004472 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004473
Craig Topper3164f332014-03-11 03:39:26 +00004474 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004475 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004476 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004477
Craig Topper3164f332014-03-11 03:39:26 +00004478 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004479 switch (CC) {
4480 case CC_X86StdCall:
4481 case CC_X86ThisCall:
4482 case CC_X86FastCall:
4483 return CCCR_Ignore;
4484 case CC_C:
4485 case CC_X86VectorCall:
4486 case CC_IntelOclBicc:
4487 case CC_X86_64SysV:
4488 return CCCR_OK;
4489 default:
4490 return CCCR_Warning;
4491 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004492 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004493};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004494
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004496class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004498 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4499 const TargetOptions &Opts)
4500 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004501 LongDoubleWidth = LongDoubleAlign = 64;
4502 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004503 }
Craig Topper3164f332014-03-11 03:39:26 +00004504 void getTargetDefines(const LangOptions &Opts,
4505 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004506 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4507 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004508 Builder.defineMacro("_M_X64", "100");
4509 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004510 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004511};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004512
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004513// x86-64 MinGW target
4514class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4515public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004516 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4517 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004518 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4519 // with x86 FP ops. Weird.
4520 LongDoubleWidth = LongDoubleAlign = 128;
4521 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4522 }
4523
Craig Topper3164f332014-03-11 03:39:26 +00004524 void getTargetDefines(const LangOptions &Opts,
4525 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004526 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004527 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004528 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004529 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004530
4531 // GCC defines this macro when it is using __gxx_personality_seh0.
4532 if (!Opts.SjLjExceptions)
4533 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004534 }
4535};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004536
Yaron Kerend030d112015-07-22 17:38:19 +00004537// x86-64 Cygwin target
4538class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4539public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004540 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4541 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004542 TLSSupported = false;
4543 WCharType = UnsignedShort;
4544 }
4545 void getTargetDefines(const LangOptions &Opts,
4546 MacroBuilder &Builder) const override {
4547 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4548 Builder.defineMacro("__x86_64__");
4549 Builder.defineMacro("__CYGWIN__");
4550 Builder.defineMacro("__CYGWIN64__");
4551 addCygMingDefines(Opts, Builder);
4552 DefineStd(Builder, "unix", Opts);
4553 if (Opts.CPlusPlus)
4554 Builder.defineMacro("_GNU_SOURCE");
4555
4556 // GCC defines this macro when it is using __gxx_personality_seh0.
4557 if (!Opts.SjLjExceptions)
4558 Builder.defineMacro("__SEH__");
4559 }
4560};
4561
Eli Friedman2857ccb2009-07-01 03:36:11 +00004562class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004564 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4565 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004566 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004567 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4568 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004569 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004570 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004571 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004572 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004573
4574 bool handleTargetFeatures(std::vector<std::string> &Features,
4575 DiagnosticsEngine &Diags) override {
4576 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4577 Diags))
4578 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004579 // We now know the features we have: we can decide how to align vectors.
4580 MaxVectorAlign =
4581 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004582 return true;
4583 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004584};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004585
Eli Friedman245f2292009-07-05 22:31:18 +00004586class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004588 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4589 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004590 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004591 Int64Type = SignedLongLong;
4592 }
4593};
Eli Friedman245f2292009-07-05 22:31:18 +00004594
Eli Friedman9fa28852012-08-08 23:57:20 +00004595class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004597 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4598 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004599 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004600 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004601 }
4602};
Tim Northover9bb857a2013-01-31 12:13:10 +00004603
Eli Friedmanf05b7722008-08-20 07:44:10 +00004604class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004605 // Possible FPU choices.
4606 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004607 VFP2FPU = (1 << 0),
4608 VFP3FPU = (1 << 1),
4609 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004610 NeonFPU = (1 << 3),
4611 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004612 };
4613
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004614 // Possible HWDiv features.
4615 enum HWDivMode {
4616 HWDivThumb = (1 << 0),
4617 HWDivARM = (1 << 1)
4618 };
4619
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004620 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004621 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004622 }
4623
4624 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4625 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004626
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004627 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004628
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004629 StringRef CPUProfile;
4630 StringRef CPUAttr;
4631
Rafael Espindolaeb265472013-08-21 21:59:03 +00004632 enum {
4633 FP_Default,
4634 FP_VFP,
4635 FP_Neon
4636 } FPMath;
4637
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004638 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004639 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004640 unsigned ArchProfile;
4641 unsigned ArchVersion;
4642
Bernard Ogdenda13af32013-10-24 18:32:51 +00004643 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004644
Logan Chien57086ce2012-10-10 06:56:20 +00004645 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004646 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004647
4648 // Initialized via features.
4649 unsigned SoftFloat : 1;
4650 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004651
Bernard Ogden18b57012013-10-29 09:47:51 +00004652 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004653 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004654 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004655 unsigned Unaligned : 1;
4656
4657 enum {
4658 LDREX_B = (1 << 0), /// byte (8-bit)
4659 LDREX_H = (1 << 1), /// half (16-bit)
4660 LDREX_W = (1 << 2), /// word (32-bit)
4661 LDREX_D = (1 << 3), /// double (64-bit)
4662 };
4663
4664 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004665
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004666 // ACLE 6.5.1 Hardware floating point
4667 enum {
4668 HW_FP_HP = (1 << 1), /// half (16-bit)
4669 HW_FP_SP = (1 << 2), /// single (32-bit)
4670 HW_FP_DP = (1 << 3), /// double (64-bit)
4671 };
4672 uint32_t HW_FP;
4673
Chris Lattner5cc15e02010-03-03 19:03:45 +00004674 static const Builtin::Info BuiltinInfo[];
4675
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004676 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004677 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004678
4679 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004680 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004681
Renato Golin0201a9e2016-09-22 19:28:20 +00004682 // size_t is unsigned long on MachO-derived environments, NetBSD,
4683 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004684 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004685 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004686 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004687 SizeType = UnsignedLong;
4688 else
4689 SizeType = UnsignedInt;
4690
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004691 switch (T.getOS()) {
4692 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004693 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004694 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004695 break;
4696 case llvm::Triple::Win32:
4697 WCharType = UnsignedShort;
4698 break;
4699 case llvm::Triple::Linux:
4700 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004701 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4702 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004703 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004704 }
4705
4706 UseBitFieldTypeAlignment = true;
4707
4708 ZeroLengthBitfieldBoundary = 0;
4709
Tim Northover147cd2f2014-10-14 22:12:21 +00004710 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4711 // so set preferred for small types to 32.
4712 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004713 resetDataLayout(BigEndian
4714 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4715 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004716 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004717 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004718 resetDataLayout("e"
4719 "-m:w"
4720 "-p:32:32"
4721 "-i64:64"
4722 "-v128:64:128"
4723 "-a:0:32"
4724 "-n32"
4725 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004726 } else if (T.isOSNaCl()) {
4727 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004728 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004729 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004730 resetDataLayout(BigEndian
4731 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4732 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004733 }
4734
4735 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004736 }
4737
Tim Northover5627d392015-10-30 16:30:45 +00004738 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004739 const llvm::Triple &T = getTriple();
4740
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004741 IsAAPCS = false;
4742
Tim Northover5627d392015-10-30 16:30:45 +00004743 if (IsAAPCS16)
4744 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4745 else
4746 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004747
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004748 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004749 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004750 SizeType = UnsignedInt;
4751 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004752 SizeType = UnsignedLong;
4753
4754 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4755 WCharType = SignedInt;
4756
4757 // Do not respect the alignment of bit-field types when laying out
4758 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4759 UseBitFieldTypeAlignment = false;
4760
4761 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4762 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4763 /// gcc.
4764 ZeroLengthBitfieldBoundary = 32;
4765
Tim Northover5627d392015-10-30 16:30:45 +00004766 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4767 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004768 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004769 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004770 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004771 BigEndian
4772 ? "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 +00004773 : "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 +00004774 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004775 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004776 BigEndian
4777 ? "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 +00004778 : "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 +00004779
4780 // FIXME: Override "preferred align" for double and long long.
4781 }
4782
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004783 void setArchInfo() {
4784 StringRef ArchName = getTriple().getArchName();
4785
Renato Goline84b0002015-10-08 16:43:26 +00004786 ArchISA = llvm::ARM::parseArchISA(ArchName);
4787 CPU = llvm::ARM::getDefaultCPU(ArchName);
4788 unsigned AK = llvm::ARM::parseArch(ArchName);
4789 if (AK != llvm::ARM::AK_INVALID)
4790 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004791 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792 }
4793
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004794 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004795 StringRef SubArch;
4796
4797 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004798 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004799 SubArch = llvm::ARM::getSubArch(ArchKind);
4800 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4801 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004802
4803 // cache CPU related strings
4804 CPUAttr = getCPUAttr();
4805 CPUProfile = getCPUProfile();
4806 }
4807
4808 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004809 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004810 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004811 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004812 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4813 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004814 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004815 if (ArchProfile == llvm::ARM::PK_M) {
4816 MaxAtomicPromoteWidth = 32;
4817 if (ShouldUseInlineAtomic)
4818 MaxAtomicInlineWidth = 32;
4819 }
4820 else {
4821 MaxAtomicPromoteWidth = 64;
4822 if (ShouldUseInlineAtomic)
4823 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004824 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825 }
4826
4827 bool isThumb() const {
4828 return (ArchISA == llvm::ARM::IK_THUMB);
4829 }
4830
4831 bool supportsThumb() const {
4832 return CPUAttr.count('T') || ArchVersion >= 6;
4833 }
4834
4835 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004836 return CPUAttr.equals("6T2") ||
4837 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004838 }
4839
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 // For most sub-arches, the build attribute CPU name is enough.
4842 // For Cortex variants, it's slightly different.
4843 switch(ArchKind) {
4844 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004845 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004848 case llvm::ARM::AK_ARMV7S:
4849 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004850 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004851 return "7A";
4852 case llvm::ARM::AK_ARMV7R:
4853 return "7R";
4854 case llvm::ARM::AK_ARMV7M:
4855 return "7M";
4856 case llvm::ARM::AK_ARMV7EM:
4857 return "7EM";
4858 case llvm::ARM::AK_ARMV8A:
4859 return "8A";
4860 case llvm::ARM::AK_ARMV8_1A:
4861 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004862 case llvm::ARM::AK_ARMV8_2A:
4863 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004864 case llvm::ARM::AK_ARMV8MBaseline:
4865 return "8M_BASE";
4866 case llvm::ARM::AK_ARMV8MMainline:
4867 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004868 }
4869 }
4870
4871 StringRef getCPUProfile() const {
4872 switch(ArchProfile) {
4873 case llvm::ARM::PK_A:
4874 return "A";
4875 case llvm::ARM::PK_R:
4876 return "R";
4877 case llvm::ARM::PK_M:
4878 return "M";
4879 default:
4880 return "";
4881 }
4882 }
4883
Chris Lattner17df24e2008-04-21 18:56:49 +00004884public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004885 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004886 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4887 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004888
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004889 switch (getTriple().getOS()) {
4890 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004891 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004892 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004893 break;
4894 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004895 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004896 break;
4897 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004898
Renato Goline84b0002015-10-08 16:43:26 +00004899 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004900 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004901
Chris Lattner1a8f3942010-04-23 16:29:58 +00004902 // {} in inline assembly are neon specifiers, not assembly variant
4903 // specifiers.
4904 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004905
Eric Christopher0e261882014-12-05 01:06:59 +00004906 // FIXME: This duplicates code from the driver that sets the -target-abi
4907 // option - this code is used if -target-abi isn't passed and should
4908 // be unified in some way.
4909 if (Triple.isOSBinFormatMachO()) {
4910 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4911 // the frontend matches that.
4912 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4913 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004914 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004915 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004916 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004917 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004918 } else {
4919 setABI("apcs-gnu");
4920 }
4921 } else if (Triple.isOSWindows()) {
4922 // FIXME: this is invalid for WindowsCE
4923 setABI("aapcs");
4924 } else {
4925 // Select the default based on the platform.
4926 switch (Triple.getEnvironment()) {
4927 case llvm::Triple::Android:
4928 case llvm::Triple::GNUEABI:
4929 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004930 case llvm::Triple::MuslEABI:
4931 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004932 setABI("aapcs-linux");
4933 break;
4934 case llvm::Triple::EABIHF:
4935 case llvm::Triple::EABI:
4936 setABI("aapcs");
4937 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004938 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004939 setABI("apcs-gnu");
4940 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004941 default:
4942 if (Triple.getOS() == llvm::Triple::NetBSD)
4943 setABI("apcs-gnu");
4944 else
4945 setABI("aapcs");
4946 break;
4947 }
4948 }
John McCall86353412010-08-21 22:46:04 +00004949
4950 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004951 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004952
Renato Golin15b86152015-07-03 16:41:13 +00004953 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004954 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004955
James Molloya7139222012-03-12 09:14:10 +00004956 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004957 // the alignment of the zero-length bitfield is greater than the member
4958 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004959 // zero length bitfield.
4960 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004961
4962 if (Triple.getOS() == llvm::Triple::Linux ||
4963 Triple.getOS() == llvm::Triple::UnknownOS)
4964 this->MCountName =
4965 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004966 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004967
Alp Toker4925ba72014-06-07 23:30:42 +00004968 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004969
Craig Topper3164f332014-03-11 03:39:26 +00004970 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004971 ABI = Name;
4972
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004973 // The defaults (above) are for AAPCS, check if we need to change them.
4974 //
4975 // FIXME: We need support for -meabi... we could just mangle it into the
4976 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004977 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004978 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004979 return true;
4980 }
4981 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4982 setABIAAPCS();
4983 return true;
4984 }
4985 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004986 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004987
Renato Golinf5c4dec2015-05-27 13:33:00 +00004988 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004989 bool
4990 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4991 StringRef CPU,
4992 const std::vector<std::string> &FeaturesVec) const override {
4993
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004994 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004995 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004996
4997 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004998 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004999 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5000
5001 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005002 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005003 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5004
5005 for (const char *Feature : TargetFeatures)
5006 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005007 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005008
Eric Christopher007b0a02015-08-28 22:32:01 +00005009 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005010 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005011
Craig Topper3164f332014-03-11 03:39:26 +00005012 bool handleTargetFeatures(std::vector<std::string> &Features,
5013 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005014 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005015 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005016 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005017 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005018 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005019 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005020 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005021
Ranjeet Singhac08e532015-06-24 23:39:25 +00005022 // This does not diagnose illegal cases like having both
5023 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5024 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005025 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005026 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005027 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005028 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005029 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005030 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005031 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005032 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005033 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005034 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005035 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005036 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005037 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005038 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005039 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005040 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005041 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005042 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005043 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005044 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005045 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005046 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005047 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005048 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005049 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005050 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005051 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005052 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005053 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005054 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005055 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005056 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005057 } else if (Feature == "+strict-align") {
5058 Unaligned = 0;
5059 } else if (Feature == "+fp16") {
5060 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005061 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005062 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005063 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005064
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005065 switch (ArchVersion) {
5066 case 6:
5067 if (ArchProfile == llvm::ARM::PK_M)
5068 LDREX = 0;
5069 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5070 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5071 else
5072 LDREX = LDREX_W;
5073 break;
5074 case 7:
5075 if (ArchProfile == llvm::ARM::PK_M)
5076 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5077 else
5078 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5079 break;
5080 case 8:
5081 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5082 }
5083
Rafael Espindolaeb265472013-08-21 21:59:03 +00005084 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5085 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5086 return false;
5087 }
5088
5089 if (FPMath == FP_Neon)
5090 Features.push_back("+neonfp");
5091 else if (FPMath == FP_VFP)
5092 Features.push_back("-neonfp");
5093
Daniel Dunbar893d4752009-12-19 04:15:38 +00005094 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005095 auto Feature =
5096 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5097 if (Feature != Features.end())
5098 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005099
Rafael Espindolaeb265472013-08-21 21:59:03 +00005100 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005101 }
5102
Craig Topper3164f332014-03-11 03:39:26 +00005103 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005104 return llvm::StringSwitch<bool>(Feature)
5105 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005106 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005107 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005108 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005109 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005110 .Case("hwdiv", HWDiv & HWDivThumb)
5111 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005112 .Default(false);
5113 }
Renato Golin15b86152015-07-03 16:41:13 +00005114
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005115 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005116 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005117 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005118
Renato Golin15b86152015-07-03 16:41:13 +00005119 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005120 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005121 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005122 CPU = Name;
5123 return true;
5124 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125
Craig Topper3164f332014-03-11 03:39:26 +00005126 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005127
Craig Topper3164f332014-03-11 03:39:26 +00005128 void getTargetDefines(const LangOptions &Opts,
5129 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005130 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005131 Builder.defineMacro("__arm");
5132 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005133 // For bare-metal none-eabi.
5134 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5135 getTriple().getEnvironment() == llvm::Triple::EABI)
5136 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005137
Chris Lattnerecd49032009-03-02 22:27:17 +00005138 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005139 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005140
5141 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5142 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005143 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005144 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5145
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005146 if (!CPUAttr.empty())
5147 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005148
5149 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005150 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005151 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005152
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005153 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005154 // ACLE 6.5.7 Crypto Extension
5155 if (Crypto)
5156 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5157 // ACLE 6.5.8 CRC32 Extension
5158 if (CRC)
5159 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5160 // ACLE 6.5.10 Numeric Maximum and Minimum
5161 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5162 // ACLE 6.5.9 Directed Rounding
5163 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005164 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005165
5166 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5167 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005168 // NOTE that the default profile is assumed to be 'A'
5169 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005170 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5171
Bradley Smithf4affc12016-03-03 13:52:22 +00005172 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5173 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5174 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5175 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005176 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005177 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005178 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005179 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5180
5181 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5182 // instruction set such as ARM or Thumb.
5183 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5184
5185 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5186
5187 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005188 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005189 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005190
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005191 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005192 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005193 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005194
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005195 // ACLE 6.4.4 LDREX/STREX
5196 if (LDREX)
5197 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5198
5199 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005200 if (ArchVersion == 5 ||
5201 (ArchVersion == 6 && CPUProfile != "M") ||
5202 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005203 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5204
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005205 // ACLE 6.5.1 Hardware Floating Point
5206 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005207 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005208
Yi Konga44c4d72014-06-27 21:25:42 +00005209 // ACLE predefines.
5210 Builder.defineMacro("__ARM_ACLE", "200");
5211
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005212 // FP16 support (we currently only support IEEE format).
5213 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5214 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5215
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005216 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005217 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005218 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5219
Mike Stump9d54bd72009-04-08 02:07:04 +00005220 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005221
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005222 // FIXME: It's more complicated than this and we don't really support
5223 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005224 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005225 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005226 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005227
David Tweed8f676532012-10-25 13:33:01 +00005228 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005229 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005230 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005231 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005232 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005233 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005234 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005235
Tim Northover28fc0e12016-04-28 13:59:55 +00005236 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5237 ABI == "aapcs16")
5238 Builder.defineMacro("__ARM_PCS_VFP", "1");
5239
Daniel Dunbar893d4752009-12-19 04:15:38 +00005240 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005241 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005242
Zijiao Ma56a83722016-08-17 02:13:33 +00005243 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005244 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005245
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005246 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005247 Builder.defineMacro("__THUMBEL__");
5248 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005249 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005250 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005251 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005252
5253 // ACLE 6.4.9 32-bit SIMD instructions
5254 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5255 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5256
5257 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005258 if (((HWDiv & HWDivThumb) && isThumb()) ||
5259 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005261 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005262 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005263
5264 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005265 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005266
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005267 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005268 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005269 if (FPU & VFP2FPU)
5270 Builder.defineMacro("__ARM_VFPV2__");
5271 if (FPU & VFP3FPU)
5272 Builder.defineMacro("__ARM_VFPV3__");
5273 if (FPU & VFP4FPU)
5274 Builder.defineMacro("__ARM_VFPV4__");
5275 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005276
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005277 // This only gets set when Neon instructions are actually available, unlike
5278 // the VFP define, hence the soft float and arch check. This is subtly
5279 // different from gcc, we follow the intent which was that it should be set
5280 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005281 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005282 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005283 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005284 // current AArch32 NEON implementations do not support double-precision
5285 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005286 Builder.defineMacro("__ARM_NEON_FP",
5287 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005288 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005289
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005290 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5291 Opts.ShortWChar ? "2" : "4");
5292
5293 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5294 Opts.ShortEnums ? "1" : "4");
5295
Bradley Smithf4affc12016-03-03 13:52:22 +00005296 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005297 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5298 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5299 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5300 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5301 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005302
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005303 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005304 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005305 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005306 }
5307
5308 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005309 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005310 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5311 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005312 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005313 }
5314
5315 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005316 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005317 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005318
5319 if (Opts.UnsafeFPMath)
5320 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005321
5322 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5323 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005324 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005325
Craig Topper6c03a542015-10-19 04:51:35 +00005326 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5327 return llvm::makeArrayRef(BuiltinInfo,
5328 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005329 }
Craig Topper3164f332014-03-11 03:39:26 +00005330 bool isCLZForZeroUndef() const override { return false; }
5331 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005332 return IsAAPCS
5333 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005334 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5335 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005336 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005337 ArrayRef<const char *> getGCCRegNames() const override;
5338 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005339 bool validateAsmConstraint(const char *&Name,
5340 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005341 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005342 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005343 case 'l': // r0-r7
5344 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005345 case 't': // VFP Floating point register single precision
5346 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005347 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005348 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005349 case 'I':
5350 case 'J':
5351 case 'K':
5352 case 'L':
5353 case 'M':
5354 // FIXME
5355 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005356 case 'Q': // A memory address that is a single base register.
5357 Info.setAllowsMemory();
5358 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005359 case 'U': // a memory reference...
5360 switch (Name[1]) {
5361 case 'q': // ...ARMV4 ldrsb
5362 case 'v': // ...VFP load/store (reg+constant offset)
5363 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005364 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005365 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005366 case 'n': // valid address for Neon doubleword vector load/store
5367 case 'm': // valid address for Neon element and structure load/store
5368 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005369 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005370 Info.setAllowsMemory();
5371 Name++;
5372 return true;
5373 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005374 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005375 return false;
5376 }
Craig Topper3164f332014-03-11 03:39:26 +00005377 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005378 std::string R;
5379 switch (*Constraint) {
5380 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005381 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005382 Constraint++;
5383 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005384 case 'p': // 'p' should be translated to 'r' by default.
5385 R = std::string("r");
5386 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005387 default:
5388 return std::string(1, *Constraint);
5389 }
5390 return R;
5391 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005392 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005393 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005394 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005395 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005396 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005397
Bill Wendling9d1ee112012-10-25 23:28:48 +00005398 // Strip off constraint modifiers.
5399 while (Constraint[0] == '=' ||
5400 Constraint[0] == '+' ||
5401 Constraint[0] == '&')
5402 Constraint = Constraint.substr(1);
5403
5404 switch (Constraint[0]) {
5405 default: break;
5406 case 'r': {
5407 switch (Modifier) {
5408 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005409 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005410 case 'q':
5411 // A register of size 32 cannot fit a vector type.
5412 return false;
5413 }
5414 }
5415 }
5416
5417 return true;
5418 }
Craig Topper3164f332014-03-11 03:39:26 +00005419 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005420 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005421 return "";
5422 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005423
Craig Topper3164f332014-03-11 03:39:26 +00005424 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005425 switch (CC) {
5426 case CC_AAPCS:
5427 case CC_AAPCS_VFP:
5428 case CC_Swift:
5429 return CCCR_OK;
5430 default:
5431 return CCCR_Warning;
5432 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005433 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005434
Craig Topper3164f332014-03-11 03:39:26 +00005435 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005436 if (RegNo == 0) return 0;
5437 if (RegNo == 1) return 1;
5438 return -1;
5439 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005440
5441 bool hasSjLjLowering() const override {
5442 return true;
5443 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005444};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005445
Rafael Espindolaeb265472013-08-21 21:59:03 +00005446bool ARMTargetInfo::setFPMath(StringRef Name) {
5447 if (Name == "neon") {
5448 FPMath = FP_Neon;
5449 return true;
5450 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5451 Name == "vfp4") {
5452 FPMath = FP_VFP;
5453 return true;
5454 }
5455 return false;
5456}
5457
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005458const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005459 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005460 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005461 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5462
5463 // Float registers
5464 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5465 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5466 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005467 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005468
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005469 // Double registers
5470 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5471 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005472 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5473 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005474
5475 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005476 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5477 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005478};
5479
Craig Topperf054e3a2015-10-19 03:52:27 +00005480ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5481 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005482}
5483
5484const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005485 { { "a1" }, "r0" },
5486 { { "a2" }, "r1" },
5487 { { "a3" }, "r2" },
5488 { { "a4" }, "r3" },
5489 { { "v1" }, "r4" },
5490 { { "v2" }, "r5" },
5491 { { "v3" }, "r6" },
5492 { { "v4" }, "r7" },
5493 { { "v5" }, "r8" },
5494 { { "v6", "rfp" }, "r9" },
5495 { { "sl" }, "r10" },
5496 { { "fp" }, "r11" },
5497 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005498 { { "r13" }, "sp" },
5499 { { "r14" }, "lr" },
5500 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005501 // The S, D and Q registers overlap, but aren't really aliases; we
5502 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005503};
5504
Craig Topperf054e3a2015-10-19 03:52:27 +00005505ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5506 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005507}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005508
5509const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005510#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005511 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005512#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5513 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005514#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005515
Craig Topper07d3b622015-08-07 05:14:44 +00005516#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005517 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005518#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005519 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005520#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5521 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005522#include "clang/Basic/BuiltinsARM.def"
5523};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005524
5525class ARMleTargetInfo : public ARMTargetInfo {
5526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005527 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005528 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005529 void getTargetDefines(const LangOptions &Opts,
5530 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005531 Builder.defineMacro("__ARMEL__");
5532 ARMTargetInfo::getTargetDefines(Opts, Builder);
5533 }
5534};
5535
5536class ARMbeTargetInfo : public ARMTargetInfo {
5537public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005538 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005539 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005540 void getTargetDefines(const LangOptions &Opts,
5541 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005542 Builder.defineMacro("__ARMEB__");
5543 Builder.defineMacro("__ARM_BIG_ENDIAN");
5544 ARMTargetInfo::getTargetDefines(Opts, Builder);
5545 }
5546};
Chris Lattner17df24e2008-04-21 18:56:49 +00005547
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005548class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5549 const llvm::Triple Triple;
5550public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005551 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5552 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005553 WCharType = UnsignedShort;
5554 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005555 }
5556 void getVisualStudioDefines(const LangOptions &Opts,
5557 MacroBuilder &Builder) const {
5558 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5559
5560 // FIXME: this is invalid for WindowsCE
5561 Builder.defineMacro("_M_ARM_NT", "1");
5562 Builder.defineMacro("_M_ARMT", "_M_ARM");
5563 Builder.defineMacro("_M_THUMB", "_M_ARM");
5564
5565 assert((Triple.getArch() == llvm::Triple::arm ||
5566 Triple.getArch() == llvm::Triple::thumb) &&
5567 "invalid architecture for Windows ARM target info");
5568 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5569 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5570
5571 // TODO map the complete set of values
5572 // 31: VFPv3 40: VFPv4
5573 Builder.defineMacro("_M_ARM_FP", "31");
5574 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005575 BuiltinVaListKind getBuiltinVaListKind() const override {
5576 return TargetInfo::CharPtrBuiltinVaList;
5577 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005578 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5579 switch (CC) {
5580 case CC_X86StdCall:
5581 case CC_X86ThisCall:
5582 case CC_X86FastCall:
5583 case CC_X86VectorCall:
5584 return CCCR_Ignore;
5585 case CC_C:
5586 return CCCR_OK;
5587 default:
5588 return CCCR_Warning;
5589 }
5590 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005591};
5592
5593// Windows ARM + Itanium C++ ABI Target
5594class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005596 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5597 const TargetOptions &Opts)
5598 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005599 TheCXXABI.set(TargetCXXABI::GenericARM);
5600 }
5601
5602 void getTargetDefines(const LangOptions &Opts,
5603 MacroBuilder &Builder) const override {
5604 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5605
5606 if (Opts.MSVCCompat)
5607 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5608 }
5609};
5610
5611// Windows ARM, MS (C++) ABI
5612class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5613public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005614 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5615 const TargetOptions &Opts)
5616 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005617 TheCXXABI.set(TargetCXXABI::Microsoft);
5618 }
5619
5620 void getTargetDefines(const LangOptions &Opts,
5621 MacroBuilder &Builder) const override {
5622 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5623 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5624 }
5625};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005626
Yaron Keren321249c2015-07-15 13:32:23 +00005627// ARM MinGW target
5628class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5629public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005630 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5631 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005632 TheCXXABI.set(TargetCXXABI::GenericARM);
5633 }
5634
5635 void getTargetDefines(const LangOptions &Opts,
5636 MacroBuilder &Builder) const override {
5637 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5638 DefineStd(Builder, "WIN32", Opts);
5639 DefineStd(Builder, "WINNT", Opts);
5640 Builder.defineMacro("_ARM_");
5641 addMinGWDefines(Opts, Builder);
5642 }
5643};
5644
5645// ARM Cygwin target
5646class CygwinARMTargetInfo : public ARMleTargetInfo {
5647public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005648 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5649 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005650 TLSSupported = false;
5651 WCharType = UnsignedShort;
5652 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005653 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005654 }
5655 void getTargetDefines(const LangOptions &Opts,
5656 MacroBuilder &Builder) const override {
5657 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5658 Builder.defineMacro("_ARM_");
5659 Builder.defineMacro("__CYGWIN__");
5660 Builder.defineMacro("__CYGWIN32__");
5661 DefineStd(Builder, "unix", Opts);
5662 if (Opts.CPlusPlus)
5663 Builder.defineMacro("_GNU_SOURCE");
5664 }
5665};
5666
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005667class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005668protected:
Craig Topper3164f332014-03-11 03:39:26 +00005669 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5670 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005671 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005672 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005673
Torok Edwinb2b37c62009-06-30 17:10:35 +00005674public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005675 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5676 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005677 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005678 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005679 // FIXME: This should be based off of the target features in
5680 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005681 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005682
Tim Northoverd88ecb32016-01-27 19:32:40 +00005683 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005684 // Darwin on iOS uses a variant of the ARM C++ ABI.
5685 TheCXXABI.set(TargetCXXABI::WatchOS);
5686
5687 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5688 // size_t is long, it's a bit weird for it to be int.
5689 PtrDiffType = SignedLong;
5690
5691 // BOOL should be a real boolean on the new ABI
5692 UseSignedCharForObjCBool = false;
5693 } else
5694 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005695 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005696};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005697
Tim Northover573cbee2014-05-24 12:52:07 +00005698class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005699 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005700 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5701 static const char *const GCCRegNames[];
5702
James Molloy75f5f9e2014-04-16 15:33:48 +00005703 enum FPUModeEnum {
5704 FPUMode,
5705 NeonMode
5706 };
5707
5708 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005709 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005710 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005711 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005712 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005713
Tim Northovera2ee4332014-03-29 15:09:45 +00005714 static const Builtin::Info BuiltinInfo[];
5715
5716 std::string ABI;
5717
5718public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005719 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005720 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005721 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5722 WCharType = SignedInt;
5723
5724 // NetBSD apparently prefers consistency across ARM targets to consistency
5725 // across 64-bit targets.
5726 Int64Type = SignedLongLong;
5727 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005728 } else {
5729 WCharType = UnsignedInt;
5730 Int64Type = SignedLong;
5731 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005732 }
5733
Tim Northovera2ee4332014-03-29 15:09:45 +00005734 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005735 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005736 MaxAtomicInlineWidth = 128;
5737 MaxAtomicPromoteWidth = 128;
5738
Tim Northovera6a19f12015-02-06 01:25:07 +00005739 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005740 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5741
Tim Northovera2ee4332014-03-29 15:09:45 +00005742 // {} in inline assembly are neon specifiers, not assembly variant
5743 // specifiers.
5744 NoAsmVariants = true;
5745
Tim Northover7ad87af2015-01-16 18:44:04 +00005746 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5747 // contributes to the alignment of the containing aggregate in the same way
5748 // a plain (non bit-field) member of that type would, without exception for
5749 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005750 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005751 UseZeroLengthBitfieldAlignment = true;
5752
Tim Northover573cbee2014-05-24 12:52:07 +00005753 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005754 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005755
5756 if (Triple.getOS() == llvm::Triple::Linux ||
5757 Triple.getOS() == llvm::Triple::UnknownOS)
5758 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005759 }
5760
Alp Toker4925ba72014-06-07 23:30:42 +00005761 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005762 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005763 if (Name != "aapcs" && Name != "darwinpcs")
5764 return false;
5765
5766 ABI = Name;
5767 return true;
5768 }
5769
David Blaikie1cbb9712014-11-14 19:09:44 +00005770 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005771 return Name == "generic" ||
5772 llvm::AArch64::parseCPUArch(Name) !=
5773 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005774 }
5775
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005776 void getTargetDefines(const LangOptions &Opts,
5777 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005778 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005779 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005780
5781 // Target properties.
5782 Builder.defineMacro("_LP64");
5783 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005784
5785 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5786 Builder.defineMacro("__ARM_ACLE", "200");
5787 Builder.defineMacro("__ARM_ARCH", "8");
5788 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5789
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005790 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005791 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005792 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005793
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005794 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5795 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5796 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5797 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005798 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005799 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5800 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005801
5802 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5803
5804 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005805 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005806
5807 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5808 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005809 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5810 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005811
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005812 if (Opts.UnsafeFPMath)
5813 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005814
5815 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5816
5817 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5818 Opts.ShortEnums ? "1" : "4");
5819
James Molloy75f5f9e2014-04-16 15:33:48 +00005820 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005821 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005822 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005823 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005825
Bradley Smith418c5932014-05-02 15:17:51 +00005826 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005827 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005828
James Molloy75f5f9e2014-04-16 15:33:48 +00005829 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005830 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5831
5832 if (Unaligned)
5833 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005834
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005835 if (V8_1A)
5836 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5837
Reid Klecknerd167d422015-05-06 15:31:46 +00005838 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5839 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5840 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5841 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5842 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005843 }
5844
Craig Topper6c03a542015-10-19 04:51:35 +00005845 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5846 return llvm::makeArrayRef(BuiltinInfo,
5847 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005848 }
5849
David Blaikie1cbb9712014-11-14 19:09:44 +00005850 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005851 return Feature == "aarch64" ||
5852 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005853 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005854 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005855 }
5856
James Molloy5e73df52014-04-16 15:06:20 +00005857 bool handleTargetFeatures(std::vector<std::string> &Features,
5858 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005859 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005860 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005861 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005862 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005863 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005864
Eric Christopher610fe112015-08-26 08:21:55 +00005865 for (const auto &Feature : Features) {
5866 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005867 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005868 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005869 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005870 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005871 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005872 if (Feature == "+strict-align")
5873 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005874 if (Feature == "+v8.1a")
5875 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005876 }
5877
James Y Knightb214cbc2016-03-04 19:00:41 +00005878 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005879
5880 return true;
5881 }
5882
John McCall477f2bb2016-03-03 06:39:32 +00005883 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5884 switch (CC) {
5885 case CC_C:
5886 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005887 case CC_PreserveMost:
5888 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005889 return CCCR_OK;
5890 default:
5891 return CCCR_Warning;
5892 }
5893 }
5894
David Blaikie1cbb9712014-11-14 19:09:44 +00005895 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005896
David Blaikie1cbb9712014-11-14 19:09:44 +00005897 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005898 return TargetInfo::AArch64ABIBuiltinVaList;
5899 }
5900
Craig Topperf054e3a2015-10-19 03:52:27 +00005901 ArrayRef<const char *> getGCCRegNames() const override;
5902 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005903
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005904 bool validateAsmConstraint(const char *&Name,
5905 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005906 switch (*Name) {
5907 default:
5908 return false;
5909 case 'w': // Floating point and SIMD registers (V0-V31)
5910 Info.setAllowsRegister();
5911 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005912 case 'I': // Constant that can be used with an ADD instruction
5913 case 'J': // Constant that can be used with a SUB instruction
5914 case 'K': // Constant that can be used with a 32-bit logical instruction
5915 case 'L': // Constant that can be used with a 64-bit logical instruction
5916 case 'M': // Constant that can be used as a 32-bit MOV immediate
5917 case 'N': // Constant that can be used as a 64-bit MOV immediate
5918 case 'Y': // Floating point constant zero
5919 case 'Z': // Integer constant zero
5920 return true;
5921 case 'Q': // A memory reference with base register and no offset
5922 Info.setAllowsMemory();
5923 return true;
5924 case 'S': // A symbolic address
5925 Info.setAllowsRegister();
5926 return true;
5927 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005928 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5929 // Utf: A memory address suitable for ldp/stp in TF mode.
5930 // Usa: An absolute symbolic address.
5931 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5932 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005933 case 'z': // Zero register, wzr or xzr
5934 Info.setAllowsRegister();
5935 return true;
5936 case 'x': // Floating point and SIMD registers (V0-V15)
5937 Info.setAllowsRegister();
5938 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005939 }
5940 return false;
5941 }
5942
Akira Hatanaka987f1862014-08-22 06:05:21 +00005943 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005944 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005945 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005946 // Strip off constraint modifiers.
5947 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5948 Constraint = Constraint.substr(1);
5949
5950 switch (Constraint[0]) {
5951 default:
5952 return true;
5953 case 'z':
5954 case 'r': {
5955 switch (Modifier) {
5956 case 'x':
5957 case 'w':
5958 // For now assume that the person knows what they're
5959 // doing with the modifier.
5960 return true;
5961 default:
5962 // By default an 'r' constraint will be in the 'x'
5963 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005964 if (Size == 64)
5965 return true;
5966
5967 SuggestedModifier = "w";
5968 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005969 }
5970 }
5971 }
5972 }
5973
David Blaikie1cbb9712014-11-14 19:09:44 +00005974 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005975
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005976 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005977 if (RegNo == 0)
5978 return 0;
5979 if (RegNo == 1)
5980 return 1;
5981 return -1;
5982 }
5983};
5984
Tim Northover573cbee2014-05-24 12:52:07 +00005985const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005986 // 32-bit Integer registers
5987 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5988 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5989 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5990
5991 // 64-bit Integer registers
5992 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5993 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5994 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5995
5996 // 32-bit floating point regsisters
5997 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5998 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5999 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6000
6001 // 64-bit floating point regsisters
6002 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6003 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6004 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6005
6006 // Vector registers
6007 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6008 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6009 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6010};
6011
Craig Topperf054e3a2015-10-19 03:52:27 +00006012ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6013 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006014}
6015
Tim Northover573cbee2014-05-24 12:52:07 +00006016const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006017 { { "w31" }, "wsp" },
6018 { { "x29" }, "fp" },
6019 { { "x30" }, "lr" },
6020 { { "x31" }, "sp" },
6021 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6022 // don't want to substitute one of these for a different-sized one.
6023};
6024
Craig Topperf054e3a2015-10-19 03:52:27 +00006025ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6026 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006027}
6028
Tim Northover573cbee2014-05-24 12:52:07 +00006029const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006030#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006031 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006032#include "clang/Basic/BuiltinsNEON.def"
6033
6034#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006035 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006036#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006037};
James Molloy5e73df52014-04-16 15:06:20 +00006038
Tim Northover573cbee2014-05-24 12:52:07 +00006039class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006040 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006041 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006042 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006043 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006044 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006045 }
6046
6047public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006048 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6049 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006050 }
James Molloy5e73df52014-04-16 15:06:20 +00006051 void getTargetDefines(const LangOptions &Opts,
6052 MacroBuilder &Builder) const override {
6053 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006054 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006055 }
6056};
6057
Tim Northover573cbee2014-05-24 12:52:07 +00006058class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006059 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006060 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006061 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006062 }
6063
6064public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006065 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6066 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006067 void getTargetDefines(const LangOptions &Opts,
6068 MacroBuilder &Builder) const override {
6069 Builder.defineMacro("__AARCH64EB__");
6070 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6071 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006072 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006073 }
6074};
Tim Northovera2ee4332014-03-29 15:09:45 +00006075
Tim Northover573cbee2014-05-24 12:52:07 +00006076class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006077protected:
6078 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6079 MacroBuilder &Builder) const override {
6080 Builder.defineMacro("__AARCH64_SIMD__");
6081 Builder.defineMacro("__ARM64_ARCH_8__");
6082 Builder.defineMacro("__ARM_NEON__");
6083 Builder.defineMacro("__LITTLE_ENDIAN__");
6084 Builder.defineMacro("__REGISTER_PREFIX__", "");
6085 Builder.defineMacro("__arm64", "1");
6086 Builder.defineMacro("__arm64__", "1");
6087
6088 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6089 }
6090
Tim Northovera2ee4332014-03-29 15:09:45 +00006091public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006092 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6093 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006094 Int64Type = SignedLongLong;
6095 WCharType = SignedInt;
6096 UseSignedCharForObjCBool = false;
6097
Tim Northovera6a19f12015-02-06 01:25:07 +00006098 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006099 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6100
6101 TheCXXABI.set(TargetCXXABI::iOS64);
6102 }
6103
David Blaikie1cbb9712014-11-14 19:09:44 +00006104 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006105 return TargetInfo::CharPtrBuiltinVaList;
6106 }
6107};
Tim Northovera2ee4332014-03-29 15:09:45 +00006108
Tony Linthicum76329bf2011-12-12 21:14:55 +00006109// Hexagon abstract base class
6110class HexagonTargetInfo : public TargetInfo {
6111 static const Builtin::Info BuiltinInfo[];
6112 static const char * const GCCRegNames[];
6113 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6114 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006115 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006116 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006117
Tony Linthicum76329bf2011-12-12 21:14:55 +00006118public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006119 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6120 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006121 // Specify the vector alignment explicitly. For v512x1, the calculated
6122 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6123 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006124 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006125 "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 +00006126 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006127 SizeType = UnsignedInt;
6128 PtrDiffType = SignedInt;
6129 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006130
6131 // {} in inline assembly are packet specifiers, not assembly variant
6132 // specifiers.
6133 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006134
6135 LargeArrayMinWidth = 64;
6136 LargeArrayAlign = 64;
6137 UseBitFieldTypeAlignment = true;
6138 ZeroLengthBitfieldBoundary = 32;
6139 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006140 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006141 }
6142
Craig Topper6c03a542015-10-19 04:51:35 +00006143 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6144 return llvm::makeArrayRef(BuiltinInfo,
6145 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006146 }
6147
Craig Topper3164f332014-03-11 03:39:26 +00006148 bool validateAsmConstraint(const char *&Name,
6149 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006150 switch (*Name) {
6151 case 'v':
6152 case 'q':
6153 if (HasHVX) {
6154 Info.setAllowsRegister();
6155 return true;
6156 }
6157 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006158 case 's':
6159 // Relocatable constant.
6160 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006161 }
6162 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006163 }
6164
Craig Topper3164f332014-03-11 03:39:26 +00006165 void getTargetDefines(const LangOptions &Opts,
6166 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006167
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006168 bool isCLZForZeroUndef() const override { return false; }
6169
Craig Topper3164f332014-03-11 03:39:26 +00006170 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006171 return llvm::StringSwitch<bool>(Feature)
6172 .Case("hexagon", true)
6173 .Case("hvx", HasHVX)
6174 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006175 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006176 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006177 }
Craig Topper3164f332014-03-11 03:39:26 +00006178
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006179 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6180 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6181 const override;
6182
6183 bool handleTargetFeatures(std::vector<std::string> &Features,
6184 DiagnosticsEngine &Diags) override;
6185
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006186 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6187 bool Enabled) const override;
6188
Craig Topper3164f332014-03-11 03:39:26 +00006189 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006190 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006191 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006192 ArrayRef<const char *> getGCCRegNames() const override;
6193 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006194 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006195 return "";
6196 }
Sebastian Pop86500282012-01-13 20:37:10 +00006197
6198 static const char *getHexagonCPUSuffix(StringRef Name) {
6199 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006200 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006201 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006202 .Case("hexagonv55", "55")
6203 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006204 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006205 }
6206
Craig Topper3164f332014-03-11 03:39:26 +00006207 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006208 if (!getHexagonCPUSuffix(Name))
6209 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006210 CPU = Name;
6211 return true;
6212 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006213
6214 int getEHDataRegisterNumber(unsigned RegNo) const override {
6215 return RegNo < 2 ? RegNo : -1;
6216 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006217};
6218
6219void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006220 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006221 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006222 Builder.defineMacro("__hexagon__", "1");
6223
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006224 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006225 Builder.defineMacro("__HEXAGON_V4__");
6226 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006227 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006228 Builder.defineMacro("__QDSP6_V4__");
6229 Builder.defineMacro("__QDSP6_ARCH__", "4");
6230 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006231 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006232 Builder.defineMacro("__HEXAGON_V5__");
6233 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6234 if(Opts.HexagonQdsp6Compat) {
6235 Builder.defineMacro("__QDSP6_V5__");
6236 Builder.defineMacro("__QDSP6_ARCH__", "5");
6237 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006238 } else if (CPU == "hexagonv55") {
6239 Builder.defineMacro("__HEXAGON_V55__");
6240 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6241 Builder.defineMacro("__QDSP6_V55__");
6242 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006243 } else if (CPU == "hexagonv60") {
6244 Builder.defineMacro("__HEXAGON_V60__");
6245 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6246 Builder.defineMacro("__QDSP6_V60__");
6247 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006248 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006249
6250 if (hasFeature("hvx")) {
6251 Builder.defineMacro("__HVX__");
6252 if (hasFeature("hvx-double"))
6253 Builder.defineMacro("__HVXDBL__");
6254 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006255}
6256
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006257bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6258 DiagnosticsEngine &Diags, StringRef CPU,
6259 const std::vector<std::string> &FeaturesVec) const {
6260 // Default for v60: -hvx, -hvx-double.
6261 Features["hvx"] = false;
6262 Features["hvx-double"] = false;
6263 Features["long-calls"] = false;
6264
6265 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6266}
6267
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006268bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6269 DiagnosticsEngine &Diags) {
6270 for (auto &F : Features) {
6271 if (F == "+hvx")
6272 HasHVX = true;
6273 else if (F == "-hvx")
6274 HasHVX = HasHVXDouble = false;
6275 else if (F == "+hvx-double")
6276 HasHVX = HasHVXDouble = true;
6277 else if (F == "-hvx-double")
6278 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006279
6280 if (F == "+long-calls")
6281 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006282 else if (F == "-long-calls")
6283 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006284 }
6285 return true;
6286}
6287
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006288void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6289 StringRef Name, bool Enabled) const {
6290 if (Enabled) {
6291 if (Name == "hvx-double")
6292 Features["hvx"] = true;
6293 } else {
6294 if (Name == "hvx")
6295 Features["hvx-double"] = false;
6296 }
6297 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006298}
6299
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006300const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006301 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6302 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6303 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6304 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6305 "p0", "p1", "p2", "p3",
6306 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6307};
6308
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006309ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006310 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006311}
6312
Tony Linthicum76329bf2011-12-12 21:14:55 +00006313const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6314 { { "sp" }, "r29" },
6315 { { "fp" }, "r30" },
6316 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006317};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006318
Craig Topperf054e3a2015-10-19 03:52:27 +00006319ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6320 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006321}
6322
6323
6324const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006325#define BUILTIN(ID, TYPE, ATTRS) \
6326 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6327#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6328 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329#include "clang/Basic/BuiltinsHexagon.def"
6330};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006331
Jacques Pienaard964cc22016-03-28 21:02:54 +00006332class LanaiTargetInfo : public TargetInfo {
6333 // Class for Lanai (32-bit).
6334 // The CPU profiles supported by the Lanai backend
6335 enum CPUKind {
6336 CK_NONE,
6337 CK_V11,
6338 } CPU;
6339
6340 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6341 static const char *const GCCRegNames[];
6342
6343public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006344 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6345 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006346 // Description string has to be kept in sync with backend.
6347 resetDataLayout("E" // Big endian
6348 "-m:e" // ELF name manging
6349 "-p:32:32" // 32 bit pointers, 32 bit aligned
6350 "-i64:64" // 64 bit integers, 64 bit aligned
6351 "-a:0:32" // 32 bit alignment of objects of aggregate type
6352 "-n32" // 32 bit native integer width
6353 "-S64" // 64 bit natural stack alignment
6354 );
6355
6356 // Setting RegParmMax equal to what mregparm was set to in the old
6357 // toolchain
6358 RegParmMax = 4;
6359
6360 // Set the default CPU to V11
6361 CPU = CK_V11;
6362
6363 // Temporary approach to make everything at least word-aligned and allow for
6364 // safely casting between pointers with different alignment requirements.
6365 // TODO: Remove this when there are no more cast align warnings on the
6366 // firmware.
6367 MinGlobalAlign = 32;
6368 }
6369
6370 void getTargetDefines(const LangOptions &Opts,
6371 MacroBuilder &Builder) const override {
6372 // Define __lanai__ when building for target lanai.
6373 Builder.defineMacro("__lanai__");
6374
6375 // Set define for the CPU specified.
6376 switch (CPU) {
6377 case CK_V11:
6378 Builder.defineMacro("__LANAI_V11__");
6379 break;
6380 case CK_NONE:
6381 llvm_unreachable("Unhandled target CPU");
6382 }
6383 }
6384
6385 bool setCPU(const std::string &Name) override {
6386 CPU = llvm::StringSwitch<CPUKind>(Name)
6387 .Case("v11", CK_V11)
6388 .Default(CK_NONE);
6389
6390 return CPU != CK_NONE;
6391 }
6392
6393 bool hasFeature(StringRef Feature) const override {
6394 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6395 }
6396
6397 ArrayRef<const char *> getGCCRegNames() const override;
6398
6399 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6400
6401 BuiltinVaListKind getBuiltinVaListKind() const override {
6402 return TargetInfo::VoidPtrBuiltinVaList;
6403 }
6404
6405 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6406
6407 bool validateAsmConstraint(const char *&Name,
6408 TargetInfo::ConstraintInfo &info) const override {
6409 return false;
6410 }
6411
6412 const char *getClobbers() const override { return ""; }
6413};
6414
6415const char *const LanaiTargetInfo::GCCRegNames[] = {
6416 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6417 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6418 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6419
6420ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6421 return llvm::makeArrayRef(GCCRegNames);
6422}
6423
6424const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6425 {{"pc"}, "r2"},
6426 {{"sp"}, "r4"},
6427 {{"fp"}, "r5"},
6428 {{"rv"}, "r8"},
6429 {{"rr1"}, "r10"},
6430 {{"rr2"}, "r11"},
6431 {{"rca"}, "r15"},
6432};
6433
6434ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6435 return llvm::makeArrayRef(GCCRegAliases);
6436}
6437
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006438// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6439class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006440 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6441 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006442 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006443public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006444 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006445 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006446
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006447 int getEHDataRegisterNumber(unsigned RegNo) const override {
6448 if (RegNo == 0) return 24;
6449 if (RegNo == 1) return 25;
6450 return -1;
6451 }
6452
Craig Topper3164f332014-03-11 03:39:26 +00006453 bool handleTargetFeatures(std::vector<std::string> &Features,
6454 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006455 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006456 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6457 if (Feature != Features.end()) {
6458 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006459 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006460 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006461 }
Craig Topper3164f332014-03-11 03:39:26 +00006462 void getTargetDefines(const LangOptions &Opts,
6463 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006464 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006465 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006466
6467 if (SoftFloat)
6468 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006469 }
Craig Topper3164f332014-03-11 03:39:26 +00006470
6471 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006472 return llvm::StringSwitch<bool>(Feature)
6473 .Case("softfloat", SoftFloat)
6474 .Case("sparc", true)
6475 .Default(false);
6476 }
Craig Topper3164f332014-03-11 03:39:26 +00006477
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006478 bool hasSjLjLowering() const override {
6479 return true;
6480 }
6481
Craig Topper6c03a542015-10-19 04:51:35 +00006482 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006483 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006484 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006485 }
Craig Topper3164f332014-03-11 03:39:26 +00006486 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006487 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006488 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006489 ArrayRef<const char *> getGCCRegNames() const override;
6490 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006491 bool validateAsmConstraint(const char *&Name,
6492 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006493 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006494 switch (*Name) {
6495 case 'I': // Signed 13-bit constant
6496 case 'J': // Zero
6497 case 'K': // 32-bit constant with the low 12 bits clear
6498 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6499 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6500 case 'N': // Same as 'K' but zext (required for SIMode)
6501 case 'O': // The constant 4096
6502 return true;
6503 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006504 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006505 }
Craig Topper3164f332014-03-11 03:39:26 +00006506 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006507 // FIXME: Implement!
6508 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006509 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006510
6511 // No Sparc V7 for now, the backend doesn't support it anyway.
6512 enum CPUKind {
6513 CK_GENERIC,
6514 CK_V8,
6515 CK_SUPERSPARC,
6516 CK_SPARCLITE,
6517 CK_F934,
6518 CK_HYPERSPARC,
6519 CK_SPARCLITE86X,
6520 CK_SPARCLET,
6521 CK_TSC701,
6522 CK_V9,
6523 CK_ULTRASPARC,
6524 CK_ULTRASPARC3,
6525 CK_NIAGARA,
6526 CK_NIAGARA2,
6527 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006528 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006529 CK_MYRIAD2100,
6530 CK_MYRIAD2150,
6531 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006532 CK_LEON2,
6533 CK_LEON2_AT697E,
6534 CK_LEON2_AT697F,
6535 CK_LEON3,
6536 CK_LEON3_UT699,
6537 CK_LEON3_GR712RC,
6538 CK_LEON4,
6539 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006540 } CPU = CK_GENERIC;
6541
6542 enum CPUGeneration {
6543 CG_V8,
6544 CG_V9,
6545 };
6546
6547 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6548 switch (Kind) {
6549 case CK_GENERIC:
6550 case CK_V8:
6551 case CK_SUPERSPARC:
6552 case CK_SPARCLITE:
6553 case CK_F934:
6554 case CK_HYPERSPARC:
6555 case CK_SPARCLITE86X:
6556 case CK_SPARCLET:
6557 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006558 case CK_MYRIAD2100:
6559 case CK_MYRIAD2150:
6560 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006561 case CK_LEON2:
6562 case CK_LEON2_AT697E:
6563 case CK_LEON2_AT697F:
6564 case CK_LEON3:
6565 case CK_LEON3_UT699:
6566 case CK_LEON3_GR712RC:
6567 case CK_LEON4:
6568 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006569 return CG_V8;
6570 case CK_V9:
6571 case CK_ULTRASPARC:
6572 case CK_ULTRASPARC3:
6573 case CK_NIAGARA:
6574 case CK_NIAGARA2:
6575 case CK_NIAGARA3:
6576 case CK_NIAGARA4:
6577 return CG_V9;
6578 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006579 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006580 }
6581
6582 CPUKind getCPUKind(StringRef Name) const {
6583 return llvm::StringSwitch<CPUKind>(Name)
6584 .Case("v8", CK_V8)
6585 .Case("supersparc", CK_SUPERSPARC)
6586 .Case("sparclite", CK_SPARCLITE)
6587 .Case("f934", CK_F934)
6588 .Case("hypersparc", CK_HYPERSPARC)
6589 .Case("sparclite86x", CK_SPARCLITE86X)
6590 .Case("sparclet", CK_SPARCLET)
6591 .Case("tsc701", CK_TSC701)
6592 .Case("v9", CK_V9)
6593 .Case("ultrasparc", CK_ULTRASPARC)
6594 .Case("ultrasparc3", CK_ULTRASPARC3)
6595 .Case("niagara", CK_NIAGARA)
6596 .Case("niagara2", CK_NIAGARA2)
6597 .Case("niagara3", CK_NIAGARA3)
6598 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006599 .Case("ma2100", CK_MYRIAD2100)
6600 .Case("ma2150", CK_MYRIAD2150)
6601 .Case("ma2450", CK_MYRIAD2450)
6602 // FIXME: the myriad2[.n] spellings are obsolete,
6603 // but a grace period is needed to allow updating dependent builds.
6604 .Case("myriad2", CK_MYRIAD2100)
6605 .Case("myriad2.1", CK_MYRIAD2100)
6606 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006607 .Case("leon2", CK_LEON2)
6608 .Case("at697e", CK_LEON2_AT697E)
6609 .Case("at697f", CK_LEON2_AT697F)
6610 .Case("leon3", CK_LEON3)
6611 .Case("ut699", CK_LEON3_UT699)
6612 .Case("gr712rc", CK_LEON3_GR712RC)
6613 .Case("leon4", CK_LEON4)
6614 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006615 .Default(CK_GENERIC);
6616 }
6617
6618 bool setCPU(const std::string &Name) override {
6619 CPU = getCPUKind(Name);
6620 return CPU != CK_GENERIC;
6621 }
Gabor Greif49991682008-02-21 16:29:08 +00006622};
6623
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006624const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006625 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6626 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6627 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6628 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6629};
6630
Craig Topperf054e3a2015-10-19 03:52:27 +00006631ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6632 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006633}
6634
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006635const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006636 { { "g0" }, "r0" },
6637 { { "g1" }, "r1" },
6638 { { "g2" }, "r2" },
6639 { { "g3" }, "r3" },
6640 { { "g4" }, "r4" },
6641 { { "g5" }, "r5" },
6642 { { "g6" }, "r6" },
6643 { { "g7" }, "r7" },
6644 { { "o0" }, "r8" },
6645 { { "o1" }, "r9" },
6646 { { "o2" }, "r10" },
6647 { { "o3" }, "r11" },
6648 { { "o4" }, "r12" },
6649 { { "o5" }, "r13" },
6650 { { "o6", "sp" }, "r14" },
6651 { { "o7" }, "r15" },
6652 { { "l0" }, "r16" },
6653 { { "l1" }, "r17" },
6654 { { "l2" }, "r18" },
6655 { { "l3" }, "r19" },
6656 { { "l4" }, "r20" },
6657 { { "l5" }, "r21" },
6658 { { "l6" }, "r22" },
6659 { { "l7" }, "r23" },
6660 { { "i0" }, "r24" },
6661 { { "i1" }, "r25" },
6662 { { "i2" }, "r26" },
6663 { { "i3" }, "r27" },
6664 { { "i4" }, "r28" },
6665 { { "i5" }, "r29" },
6666 { { "i6", "fp" }, "r30" },
6667 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006668};
6669
Craig Topperf054e3a2015-10-19 03:52:27 +00006670ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6671 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006672}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006673
6674// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6675class SparcV8TargetInfo : public SparcTargetInfo {
6676public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006677 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6678 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006679 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006680 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6681 switch (getTriple().getOS()) {
6682 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006683 SizeType = UnsignedInt;
6684 IntPtrType = SignedInt;
6685 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006686 break;
6687 case llvm::Triple::NetBSD:
6688 case llvm::Triple::OpenBSD:
6689 SizeType = UnsignedLong;
6690 IntPtrType = SignedLong;
6691 PtrDiffType = SignedLong;
6692 break;
Brad Smith56495d52015-08-13 22:00:53 +00006693 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006694 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006695 }
6696
Craig Topper3164f332014-03-11 03:39:26 +00006697 void getTargetDefines(const LangOptions &Opts,
6698 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006699 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006700 switch (getCPUGeneration(CPU)) {
6701 case CG_V8:
6702 Builder.defineMacro("__sparcv8");
6703 if (getTriple().getOS() != llvm::Triple::Solaris)
6704 Builder.defineMacro("__sparcv8__");
6705 break;
6706 case CG_V9:
6707 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006708 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006709 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006710 Builder.defineMacro("__sparc_v9__");
6711 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006712 break;
6713 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006714 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006715 std::string MyriadArchValue, Myriad2Value;
6716 Builder.defineMacro("__sparc_v8__");
6717 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006718 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006719 case CK_MYRIAD2150:
6720 MyriadArchValue = "__ma2150";
6721 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006722 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006723 case CK_MYRIAD2450:
6724 MyriadArchValue = "__ma2450";
6725 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006726 break;
6727 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006728 MyriadArchValue = "__ma2100";
6729 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006730 break;
6731 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006732 Builder.defineMacro(MyriadArchValue, "1");
6733 Builder.defineMacro(MyriadArchValue+"__", "1");
6734 Builder.defineMacro("__myriad2__", Myriad2Value);
6735 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006736 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006737 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006738
6739 bool hasSjLjLowering() const override {
6740 return true;
6741 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006742};
6743
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006744// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6745class SparcV8elTargetInfo : public SparcV8TargetInfo {
6746 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006747 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6748 : SparcV8TargetInfo(Triple, Opts) {
6749 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006750 }
6751};
6752
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006753// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6754class SparcV9TargetInfo : public SparcTargetInfo {
6755public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006756 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6757 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006758 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006759 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006760 // This is an LP64 platform.
6761 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006762
6763 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006764 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006765 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006766 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006767 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006768 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006769
6770 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6771 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6772 LongDoubleWidth = 128;
6773 LongDoubleAlign = 128;
6774 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006775 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006776 }
6777
Craig Topper3164f332014-03-11 03:39:26 +00006778 void getTargetDefines(const LangOptions &Opts,
6779 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006780 SparcTargetInfo::getTargetDefines(Opts, Builder);
6781 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006782 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006783 // Solaris doesn't need these variants, but the BSDs do.
6784 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006785 Builder.defineMacro("__sparc64__");
6786 Builder.defineMacro("__sparc_v9__");
6787 Builder.defineMacro("__sparcv9__");
6788 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006789 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006790
Craig Topper3164f332014-03-11 03:39:26 +00006791 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006792 if (!SparcTargetInfo::setCPU(Name))
6793 return false;
6794 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006795 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006796};
6797
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006798class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006799 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006800 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006801 std::string CPU;
6802 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006803 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006804
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006805public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006806 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006807 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6808 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006809 IntMaxType = SignedLong;
6810 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006811 TLSSupported = true;
6812 IntWidth = IntAlign = 32;
6813 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6814 PointerWidth = PointerAlign = 64;
6815 LongDoubleWidth = 128;
6816 LongDoubleAlign = 64;
6817 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006818 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006819 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006820 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 +00006821 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6822 }
6823 void getTargetDefines(const LangOptions &Opts,
6824 MacroBuilder &Builder) const override {
6825 Builder.defineMacro("__s390__");
6826 Builder.defineMacro("__s390x__");
6827 Builder.defineMacro("__zarch__");
6828 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006829
6830 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6831 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6832 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6833 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6834
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006835 if (HasTransactionalExecution)
6836 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006837 if (Opts.ZVector)
6838 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839 }
Craig Topper6c03a542015-10-19 04:51:35 +00006840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6841 return llvm::makeArrayRef(BuiltinInfo,
6842 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006843 }
6844
Craig Topperf054e3a2015-10-19 03:52:27 +00006845 ArrayRef<const char *> getGCCRegNames() const override;
6846 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006847 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006848 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006849 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006850 bool validateAsmConstraint(const char *&Name,
6851 TargetInfo::ConstraintInfo &info) const override;
6852 const char *getClobbers() const override {
6853 // FIXME: Is this really right?
6854 return "";
6855 }
6856 BuiltinVaListKind getBuiltinVaListKind() const override {
6857 return TargetInfo::SystemZBuiltinVaList;
6858 }
6859 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006860 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006861 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6862 .Case("z10", true)
6863 .Case("z196", true)
6864 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006865 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006866 .Default(false);
6867
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006868 return CPUKnown;
6869 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006870 bool
6871 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6872 StringRef CPU,
6873 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006874 if (CPU == "zEC12")
6875 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006876 if (CPU == "z13") {
6877 Features["transactional-execution"] = true;
6878 Features["vector"] = true;
6879 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006880 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006881 }
6882
6883 bool handleTargetFeatures(std::vector<std::string> &Features,
6884 DiagnosticsEngine &Diags) override {
6885 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006886 for (const auto &Feature : Features) {
6887 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006888 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006889 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006890 HasVector = true;
6891 }
6892 // If we use the vector ABI, vector types are 64-bit aligned.
6893 if (HasVector) {
6894 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006895 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6896 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006897 }
6898 return true;
6899 }
6900
6901 bool hasFeature(StringRef Feature) const override {
6902 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006903 .Case("systemz", true)
6904 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006905 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006906 .Default(false);
6907 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006908
Bryan Chane3f1ed52016-04-28 13:56:43 +00006909 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6910 switch (CC) {
6911 case CC_C:
6912 case CC_Swift:
6913 return CCCR_OK;
6914 default:
6915 return CCCR_Warning;
6916 }
6917 }
6918
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006919 StringRef getABI() const override {
6920 if (HasVector)
6921 return "vector";
6922 return "";
6923 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006924
6925 bool useFloat128ManglingForLongDouble() const override {
6926 return true;
6927 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006928};
6929
6930const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6931#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006932 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006933#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6934 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006935#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006936};
6937
6938const char *const SystemZTargetInfo::GCCRegNames[] = {
6939 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6940 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6941 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6942 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6943};
6944
Craig Topperf054e3a2015-10-19 03:52:27 +00006945ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6946 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006947}
6948
6949bool SystemZTargetInfo::
6950validateAsmConstraint(const char *&Name,
6951 TargetInfo::ConstraintInfo &Info) const {
6952 switch (*Name) {
6953 default:
6954 return false;
6955
6956 case 'a': // Address register
6957 case 'd': // Data register (equivalent to 'r')
6958 case 'f': // Floating-point register
6959 Info.setAllowsRegister();
6960 return true;
6961
6962 case 'I': // Unsigned 8-bit constant
6963 case 'J': // Unsigned 12-bit constant
6964 case 'K': // Signed 16-bit constant
6965 case 'L': // Signed 20-bit displacement (on all targets we support)
6966 case 'M': // 0x7fffffff
6967 return true;
6968
6969 case 'Q': // Memory with base and unsigned 12-bit displacement
6970 case 'R': // Likewise, plus an index
6971 case 'S': // Memory with base and signed 20-bit displacement
6972 case 'T': // Likewise, plus an index
6973 Info.setAllowsMemory();
6974 return true;
6975 }
6976}
Ulrich Weigand47445072013-05-06 16:26:41 +00006977
Eric Christopherc48497a2015-09-18 21:26:24 +00006978class MSP430TargetInfo : public TargetInfo {
6979 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006980
Eric Christopherc48497a2015-09-18 21:26:24 +00006981public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006982 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6983 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006984 TLSSupported = false;
6985 IntWidth = 16;
6986 IntAlign = 16;
6987 LongWidth = 32;
6988 LongLongWidth = 64;
6989 LongAlign = LongLongAlign = 16;
6990 PointerWidth = 16;
6991 PointerAlign = 16;
6992 SuitableAlign = 16;
6993 SizeType = UnsignedInt;
6994 IntMaxType = SignedLongLong;
6995 IntPtrType = SignedInt;
6996 PtrDiffType = SignedInt;
6997 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006998 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006999 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007000 void getTargetDefines(const LangOptions &Opts,
7001 MacroBuilder &Builder) const override {
7002 Builder.defineMacro("MSP430");
7003 Builder.defineMacro("__MSP430__");
7004 // FIXME: defines for different 'flavours' of MCU
7005 }
Craig Topper6c03a542015-10-19 04:51:35 +00007006 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007007 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007008 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007009 }
7010 bool hasFeature(StringRef Feature) const override {
7011 return Feature == "msp430";
7012 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007013 ArrayRef<const char *> getGCCRegNames() const override;
7014 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007015 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007016 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007017 }
7018 bool validateAsmConstraint(const char *&Name,
7019 TargetInfo::ConstraintInfo &info) const override {
7020 // FIXME: implement
7021 switch (*Name) {
7022 case 'K': // the constant 1
7023 case 'L': // constant -1^20 .. 1^19
7024 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007025 return true;
7026 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007027 // No target constraints for now.
7028 return false;
7029 }
7030 const char *getClobbers() const override {
7031 // FIXME: Is this really right?
7032 return "";
7033 }
7034 BuiltinVaListKind getBuiltinVaListKind() const override {
7035 // FIXME: implement
7036 return TargetInfo::CharPtrBuiltinVaList;
7037 }
7038};
7039
7040const char *const MSP430TargetInfo::GCCRegNames[] = {
7041 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7042 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7043
Craig Topperf054e3a2015-10-19 03:52:27 +00007044ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7045 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007046}
7047
7048// LLVM and Clang cannot be used directly to output native binaries for
7049// target, but is used to compile C code to llvm bitcode with correct
7050// type and alignment information.
7051//
7052// TCE uses the llvm bitcode as input and uses it for generating customized
7053// target processor and program binary. TCE co-design environment is
7054// publicly available in http://tce.cs.tut.fi
7055
7056static const unsigned TCEOpenCLAddrSpaceMap[] = {
7057 3, // opencl_global
7058 4, // opencl_local
7059 5, // opencl_constant
7060 // FIXME: generic has to be added to the target
7061 0, // opencl_generic
7062 0, // cuda_device
7063 0, // cuda_constant
7064 0 // cuda_shared
7065};
7066
7067class TCETargetInfo : public TargetInfo {
7068public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007069 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7070 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007071 TLSSupported = false;
7072 IntWidth = 32;
7073 LongWidth = LongLongWidth = 32;
7074 PointerWidth = 32;
7075 IntAlign = 32;
7076 LongAlign = LongLongAlign = 32;
7077 PointerAlign = 32;
7078 SuitableAlign = 32;
7079 SizeType = UnsignedInt;
7080 IntMaxType = SignedLong;
7081 IntPtrType = SignedInt;
7082 PtrDiffType = SignedInt;
7083 FloatWidth = 32;
7084 FloatAlign = 32;
7085 DoubleWidth = 32;
7086 DoubleAlign = 32;
7087 LongDoubleWidth = 32;
7088 LongDoubleAlign = 32;
7089 FloatFormat = &llvm::APFloat::IEEEsingle;
7090 DoubleFormat = &llvm::APFloat::IEEEsingle;
7091 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007092 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7093 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007094 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7095 UseAddrSpaceMapMangling = true;
7096 }
7097
7098 void getTargetDefines(const LangOptions &Opts,
7099 MacroBuilder &Builder) const override {
7100 DefineStd(Builder, "tce", Opts);
7101 Builder.defineMacro("__TCE__");
7102 Builder.defineMacro("__TCE_V1__");
7103 }
7104 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7105
Craig Topper6c03a542015-10-19 04:51:35 +00007106 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007107 const char *getClobbers() const override { return ""; }
7108 BuiltinVaListKind getBuiltinVaListKind() const override {
7109 return TargetInfo::VoidPtrBuiltinVaList;
7110 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007111 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007112 bool validateAsmConstraint(const char *&Name,
7113 TargetInfo::ConstraintInfo &info) const override {
7114 return true;
7115 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007116 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7117 return None;
7118 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007119};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007120
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007121class BPFTargetInfo : public TargetInfo {
7122public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007123 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7124 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007125 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7126 SizeType = UnsignedLong;
7127 PtrDiffType = SignedLong;
7128 IntPtrType = SignedLong;
7129 IntMaxType = SignedLong;
7130 Int64Type = SignedLong;
7131 RegParmMax = 5;
7132 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007133 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007134 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007135 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007136 }
7137 MaxAtomicPromoteWidth = 64;
7138 MaxAtomicInlineWidth = 64;
7139 TLSSupported = false;
7140 }
7141 void getTargetDefines(const LangOptions &Opts,
7142 MacroBuilder &Builder) const override {
7143 DefineStd(Builder, "bpf", Opts);
7144 Builder.defineMacro("__BPF__");
7145 }
7146 bool hasFeature(StringRef Feature) const override {
7147 return Feature == "bpf";
7148 }
7149
Craig Topper6c03a542015-10-19 04:51:35 +00007150 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007151 const char *getClobbers() const override {
7152 return "";
7153 }
7154 BuiltinVaListKind getBuiltinVaListKind() const override {
7155 return TargetInfo::VoidPtrBuiltinVaList;
7156 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007157 ArrayRef<const char *> getGCCRegNames() const override {
7158 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007159 }
7160 bool validateAsmConstraint(const char *&Name,
7161 TargetInfo::ConstraintInfo &info) const override {
7162 return true;
7163 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007164 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7165 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007166 }
7167};
7168
Daniel Sanders4672af62016-05-27 11:51:02 +00007169class MipsTargetInfo : public TargetInfo {
7170 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007171 StringRef Layout;
7172
7173 if (ABI == "o32")
7174 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7175 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007176 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007177 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007178 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007179 else
7180 llvm_unreachable("Invalid ABI");
7181
7182 if (BigEndian)
7183 resetDataLayout(("E-" + Layout).str());
7184 else
7185 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007186 }
7187
Akira Hatanaka9064e362013-10-29 18:30:33 +00007188
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007189 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007190 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007191 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007192 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007193 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007194 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007195 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007196 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007197 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007198 enum DspRevEnum {
7199 NoDSP, DSP1, DSP2
7200 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007201 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007202
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007203protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007204 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007205 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007206
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007207public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007208 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007209 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7210 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7211 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007212 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007213
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007214 setABI((getTriple().getArch() == llvm::Triple::mips ||
7215 getTriple().getArch() == llvm::Triple::mipsel)
7216 ? "o32"
7217 : "n64");
7218
7219 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007220 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007221
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007222 bool isNaN2008Default() const {
7223 return CPU == "mips32r6" || CPU == "mips64r6";
7224 }
7225
7226 bool isFP64Default() const {
7227 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7228 }
7229
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007230 bool isNan2008() const override {
7231 return IsNan2008;
7232 }
7233
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007234 bool processorSupportsGPR64() const {
7235 return llvm::StringSwitch<bool>(CPU)
7236 .Case("mips3", true)
7237 .Case("mips4", true)
7238 .Case("mips5", true)
7239 .Case("mips64", true)
7240 .Case("mips64r2", true)
7241 .Case("mips64r3", true)
7242 .Case("mips64r5", true)
7243 .Case("mips64r6", true)
7244 .Case("octeon", true)
7245 .Default(false);
7246 return false;
7247 }
7248
Alp Toker4925ba72014-06-07 23:30:42 +00007249 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007250 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007251 if (Name == "o32") {
7252 setO32ABITypes();
7253 ABI = Name;
7254 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007255 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007256
7257 if (Name == "n32") {
7258 setN32ABITypes();
7259 ABI = Name;
7260 return true;
7261 }
7262 if (Name == "n64") {
7263 setN64ABITypes();
7264 ABI = Name;
7265 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007266 }
7267 return false;
7268 }
7269
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007270 void setO32ABITypes() {
7271 Int64Type = SignedLongLong;
7272 IntMaxType = Int64Type;
7273 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7274 LongDoubleWidth = LongDoubleAlign = 64;
7275 LongWidth = LongAlign = 32;
7276 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7277 PointerWidth = PointerAlign = 32;
7278 PtrDiffType = SignedInt;
7279 SizeType = UnsignedInt;
7280 SuitableAlign = 64;
7281 }
7282
7283 void setN32N64ABITypes() {
7284 LongDoubleWidth = LongDoubleAlign = 128;
7285 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7286 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7287 LongDoubleWidth = LongDoubleAlign = 64;
7288 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7289 }
7290 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7291 SuitableAlign = 128;
7292 }
7293
Daniel Sanders4672af62016-05-27 11:51:02 +00007294 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007295 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007296 Int64Type = SignedLong;
7297 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007298 LongWidth = LongAlign = 64;
7299 PointerWidth = PointerAlign = 64;
7300 PtrDiffType = SignedLong;
7301 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007302 }
7303
7304 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007305 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007306 Int64Type = SignedLongLong;
7307 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007308 LongWidth = LongAlign = 32;
7309 PointerWidth = PointerAlign = 32;
7310 PtrDiffType = SignedInt;
7311 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007312 }
7313
Craig Topper3164f332014-03-11 03:39:26 +00007314 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007315 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007316 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007317 .Case("mips1", true)
7318 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007319 .Case("mips3", true)
7320 .Case("mips4", true)
7321 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007322 .Case("mips32", true)
7323 .Case("mips32r2", true)
7324 .Case("mips32r3", true)
7325 .Case("mips32r5", true)
7326 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007327 .Case("mips64", true)
7328 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007329 .Case("mips64r3", true)
7330 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007331 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007332 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007333 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007334 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007335 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007336 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007337 bool
7338 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7339 StringRef CPU,
7340 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007341 if (CPU.empty())
7342 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007343 if (CPU == "octeon")
7344 Features["mips64r2"] = Features["cnmips"] = true;
7345 else
7346 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007347 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007348 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007349
Craig Topper3164f332014-03-11 03:39:26 +00007350 void getTargetDefines(const LangOptions &Opts,
7351 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007352 if (BigEndian) {
7353 DefineStd(Builder, "MIPSEB", Opts);
7354 Builder.defineMacro("_MIPSEB");
7355 } else {
7356 DefineStd(Builder, "MIPSEL", Opts);
7357 Builder.defineMacro("_MIPSEL");
7358 }
7359
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007360 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007361 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007362 if (Opts.GNUMode)
7363 Builder.defineMacro("mips");
7364
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007365 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007366 Builder.defineMacro("__mips", "32");
7367 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7368 } else {
7369 Builder.defineMacro("__mips", "64");
7370 Builder.defineMacro("__mips64");
7371 Builder.defineMacro("__mips64__");
7372 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7373 }
7374
7375 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7376 .Cases("mips32", "mips64", "1")
7377 .Cases("mips32r2", "mips64r2", "2")
7378 .Cases("mips32r3", "mips64r3", "3")
7379 .Cases("mips32r5", "mips64r5", "5")
7380 .Cases("mips32r6", "mips64r6", "6")
7381 .Default("");
7382 if (!ISARev.empty())
7383 Builder.defineMacro("__mips_isa_rev", ISARev);
7384
7385 if (ABI == "o32") {
7386 Builder.defineMacro("__mips_o32");
7387 Builder.defineMacro("_ABIO32", "1");
7388 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007389 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007390 Builder.defineMacro("__mips_n32");
7391 Builder.defineMacro("_ABIN32", "2");
7392 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7393 } else if (ABI == "n64") {
7394 Builder.defineMacro("__mips_n64");
7395 Builder.defineMacro("_ABI64", "3");
7396 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7397 } else
7398 llvm_unreachable("Invalid ABI.");
7399
Simon Atanasyan683535b2012-08-29 19:14:58 +00007400 Builder.defineMacro("__REGISTER_PREFIX__", "");
7401
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007402 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007403 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007404 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007405 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007406 case SoftFloat:
7407 Builder.defineMacro("__mips_soft_float", Twine(1));
7408 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007409 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007410
Simon Atanasyan16071912013-04-14 14:07:30 +00007411 if (IsSingleFloat)
7412 Builder.defineMacro("__mips_single_float", Twine(1));
7413
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007414 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7415 Builder.defineMacro("_MIPS_FPSET",
7416 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7417
Simon Atanasyan72244b62012-07-05 16:06:06 +00007418 if (IsMips16)
7419 Builder.defineMacro("__mips16", Twine(1));
7420
Simon Atanasyan60777612013-04-14 14:07:51 +00007421 if (IsMicromips)
7422 Builder.defineMacro("__mips_micromips", Twine(1));
7423
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007424 if (IsNan2008)
7425 Builder.defineMacro("__mips_nan2008", Twine(1));
7426
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007427 switch (DspRev) {
7428 default:
7429 break;
7430 case DSP1:
7431 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7432 Builder.defineMacro("__mips_dsp", Twine(1));
7433 break;
7434 case DSP2:
7435 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7436 Builder.defineMacro("__mips_dspr2", Twine(1));
7437 Builder.defineMacro("__mips_dsp", Twine(1));
7438 break;
7439 }
7440
Jack Carter44ff1e52013-08-12 17:20:29 +00007441 if (HasMSA)
7442 Builder.defineMacro("__mips_msa", Twine(1));
7443
Simon Atanasyan26f19672012-04-05 19:28:31 +00007444 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7445 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7446 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007447
7448 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7449 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007450
7451 // These shouldn't be defined for MIPS-I but there's no need to check
7452 // for that since MIPS-I isn't supported.
7453 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7454 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7455 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007456
7457 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7458 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7459 // the instructions exist but using them violates the ABI since they
7460 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7461 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007462 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007463 }
7464
Craig Topper6c03a542015-10-19 04:51:35 +00007465 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7466 return llvm::makeArrayRef(BuiltinInfo,
7467 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007468 }
Craig Topper3164f332014-03-11 03:39:26 +00007469 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007470 return llvm::StringSwitch<bool>(Feature)
7471 .Case("mips", true)
7472 .Case("fp64", HasFP64)
7473 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007474 }
Craig Topper3164f332014-03-11 03:39:26 +00007475 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007476 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007477 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007478 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007479 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007480 // CPU register names
7481 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007482 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7483 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7484 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007485 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7486 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007487 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7488 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7489 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7490 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007491 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007492 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007493 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7494 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007495 // MSA register names
7496 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7497 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7498 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7499 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7500 // MSA control register names
7501 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7502 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007503 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007504 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007505 }
Craig Topper3164f332014-03-11 03:39:26 +00007506 bool validateAsmConstraint(const char *&Name,
7507 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007508 switch (*Name) {
7509 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007510 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007511 case 'r': // CPU registers.
7512 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007513 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007514 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007515 case 'c': // $25 for indirect jumps
7516 case 'l': // lo register
7517 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007518 Info.setAllowsRegister();
7519 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007520 case 'I': // Signed 16-bit constant
7521 case 'J': // Integer 0
7522 case 'K': // Unsigned 16-bit constant
7523 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7524 case 'M': // Constants not loadable via lui, addiu, or ori
7525 case 'N': // Constant -1 to -65535
7526 case 'O': // A signed 15-bit constant
7527 case 'P': // A constant between 1 go 65535
7528 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007529 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007530 Info.setAllowsMemory();
7531 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007532 case 'Z':
7533 if (Name[1] == 'C') { // An address usable by ll, and sc.
7534 Info.setAllowsMemory();
7535 Name++; // Skip over 'Z'.
7536 return true;
7537 }
7538 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007539 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007540 }
7541
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007542 std::string convertConstraint(const char *&Constraint) const override {
7543 std::string R;
7544 switch (*Constraint) {
7545 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7546 if (Constraint[1] == 'C') {
7547 R = std::string("^") + std::string(Constraint, 2);
7548 Constraint++;
7549 return R;
7550 }
7551 break;
7552 }
7553 return TargetInfo::convertConstraint(Constraint);
7554 }
7555
Craig Topper3164f332014-03-11 03:39:26 +00007556 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007557 // In GCC, $1 is not widely used in generated code (it's used only in a few
7558 // specific situations), so there is no real need for users to add it to
7559 // the clobbers list if they want to use it in their inline assembly code.
7560 //
7561 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7562 // code generation, so using it in inline assembly without adding it to the
7563 // clobbers list can cause conflicts between the inline assembly code and
7564 // the surrounding generated code.
7565 //
7566 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7567 // operands, which will conflict with the ".set at" assembler option (which
7568 // we use only for inline assembly, in order to maintain compatibility with
7569 // GCC) and will also conflict with the user's usage of $1.
7570 //
7571 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7572 // register for generated code is to automatically clobber $1 for all inline
7573 // assembly code.
7574 //
7575 // FIXME: We should automatically clobber $1 only for inline assembly code
7576 // which actually uses it. This would allow LLVM to use $1 for inline
7577 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007578 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007579 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007580
Craig Topper3164f332014-03-11 03:39:26 +00007581 bool handleTargetFeatures(std::vector<std::string> &Features,
7582 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007583 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007584 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007585 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007586 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007587 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007588 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007589 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007590
Eric Christopher610fe112015-08-26 08:21:55 +00007591 for (const auto &Feature : Features) {
7592 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007593 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007594 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007595 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007596 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007597 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007598 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007599 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007600 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007601 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007602 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007603 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007604 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007605 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007606 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007607 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007608 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007609 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007610 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007611 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007612 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007613 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007614 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007615
James Y Knightb214cbc2016-03-04 19:00:41 +00007616 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007617
Rafael Espindolaeb265472013-08-21 21:59:03 +00007618 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007619 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007620
Craig Topper3164f332014-03-11 03:39:26 +00007621 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007622 if (RegNo == 0) return 4;
7623 if (RegNo == 1) return 5;
7624 return -1;
7625 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007626
7627 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007628
7629 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7630 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7631 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7632 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7633 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7634 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7635 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7636 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7637 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7638 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7639 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7640 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7641 {{"ra"}, "$31"}};
7642 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7643 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7644 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7645 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7646 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7647 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7648 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7649 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7650 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7651 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7652 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7653 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007654 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007655 return llvm::makeArrayRef(O32RegAliases);
7656 return llvm::makeArrayRef(NewABIRegAliases);
7657 }
7658
7659 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007660 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007661 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007662
7663 bool validateTarget(DiagnosticsEngine &Diags) const override {
7664 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7665 // this yet. It's better to fail here than on the backend assertion.
7666 if (processorSupportsGPR64() && ABI == "o32") {
7667 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7668 return false;
7669 }
7670
7671 // 64-bit ABI's require 64-bit CPU's.
7672 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7673 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7674 return false;
7675 }
7676
7677 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7678 // can't handle this yet. It's better to fail here than on the
7679 // backend assertion.
7680 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7681 getTriple().getArch() == llvm::Triple::mips64el) &&
7682 ABI == "o32") {
7683 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7684 << ABI << getTriple().str();
7685 return false;
7686 }
7687
7688 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7689 // can't handle this yet. It's better to fail here than on the
7690 // backend assertion.
7691 if ((getTriple().getArch() == llvm::Triple::mips ||
7692 getTriple().getArch() == llvm::Triple::mipsel) &&
7693 (ABI == "n32" || ABI == "n64")) {
7694 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7695 << ABI << getTriple().str();
7696 return false;
7697 }
7698
7699 return true;
7700 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007701};
7702
Daniel Sanders4672af62016-05-27 11:51:02 +00007703const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007704#define BUILTIN(ID, TYPE, ATTRS) \
7705 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7706#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7707 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007708#include "clang/Basic/BuiltinsMips.def"
7709};
7710
Ivan Krasindd7403e2011-08-24 20:22:22 +00007711class PNaClTargetInfo : public TargetInfo {
7712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007713 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7714 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007715 this->LongAlign = 32;
7716 this->LongWidth = 32;
7717 this->PointerAlign = 32;
7718 this->PointerWidth = 32;
7719 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007720 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007721 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007722 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007723 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007724 this->SizeType = TargetInfo::UnsignedInt;
7725 this->PtrDiffType = TargetInfo::SignedInt;
7726 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007727 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007728 }
7729
Craig Toppere6f17d02014-03-11 04:07:52 +00007730 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007731 Builder.defineMacro("__le32__");
7732 Builder.defineMacro("__pnacl__");
7733 }
Craig Topper3164f332014-03-11 03:39:26 +00007734 void getTargetDefines(const LangOptions &Opts,
7735 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007736 getArchDefines(Opts, Builder);
7737 }
Craig Topper3164f332014-03-11 03:39:26 +00007738 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007739 return Feature == "pnacl";
7740 }
Craig Topper6c03a542015-10-19 04:51:35 +00007741 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007742 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007743 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007744 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007745 ArrayRef<const char *> getGCCRegNames() const override;
7746 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007747 bool validateAsmConstraint(const char *&Name,
7748 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007749 return false;
7750 }
7751
Craig Topper3164f332014-03-11 03:39:26 +00007752 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007753 return "";
7754 }
7755};
7756
Craig Topperf054e3a2015-10-19 03:52:27 +00007757ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7758 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007759}
7760
Craig Topperf054e3a2015-10-19 03:52:27 +00007761ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7762 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007763}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007764
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007765// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007766class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007767public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007768 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7769 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007770
7771 BuiltinVaListKind getBuiltinVaListKind() const override {
7772 return TargetInfo::PNaClABIBuiltinVaList;
7773 }
7774};
7775
JF Bastien643817d2014-09-12 17:52:47 +00007776class Le64TargetInfo : public TargetInfo {
7777 static const Builtin::Info BuiltinInfo[];
7778
7779public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007780 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7781 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007782 NoAsmVariants = true;
7783 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7784 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007785 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007786 }
7787
7788 void getTargetDefines(const LangOptions &Opts,
7789 MacroBuilder &Builder) const override {
7790 DefineStd(Builder, "unix", Opts);
7791 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7792 Builder.defineMacro("__ELF__");
7793 }
Craig Topper6c03a542015-10-19 04:51:35 +00007794 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7795 return llvm::makeArrayRef(BuiltinInfo,
7796 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007797 }
7798 BuiltinVaListKind getBuiltinVaListKind() const override {
7799 return TargetInfo::PNaClABIBuiltinVaList;
7800 }
7801 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007802 ArrayRef<const char *> getGCCRegNames() const override {
7803 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007804 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007805 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7806 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007807 }
7808 bool validateAsmConstraint(const char *&Name,
7809 TargetInfo::ConstraintInfo &Info) const override {
7810 return false;
7811 }
7812
7813 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007814};
Dan Gohmanc2853072015-09-03 22:51:53 +00007815
7816class WebAssemblyTargetInfo : public TargetInfo {
7817 static const Builtin::Info BuiltinInfo[];
7818
7819 enum SIMDEnum {
7820 NoSIMD,
7821 SIMD128,
7822 } SIMDLevel;
7823
7824public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007825 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007826 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007827 NoAsmVariants = true;
7828 SuitableAlign = 128;
7829 LargeArrayMinWidth = 128;
7830 LargeArrayAlign = 128;
7831 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007832 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007833 LongDoubleWidth = LongDoubleAlign = 128;
7834 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007835 SizeType = UnsignedInt;
7836 PtrDiffType = SignedInt;
7837 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007838 }
7839
7840protected:
7841 void getTargetDefines(const LangOptions &Opts,
7842 MacroBuilder &Builder) const override {
7843 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7844 if (SIMDLevel >= SIMD128)
7845 Builder.defineMacro("__wasm_simd128__");
7846 }
7847
7848private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007849 bool
7850 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7851 StringRef CPU,
7852 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007853 if (CPU == "bleeding-edge")
7854 Features["simd128"] = true;
7855 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7856 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007857 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007858 return llvm::StringSwitch<bool>(Feature)
7859 .Case("simd128", SIMDLevel >= SIMD128)
7860 .Default(false);
7861 }
7862 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007863 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007864 for (const auto &Feature : Features) {
7865 if (Feature == "+simd128") {
7866 SIMDLevel = std::max(SIMDLevel, SIMD128);
7867 continue;
7868 }
7869 if (Feature == "-simd128") {
7870 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7871 continue;
7872 }
7873
7874 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7875 << "-target-feature";
7876 return false;
7877 }
7878 return true;
7879 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007880 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007881 return llvm::StringSwitch<bool>(Name)
7882 .Case("mvp", true)
7883 .Case("bleeding-edge", true)
7884 .Case("generic", true)
7885 .Default(false);
7886 }
Craig Topper6c03a542015-10-19 04:51:35 +00007887 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7888 return llvm::makeArrayRef(BuiltinInfo,
7889 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007890 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007891 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007892 return VoidPtrBuiltinVaList;
7893 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007894 ArrayRef<const char *> getGCCRegNames() const final {
7895 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007896 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007897 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7898 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007899 }
7900 bool
7901 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007902 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007903 return false;
7904 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007905 const char *getClobbers() const final { return ""; }
7906 bool isCLZForZeroUndef() const final { return false; }
7907 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007908 IntType getIntTypeByWidth(unsigned BitWidth,
7909 bool IsSigned) const final {
7910 // WebAssembly prefers long long for explicitly 64-bit integers.
7911 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7912 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7913 }
7914 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7915 bool IsSigned) const final {
7916 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7917 return BitWidth == 64
7918 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7919 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7920 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007921};
7922
7923const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7924#define BUILTIN(ID, TYPE, ATTRS) \
7925 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7926#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7927 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7928#include "clang/Basic/BuiltinsWebAssembly.def"
7929};
7930
7931class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7932public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007933 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7934 const TargetOptions &Opts)
7935 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007936 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007937 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007938 }
7939
7940protected:
7941 void getTargetDefines(const LangOptions &Opts,
7942 MacroBuilder &Builder) const override {
7943 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7944 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7945 }
7946};
7947
7948class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7949public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007950 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7951 const TargetOptions &Opts)
7952 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007953 LongAlign = LongWidth = 64;
7954 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007955 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007956 SizeType = UnsignedLong;
7957 PtrDiffType = SignedLong;
7958 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007959 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007960 }
7961
7962protected:
7963 void getTargetDefines(const LangOptions &Opts,
7964 MacroBuilder &Builder) const override {
7965 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7966 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7967 }
7968};
7969
JF Bastien643817d2014-09-12 17:52:47 +00007970const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7971#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007972 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007973#include "clang/Basic/BuiltinsLe64.def"
7974};
7975
Eric Christopherc48497a2015-09-18 21:26:24 +00007976static const unsigned SPIRAddrSpaceMap[] = {
7977 1, // opencl_global
7978 3, // opencl_local
7979 2, // opencl_constant
7980 4, // opencl_generic
7981 0, // cuda_device
7982 0, // cuda_constant
7983 0 // cuda_shared
7984};
7985class SPIRTargetInfo : public TargetInfo {
7986public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007987 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7988 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007989 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7990 "SPIR target must use unknown OS");
7991 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7992 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00007993 TLSSupported = false;
7994 LongWidth = LongAlign = 64;
7995 AddrSpaceMap = &SPIRAddrSpaceMap;
7996 UseAddrSpaceMapMangling = true;
7997 // Define available target features
7998 // These must be defined in sorted order!
7999 NoAsmVariants = true;
8000 }
8001 void getTargetDefines(const LangOptions &Opts,
8002 MacroBuilder &Builder) const override {
8003 DefineStd(Builder, "SPIR", Opts);
8004 }
8005 bool hasFeature(StringRef Feature) const override {
8006 return Feature == "spir";
8007 }
Craig Topper3164f332014-03-11 03:39:26 +00008008
Craig Topper6c03a542015-10-19 04:51:35 +00008009 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008010 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008011 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008012 bool validateAsmConstraint(const char *&Name,
8013 TargetInfo::ConstraintInfo &info) const override {
8014 return true;
8015 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008016 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8017 return None;
8018 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008019 BuiltinVaListKind getBuiltinVaListKind() const override {
8020 return TargetInfo::VoidPtrBuiltinVaList;
8021 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008022
Eric Christopherc48497a2015-09-18 21:26:24 +00008023 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008024 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8025 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008026 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008027
Eric Christopherc48497a2015-09-18 21:26:24 +00008028 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8029 return CC_SpirFunction;
8030 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008031
8032 void setSupportedOpenCLOpts() override {
8033 // Assume all OpenCL extensions and optional core features are supported
8034 // for SPIR since it is a generic target.
8035 getSupportedOpenCLOpts().setAll();
8036 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008037};
Guy Benyeib798fc92012-12-11 21:38:14 +00008038
Eric Christopherc48497a2015-09-18 21:26:24 +00008039class SPIR32TargetInfo : public SPIRTargetInfo {
8040public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008041 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8042 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008043 PointerWidth = PointerAlign = 32;
8044 SizeType = TargetInfo::UnsignedInt;
8045 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008046 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8047 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008048 }
8049 void getTargetDefines(const LangOptions &Opts,
8050 MacroBuilder &Builder) const override {
8051 DefineStd(Builder, "SPIR32", Opts);
8052 }
8053};
Guy Benyeib798fc92012-12-11 21:38:14 +00008054
Eric Christopherc48497a2015-09-18 21:26:24 +00008055class SPIR64TargetInfo : public SPIRTargetInfo {
8056public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008057 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8058 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008059 PointerWidth = PointerAlign = 64;
8060 SizeType = TargetInfo::UnsignedLong;
8061 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008062 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8063 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008064 }
8065 void getTargetDefines(const LangOptions &Opts,
8066 MacroBuilder &Builder) const override {
8067 DefineStd(Builder, "SPIR64", Opts);
8068 }
8069};
Guy Benyeib798fc92012-12-11 21:38:14 +00008070
Robert Lytton0e076492013-08-13 09:43:10 +00008071class XCoreTargetInfo : public TargetInfo {
8072 static const Builtin::Info BuiltinInfo[];
8073public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008074 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8075 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008076 NoAsmVariants = true;
8077 LongLongAlign = 32;
8078 SuitableAlign = 32;
8079 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008080 SizeType = UnsignedInt;
8081 PtrDiffType = SignedInt;
8082 IntPtrType = SignedInt;
8083 WCharType = UnsignedChar;
8084 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008085 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008086 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8087 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008088 }
Craig Topper3164f332014-03-11 03:39:26 +00008089 void getTargetDefines(const LangOptions &Opts,
8090 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008091 Builder.defineMacro("__XS1B__");
8092 }
Craig Topper6c03a542015-10-19 04:51:35 +00008093 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8094 return llvm::makeArrayRef(BuiltinInfo,
8095 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008096 }
Craig Topper3164f332014-03-11 03:39:26 +00008097 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008098 return TargetInfo::VoidPtrBuiltinVaList;
8099 }
Craig Topper3164f332014-03-11 03:39:26 +00008100 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008101 return "";
8102 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008103 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008104 static const char * const GCCRegNames[] = {
8105 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8106 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8107 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008108 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008109 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008110 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8111 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008112 }
Craig Topper3164f332014-03-11 03:39:26 +00008113 bool validateAsmConstraint(const char *&Name,
8114 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008115 return false;
8116 }
Craig Topper3164f332014-03-11 03:39:26 +00008117 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008118 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8119 return (RegNo < 2)? RegNo : -1;
8120 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008121 bool allowsLargerPreferedTypeAlignment() const override {
8122 return false;
8123 }
Robert Lytton0e076492013-08-13 09:43:10 +00008124};
8125
8126const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008127#define BUILTIN(ID, TYPE, ATTRS) \
8128 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8129#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8130 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008131#include "clang/Basic/BuiltinsXCore.def"
8132};
Robert Lytton0e076492013-08-13 09:43:10 +00008133
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008134// x86_32 Android target
8135class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8136public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008137 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8138 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008139 SuitableAlign = 32;
8140 LongDoubleWidth = 64;
8141 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8142 }
8143};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008144
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008145// x86_64 Android target
8146class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8147public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008148 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8149 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008150 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8151 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008152
8153 bool useFloat128ManglingForLongDouble() const override {
8154 return true;
8155 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008156};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008157
8158// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8159class RenderScript32TargetInfo : public ARMleTargetInfo {
8160public:
8161 RenderScript32TargetInfo(const llvm::Triple &Triple,
8162 const TargetOptions &Opts)
8163 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8164 Triple.getOSName(),
8165 Triple.getEnvironmentName()),
8166 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008167 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008168 LongWidth = LongAlign = 64;
8169 }
8170 void getTargetDefines(const LangOptions &Opts,
8171 MacroBuilder &Builder) const override {
8172 Builder.defineMacro("__RENDERSCRIPT__");
8173 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8174 }
8175};
8176
8177// 64-bit RenderScript is aarch64
8178class RenderScript64TargetInfo : public AArch64leTargetInfo {
8179public:
8180 RenderScript64TargetInfo(const llvm::Triple &Triple,
8181 const TargetOptions &Opts)
8182 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8183 Triple.getOSName(),
8184 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008185 Opts) {
8186 IsRenderScriptTarget = true;
8187 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008188
8189 void getTargetDefines(const LangOptions &Opts,
8190 MacroBuilder &Builder) const override {
8191 Builder.defineMacro("__RENDERSCRIPT__");
8192 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8193 }
8194};
8195
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008196} // end anonymous namespace
8197
Chris Lattner5ba61f02006-10-14 07:39:34 +00008198//===----------------------------------------------------------------------===//
8199// Driver code
8200//===----------------------------------------------------------------------===//
8201
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008202static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8203 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008204 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008205
Daniel Dunbar52322032009-08-18 05:47:58 +00008206 switch (Triple.getArch()) {
8207 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008208 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008209
Tim Northover2a0783d2014-05-30 14:14:07 +00008210 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008211 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008212
8213 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008214 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008215
Jacques Pienaard964cc22016-03-28 21:02:54 +00008216 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008218
Tim Northover2a0783d2014-05-30 14:14:07 +00008219 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008220 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008222
8223 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008224 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008226 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008228 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008230 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008232 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008233 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008234 }
8235
Christian Pirker9b019ae2014-02-25 13:51:00 +00008236 case llvm::Triple::aarch64_be:
8237 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008238 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008240 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008242 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008244 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008246 }
8247
Daniel Dunbar52322032009-08-18 05:47:58 +00008248 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008249 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008250 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008252
Daniel Dunbar52322032009-08-18 05:47:58 +00008253 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008254 case llvm::Triple::CloudABI:
8255 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008256 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008258 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008260 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008262 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008264 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008266 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008268 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008270 case llvm::Triple::Win32:
8271 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008272 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008274 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008276 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008278 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008279 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008281 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008282 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008284 }
8285
8286 case llvm::Triple::armeb:
8287 case llvm::Triple::thumbeb:
8288 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008290
8291 switch (os) {
8292 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008294 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008296 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008298 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008300 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008302 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008304 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008306 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008308 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008309
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008310 case llvm::Triple::bpfeb:
8311 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008312 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008313
Daniel Dunbar52322032009-08-18 05:47:58 +00008314 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008316
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008317 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008318 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008319 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008320 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008321 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008322 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008323 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008324 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008325 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008326 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008327 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008328 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008329 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008330
8331 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008332 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008333 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008334 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008335 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008336 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008337 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008338 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008339 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008340 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008341 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008342 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008343 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008344 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008345 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008346
Akira Hatanakabef17452011-09-20 19:21:49 +00008347 case llvm::Triple::mips64:
8348 switch (os) {
8349 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008350 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008351 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008352 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008353 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008354 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008355 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008356 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008357 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008358 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008359 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008360 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008361 }
8362
8363 case llvm::Triple::mips64el:
8364 switch (os) {
8365 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008366 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008367 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008369 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008371 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008372 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008373 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008374 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008375 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008376 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008377 }
8378
Ivan Krasindd7403e2011-08-24 20:22:22 +00008379 case llvm::Triple::le32:
8380 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008381 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008383 default:
8384 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008385 }
8386
JF Bastien643817d2014-09-12 17:52:47 +00008387 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008389
Daniel Dunbar52322032009-08-18 05:47:58 +00008390 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008391 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008393 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008394 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008396 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008398 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008400 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008402 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008404 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008406 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008407
8408 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008409 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008410 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008411 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008412 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008414 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008416 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008418 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008420 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008422 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008423
Bill Schmidt778d3872013-07-26 01:36:11 +00008424 case llvm::Triple::ppc64le:
8425 switch (os) {
8426 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008428 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008430 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008432 }
8433
Peter Collingbournec947aae2012-05-20 23:28:41 +00008434 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008436 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008438
Tom Stellardd8e38a32015-01-06 20:34:47 +00008439 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008440 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008442
Daniel Dunbar52322032009-08-18 05:47:58 +00008443 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008444 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008445 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008447 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008449 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008451 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008453 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008455 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008457 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008458
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008459 // The 'sparcel' architecture copies all the above cases except for Solaris.
8460 case llvm::Triple::sparcel:
8461 switch (os) {
8462 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008464 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008466 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008468 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008470 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008472 }
8473
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008474 case llvm::Triple::sparcv9:
8475 switch (os) {
8476 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008478 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008480 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008482 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008484 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008486 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008488 }
8489
Ulrich Weigand47445072013-05-06 16:26:41 +00008490 case llvm::Triple::systemz:
8491 switch (os) {
8492 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008494 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008495 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008496 }
8497
Eli Friedmana9c3d712009-08-19 20:47:07 +00008498 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008499 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008500
Daniel Dunbar52322032009-08-18 05:47:58 +00008501 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008502 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008504
Daniel Dunbar52322032009-08-18 05:47:58 +00008505 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008506 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008508 case llvm::Triple::Linux: {
8509 switch (Triple.getEnvironment()) {
8510 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008511 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008512 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008514 }
8515 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008516 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008518 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008520 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008522 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008524 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008526 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008528 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008530 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008532 case llvm::Triple::Win32: {
8533 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008534 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008536 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008538 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008539 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008540 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008542 }
8543 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008544 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008546 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008548 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008550 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008552 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008554 }
8555
8556 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008557 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008559
Daniel Dunbar52322032009-08-18 05:47:58 +00008560 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008561 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008563 case llvm::Triple::Linux: {
8564 switch (Triple.getEnvironment()) {
8565 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008567 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008569 }
8570 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008571 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008573 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008575 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008577 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008579 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008581 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008583 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008585 case llvm::Triple::Win32: {
8586 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008587 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008588 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008589 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008590 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008591 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008592 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008594 }
8595 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008596 case llvm::Triple::Haiku:
8597 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008598 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008599 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008600 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008602 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008603 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008604 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008605
Douglas Katzman78d7c542015-05-12 21:18:10 +00008606 case llvm::Triple::spir: {
8607 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8608 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8609 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008611 }
8612 case llvm::Triple::spir64: {
8613 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8614 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8615 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008616 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008617 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008618 case llvm::Triple::wasm32:
8619 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8620 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008621 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008622 case llvm::Triple::wasm64:
8623 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8624 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008625 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008626
8627 case llvm::Triple::renderscript32:
8628 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8629 case llvm::Triple::renderscript64:
8630 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008631 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008632}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008633
8634/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008635/// options.
Alp Toker80758082014-07-06 05:26:44 +00008636TargetInfo *
8637TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008638 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008639 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008640
8641 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008642 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008643 if (!Target) {
8644 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008645 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008646 }
Alp Toker80758082014-07-06 05:26:44 +00008647 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008648
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008649 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008650 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8651 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008652 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008653 }
8654
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008655 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008656 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8657 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008658 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008659 }
8660
Rafael Espindolaeb265472013-08-21 21:59:03 +00008661 // Set the fp math unit.
8662 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8663 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008664 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008665 }
8666
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008667 // Compute the default target features, we need the target to handle this
8668 // because features may have dependencies on one another.
8669 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008670 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8671 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008672 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008673
8674 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008675 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008676 for (const auto &F : Features)
8677 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8678
Eric Christopher3ff21b32013-10-16 21:26:26 +00008679 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008680 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008681
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008682 Target->setSupportedOpenCLOpts();
8683
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008684 if (!Target->validateTarget(Diags))
8685 return nullptr;
8686
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008687 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008688}