blob: 36e6d4594fa0e4ff465458a719e70666e2ad6c59 [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) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000882 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001161 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001162 // TODO: Finish this list and add an assert that we've handled them
1163 // all.
1164 }
Eric Christopher02c33352015-08-25 00:59:11 +00001165
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001166 return true;
1167}
1168
Chris Lattnerecd49032009-03-02 22:27:17 +00001169/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1170/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001171void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001172 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001173 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001175 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001177 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001179 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001181 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001183 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001184 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001185
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001187 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1188 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 } else {
1190 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1191 getTriple().getOS() != llvm::Triple::OpenBSD)
1192 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001193 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194
Ulrich Weigand8afad612014-07-28 13:17:52 +00001195 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001196 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 Builder.defineMacro("_CALL_ELF", "1");
1198 if (ABI == "elfv2")
1199 Builder.defineMacro("_CALL_ELF", "2");
1200
Chris Lattnerecd49032009-03-02 22:27:17 +00001201 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1203 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001204
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001206 if (LongDoubleWidth == 128)
1207 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001208
John Thompsone467e192009-11-19 17:18:50 +00001209 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__VEC__", "10206");
1211 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001212 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001213
1214 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1216 .Case("440", ArchDefineName)
1217 .Case("450", ArchDefineName | ArchDefine440)
1218 .Case("601", ArchDefineName)
1219 .Case("602", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603", ArchDefineName | ArchDefinePpcgr)
1221 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1223 .Case("604", ArchDefineName | ArchDefinePpcgr)
1224 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1225 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001226 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001227 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1228 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1229 .Case("750", ArchDefineName | ArchDefinePpcgr)
1230 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001232 .Case("a2", ArchDefineA2)
1233 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001234 .Case("pwr3", ArchDefinePpcgr)
1235 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1237 | ArchDefinePpcsq)
1238 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1239 | ArchDefinePpcgr | ArchDefinePpcsq)
1240 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1241 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1243 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1244 | ArchDefinePpcsq)
1245 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1246 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001247 | ArchDefinePpcgr | ArchDefinePpcsq)
1248 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1249 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1250 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001251 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1252 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1253 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1254 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power3", ArchDefinePpcgr)
1256 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1257 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1258 | ArchDefinePpcsq)
1259 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1260 | ArchDefinePpcgr | ArchDefinePpcsq)
1261 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1262 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1264 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1265 | ArchDefinePpcsq)
1266 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1267 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001268 | ArchDefinePpcgr | ArchDefinePpcsq)
1269 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1270 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1271 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001272 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1273 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1274 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1275 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001276 .Default(ArchDefineNone);
1277
1278 if (defs & ArchDefineName)
1279 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1280 if (defs & ArchDefinePpcgr)
1281 Builder.defineMacro("_ARCH_PPCGR");
1282 if (defs & ArchDefinePpcsq)
1283 Builder.defineMacro("_ARCH_PPCSQ");
1284 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001285 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001286 if (defs & ArchDefine603)
1287 Builder.defineMacro("_ARCH_603");
1288 if (defs & ArchDefine604)
1289 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001290 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001291 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5x)
1295 Builder.defineMacro("_ARCH_PWR5X");
1296 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001297 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001298 if (defs & ArchDefinePwr6x)
1299 Builder.defineMacro("_ARCH_PWR6X");
1300 if (defs & ArchDefinePwr7)
1301 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001302 if (defs & ArchDefinePwr8)
1303 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001304 if (defs & ArchDefinePwr9)
1305 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001306 if (defs & ArchDefineA2)
1307 Builder.defineMacro("_ARCH_A2");
1308 if (defs & ArchDefineA2q) {
1309 Builder.defineMacro("_ARCH_A2Q");
1310 Builder.defineMacro("_ARCH_QP");
1311 }
1312
1313 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1314 Builder.defineMacro("__bg__");
1315 Builder.defineMacro("__THW_BLUEGENE__");
1316 Builder.defineMacro("__bgq__");
1317 Builder.defineMacro("__TOS_BGQ__");
1318 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001319
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001320 if (HasVSX)
1321 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001322 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001323 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001324 if (HasP8Crypto)
1325 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001326 if (HasHTM)
1327 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001328 if (HasFloat128)
1329 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001330
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1334 if (PointerWidth == 64)
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001336
Bill Schmidt38378a02013-02-01 20:23:10 +00001337 // FIXME: The following are not yet generated here by Clang, but are
1338 // generated by GCC:
1339 //
1340 // _SOFT_FLOAT_
1341 // __RECIP_PRECISION__
1342 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001343 // __RECIP__
1344 // __RECIPF__
1345 // __RSQRTE__
1346 // __RSQRTEF__
1347 // _SOFT_DOUBLE_
1348 // __NO_LWSYNC__
1349 // __HAVE_BSWAP__
1350 // __LONGDOUBLE128
1351 // __CMODEL_MEDIUM__
1352 // __CMODEL_LARGE__
1353 // _CALL_SYSV
1354 // _CALL_DARWIN
1355 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001356}
1357
Eric Christophera8a14c32015-08-31 18:39:16 +00001358// Handle explicit options being passed to the compiler here: if we've
1359// explicitly turned off vsx and turned on power8-vector or direct-move then
1360// go ahead and error since the customer has expressed a somewhat incompatible
1361// set of options.
1362static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001363 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001364
1365 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1366 FeaturesVec.end()) {
1367 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1368 FeaturesVec.end()) {
1369 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1370 << "-mno-vsx";
1371 return false;
1372 }
1373
1374 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1375 FeaturesVec.end()) {
1376 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1377 << "-mno-vsx";
1378 return false;
1379 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001380
1381 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1382 FeaturesVec.end()) {
1383 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1384 << "-mno-vsx";
1385 return false;
1386 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001387 }
1388
1389 return true;
1390}
1391
Eric Christopher8c47b422015-10-09 18:39:55 +00001392bool PPCTargetInfo::initFeatureMap(
1393 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1394 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001395 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1396 .Case("7400", true)
1397 .Case("g4", true)
1398 .Case("7450", true)
1399 .Case("g4+", true)
1400 .Case("970", true)
1401 .Case("g5", true)
1402 .Case("pwr6", true)
1403 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001404 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001405 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001406 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001407 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001408 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001409
1410 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001411 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001414 .Case("pwr8", true)
1415 .Default(false);
1416 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1417 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001418 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001419 .Case("pwr8", true)
1420 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001421 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1422 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001423 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001424 .Case("pwr8", true)
1425 .Case("pwr7", true)
1426 .Default(false);
1427 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001430 .Case("pwr8", true)
1431 .Case("pwr7", true)
1432 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001433 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1434 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001435 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001436 .Case("pwr8", true)
1437 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001438 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1439 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001440 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001441 .Case("pwr8", true)
1442 .Case("pwr7", true)
1443 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001444
Eric Christophera8a14c32015-08-31 18:39:16 +00001445 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1446 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001447
Eric Christopher007b0a02015-08-28 22:32:01 +00001448 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001449}
1450
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001451bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001452 return llvm::StringSwitch<bool>(Feature)
1453 .Case("powerpc", true)
1454 .Case("vsx", HasVSX)
1455 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001456 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001457 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001458 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001459 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001460 .Case("bpermd", HasBPERMD)
1461 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001462 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001463 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001464}
Chris Lattner17df24e2008-04-21 18:56:49 +00001465
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001466void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1467 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001468 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1469 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1470 // incompatible options.
1471 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001472 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001473 Features[Name] = Features["vsx"] = true;
1474 } else if (Name == "power8-vector") {
1475 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001476 } else if (Name == "float128") {
1477 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001478 } else {
1479 Features[Name] = true;
1480 }
1481 } else {
1482 if (Name == "vsx") {
1483 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001484 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 } else {
1486 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001487 }
1488 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001489}
1490
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001491const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1494 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1495 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1496 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1497 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1498 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1499 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001500 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001501 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001502 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001503 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1504 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1505 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1506 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507 "vrsave", "vscr",
1508 "spe_acc", "spefscr",
1509 "sfp"
1510};
Chris Lattner10a5b382007-01-29 05:24:35 +00001511
Craig Topperf054e3a2015-10-19 03:52:27 +00001512ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1513 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001514}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001515
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001516const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1517 // While some of these aliases do map to different registers
1518 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001519 { { "0" }, "r0" },
1520 { { "1"}, "r1" },
1521 { { "2" }, "r2" },
1522 { { "3" }, "r3" },
1523 { { "4" }, "r4" },
1524 { { "5" }, "r5" },
1525 { { "6" }, "r6" },
1526 { { "7" }, "r7" },
1527 { { "8" }, "r8" },
1528 { { "9" }, "r9" },
1529 { { "10" }, "r10" },
1530 { { "11" }, "r11" },
1531 { { "12" }, "r12" },
1532 { { "13" }, "r13" },
1533 { { "14" }, "r14" },
1534 { { "15" }, "r15" },
1535 { { "16" }, "r16" },
1536 { { "17" }, "r17" },
1537 { { "18" }, "r18" },
1538 { { "19" }, "r19" },
1539 { { "20" }, "r20" },
1540 { { "21" }, "r21" },
1541 { { "22" }, "r22" },
1542 { { "23" }, "r23" },
1543 { { "24" }, "r24" },
1544 { { "25" }, "r25" },
1545 { { "26" }, "r26" },
1546 { { "27" }, "r27" },
1547 { { "28" }, "r28" },
1548 { { "29" }, "r29" },
1549 { { "30" }, "r30" },
1550 { { "31" }, "r31" },
1551 { { "fr0" }, "f0" },
1552 { { "fr1" }, "f1" },
1553 { { "fr2" }, "f2" },
1554 { { "fr3" }, "f3" },
1555 { { "fr4" }, "f4" },
1556 { { "fr5" }, "f5" },
1557 { { "fr6" }, "f6" },
1558 { { "fr7" }, "f7" },
1559 { { "fr8" }, "f8" },
1560 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001561 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "fr11" }, "f11" },
1563 { { "fr12" }, "f12" },
1564 { { "fr13" }, "f13" },
1565 { { "fr14" }, "f14" },
1566 { { "fr15" }, "f15" },
1567 { { "fr16" }, "f16" },
1568 { { "fr17" }, "f17" },
1569 { { "fr18" }, "f18" },
1570 { { "fr19" }, "f19" },
1571 { { "fr20" }, "f20" },
1572 { { "fr21" }, "f21" },
1573 { { "fr22" }, "f22" },
1574 { { "fr23" }, "f23" },
1575 { { "fr24" }, "f24" },
1576 { { "fr25" }, "f25" },
1577 { { "fr26" }, "f26" },
1578 { { "fr27" }, "f27" },
1579 { { "fr28" }, "f28" },
1580 { { "fr29" }, "f29" },
1581 { { "fr30" }, "f30" },
1582 { { "fr31" }, "f31" },
1583 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001584};
1585
Craig Topperf054e3a2015-10-19 03:52:27 +00001586ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1587 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001588}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001589
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001590class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001592 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1593 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001594 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001595
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001596 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001597 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001598 case llvm::Triple::FreeBSD:
1599 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001600 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001601 PtrDiffType = SignedInt;
1602 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001603 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001604 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001605 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001606 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001607
Roman Divacky3ffe7462012-03-13 19:20:17 +00001608 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1609 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001610 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001611 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001612
1613 // PPC32 supports atomics up to 4 bytes.
1614 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001615 }
1616
Craig Topper3164f332014-03-11 03:39:26 +00001617 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001618 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001619 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001620 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001622
Bill Schmidt778d3872013-07-26 01:36:11 +00001623// Note: ABI differences may eventually require us to have a separate
1624// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001626public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001627 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1628 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001631 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001632
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001633 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001634 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001635 ABI = "elfv2";
1636 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001638 ABI = "elfv1";
1639 }
1640
1641 switch (getTriple().getOS()) {
1642 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001643 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001644 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001645 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001646 case llvm::Triple::NetBSD:
1647 IntMaxType = SignedLongLong;
1648 Int64Type = SignedLongLong;
1649 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001650 default:
1651 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC64 supports atomics up to 8 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001656 }
Craig Topper3164f332014-03-11 03:39:26 +00001657 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001658 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001660 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001661 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001662 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001663 ABI = Name;
1664 return true;
1665 }
1666 return false;
1667 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001669
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001672 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1673 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001674 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001675 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001676 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001677 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001678 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001680 }
Craig Topper3164f332014-03-11 03:39:26 +00001681 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001682 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001683 }
1684};
1685
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001686class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001687public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001688 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1689 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001691 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001692 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 }
1694};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001695
Eric Christopherc48497a2015-09-18 21:26:24 +00001696static const unsigned NVPTXAddrSpaceMap[] = {
1697 1, // opencl_global
1698 3, // opencl_local
1699 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001700 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001701 0, // opencl_generic
1702 1, // cuda_device
1703 4, // cuda_constant
1704 3, // cuda_shared
1705};
1706
1707class NVPTXTargetInfo : public TargetInfo {
1708 static const char *const GCCRegNames[];
1709 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001710 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001711
Eric Christopherc48497a2015-09-18 21:26:24 +00001712public:
Justin Lebar76945b22016-04-29 23:05:19 +00001713 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001714 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001715 BigEndian = false;
1716 TLSSupported = false;
1717 LongWidth = LongAlign = 64;
1718 AddrSpaceMap = &NVPTXAddrSpaceMap;
1719 UseAddrSpaceMapMangling = true;
1720 // Define available target features
1721 // These must be defined in sorted order!
1722 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001723 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001724
1725 // If possible, get a TargetInfo for our host triple, so we can match its
1726 // types.
1727 llvm::Triple HostTriple(Opts.HostTriple);
1728 if (HostTriple.isNVPTX())
1729 return;
1730 std::unique_ptr<TargetInfo> HostTarget(
1731 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1732 if (!HostTarget) {
1733 return;
1734 }
1735
1736 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1737 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1738 BoolWidth = HostTarget->getBoolWidth();
1739 BoolAlign = HostTarget->getBoolAlign();
1740 IntWidth = HostTarget->getIntWidth();
1741 IntAlign = HostTarget->getIntAlign();
1742 HalfWidth = HostTarget->getHalfWidth();
1743 HalfAlign = HostTarget->getHalfAlign();
1744 FloatWidth = HostTarget->getFloatWidth();
1745 FloatAlign = HostTarget->getFloatAlign();
1746 DoubleWidth = HostTarget->getDoubleWidth();
1747 DoubleAlign = HostTarget->getDoubleAlign();
1748 LongWidth = HostTarget->getLongWidth();
1749 LongAlign = HostTarget->getLongAlign();
1750 LongLongWidth = HostTarget->getLongLongWidth();
1751 LongLongAlign = HostTarget->getLongLongAlign();
1752 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1753 DefaultAlignForAttributeAligned =
1754 HostTarget->getDefaultAlignForAttributeAligned();
1755 SizeType = HostTarget->getSizeType();
1756 IntMaxType = HostTarget->getIntMaxType();
1757 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1758 IntPtrType = HostTarget->getIntPtrType();
1759 WCharType = HostTarget->getWCharType();
1760 WIntType = HostTarget->getWIntType();
1761 Char16Type = HostTarget->getChar16Type();
1762 Char32Type = HostTarget->getChar32Type();
1763 Int64Type = HostTarget->getInt64Type();
1764 SigAtomicType = HostTarget->getSigAtomicType();
1765 ProcessIDType = HostTarget->getProcessIDType();
1766
1767 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1768 UseZeroLengthBitfieldAlignment =
1769 HostTarget->useZeroLengthBitfieldAlignment();
1770 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1771 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1772
1773 // Properties intentionally not copied from host:
1774 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1775 // host/device boundary.
1776 // - SuitableAlign: Not visible across the host/device boundary, and may
1777 // correctly be different on host/device, e.g. if host has wider vector
1778 // types than device.
1779 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1780 // as its double type, but that's not necessarily true on the host.
1781 // TODO: nvcc emits a warning when using long double on device; we should
1782 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 }
1784 void getTargetDefines(const LangOptions &Opts,
1785 MacroBuilder &Builder) const override {
1786 Builder.defineMacro("__PTX__");
1787 Builder.defineMacro("__NVPTX__");
1788 if (Opts.CUDAIsDevice) {
1789 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001790 std::string CUDAArchCode = [this] {
1791 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001792 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001793 assert(false && "No GPU arch when compiling CUDA device code.");
1794 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001795 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001796 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001797 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001798 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "620";
1819 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001820 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001821 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001822 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001823 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001824 }
Craig Topper6c03a542015-10-19 04:51:35 +00001825 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1826 return llvm::makeArrayRef(BuiltinInfo,
1827 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
1829 bool hasFeature(StringRef Feature) const override {
1830 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001831 }
1832
Craig Topperf054e3a2015-10-19 03:52:27 +00001833 ArrayRef<const char *> getGCCRegNames() const override;
1834 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001835 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001836 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001837 }
1838 bool validateAsmConstraint(const char *&Name,
1839 TargetInfo::ConstraintInfo &Info) const override {
1840 switch (*Name) {
1841 default:
1842 return false;
1843 case 'c':
1844 case 'h':
1845 case 'r':
1846 case 'l':
1847 case 'f':
1848 case 'd':
1849 Info.setAllowsRegister();
1850 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001851 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
1853 const char *getClobbers() const override {
1854 // FIXME: Is this really right?
1855 return "";
1856 }
1857 BuiltinVaListKind getBuiltinVaListKind() const override {
1858 // FIXME: implement
1859 return TargetInfo::CharPtrBuiltinVaList;
1860 }
1861 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001862 GPU = StringToCudaArch(Name);
1863 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001864 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001865 void setSupportedOpenCLOpts() override {
1866 auto &Opts = getSupportedOpenCLOpts();
1867 Opts.cl_clang_storage_class_specifiers = 1;
1868 Opts.cl_khr_gl_sharing = 1;
1869 Opts.cl_khr_icd = 1;
1870
1871 Opts.cl_khr_fp64 = 1;
1872 Opts.cl_khr_byte_addressable_store = 1;
1873 Opts.cl_khr_global_int32_base_atomics = 1;
1874 Opts.cl_khr_global_int32_extended_atomics = 1;
1875 Opts.cl_khr_local_int32_base_atomics = 1;
1876 Opts.cl_khr_local_int32_extended_atomics = 1;
1877 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001878};
1879
1880const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1881#define BUILTIN(ID, TYPE, ATTRS) \
1882 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1884 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1885#include "clang/Basic/BuiltinsNVPTX.def"
1886};
1887
1888const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1889
Craig Topperf054e3a2015-10-19 03:52:27 +00001890ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1891 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001892}
1893
1894class NVPTX32TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001898 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 PointerWidth = PointerAlign = 32;
1900 SizeType = TargetInfo::UnsignedInt;
1901 PtrDiffType = TargetInfo::SignedInt;
1902 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001903 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
1905};
1906
1907class NVPTX64TargetInfo : public NVPTXTargetInfo {
1908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001909 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1910 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 PointerWidth = PointerAlign = 64;
1912 SizeType = TargetInfo::UnsignedLong;
1913 PtrDiffType = TargetInfo::SignedLong;
1914 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001915 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001916 }
1917};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001918
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001919static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001920 1, // opencl_global
1921 3, // opencl_local
1922 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001923 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // cuda_device
1925 2, // cuda_constant
1926 3 // cuda_shared
1927};
1928
Tom Stellarda96344b2014-08-21 13:58:40 +00001929// If you edit the description strings, make sure you update
1930// getPointerWidthV().
1931
Craig Topper273dbc62015-10-18 05:29:26 +00001932static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001933 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1934 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001937 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001938 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1939 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001940
Matt Arsenault250024f2016-06-08 01:56:42 +00001941class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001942 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001943 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001944
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001945 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 enum GPUKind {
1947 GK_NONE,
1948 GK_R600,
1949 GK_R600_DOUBLE_OPS,
1950 GK_R700,
1951 GK_R700_DOUBLE_OPS,
1952 GK_EVERGREEN,
1953 GK_EVERGREEN_DOUBLE_OPS,
1954 GK_NORTHERN_ISLANDS,
1955 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001956 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001957 GK_SEA_ISLANDS,
1958 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959 } GPU;
1960
Jan Veselyeebeaea2015-05-04 19:53:36 +00001961 bool hasFP64:1;
1962 bool hasFMAF:1;
1963 bool hasLDEXPF:1;
Yaxun Liu2c17e822016-08-09 19:43:38 +00001964 bool hasDenormSupport:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001965
Matt Arsenault250024f2016-06-08 01:56:42 +00001966 static bool isAMDGCN(const llvm::Triple &TT) {
1967 return TT.getArch() == llvm::Triple::amdgcn;
1968 }
1969
Eli Friedmand13b41e2012-10-12 23:32:00 +00001970public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001971 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001972 : TargetInfo(Triple) ,
1973 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1974 hasFP64(false),
1975 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001976 hasLDEXPF(false),
1977 hasDenormSupport(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001979 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001980 hasFMAF = true;
1981 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001982 }
Yaxun Liu2c17e822016-08-09 19:43:38 +00001983 if (Opts.CPU == "fiji")
1984 hasDenormSupport = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00001985
1986 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1987 DataLayoutStringSI : DataLayoutStringR600);
1988
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001989 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001990 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 }
1992
Tom Stellarda96344b2014-08-21 13:58:40 +00001993 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1994 if (GPU <= GK_CAYMAN)
1995 return 32;
1996
1997 switch(AddrSpace) {
1998 default:
1999 return 64;
2000 case 0:
2001 case 3:
2002 case 5:
2003 return 32;
2004 }
2005 }
2006
Yaxun Liu26f75662016-08-19 05:17:25 +00002007 uint64_t getMaxPointerWidth() const override {
2008 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2009 }
2010
Craig Topper3164f332014-03-11 03:39:26 +00002011 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002012 return "";
2013 }
2014
Craig Topperf054e3a2015-10-19 03:52:27 +00002015 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2018 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002019 }
2020
Craig Topper3164f332014-03-11 03:39:26 +00002021 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002022 TargetInfo::ConstraintInfo &Info) const override {
2023 switch (*Name) {
2024 default: break;
2025 case 'v': // vgpr
2026 case 's': // sgpr
2027 Info.setAllowsRegister();
2028 return true;
2029 }
2030 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002031 }
2032
Matt Arsenault250024f2016-06-08 01:56:42 +00002033 bool initFeatureMap(llvm::StringMap<bool> &Features,
2034 DiagnosticsEngine &Diags, StringRef CPU,
2035 const std::vector<std::string> &FeatureVec) const override;
2036
Yaxun Liu2c17e822016-08-09 19:43:38 +00002037 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2038 TargetOptions &TargetOpts) const override {
2039 if (!hasDenormSupport)
2040 return;
2041 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)
2050 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2051 Twine("fp32-denormals")).str());
2052 if (!hasFP64Denormals && hasFP64)
2053 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2054 Twine("fp64-denormals")).str());
2055 }
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)
Tom Stellard785699322013-04-01 20:56:49 +00002113 .Case("tahiti", GK_SOUTHERN_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002114 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2115 .Case("verde", GK_SOUTHERN_ISLANDS)
2116 .Case("oland", GK_SOUTHERN_ISLANDS)
Tom Stellard9affba42014-08-21 13:58:38 +00002117 .Case("hainan", GK_SOUTHERN_ISLANDS)
Tom Stellard08ded122013-10-29 16:38:29 +00002118 .Case("bonaire", GK_SEA_ISLANDS)
2119 .Case("kabini", GK_SEA_ISLANDS)
2120 .Case("kaveri", GK_SEA_ISLANDS)
Tom Stellard55583042013-11-14 23:45:53 +00002121 .Case("hawaii", GK_SEA_ISLANDS)
Tom Stellard14e03962014-07-26 01:05:20 +00002122 .Case("mullins", GK_SEA_ISLANDS)
Tom Stellard5c384402015-06-18 19:14:15 +00002123 .Case("tonga", GK_VOLCANIC_ISLANDS)
2124 .Case("iceland", GK_VOLCANIC_ISLANDS)
2125 .Case("carrizo", GK_VOLCANIC_ISLANDS)
Tom Stellard2c7cdd22016-02-29 15:08:56 +00002126 .Case("fiji", GK_VOLCANIC_ISLANDS)
2127 .Case("stoney", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002128 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002129 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002130
Matt Arsenault250024f2016-06-08 01:56:42 +00002131 bool setCPU(const std::string &Name) override {
2132 if (getTriple().getArch() == llvm::Triple::amdgcn)
2133 GPU = parseAMDGCNName(Name);
2134 else
2135 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002136
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002138 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002139
Jan Vesely211ba782016-06-17 02:25:03 +00002140 void setSupportedOpenCLOpts() override {
2141 auto &Opts = getSupportedOpenCLOpts();
2142 Opts.cl_clang_storage_class_specifiers = 1;
2143 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002144
Jan Vesely211ba782016-06-17 02:25:03 +00002145 if (hasFP64)
2146 Opts.cl_khr_fp64 = 1;
2147 if (GPU >= GK_EVERGREEN) {
2148 Opts.cl_khr_byte_addressable_store = 1;
2149 Opts.cl_khr_global_int32_base_atomics = 1;
2150 Opts.cl_khr_global_int32_extended_atomics = 1;
2151 Opts.cl_khr_local_int32_base_atomics = 1;
2152 Opts.cl_khr_local_int32_extended_atomics = 1;
2153 }
2154 if (GPU >= GK_SOUTHERN_ISLANDS) {
2155 Opts.cl_khr_fp16 = 1;
2156 Opts.cl_khr_int64_base_atomics = 1;
2157 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002158 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002159 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002160 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002161 Opts.cl_amd_media_ops = 1;
2162 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002163 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002164 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002165
Yaxun Liu99444cb2016-08-03 20:38:06 +00002166 LangAS::ID getOpenCLImageAddrSpace() const override {
2167 return LangAS::opencl_constant;
2168 }
2169
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002170 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2171 switch (CC) {
2172 default:
2173 return CCCR_Warning;
2174 case CC_C:
2175 case CC_OpenCLKernel:
2176 return CCCR_OK;
2177 }
2178 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002179};
2180
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002181const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002182#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002183 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002184#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002186#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002187};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002188const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002189 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2190 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2191 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2192 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2193 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2194 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2195 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2196 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2197 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2198 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2199 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2200 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2201 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2202 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2203 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2204 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2205 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2206 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2207 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2208 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2209 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2210 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2211 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2212 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2213 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2214 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2215 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2216 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2217 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2218 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2219 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2220 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2221 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2222 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2223 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2224 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2225 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2226 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2227 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2228 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2229 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2230 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2231 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2232 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2233 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2234 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2235 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002236 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002237 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2238 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002239};
2240
Craig Topperf054e3a2015-10-19 03:52:27 +00002241ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2242 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002243}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002244
Matt Arsenault250024f2016-06-08 01:56:42 +00002245bool AMDGPUTargetInfo::initFeatureMap(
2246 llvm::StringMap<bool> &Features,
2247 DiagnosticsEngine &Diags, StringRef CPU,
2248 const std::vector<std::string> &FeatureVec) const {
2249
2250 // XXX - What does the member GPU mean if device name string passed here?
2251 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2252 if (CPU.empty())
2253 CPU = "tahiti";
2254
2255 switch (parseAMDGCNName(CPU)) {
2256 case GK_SOUTHERN_ISLANDS:
2257 case GK_SEA_ISLANDS:
2258 break;
2259
2260 case GK_VOLCANIC_ISLANDS:
2261 Features["s-memrealtime"] = true;
2262 Features["16-bit-insts"] = true;
2263 break;
2264
2265 case GK_NONE:
2266 return false;
2267 default:
2268 llvm_unreachable("unhandled subtarget");
2269 }
2270 } else {
2271 if (CPU.empty())
2272 CPU = "r600";
2273
2274 switch (parseR600Name(CPU)) {
2275 case GK_R600:
2276 case GK_R700:
2277 case GK_EVERGREEN:
2278 case GK_NORTHERN_ISLANDS:
2279 break;
2280 case GK_R600_DOUBLE_OPS:
2281 case GK_R700_DOUBLE_OPS:
2282 case GK_EVERGREEN_DOUBLE_OPS:
2283 case GK_CAYMAN:
2284 Features["fp64"] = true;
2285 break;
2286 case GK_NONE:
2287 return false;
2288 default:
2289 llvm_unreachable("unhandled subtarget");
2290 }
2291 }
2292
2293 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2294}
2295
Eli Friedman3fd920a2008-08-20 02:34:37 +00002296// Namespace for x86 abstract base class
2297const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002298#define BUILTIN(ID, TYPE, ATTRS) \
2299 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002300#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002301 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002302#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002303 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002304#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002305};
Eli Friedmanb5366062008-05-20 14:21:01 +00002306
Nuno Lopescfca1f02009-12-23 17:49:57 +00002307static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002308 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2309 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002310 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002311 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2312 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2313 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002314 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002315 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2316 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002317 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2318 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2319 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2320 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2321 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2322 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2323 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2324 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002325};
2326
Eric Christophercdd36352011-06-21 00:05:20 +00002327const TargetInfo::AddlRegName AddlRegNames[] = {
2328 { { "al", "ah", "eax", "rax" }, 0 },
2329 { { "bl", "bh", "ebx", "rbx" }, 3 },
2330 { { "cl", "ch", "ecx", "rcx" }, 2 },
2331 { { "dl", "dh", "edx", "rdx" }, 1 },
2332 { { "esi", "rsi" }, 4 },
2333 { { "edi", "rdi" }, 5 },
2334 { { "esp", "rsp" }, 7 },
2335 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002336 { { "r8d", "r8w", "r8b" }, 38 },
2337 { { "r9d", "r9w", "r9b" }, 39 },
2338 { { "r10d", "r10w", "r10b" }, 40 },
2339 { { "r11d", "r11w", "r11b" }, 41 },
2340 { { "r12d", "r12w", "r12b" }, 42 },
2341 { { "r13d", "r13w", "r13b" }, 43 },
2342 { { "r14d", "r14w", "r14b" }, 44 },
2343 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002344};
2345
2346// X86 target abstract base class; x86-32 and x86-64 are very close, so
2347// most of the implementation can be shared.
2348class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002349 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002350 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002351 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002352 enum MMX3DNowEnum {
2353 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002354 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002355 enum XOPEnum {
2356 NoXOP,
2357 SSE4A,
2358 FMA4,
2359 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002360 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002361
Craig Topper543f3bd2015-10-14 23:47:57 +00002362 bool HasAES = false;
2363 bool HasPCLMUL = false;
2364 bool HasLZCNT = false;
2365 bool HasRDRND = false;
2366 bool HasFSGSBASE = false;
2367 bool HasBMI = false;
2368 bool HasBMI2 = false;
2369 bool HasPOPCNT = false;
2370 bool HasRTM = false;
2371 bool HasPRFCHW = false;
2372 bool HasRDSEED = false;
2373 bool HasADX = false;
2374 bool HasTBM = false;
2375 bool HasFMA = false;
2376 bool HasF16C = false;
2377 bool HasAVX512CD = false;
2378 bool HasAVX512ER = false;
2379 bool HasAVX512PF = false;
2380 bool HasAVX512DQ = false;
2381 bool HasAVX512BW = false;
2382 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002383 bool HasAVX512VBMI = false;
2384 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002385 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002386 bool HasMPX = false;
2387 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002388 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002389 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002390 bool HasXSAVE = false;
2391 bool HasXSAVEOPT = false;
2392 bool HasXSAVEC = false;
2393 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002394 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002395 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002396 bool HasCLFLUSHOPT = false;
2397 bool HasPCOMMIT = false;
2398 bool HasCLWB = false;
2399 bool HasUMIP = false;
2400 bool HasMOVBE = false;
2401 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002402
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002403 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2404 ///
2405 /// Each enumeration represents a particular CPU supported by Clang. These
2406 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2407 enum CPUKind {
2408 CK_Generic,
2409
2410 /// \name i386
2411 /// i386-generation processors.
2412 //@{
2413 CK_i386,
2414 //@}
2415
2416 /// \name i486
2417 /// i486-generation processors.
2418 //@{
2419 CK_i486,
2420 CK_WinChipC6,
2421 CK_WinChip2,
2422 CK_C3,
2423 //@}
2424
2425 /// \name i586
2426 /// i586-generation processors, P5 microarchitecture based.
2427 //@{
2428 CK_i586,
2429 CK_Pentium,
2430 CK_PentiumMMX,
2431 //@}
2432
2433 /// \name i686
2434 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2435 //@{
2436 CK_i686,
2437 CK_PentiumPro,
2438 CK_Pentium2,
2439 CK_Pentium3,
2440 CK_Pentium3M,
2441 CK_PentiumM,
2442 CK_C3_2,
2443
2444 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2445 /// Clang however has some logic to suport this.
2446 // FIXME: Warn, deprecate, and potentially remove this.
2447 CK_Yonah,
2448 //@}
2449
2450 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002451 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002452 //@{
2453 CK_Pentium4,
2454 CK_Pentium4M,
2455 CK_Prescott,
2456 CK_Nocona,
2457 //@}
2458
2459 /// \name Core
2460 /// Core microarchitecture based processors.
2461 //@{
2462 CK_Core2,
2463
2464 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2465 /// codename which GCC no longer accepts as an option to -march, but Clang
2466 /// has some logic for recognizing it.
2467 // FIXME: Warn, deprecate, and potentially remove this.
2468 CK_Penryn,
2469 //@}
2470
2471 /// \name Atom
2472 /// Atom processors
2473 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002474 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002475 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002476 //@}
2477
2478 /// \name Nehalem
2479 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002480 CK_Nehalem,
2481
2482 /// \name Westmere
2483 /// Westmere microarchitecture based processors.
2484 CK_Westmere,
2485
2486 /// \name Sandy Bridge
2487 /// Sandy Bridge microarchitecture based processors.
2488 CK_SandyBridge,
2489
2490 /// \name Ivy Bridge
2491 /// Ivy Bridge microarchitecture based processors.
2492 CK_IvyBridge,
2493
2494 /// \name Haswell
2495 /// Haswell microarchitecture based processors.
2496 CK_Haswell,
2497
2498 /// \name Broadwell
2499 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002500 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002501
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002502 /// \name Skylake Client
2503 /// Skylake client microarchitecture based processors.
2504 CK_SkylakeClient,
2505
2506 /// \name Skylake Server
2507 /// Skylake server microarchitecture based processors.
2508 CK_SkylakeServer,
2509
2510 /// \name Cannonlake Client
2511 /// Cannonlake client microarchitecture based processors.
2512 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002513
Craig Topper449314e2013-08-20 07:09:39 +00002514 /// \name Knights Landing
2515 /// Knights Landing processor.
2516 CK_KNL,
2517
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002518 /// \name Lakemont
2519 /// Lakemont microarchitecture based processors.
2520 CK_Lakemont,
2521
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002522 /// \name K6
2523 /// K6 architecture processors.
2524 //@{
2525 CK_K6,
2526 CK_K6_2,
2527 CK_K6_3,
2528 //@}
2529
2530 /// \name K7
2531 /// K7 architecture processors.
2532 //@{
2533 CK_Athlon,
2534 CK_AthlonThunderbird,
2535 CK_Athlon4,
2536 CK_AthlonXP,
2537 CK_AthlonMP,
2538 //@}
2539
2540 /// \name K8
2541 /// K8 architecture processors.
2542 //@{
2543 CK_Athlon64,
2544 CK_Athlon64SSE3,
2545 CK_AthlonFX,
2546 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002547 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002548 CK_Opteron,
2549 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002550 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002551 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002552
Benjamin Kramer569f2152012-01-10 11:50:18 +00002553 /// \name Bobcat
2554 /// Bobcat architecture processors.
2555 //@{
2556 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002557 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002558 //@}
2559
2560 /// \name Bulldozer
2561 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002562 //@{
2563 CK_BDVER1,
2564 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002565 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002566 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002567 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002568
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002569 /// This specification is deprecated and will be removed in the future.
2570 /// Users should prefer \see CK_K8.
2571 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002572 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002573 CK_x86_64,
2574 //@}
2575
2576 /// \name Geode
2577 /// Geode processors.
2578 //@{
2579 CK_Geode
2580 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002581 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002582
Eric Christopherc50738f2015-08-27 00:05:50 +00002583 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002584 return llvm::StringSwitch<CPUKind>(CPU)
2585 .Case("i386", CK_i386)
2586 .Case("i486", CK_i486)
2587 .Case("winchip-c6", CK_WinChipC6)
2588 .Case("winchip2", CK_WinChip2)
2589 .Case("c3", CK_C3)
2590 .Case("i586", CK_i586)
2591 .Case("pentium", CK_Pentium)
2592 .Case("pentium-mmx", CK_PentiumMMX)
2593 .Case("i686", CK_i686)
2594 .Case("pentiumpro", CK_PentiumPro)
2595 .Case("pentium2", CK_Pentium2)
2596 .Case("pentium3", CK_Pentium3)
2597 .Case("pentium3m", CK_Pentium3M)
2598 .Case("pentium-m", CK_PentiumM)
2599 .Case("c3-2", CK_C3_2)
2600 .Case("yonah", CK_Yonah)
2601 .Case("pentium4", CK_Pentium4)
2602 .Case("pentium4m", CK_Pentium4M)
2603 .Case("prescott", CK_Prescott)
2604 .Case("nocona", CK_Nocona)
2605 .Case("core2", CK_Core2)
2606 .Case("penryn", CK_Penryn)
2607 .Case("bonnell", CK_Bonnell)
2608 .Case("atom", CK_Bonnell) // Legacy name.
2609 .Case("silvermont", CK_Silvermont)
2610 .Case("slm", CK_Silvermont) // Legacy name.
2611 .Case("nehalem", CK_Nehalem)
2612 .Case("corei7", CK_Nehalem) // Legacy name.
2613 .Case("westmere", CK_Westmere)
2614 .Case("sandybridge", CK_SandyBridge)
2615 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2616 .Case("ivybridge", CK_IvyBridge)
2617 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2618 .Case("haswell", CK_Haswell)
2619 .Case("core-avx2", CK_Haswell) // Legacy name.
2620 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002621 .Case("skylake", CK_SkylakeClient)
2622 .Case("skylake-avx512", CK_SkylakeServer)
2623 .Case("skx", CK_SkylakeServer) // Legacy name.
2624 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002625 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002626 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002627 .Case("k6", CK_K6)
2628 .Case("k6-2", CK_K6_2)
2629 .Case("k6-3", CK_K6_3)
2630 .Case("athlon", CK_Athlon)
2631 .Case("athlon-tbird", CK_AthlonThunderbird)
2632 .Case("athlon-4", CK_Athlon4)
2633 .Case("athlon-xp", CK_AthlonXP)
2634 .Case("athlon-mp", CK_AthlonMP)
2635 .Case("athlon64", CK_Athlon64)
2636 .Case("athlon64-sse3", CK_Athlon64SSE3)
2637 .Case("athlon-fx", CK_AthlonFX)
2638 .Case("k8", CK_K8)
2639 .Case("k8-sse3", CK_K8SSE3)
2640 .Case("opteron", CK_Opteron)
2641 .Case("opteron-sse3", CK_OpteronSSE3)
2642 .Case("barcelona", CK_AMDFAM10)
2643 .Case("amdfam10", CK_AMDFAM10)
2644 .Case("btver1", CK_BTVER1)
2645 .Case("btver2", CK_BTVER2)
2646 .Case("bdver1", CK_BDVER1)
2647 .Case("bdver2", CK_BDVER2)
2648 .Case("bdver3", CK_BDVER3)
2649 .Case("bdver4", CK_BDVER4)
2650 .Case("x86-64", CK_x86_64)
2651 .Case("geode", CK_Geode)
2652 .Default(CK_Generic);
2653 }
2654
Rafael Espindolaeb265472013-08-21 21:59:03 +00002655 enum FPMathKind {
2656 FP_Default,
2657 FP_SSE,
2658 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002659 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002660
Eli Friedman3fd920a2008-08-20 02:34:37 +00002661public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002662 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2663 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002664 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002665 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002666 }
Craig Topper3164f332014-03-11 03:39:26 +00002667 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002668 // X87 evaluates with 80 bits "long double" precision.
2669 return SSELevel == NoSSE ? 2 : 0;
2670 }
Craig Topper6c03a542015-10-19 04:51:35 +00002671 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2672 return llvm::makeArrayRef(BuiltinInfo,
2673 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002674 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002675 ArrayRef<const char *> getGCCRegNames() const override {
2676 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002677 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002678 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2679 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002680 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002681 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2682 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002683 }
Eric Christopherd9832702015-06-29 21:00:05 +00002684 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002685 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002686 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002687
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002688 bool validateGlobalRegisterVariable(StringRef RegName,
2689 unsigned RegSize,
2690 bool &HasSizeMismatch) const override {
2691 // esp and ebp are the only 32-bit registers the x86 backend can currently
2692 // handle.
2693 if (RegName.equals("esp") || RegName.equals("ebp")) {
2694 // Check that the register size is 32-bit.
2695 HasSizeMismatch = RegSize != 32;
2696 return true;
2697 }
2698
2699 return false;
2700 }
2701
Akira Hatanaka974131e2014-09-18 18:17:18 +00002702 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2703
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002704 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2705
Akira Hatanaka974131e2014-09-18 18:17:18 +00002706 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2707
Craig Topper3164f332014-03-11 03:39:26 +00002708 std::string convertConstraint(const char *&Constraint) const override;
2709 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002710 return "~{dirflag},~{fpsr},~{flags}";
2711 }
Craig Topper3164f332014-03-11 03:39:26 +00002712 void getTargetDefines(const LangOptions &Opts,
2713 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002714 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2715 bool Enabled);
2716 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2717 bool Enabled);
2718 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2719 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002720 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2721 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002722 setFeatureEnabledImpl(Features, Name, Enabled);
2723 }
2724 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002725 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002726 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2727 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002728 bool
2729 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2730 StringRef CPU,
2731 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002732 bool hasFeature(StringRef Feature) const override;
2733 bool handleTargetFeatures(std::vector<std::string> &Features,
2734 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002735 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002736 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2737 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002738 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002739 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002740 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002741 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002742 return "no-mmx";
2743 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002744 }
Craig Topper3164f332014-03-11 03:39:26 +00002745 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002746 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002747
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002748 // Perform any per-CPU checks necessary to determine if this CPU is
2749 // acceptable.
2750 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2751 // invalid without explaining *why*.
2752 switch (CPU) {
2753 case CK_Generic:
2754 // No processor selected!
2755 return false;
2756
2757 case CK_i386:
2758 case CK_i486:
2759 case CK_WinChipC6:
2760 case CK_WinChip2:
2761 case CK_C3:
2762 case CK_i586:
2763 case CK_Pentium:
2764 case CK_PentiumMMX:
2765 case CK_i686:
2766 case CK_PentiumPro:
2767 case CK_Pentium2:
2768 case CK_Pentium3:
2769 case CK_Pentium3M:
2770 case CK_PentiumM:
2771 case CK_Yonah:
2772 case CK_C3_2:
2773 case CK_Pentium4:
2774 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002775 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002776 case CK_Prescott:
2777 case CK_K6:
2778 case CK_K6_2:
2779 case CK_K6_3:
2780 case CK_Athlon:
2781 case CK_AthlonThunderbird:
2782 case CK_Athlon4:
2783 case CK_AthlonXP:
2784 case CK_AthlonMP:
2785 case CK_Geode:
2786 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002787 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002788 return false;
2789
2790 // Fallthrough
2791 case CK_Nocona:
2792 case CK_Core2:
2793 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002794 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002795 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002796 case CK_Nehalem:
2797 case CK_Westmere:
2798 case CK_SandyBridge:
2799 case CK_IvyBridge:
2800 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002801 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002802 case CK_SkylakeClient:
2803 case CK_SkylakeServer:
2804 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002805 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002806 case CK_Athlon64:
2807 case CK_Athlon64SSE3:
2808 case CK_AthlonFX:
2809 case CK_K8:
2810 case CK_K8SSE3:
2811 case CK_Opteron:
2812 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002813 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002814 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002815 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002816 case CK_BDVER1:
2817 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002818 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002819 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002820 case CK_x86_64:
2821 return true;
2822 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002823 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002824 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002825
Craig Topper3164f332014-03-11 03:39:26 +00002826 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002827
Craig Topper3164f332014-03-11 03:39:26 +00002828 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002829 // Most of the non-ARM calling conventions are i386 conventions.
2830 switch (CC) {
2831 case CC_X86ThisCall:
2832 case CC_X86FastCall:
2833 case CC_X86StdCall:
2834 case CC_X86VectorCall:
2835 case CC_C:
2836 case CC_Swift:
2837 case CC_X86Pascal:
2838 case CC_IntelOclBicc:
2839 return CCCR_OK;
2840 default:
2841 return CCCR_Warning;
2842 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002843 }
2844
Craig Topper3164f332014-03-11 03:39:26 +00002845 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002846 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002847 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002848
2849 bool hasSjLjLowering() const override {
2850 return true;
2851 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002852
2853 void setSupportedOpenCLOpts() override {
2854 getSupportedOpenCLOpts().setAll();
2855 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002856};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002857
Rafael Espindolaeb265472013-08-21 21:59:03 +00002858bool X86TargetInfo::setFPMath(StringRef Name) {
2859 if (Name == "387") {
2860 FPMath = FP_387;
2861 return true;
2862 }
2863 if (Name == "sse") {
2864 FPMath = FP_SSE;
2865 return true;
2866 }
2867 return false;
2868}
2869
Eric Christopher007b0a02015-08-28 22:32:01 +00002870bool X86TargetInfo::initFeatureMap(
2871 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002872 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002873 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002874 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002875 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002876 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002877
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002878 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002879
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002880 // Enable X87 for all X86 processors but Lakemont.
2881 if (Kind != CK_Lakemont)
2882 setFeatureEnabledImpl(Features, "x87", true);
2883
2884 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002885 case CK_Generic:
2886 case CK_i386:
2887 case CK_i486:
2888 case CK_i586:
2889 case CK_Pentium:
2890 case CK_i686:
2891 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002892 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002893 break;
2894 case CK_PentiumMMX:
2895 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002896 case CK_K6:
2897 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002898 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002899 break;
2900 case CK_Pentium3:
2901 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002902 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002903 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002904 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002905 break;
2906 case CK_PentiumM:
2907 case CK_Pentium4:
2908 case CK_Pentium4M:
2909 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002910 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002911 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002912 break;
2913 case CK_Yonah:
2914 case CK_Prescott:
2915 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002916 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002917 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002918 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002919 break;
2920 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002921 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002922 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002923 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002924 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002925 break;
2926 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002927 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002928 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002929 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002930 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002931 case CK_Cannonlake:
2932 setFeatureEnabledImpl(Features, "avx512ifma", true);
2933 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2934 setFeatureEnabledImpl(Features, "sha", true);
2935 setFeatureEnabledImpl(Features, "umip", true);
2936 // FALLTHROUGH
2937 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002938 setFeatureEnabledImpl(Features, "avx512f", true);
2939 setFeatureEnabledImpl(Features, "avx512cd", true);
2940 setFeatureEnabledImpl(Features, "avx512dq", true);
2941 setFeatureEnabledImpl(Features, "avx512bw", true);
2942 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002943 setFeatureEnabledImpl(Features, "pku", true);
2944 setFeatureEnabledImpl(Features, "pcommit", true);
2945 setFeatureEnabledImpl(Features, "clwb", true);
2946 // FALLTHROUGH
2947 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002948 setFeatureEnabledImpl(Features, "xsavec", true);
2949 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002950 setFeatureEnabledImpl(Features, "mpx", true);
2951 setFeatureEnabledImpl(Features, "sgx", true);
2952 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002953 // FALLTHROUGH
2954 case CK_Broadwell:
2955 setFeatureEnabledImpl(Features, "rdseed", true);
2956 setFeatureEnabledImpl(Features, "adx", true);
2957 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002958 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002959 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002960 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002961 setFeatureEnabledImpl(Features, "bmi", true);
2962 setFeatureEnabledImpl(Features, "bmi2", true);
2963 setFeatureEnabledImpl(Features, "rtm", true);
2964 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002965 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002966 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002967 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002968 setFeatureEnabledImpl(Features, "rdrnd", true);
2969 setFeatureEnabledImpl(Features, "f16c", true);
2970 setFeatureEnabledImpl(Features, "fsgsbase", true);
2971 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002972 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002973 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002974 setFeatureEnabledImpl(Features, "xsave", true);
2975 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002976 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002977 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002978 case CK_Silvermont:
2979 setFeatureEnabledImpl(Features, "aes", true);
2980 setFeatureEnabledImpl(Features, "pclmul", true);
2981 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002982 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002983 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002984 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002985 setFeatureEnabledImpl(Features, "cx16", true);
2986 break;
2987 case CK_KNL:
2988 setFeatureEnabledImpl(Features, "avx512f", true);
2989 setFeatureEnabledImpl(Features, "avx512cd", true);
2990 setFeatureEnabledImpl(Features, "avx512er", true);
2991 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002992 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002993 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002994 setFeatureEnabledImpl(Features, "rdseed", true);
2995 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002996 setFeatureEnabledImpl(Features, "lzcnt", true);
2997 setFeatureEnabledImpl(Features, "bmi", true);
2998 setFeatureEnabledImpl(Features, "bmi2", true);
2999 setFeatureEnabledImpl(Features, "rtm", true);
3000 setFeatureEnabledImpl(Features, "fma", true);
3001 setFeatureEnabledImpl(Features, "rdrnd", true);
3002 setFeatureEnabledImpl(Features, "f16c", true);
3003 setFeatureEnabledImpl(Features, "fsgsbase", true);
3004 setFeatureEnabledImpl(Features, "aes", true);
3005 setFeatureEnabledImpl(Features, "pclmul", true);
3006 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003007 setFeatureEnabledImpl(Features, "xsaveopt", true);
3008 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003009 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003010 break;
3011 case CK_K6_2:
3012 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003013 case CK_WinChip2:
3014 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003015 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003016 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003017 case CK_Athlon:
3018 case CK_AthlonThunderbird:
3019 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003020 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003021 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003022 case CK_Athlon4:
3023 case CK_AthlonXP:
3024 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003025 setFeatureEnabledImpl(Features, "sse", true);
3026 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003027 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003028 break;
3029 case CK_K8:
3030 case CK_Opteron:
3031 case CK_Athlon64:
3032 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003033 setFeatureEnabledImpl(Features, "sse2", true);
3034 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003035 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003036 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003037 case CK_AMDFAM10:
3038 setFeatureEnabledImpl(Features, "sse4a", true);
3039 setFeatureEnabledImpl(Features, "lzcnt", true);
3040 setFeatureEnabledImpl(Features, "popcnt", true);
3041 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003042 case CK_K8SSE3:
3043 case CK_OpteronSSE3:
3044 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003045 setFeatureEnabledImpl(Features, "sse3", true);
3046 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003047 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003048 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003049 case CK_BTVER2:
3050 setFeatureEnabledImpl(Features, "avx", true);
3051 setFeatureEnabledImpl(Features, "aes", true);
3052 setFeatureEnabledImpl(Features, "pclmul", true);
3053 setFeatureEnabledImpl(Features, "bmi", true);
3054 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003055 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003056 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003057 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003058 setFeatureEnabledImpl(Features, "ssse3", true);
3059 setFeatureEnabledImpl(Features, "sse4a", true);
3060 setFeatureEnabledImpl(Features, "lzcnt", true);
3061 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003062 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003063 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003064 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003065 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003066 case CK_BDVER4:
3067 setFeatureEnabledImpl(Features, "avx2", true);
3068 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003069 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003070 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003071 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003072 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003073 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003074 // FALLTHROUGH
3075 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003076 setFeatureEnabledImpl(Features, "bmi", true);
3077 setFeatureEnabledImpl(Features, "fma", true);
3078 setFeatureEnabledImpl(Features, "f16c", true);
3079 setFeatureEnabledImpl(Features, "tbm", true);
3080 // FALLTHROUGH
3081 case CK_BDVER1:
3082 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003083 setFeatureEnabledImpl(Features, "xop", true);
3084 setFeatureEnabledImpl(Features, "lzcnt", true);
3085 setFeatureEnabledImpl(Features, "aes", true);
3086 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003087 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003088 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003089 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003090 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003091 break;
Eli Friedman33465822011-07-08 23:31:17 +00003092 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003093 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3094 return false;
3095
3096 // Can't do this earlier because we need to be able to explicitly enable
3097 // or disable these features and the things that they depend upon.
3098
3099 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3100 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003101 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003102 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3103 FeaturesVec.end())
3104 Features["popcnt"] = true;
3105
3106 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3107 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003108 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003109 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3110 FeaturesVec.end())
3111 Features["prfchw"] = true;
3112
Eric Christophera7260af2015-10-08 20:10:18 +00003113 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3114 // then enable MMX.
3115 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003116 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003117 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3118 FeaturesVec.end())
3119 Features["mmx"] = true;
3120
Eric Christopherbbd746d2015-10-08 20:10:14 +00003121 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003122}
3123
Rafael Espindolae62e2792013-08-20 13:44:29 +00003124void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003125 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003126 if (Enabled) {
3127 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003128 case AVX512F:
3129 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003130 case AVX2:
3131 Features["avx2"] = true;
3132 case AVX:
3133 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003134 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003135 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003136 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003137 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003138 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003139 case SSSE3:
3140 Features["ssse3"] = true;
3141 case SSE3:
3142 Features["sse3"] = true;
3143 case SSE2:
3144 Features["sse2"] = true;
3145 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003146 Features["sse"] = true;
3147 case NoSSE:
3148 break;
3149 }
3150 return;
3151 }
3152
3153 switch (Level) {
3154 case NoSSE:
3155 case SSE1:
3156 Features["sse"] = false;
3157 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003158 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3159 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003160 case SSE3:
3161 Features["sse3"] = false;
3162 setXOPLevel(Features, NoXOP, false);
3163 case SSSE3:
3164 Features["ssse3"] = false;
3165 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003166 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003167 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003168 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003169 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003170 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3171 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003172 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003173 case AVX2:
3174 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003175 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003176 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003177 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003178 Features["avx512vl"] = Features["avx512vbmi"] =
3179 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003180 }
3181}
3182
3183void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003184 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185 if (Enabled) {
3186 switch (Level) {
3187 case AMD3DNowAthlon:
3188 Features["3dnowa"] = true;
3189 case AMD3DNow:
3190 Features["3dnow"] = true;
3191 case MMX:
3192 Features["mmx"] = true;
3193 case NoMMX3DNow:
3194 break;
3195 }
3196 return;
3197 }
3198
3199 switch (Level) {
3200 case NoMMX3DNow:
3201 case MMX:
3202 Features["mmx"] = false;
3203 case AMD3DNow:
3204 Features["3dnow"] = false;
3205 case AMD3DNowAthlon:
3206 Features["3dnowa"] = false;
3207 }
3208}
3209
3210void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003211 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003212 if (Enabled) {
3213 switch (Level) {
3214 case XOP:
3215 Features["xop"] = true;
3216 case FMA4:
3217 Features["fma4"] = true;
3218 setSSELevel(Features, AVX, true);
3219 case SSE4A:
3220 Features["sse4a"] = true;
3221 setSSELevel(Features, SSE3, true);
3222 case NoXOP:
3223 break;
3224 }
3225 return;
3226 }
3227
3228 switch (Level) {
3229 case NoXOP:
3230 case SSE4A:
3231 Features["sse4a"] = false;
3232 case FMA4:
3233 Features["fma4"] = false;
3234 case XOP:
3235 Features["xop"] = false;
3236 }
3237}
3238
Craig Topper86d79ef2013-09-17 04:51:29 +00003239void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3240 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003241 // This is a bit of a hack to deal with the sse4 target feature when used
3242 // as part of the target attribute. We handle sse4 correctly everywhere
3243 // else. See below for more information on how we handle the sse4 options.
3244 if (Name != "sse4")
3245 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003246
Craig Topper29561122013-09-19 01:13:07 +00003247 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003248 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003249 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003251 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003252 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003253 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003255 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003256 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003257 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003258 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003259 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003260 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003261 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003262 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003263 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003264 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003265 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003266 if (Enabled)
3267 setSSELevel(Features, SSE2, Enabled);
3268 } else if (Name == "pclmul") {
3269 if (Enabled)
3270 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003271 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003272 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003273 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003274 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003275 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003276 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003277 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3278 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3279 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003280 if (Enabled)
3281 setSSELevel(Features, AVX512F, Enabled);
3282 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003283 if (Enabled)
3284 setSSELevel(Features, AVX, Enabled);
3285 } else if (Name == "fma4") {
3286 setXOPLevel(Features, FMA4, Enabled);
3287 } else if (Name == "xop") {
3288 setXOPLevel(Features, XOP, Enabled);
3289 } else if (Name == "sse4a") {
3290 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003291 } else if (Name == "f16c") {
3292 if (Enabled)
3293 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003294 } else if (Name == "sha") {
3295 if (Enabled)
3296 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003297 } else if (Name == "sse4") {
3298 // We can get here via the __target__ attribute since that's not controlled
3299 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3300 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3301 // disabled.
3302 if (Enabled)
3303 setSSELevel(Features, SSE42, Enabled);
3304 else
3305 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003306 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003307 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003308 Features["xsaveopt"] = false;
3309 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003310 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003311 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003312 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003313}
3314
Eric Christopher3ff21b32013-10-16 21:26:26 +00003315/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003316/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003317bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003318 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003319 for (const auto &Feature : Features) {
3320 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003321 continue;
3322
Eric Christopher610fe112015-08-26 08:21:55 +00003323 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003324 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003325 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003326 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003327 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003328 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003329 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003330 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003331 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003332 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003333 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003334 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003335 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003336 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003337 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003338 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003339 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003340 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003341 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003342 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003343 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003344 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003345 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003346 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003347 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003348 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003349 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003350 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003351 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003352 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003353 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003354 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003355 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003356 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003357 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003358 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003359 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003360 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003361 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003362 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003363 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003364 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003365 } else if (Feature == "+avx512vbmi") {
3366 HasAVX512VBMI = true;
3367 } else if (Feature == "+avx512ifma") {
3368 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003369 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003370 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003371 } else if (Feature == "+mpx") {
3372 HasMPX = true;
3373 } else if (Feature == "+movbe") {
3374 HasMOVBE = true;
3375 } else if (Feature == "+sgx") {
3376 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003377 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003378 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003379 } else if (Feature == "+fxsr") {
3380 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003381 } else if (Feature == "+xsave") {
3382 HasXSAVE = true;
3383 } else if (Feature == "+xsaveopt") {
3384 HasXSAVEOPT = true;
3385 } else if (Feature == "+xsavec") {
3386 HasXSAVEC = true;
3387 } else if (Feature == "+xsaves") {
3388 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003389 } else if (Feature == "+mwaitx") {
3390 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003391 } else if (Feature == "+pku") {
3392 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003393 } else if (Feature == "+clflushopt") {
3394 HasCLFLUSHOPT = true;
3395 } else if (Feature == "+pcommit") {
3396 HasPCOMMIT = true;
3397 } else if (Feature == "+clwb") {
3398 HasCLWB = true;
3399 } else if (Feature == "+umip") {
3400 HasUMIP = true;
3401 } else if (Feature == "+prefetchwt1") {
3402 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003403 }
3404
Benjamin Kramer27402c62012-03-05 15:10:44 +00003405 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003406 .Case("+avx512f", AVX512F)
3407 .Case("+avx2", AVX2)
3408 .Case("+avx", AVX)
3409 .Case("+sse4.2", SSE42)
3410 .Case("+sse4.1", SSE41)
3411 .Case("+ssse3", SSSE3)
3412 .Case("+sse3", SSE3)
3413 .Case("+sse2", SSE2)
3414 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003415 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003416 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003417
Eli Friedman33465822011-07-08 23:31:17 +00003418 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003419 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003420 .Case("+3dnowa", AMD3DNowAthlon)
3421 .Case("+3dnow", AMD3DNow)
3422 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003423 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003424 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003425
3426 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003427 .Case("+xop", XOP)
3428 .Case("+fma4", FMA4)
3429 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003430 .Default(NoXOP);
3431 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003432 }
Eli Friedman33465822011-07-08 23:31:17 +00003433
Rafael Espindolaeb265472013-08-21 21:59:03 +00003434 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3435 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003436 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3437 (FPMath == FP_387 && SSELevel >= SSE1)) {
3438 Diags.Report(diag::err_target_unsupported_fpmath) <<
3439 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003440 return false;
3441 }
3442
Alexey Bataev00396512015-07-02 03:40:19 +00003443 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003444 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003445 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003446}
Chris Lattnerecd49032009-03-02 22:27:17 +00003447
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003448/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3449/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003450void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003451 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003452 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003453 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003454 Builder.defineMacro("__amd64__");
3455 Builder.defineMacro("__amd64");
3456 Builder.defineMacro("__x86_64");
3457 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003458 if (getTriple().getArchName() == "x86_64h") {
3459 Builder.defineMacro("__x86_64h");
3460 Builder.defineMacro("__x86_64h__");
3461 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003462 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003463 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003464 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003465
Chris Lattnerecd49032009-03-02 22:27:17 +00003466 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003467 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3468 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003469 switch (CPU) {
3470 case CK_Generic:
3471 break;
3472 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003473 // The rest are coming from the i386 define above.
3474 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003475 break;
3476 case CK_i486:
3477 case CK_WinChipC6:
3478 case CK_WinChip2:
3479 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003480 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003481 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003482 case CK_PentiumMMX:
3483 Builder.defineMacro("__pentium_mmx__");
3484 Builder.defineMacro("__tune_pentium_mmx__");
3485 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003486 case CK_i586:
3487 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003488 defineCPUMacros(Builder, "i586");
3489 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003490 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003491 case CK_Pentium3:
3492 case CK_Pentium3M:
3493 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003494 Builder.defineMacro("__tune_pentium3__");
3495 // Fallthrough
3496 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003497 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003498 Builder.defineMacro("__tune_pentium2__");
3499 // Fallthrough
3500 case CK_PentiumPro:
3501 Builder.defineMacro("__tune_i686__");
3502 Builder.defineMacro("__tune_pentiumpro__");
3503 // Fallthrough
3504 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003505 Builder.defineMacro("__i686");
3506 Builder.defineMacro("__i686__");
3507 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3508 Builder.defineMacro("__pentiumpro");
3509 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003510 break;
3511 case CK_Pentium4:
3512 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003513 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003514 break;
3515 case CK_Yonah:
3516 case CK_Prescott:
3517 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003518 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003519 break;
3520 case CK_Core2:
3521 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003522 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003523 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003524 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003525 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003526 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003527 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003528 defineCPUMacros(Builder, "slm");
3529 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003530 case CK_Nehalem:
3531 case CK_Westmere:
3532 case CK_SandyBridge:
3533 case CK_IvyBridge:
3534 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003535 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003536 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003537 // FIXME: Historically, we defined this legacy name, it would be nice to
3538 // remove it at some point. We've never exposed fine-grained names for
3539 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003540 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003541 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003542 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003543 defineCPUMacros(Builder, "skx");
3544 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003545 case CK_Cannonlake:
3546 break;
Craig Topper449314e2013-08-20 07:09:39 +00003547 case CK_KNL:
3548 defineCPUMacros(Builder, "knl");
3549 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003550 case CK_Lakemont:
3551 Builder.defineMacro("__tune_lakemont__");
3552 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003553 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003554 Builder.defineMacro("__k6_2__");
3555 Builder.defineMacro("__tune_k6_2__");
3556 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003557 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003558 if (CPU != CK_K6_2) { // In case of fallthrough
3559 // FIXME: GCC may be enabling these in cases where some other k6
3560 // architecture is specified but -m3dnow is explicitly provided. The
3561 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003562 Builder.defineMacro("__k6_3__");
3563 Builder.defineMacro("__tune_k6_3__");
3564 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003565 // Fallthrough
3566 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003567 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003568 break;
3569 case CK_Athlon:
3570 case CK_AthlonThunderbird:
3571 case CK_Athlon4:
3572 case CK_AthlonXP:
3573 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003574 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003575 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003576 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003577 Builder.defineMacro("__tune_athlon_sse__");
3578 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003579 break;
3580 case CK_K8:
3581 case CK_K8SSE3:
3582 case CK_x86_64:
3583 case CK_Opteron:
3584 case CK_OpteronSSE3:
3585 case CK_Athlon64:
3586 case CK_Athlon64SSE3:
3587 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003588 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003589 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003590 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003591 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003592 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003593 case CK_BTVER1:
3594 defineCPUMacros(Builder, "btver1");
3595 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003596 case CK_BTVER2:
3597 defineCPUMacros(Builder, "btver2");
3598 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003599 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003600 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003601 break;
3602 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003603 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003604 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003605 case CK_BDVER3:
3606 defineCPUMacros(Builder, "bdver3");
3607 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003608 case CK_BDVER4:
3609 defineCPUMacros(Builder, "bdver4");
3610 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003611 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003612 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003613 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003614 }
Chris Lattner96e43572009-03-02 22:40:39 +00003615
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003616 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003617 Builder.defineMacro("__REGISTER_PREFIX__", "");
3618
Chris Lattner6df41af2009-04-19 17:32:33 +00003619 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3620 // functions in glibc header files that use FP Stack inline asm which the
3621 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003622 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003623
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003624 if (HasAES)
3625 Builder.defineMacro("__AES__");
3626
Craig Topper3f122a72012-05-31 05:18:48 +00003627 if (HasPCLMUL)
3628 Builder.defineMacro("__PCLMUL__");
3629
Craig Topper22967d42011-12-25 05:06:45 +00003630 if (HasLZCNT)
3631 Builder.defineMacro("__LZCNT__");
3632
Benjamin Kramer1e250392012-07-07 09:39:18 +00003633 if (HasRDRND)
3634 Builder.defineMacro("__RDRND__");
3635
Craig Topper8c7f2512014-11-03 06:51:41 +00003636 if (HasFSGSBASE)
3637 Builder.defineMacro("__FSGSBASE__");
3638
Craig Topper22967d42011-12-25 05:06:45 +00003639 if (HasBMI)
3640 Builder.defineMacro("__BMI__");
3641
3642 if (HasBMI2)
3643 Builder.defineMacro("__BMI2__");
3644
Craig Topper1de83482011-12-29 16:10:46 +00003645 if (HasPOPCNT)
3646 Builder.defineMacro("__POPCNT__");
3647
Michael Liao625a8752012-11-10 05:17:46 +00003648 if (HasRTM)
3649 Builder.defineMacro("__RTM__");
3650
Michael Liao74f4eaf2013-03-26 17:52:08 +00003651 if (HasPRFCHW)
3652 Builder.defineMacro("__PRFCHW__");
3653
Michael Liaoffaae352013-03-29 05:17:55 +00003654 if (HasRDSEED)
3655 Builder.defineMacro("__RDSEED__");
3656
Robert Khasanov50e6f582014-09-19 09:53:48 +00003657 if (HasADX)
3658 Builder.defineMacro("__ADX__");
3659
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003660 if (HasTBM)
3661 Builder.defineMacro("__TBM__");
3662
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003663 if (HasMWAITX)
3664 Builder.defineMacro("__MWAITX__");
3665
Rafael Espindolae62e2792013-08-20 13:44:29 +00003666 switch (XOPLevel) {
3667 case XOP:
3668 Builder.defineMacro("__XOP__");
3669 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003670 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003671 case SSE4A:
3672 Builder.defineMacro("__SSE4A__");
3673 case NoXOP:
3674 break;
3675 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003676
Craig Topperbba778b2012-06-03 21:46:30 +00003677 if (HasFMA)
3678 Builder.defineMacro("__FMA__");
3679
Manman Rena45358c2012-10-11 00:59:55 +00003680 if (HasF16C)
3681 Builder.defineMacro("__F16C__");
3682
Craig Topper679b53a2013-08-21 05:29:10 +00003683 if (HasAVX512CD)
3684 Builder.defineMacro("__AVX512CD__");
3685 if (HasAVX512ER)
3686 Builder.defineMacro("__AVX512ER__");
3687 if (HasAVX512PF)
3688 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003689 if (HasAVX512DQ)
3690 Builder.defineMacro("__AVX512DQ__");
3691 if (HasAVX512BW)
3692 Builder.defineMacro("__AVX512BW__");
3693 if (HasAVX512VL)
3694 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003695 if (HasAVX512VBMI)
3696 Builder.defineMacro("__AVX512VBMI__");
3697 if (HasAVX512IFMA)
3698 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003699
Ben Langmuir58078d02013-09-19 13:22:04 +00003700 if (HasSHA)
3701 Builder.defineMacro("__SHA__");
3702
Craig Toppere33f51f2015-10-16 06:22:36 +00003703 if (HasFXSR)
3704 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003705 if (HasXSAVE)
3706 Builder.defineMacro("__XSAVE__");
3707 if (HasXSAVEOPT)
3708 Builder.defineMacro("__XSAVEOPT__");
3709 if (HasXSAVEC)
3710 Builder.defineMacro("__XSAVEC__");
3711 if (HasXSAVES)
3712 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003713 if (HasPKU)
3714 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003715 if (HasCX16)
3716 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3717
Chris Lattner96e43572009-03-02 22:40:39 +00003718 // Each case falls through to the previous one here.
3719 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003720 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003721 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003722 case AVX2:
3723 Builder.defineMacro("__AVX2__");
3724 case AVX:
3725 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003726 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003727 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003728 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003729 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003730 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003731 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003732 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003733 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003734 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003735 Builder.defineMacro("__SSE2__");
3736 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003737 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003738 Builder.defineMacro("__SSE__");
3739 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003740 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003741 break;
3742 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003743
Derek Schuffc7dd7222012-10-11 15:52:22 +00003744 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003745 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003746 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003747 case AVX2:
3748 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003749 case SSE42:
3750 case SSE41:
3751 case SSSE3:
3752 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003753 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003754 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003755 break;
3756 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003757 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003758 break;
3759 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003760 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003761 }
3762 }
3763
Anders Carlssone437c682010-01-27 03:47:49 +00003764 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003765 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003766 case AMD3DNowAthlon:
3767 Builder.defineMacro("__3dNOW_A__");
3768 case AMD3DNow:
3769 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003770 case MMX:
3771 Builder.defineMacro("__MMX__");
3772 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003773 break;
3774 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003775
3776 if (CPU >= CK_i486) {
3777 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3778 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3779 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3780 }
3781 if (CPU >= CK_i586)
3782 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003783}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003784
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003785bool X86TargetInfo::hasFeature(StringRef Feature) const {
3786 return llvm::StringSwitch<bool>(Feature)
3787 .Case("aes", HasAES)
3788 .Case("avx", SSELevel >= AVX)
3789 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003790 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003791 .Case("avx512cd", HasAVX512CD)
3792 .Case("avx512er", HasAVX512ER)
3793 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003794 .Case("avx512dq", HasAVX512DQ)
3795 .Case("avx512bw", HasAVX512BW)
3796 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003797 .Case("avx512vbmi", HasAVX512VBMI)
3798 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003799 .Case("bmi", HasBMI)
3800 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003801 .Case("clflushopt", HasCLFLUSHOPT)
3802 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003803 .Case("cx16", HasCX16)
3804 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003805 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003806 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003807 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003808 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003809 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003810 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3811 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3812 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003813 .Case("movbe", HasMOVBE)
3814 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003815 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003816 .Case("pcommit", HasPCOMMIT)
3817 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003818 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003819 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003820 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003821 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003822 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003823 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003824 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003825 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003826 .Case("sse", SSELevel >= SSE1)
3827 .Case("sse2", SSELevel >= SSE2)
3828 .Case("sse3", SSELevel >= SSE3)
3829 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003830 .Case("sse4.1", SSELevel >= SSE41)
3831 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003832 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003833 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003834 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003835 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003836 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3837 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003838 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003839 .Case("xsave", HasXSAVE)
3840 .Case("xsavec", HasXSAVEC)
3841 .Case("xsaves", HasXSAVES)
3842 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003843 .Default(false);
3844}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003845
Eric Christopherd9832702015-06-29 21:00:05 +00003846// We can't use a generic validation scheme for the features accepted here
3847// versus subtarget features accepted in the target attribute because the
3848// bitfield structure that's initialized in the runtime only supports the
3849// below currently rather than the full range of subtarget features. (See
3850// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3851bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3852 return llvm::StringSwitch<bool>(FeatureStr)
3853 .Case("cmov", true)
3854 .Case("mmx", true)
3855 .Case("popcnt", true)
3856 .Case("sse", true)
3857 .Case("sse2", true)
3858 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003859 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003860 .Case("sse4.1", true)
3861 .Case("sse4.2", true)
3862 .Case("avx", true)
3863 .Case("avx2", true)
3864 .Case("sse4a", true)
3865 .Case("fma4", true)
3866 .Case("xop", true)
3867 .Case("fma", true)
3868 .Case("avx512f", true)
3869 .Case("bmi", true)
3870 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003871 .Case("aes", true)
3872 .Case("pclmul", true)
3873 .Case("avx512vl", true)
3874 .Case("avx512bw", true)
3875 .Case("avx512dq", true)
3876 .Case("avx512cd", true)
3877 .Case("avx512er", true)
3878 .Case("avx512pf", true)
3879 .Case("avx512vbmi", true)
3880 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003881 .Default(false);
3882}
3883
Eli Friedman3fd920a2008-08-20 02:34:37 +00003884bool
Anders Carlsson58436352009-02-28 17:11:49 +00003885X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003886 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003887 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003888 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003889 // Constant constraints.
3890 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3891 // instructions.
3892 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3893 // x86_64 instructions.
3894 case 's':
3895 Info.setRequiresImmediate();
3896 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003897 case 'I':
3898 Info.setRequiresImmediate(0, 31);
3899 return true;
3900 case 'J':
3901 Info.setRequiresImmediate(0, 63);
3902 return true;
3903 case 'K':
3904 Info.setRequiresImmediate(-128, 127);
3905 return true;
3906 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003907 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003908 return true;
3909 case 'M':
3910 Info.setRequiresImmediate(0, 3);
3911 return true;
3912 case 'N':
3913 Info.setRequiresImmediate(0, 255);
3914 return true;
3915 case 'O':
3916 Info.setRequiresImmediate(0, 127);
3917 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003918 // Register constraints.
3919 case 'Y': // 'Y' is the first character for several 2-character constraints.
3920 // Shift the pointer to the second character of the constraint.
3921 Name++;
3922 switch (*Name) {
3923 default:
3924 return false;
3925 case '0': // First SSE register.
3926 case 't': // Any SSE register, when SSE2 is enabled.
3927 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3928 case 'm': // Any MMX register, when inter-unit moves enabled.
3929 Info.setAllowsRegister();
3930 return true;
3931 }
3932 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003933 // Constraint 'f' cannot be used for output operands.
3934 if (Info.ConstraintStr[0] == '=')
3935 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003936 Info.setAllowsRegister();
3937 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003938 case 'a': // eax.
3939 case 'b': // ebx.
3940 case 'c': // ecx.
3941 case 'd': // edx.
3942 case 'S': // esi.
3943 case 'D': // edi.
3944 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003945 case 't': // Top of floating point stack.
3946 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003947 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003948 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003949 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003950 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003951 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3952 case 'l': // "Index" registers: any general register that can be used as an
3953 // index in a base+index memory access.
3954 Info.setAllowsRegister();
3955 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003956 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003957 case 'C': // SSE floating point constant.
3958 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003959 return true;
3960 }
3961}
3962
Akira Hatanaka974131e2014-09-18 18:17:18 +00003963bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3964 unsigned Size) const {
3965 // Strip off constraint modifiers.
3966 while (Constraint[0] == '=' ||
3967 Constraint[0] == '+' ||
3968 Constraint[0] == '&')
3969 Constraint = Constraint.substr(1);
3970
3971 return validateOperandSize(Constraint, Size);
3972}
3973
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003974bool X86TargetInfo::validateInputSize(StringRef Constraint,
3975 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003976 return validateOperandSize(Constraint, Size);
3977}
3978
3979bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3980 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003981 switch (Constraint[0]) {
3982 default: break;
3983 case 'y':
3984 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003985 case 'f':
3986 case 't':
3987 case 'u':
3988 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003989 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003990 if (SSELevel >= AVX512F)
3991 // 512-bit zmm registers can be used if target supports AVX512F.
3992 return Size <= 512U;
3993 else if (SSELevel >= AVX)
3994 // 256-bit ymm registers can be used if target supports AVX.
3995 return Size <= 256U;
3996 return Size <= 128U;
3997 case 'Y':
3998 // 'Y' is the first character for several 2-character constraints.
3999 switch (Constraint[1]) {
4000 default: break;
4001 case 'm':
4002 // 'Ym' is synonymous with 'y'.
4003 return Size <= 64;
4004 case 'i':
4005 case 't':
4006 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4007 if (SSELevel >= AVX512F)
4008 return Size <= 512U;
4009 else if (SSELevel >= AVX)
4010 return Size <= 256U;
4011 return SSELevel >= SSE2 && Size <= 128U;
4012 }
4013
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004014 }
4015
4016 return true;
4017}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004018
Eli Friedman3fd920a2008-08-20 02:34:37 +00004019std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004020X86TargetInfo::convertConstraint(const char *&Constraint) const {
4021 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004022 case 'a': return std::string("{ax}");
4023 case 'b': return std::string("{bx}");
4024 case 'c': return std::string("{cx}");
4025 case 'd': return std::string("{dx}");
4026 case 'S': return std::string("{si}");
4027 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004028 case 'p': // address
4029 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004030 case 't': // top of floating point stack.
4031 return std::string("{st}");
4032 case 'u': // second from top of floating point stack.
4033 return std::string("{st(1)}"); // second from top of floating point stack.
4034 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004035 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004036 }
4037}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004038
Eli Friedman3fd920a2008-08-20 02:34:37 +00004039// X86-32 generic target
4040class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004041public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004042 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4043 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004044 DoubleAlign = LongLongAlign = 32;
4045 LongDoubleWidth = 96;
4046 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004047 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004048 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004049 SizeType = UnsignedInt;
4050 PtrDiffType = SignedInt;
4051 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004052 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004053
4054 // Use fpret for all types.
4055 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4056 (1 << TargetInfo::Double) |
4057 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004058
4059 // x86-32 has atomics up to 8 bytes
4060 // FIXME: Check that we actually have cmpxchg8b before setting
4061 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4062 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004063 }
Craig Topper3164f332014-03-11 03:39:26 +00004064 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004065 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004066 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004067
Craig Topper3164f332014-03-11 03:39:26 +00004068 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004069 if (RegNo == 0) return 0;
4070 if (RegNo == 1) return 2;
4071 return -1;
4072 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004073 bool validateOperandSize(StringRef Constraint,
4074 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004075 switch (Constraint[0]) {
4076 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004077 case 'R':
4078 case 'q':
4079 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004080 case 'a':
4081 case 'b':
4082 case 'c':
4083 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004084 case 'S':
4085 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004086 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004087 case 'A':
4088 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004089 }
4090
Akira Hatanaka974131e2014-09-18 18:17:18 +00004091 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004092 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004093};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004094
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004095class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4096public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004097 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4098 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004099
Craig Topper3164f332014-03-11 03:39:26 +00004100 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004101 unsigned Major, Minor, Micro;
4102 getTriple().getOSVersion(Major, Minor, Micro);
4103 // New NetBSD uses the default rounding mode.
4104 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4105 return X86_32TargetInfo::getFloatEvalMethod();
4106 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004107 return 1;
4108 }
4109};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004110
Eli Friedmane3aa4542009-07-05 18:47:56 +00004111class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4112public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004113 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4114 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004115 SizeType = UnsignedLong;
4116 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004117 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004118 }
4119};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004120
Eli Friedman9fa28852012-08-08 23:57:20 +00004121class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4122public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004123 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4124 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004125 SizeType = UnsignedLong;
4126 IntPtrType = SignedLong;
4127 PtrDiffType = SignedLong;
4128 }
4129};
Eli Friedman9fa28852012-08-08 23:57:20 +00004130
Torok Edwinb2b37c62009-06-30 17:10:35 +00004131class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004132public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004133 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4134 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004135 LongDoubleWidth = 128;
4136 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004137 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004138 MaxVectorAlign = 256;
4139 // The watchOS simulator uses the builtin bool type for Objective-C.
4140 llvm::Triple T = llvm::Triple(Triple);
4141 if (T.isWatchOS())
4142 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004143 SizeType = UnsignedLong;
4144 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004145 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004146 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004147 }
4148
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004149 bool handleTargetFeatures(std::vector<std::string> &Features,
4150 DiagnosticsEngine &Diags) override {
4151 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4152 Diags))
4153 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004154 // We now know the features we have: we can decide how to align vectors.
4155 MaxVectorAlign =
4156 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004157 return true;
4158 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004159};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004160
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004161// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004162class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004163public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004164 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4165 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004166 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004167 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004168 bool IsWinCOFF =
4169 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004170 resetDataLayout(IsWinCOFF
4171 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4172 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004173 }
Craig Topper3164f332014-03-11 03:39:26 +00004174 void getTargetDefines(const LangOptions &Opts,
4175 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004176 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4177 }
4178};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179
4180// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004181class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004182public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004183 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4184 const TargetOptions &Opts)
4185 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004186 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004187 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4188 }
Craig Topper3164f332014-03-11 03:39:26 +00004189 void getTargetDefines(const LangOptions &Opts,
4190 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004191 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4192 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4193 // The value of the following reflects processor type.
4194 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4195 // We lost the original triple, so we use the default.
4196 Builder.defineMacro("_M_IX86", "600");
4197 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004198};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004199
David Majnemerae1ed0e2015-05-28 04:36:18 +00004200static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004201 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4202 // supports __declspec natively under -fms-extensions, but we define a no-op
4203 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004204 if (Opts.MicrosoftExt)
4205 Builder.defineMacro("__declspec", "__declspec");
4206 else
4207 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4208
4209 if (!Opts.MicrosoftExt) {
4210 // Provide macros for all the calling convention keywords. Provide both
4211 // single and double underscore prefixed variants. These are available on
4212 // x64 as well as x86, even though they have no effect.
4213 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4214 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004215 std::string GCCSpelling = "__attribute__((__";
4216 GCCSpelling += CC;
4217 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004218 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4219 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4220 }
4221 }
4222}
4223
David Majnemerae1ed0e2015-05-28 04:36:18 +00004224static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4225 Builder.defineMacro("__MSVCRT__");
4226 Builder.defineMacro("__MINGW32__");
4227 addCygMingDefines(Opts, Builder);
4228}
4229
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004230// x86-32 MinGW target
4231class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4232public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004233 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4234 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004235 void getTargetDefines(const LangOptions &Opts,
4236 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004237 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004238 DefineStd(Builder, "WIN32", Opts);
4239 DefineStd(Builder, "WINNT", Opts);
4240 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004241 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004242 }
4243};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004244
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004245// x86-32 Cygwin target
4246class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4247public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004248 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4249 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004250 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004251 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004252 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 +00004253 }
Craig Topper3164f332014-03-11 03:39:26 +00004254 void getTargetDefines(const LangOptions &Opts,
4255 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004256 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004257 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004258 Builder.defineMacro("__CYGWIN__");
4259 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004260 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004261 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004262 if (Opts.CPlusPlus)
4263 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004264 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004265};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004266
Chris Lattnerb986aba2010-04-11 19:29:39 +00004267// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004268class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004269public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004270 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004271 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004272 }
Craig Topper3164f332014-03-11 03:39:26 +00004273 void getTargetDefines(const LangOptions &Opts,
4274 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004275 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004276 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004277 }
4278};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004279
Alexey Bataevc99b0492015-11-25 09:24:26 +00004280// X86-32 MCU target
4281class MCUX86_32TargetInfo : public X86_32TargetInfo {
4282public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004283 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4284 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004285 LongDoubleWidth = 64;
4286 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004287 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 +00004288 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004289 }
4290
4291 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4292 // On MCU we support only C calling convention.
4293 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4294 }
4295
4296 void getTargetDefines(const LangOptions &Opts,
4297 MacroBuilder &Builder) const override {
4298 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4299 Builder.defineMacro("__iamcu");
4300 Builder.defineMacro("__iamcu__");
4301 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004302
4303 bool allowsLargerPreferedTypeAlignment() const override {
4304 return false;
4305 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004306};
4307
Douglas Gregor9fabd852011-07-01 22:41:14 +00004308// RTEMS Target
4309template<typename Target>
4310class RTEMSTargetInfo : public OSTargetInfo<Target> {
4311protected:
Craig Topper3164f332014-03-11 03:39:26 +00004312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4313 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004314 // RTEMS defines; list based off of gcc output
4315
Douglas Gregor9fabd852011-07-01 22:41:14 +00004316 Builder.defineMacro("__rtems__");
4317 Builder.defineMacro("__ELF__");
4318 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004319
Douglas Gregor9fabd852011-07-01 22:41:14 +00004320public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004321 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4322 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004323 switch (Triple.getArch()) {
4324 default:
4325 case llvm::Triple::x86:
4326 // this->MCountName = ".mcount";
4327 break;
4328 case llvm::Triple::mips:
4329 case llvm::Triple::mipsel:
4330 case llvm::Triple::ppc:
4331 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004332 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004333 // this->MCountName = "_mcount";
4334 break;
4335 case llvm::Triple::arm:
4336 // this->MCountName = "__mcount";
4337 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004338 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004339 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004340};
4341
Douglas Gregor9fabd852011-07-01 22:41:14 +00004342// x86-32 RTEMS target
4343class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4344public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004345 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4346 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004347 SizeType = UnsignedLong;
4348 IntPtrType = SignedLong;
4349 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004350 }
Craig Topper3164f332014-03-11 03:39:26 +00004351 void getTargetDefines(const LangOptions &Opts,
4352 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004353 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4354 Builder.defineMacro("__INTEL__");
4355 Builder.defineMacro("__rtems__");
4356 }
4357};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004358
Eli Friedman3fd920a2008-08-20 02:34:37 +00004359// x86-64 generic target
4360class X86_64TargetInfo : public X86TargetInfo {
4361public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004362 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4363 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004364 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004365 bool IsWinCOFF =
4366 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004367 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004368 LongDoubleWidth = 128;
4369 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004370 LargeArrayMinWidth = 128;
4371 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004372 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004373 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4374 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4375 IntPtrType = IsX32 ? SignedInt : SignedLong;
4376 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004377 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004378 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004379
Eric Christopher917e9522014-11-18 22:36:15 +00004380 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004381 resetDataLayout(IsX32
4382 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4383 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4384 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004385
4386 // Use fpret only for long double.
4387 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004388
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004389 // Use fp2ret for _Complex long double.
4390 ComplexLongDoubleUsesFP2Ret = true;
4391
Charles Davisc7d5c942015-09-17 20:55:33 +00004392 // Make __builtin_ms_va_list available.
4393 HasBuiltinMSVaList = true;
4394
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004395 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004396 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004397 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004398 }
Craig Topper3164f332014-03-11 03:39:26 +00004399 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004400 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004401 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004402
Craig Topper3164f332014-03-11 03:39:26 +00004403 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004404 if (RegNo == 0) return 0;
4405 if (RegNo == 1) return 1;
4406 return -1;
4407 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004408
Craig Topper3164f332014-03-11 03:39:26 +00004409 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004410 switch (CC) {
4411 case CC_C:
4412 case CC_Swift:
4413 case CC_X86VectorCall:
4414 case CC_IntelOclBicc:
4415 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004416 case CC_PreserveMost:
4417 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004418 return CCCR_OK;
4419 default:
4420 return CCCR_Warning;
4421 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004422 }
4423
Craig Topper3164f332014-03-11 03:39:26 +00004424 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004425 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004426 }
4427
Pavel Chupinfd223e12014-08-04 12:39:43 +00004428 // for x32 we need it here explicitly
4429 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004430 unsigned getUnwindWordWidth() const override { return 64; }
4431 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004432
4433 bool validateGlobalRegisterVariable(StringRef RegName,
4434 unsigned RegSize,
4435 bool &HasSizeMismatch) const override {
4436 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4437 // handle.
4438 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4439 // Check that the register size is 64-bit.
4440 HasSizeMismatch = RegSize != 64;
4441 return true;
4442 }
4443
4444 // Check if the register is a 32-bit register the backend can handle.
4445 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4446 HasSizeMismatch);
4447 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004448};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004449
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004450// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004451class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004452public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004453 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4454 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004455 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004456 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004457 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004458 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004459 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004460 SizeType = UnsignedLongLong;
4461 PtrDiffType = SignedLongLong;
4462 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004463 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004464
Craig Topper3164f332014-03-11 03:39:26 +00004465 void getTargetDefines(const LangOptions &Opts,
4466 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004467 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004468 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004469 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004470
Craig Topper3164f332014-03-11 03:39:26 +00004471 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004472 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004473 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004474
Craig Topper3164f332014-03-11 03:39:26 +00004475 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004476 switch (CC) {
4477 case CC_X86StdCall:
4478 case CC_X86ThisCall:
4479 case CC_X86FastCall:
4480 return CCCR_Ignore;
4481 case CC_C:
4482 case CC_X86VectorCall:
4483 case CC_IntelOclBicc:
4484 case CC_X86_64SysV:
4485 return CCCR_OK;
4486 default:
4487 return CCCR_Warning;
4488 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004489 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004490};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004491
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004492// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004493class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004494public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004495 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4496 const TargetOptions &Opts)
4497 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004498 LongDoubleWidth = LongDoubleAlign = 64;
4499 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004500 }
Craig Topper3164f332014-03-11 03:39:26 +00004501 void getTargetDefines(const LangOptions &Opts,
4502 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004503 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4504 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004505 Builder.defineMacro("_M_X64", "100");
4506 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004507 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004508};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004509
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004510// x86-64 MinGW target
4511class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4512public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004513 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4514 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004515 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4516 // with x86 FP ops. Weird.
4517 LongDoubleWidth = LongDoubleAlign = 128;
4518 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4519 }
4520
Craig Topper3164f332014-03-11 03:39:26 +00004521 void getTargetDefines(const LangOptions &Opts,
4522 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004523 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004524 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004525 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004526 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004527
4528 // GCC defines this macro when it is using __gxx_personality_seh0.
4529 if (!Opts.SjLjExceptions)
4530 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004531 }
4532};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004533
Yaron Kerend030d112015-07-22 17:38:19 +00004534// x86-64 Cygwin target
4535class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4536public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004537 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4538 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004539 TLSSupported = false;
4540 WCharType = UnsignedShort;
4541 }
4542 void getTargetDefines(const LangOptions &Opts,
4543 MacroBuilder &Builder) const override {
4544 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4545 Builder.defineMacro("__x86_64__");
4546 Builder.defineMacro("__CYGWIN__");
4547 Builder.defineMacro("__CYGWIN64__");
4548 addCygMingDefines(Opts, Builder);
4549 DefineStd(Builder, "unix", Opts);
4550 if (Opts.CPlusPlus)
4551 Builder.defineMacro("_GNU_SOURCE");
4552
4553 // GCC defines this macro when it is using __gxx_personality_seh0.
4554 if (!Opts.SjLjExceptions)
4555 Builder.defineMacro("__SEH__");
4556 }
4557};
4558
Eli Friedman2857ccb2009-07-01 03:36:11 +00004559class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4560public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004561 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4562 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004563 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004564 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4565 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004566 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004567 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004568 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004569 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004570
4571 bool handleTargetFeatures(std::vector<std::string> &Features,
4572 DiagnosticsEngine &Diags) override {
4573 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4574 Diags))
4575 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004576 // We now know the features we have: we can decide how to align vectors.
4577 MaxVectorAlign =
4578 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004579 return true;
4580 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004581};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004582
Eli Friedman245f2292009-07-05 22:31:18 +00004583class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4584public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004585 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4586 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004587 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004588 Int64Type = SignedLongLong;
4589 }
4590};
Eli Friedman245f2292009-07-05 22:31:18 +00004591
Eli Friedman9fa28852012-08-08 23:57:20 +00004592class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4593public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004594 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4595 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004596 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004597 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004598 }
4599};
Tim Northover9bb857a2013-01-31 12:13:10 +00004600
Eli Friedmanf05b7722008-08-20 07:44:10 +00004601class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004602 // Possible FPU choices.
4603 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004604 VFP2FPU = (1 << 0),
4605 VFP3FPU = (1 << 1),
4606 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004607 NeonFPU = (1 << 3),
4608 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004609 };
4610
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004611 // Possible HWDiv features.
4612 enum HWDivMode {
4613 HWDivThumb = (1 << 0),
4614 HWDivARM = (1 << 1)
4615 };
4616
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004617 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004618 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004619 }
4620
4621 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4622 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004623
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004624 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004625
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004626 StringRef CPUProfile;
4627 StringRef CPUAttr;
4628
Rafael Espindolaeb265472013-08-21 21:59:03 +00004629 enum {
4630 FP_Default,
4631 FP_VFP,
4632 FP_Neon
4633 } FPMath;
4634
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004635 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004636 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004637 unsigned ArchProfile;
4638 unsigned ArchVersion;
4639
Bernard Ogdenda13af32013-10-24 18:32:51 +00004640 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004641
Logan Chien57086ce2012-10-10 06:56:20 +00004642 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004643 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004644
4645 // Initialized via features.
4646 unsigned SoftFloat : 1;
4647 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004648
Bernard Ogden18b57012013-10-29 09:47:51 +00004649 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004650 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004651 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004652 unsigned Unaligned : 1;
4653
4654 enum {
4655 LDREX_B = (1 << 0), /// byte (8-bit)
4656 LDREX_H = (1 << 1), /// half (16-bit)
4657 LDREX_W = (1 << 2), /// word (32-bit)
4658 LDREX_D = (1 << 3), /// double (64-bit)
4659 };
4660
4661 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004662
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004663 // ACLE 6.5.1 Hardware floating point
4664 enum {
4665 HW_FP_HP = (1 << 1), /// half (16-bit)
4666 HW_FP_SP = (1 << 2), /// single (32-bit)
4667 HW_FP_DP = (1 << 3), /// double (64-bit)
4668 };
4669 uint32_t HW_FP;
4670
Chris Lattner5cc15e02010-03-03 19:03:45 +00004671 static const Builtin::Info BuiltinInfo[];
4672
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004673 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004674 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004675
4676 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004677 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004678
Renato Golin9ba39232015-02-27 16:35:48 +00004679 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4680 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4681 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004682 SizeType = UnsignedLong;
4683 else
4684 SizeType = UnsignedInt;
4685
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004686 switch (T.getOS()) {
4687 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004688 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004689 break;
4690 case llvm::Triple::Win32:
4691 WCharType = UnsignedShort;
4692 break;
4693 case llvm::Triple::Linux:
4694 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004695 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4696 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004697 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004698 }
4699
4700 UseBitFieldTypeAlignment = true;
4701
4702 ZeroLengthBitfieldBoundary = 0;
4703
Tim Northover147cd2f2014-10-14 22:12:21 +00004704 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4705 // so set preferred for small types to 32.
4706 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004707 resetDataLayout(BigEndian
4708 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4709 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004710 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004711 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004712 resetDataLayout("e"
4713 "-m:w"
4714 "-p:32:32"
4715 "-i64:64"
4716 "-v128:64:128"
4717 "-a:0:32"
4718 "-n32"
4719 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004720 } else if (T.isOSNaCl()) {
4721 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004722 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004723 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004724 resetDataLayout(BigEndian
4725 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4726 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004727 }
4728
4729 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004730 }
4731
Tim Northover5627d392015-10-30 16:30:45 +00004732 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004733 const llvm::Triple &T = getTriple();
4734
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004735 IsAAPCS = false;
4736
Tim Northover5627d392015-10-30 16:30:45 +00004737 if (IsAAPCS16)
4738 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4739 else
4740 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004741
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004742 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004743 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004744 SizeType = UnsignedInt;
4745 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004746 SizeType = UnsignedLong;
4747
4748 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4749 WCharType = SignedInt;
4750
4751 // Do not respect the alignment of bit-field types when laying out
4752 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4753 UseBitFieldTypeAlignment = false;
4754
4755 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4756 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4757 /// gcc.
4758 ZeroLengthBitfieldBoundary = 32;
4759
Tim Northover5627d392015-10-30 16:30:45 +00004760 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4761 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004762 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004763 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004764 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004765 BigEndian
4766 ? "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 +00004767 : "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 +00004768 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004769 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004770 BigEndian
4771 ? "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 +00004772 : "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 +00004773
4774 // FIXME: Override "preferred align" for double and long long.
4775 }
4776
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004777 void setArchInfo() {
4778 StringRef ArchName = getTriple().getArchName();
4779
Renato Goline84b0002015-10-08 16:43:26 +00004780 ArchISA = llvm::ARM::parseArchISA(ArchName);
4781 CPU = llvm::ARM::getDefaultCPU(ArchName);
4782 unsigned AK = llvm::ARM::parseArch(ArchName);
4783 if (AK != llvm::ARM::AK_INVALID)
4784 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004785 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004786 }
4787
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004788 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004789 StringRef SubArch;
4790
4791 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004792 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004793 SubArch = llvm::ARM::getSubArch(ArchKind);
4794 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4795 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004796
4797 // cache CPU related strings
4798 CPUAttr = getCPUAttr();
4799 CPUProfile = getCPUProfile();
4800 }
4801
4802 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004803 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004804 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004805 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004806 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4807 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004808 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004809 if (ArchProfile == llvm::ARM::PK_M) {
4810 MaxAtomicPromoteWidth = 32;
4811 if (ShouldUseInlineAtomic)
4812 MaxAtomicInlineWidth = 32;
4813 }
4814 else {
4815 MaxAtomicPromoteWidth = 64;
4816 if (ShouldUseInlineAtomic)
4817 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004818 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004819 }
4820
4821 bool isThumb() const {
4822 return (ArchISA == llvm::ARM::IK_THUMB);
4823 }
4824
4825 bool supportsThumb() const {
4826 return CPUAttr.count('T') || ArchVersion >= 6;
4827 }
4828
4829 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004830 return CPUAttr.equals("6T2") ||
4831 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004832 }
4833
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004834 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004835 // For most sub-arches, the build attribute CPU name is enough.
4836 // For Cortex variants, it's slightly different.
4837 switch(ArchKind) {
4838 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004839 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004842 case llvm::ARM::AK_ARMV7S:
4843 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004844 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 return "7A";
4846 case llvm::ARM::AK_ARMV7R:
4847 return "7R";
4848 case llvm::ARM::AK_ARMV7M:
4849 return "7M";
4850 case llvm::ARM::AK_ARMV7EM:
4851 return "7EM";
4852 case llvm::ARM::AK_ARMV8A:
4853 return "8A";
4854 case llvm::ARM::AK_ARMV8_1A:
4855 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004856 case llvm::ARM::AK_ARMV8_2A:
4857 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004858 case llvm::ARM::AK_ARMV8MBaseline:
4859 return "8M_BASE";
4860 case llvm::ARM::AK_ARMV8MMainline:
4861 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004862 }
4863 }
4864
4865 StringRef getCPUProfile() const {
4866 switch(ArchProfile) {
4867 case llvm::ARM::PK_A:
4868 return "A";
4869 case llvm::ARM::PK_R:
4870 return "R";
4871 case llvm::ARM::PK_M:
4872 return "M";
4873 default:
4874 return "";
4875 }
4876 }
4877
Chris Lattner17df24e2008-04-21 18:56:49 +00004878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004879 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4880 bool IsBigEndian)
4881 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4882 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004883 BigEndian = IsBigEndian;
4884
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004885 switch (getTriple().getOS()) {
4886 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004887 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004888 break;
4889 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004890 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004891 break;
4892 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004893
Renato Goline84b0002015-10-08 16:43:26 +00004894 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004895 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004896
Chris Lattner1a8f3942010-04-23 16:29:58 +00004897 // {} in inline assembly are neon specifiers, not assembly variant
4898 // specifiers.
4899 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004900
Eric Christopher0e261882014-12-05 01:06:59 +00004901 // FIXME: This duplicates code from the driver that sets the -target-abi
4902 // option - this code is used if -target-abi isn't passed and should
4903 // be unified in some way.
4904 if (Triple.isOSBinFormatMachO()) {
4905 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4906 // the frontend matches that.
4907 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4908 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004909 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004910 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004911 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004912 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004913 } else {
4914 setABI("apcs-gnu");
4915 }
4916 } else if (Triple.isOSWindows()) {
4917 // FIXME: this is invalid for WindowsCE
4918 setABI("aapcs");
4919 } else {
4920 // Select the default based on the platform.
4921 switch (Triple.getEnvironment()) {
4922 case llvm::Triple::Android:
4923 case llvm::Triple::GNUEABI:
4924 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004925 case llvm::Triple::MuslEABI:
4926 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004927 setABI("aapcs-linux");
4928 break;
4929 case llvm::Triple::EABIHF:
4930 case llvm::Triple::EABI:
4931 setABI("aapcs");
4932 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004933 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004934 setABI("apcs-gnu");
4935 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004936 default:
4937 if (Triple.getOS() == llvm::Triple::NetBSD)
4938 setABI("apcs-gnu");
4939 else
4940 setABI("aapcs");
4941 break;
4942 }
4943 }
John McCall86353412010-08-21 22:46:04 +00004944
4945 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004946 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004947
Renato Golin15b86152015-07-03 16:41:13 +00004948 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004949 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004950
James Molloya7139222012-03-12 09:14:10 +00004951 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004952 // the alignment of the zero-length bitfield is greater than the member
4953 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004954 // zero length bitfield.
4955 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004956
4957 if (Triple.getOS() == llvm::Triple::Linux ||
4958 Triple.getOS() == llvm::Triple::UnknownOS)
4959 this->MCountName =
4960 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004961 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004962
Alp Toker4925ba72014-06-07 23:30:42 +00004963 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004964
Craig Topper3164f332014-03-11 03:39:26 +00004965 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004966 ABI = Name;
4967
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004968 // The defaults (above) are for AAPCS, check if we need to change them.
4969 //
4970 // FIXME: We need support for -meabi... we could just mangle it into the
4971 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004972 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004973 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004974 return true;
4975 }
4976 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4977 setABIAAPCS();
4978 return true;
4979 }
4980 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004981 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004982
Renato Golinf5c4dec2015-05-27 13:33:00 +00004983 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004984 bool
4985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4986 StringRef CPU,
4987 const std::vector<std::string> &FeaturesVec) const override {
4988
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004989 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004990 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004991
4992 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004993 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004994 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4995
4996 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004997 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004998 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
4999
5000 for (const char *Feature : TargetFeatures)
5001 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005002 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005003
Eric Christopher007b0a02015-08-28 22:32:01 +00005004 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005005 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005006
Craig Topper3164f332014-03-11 03:39:26 +00005007 bool handleTargetFeatures(std::vector<std::string> &Features,
5008 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005009 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005010 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005011 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005012 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005013 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005014 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005015 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005016
Ranjeet Singhac08e532015-06-24 23:39:25 +00005017 // This does not diagnose illegal cases like having both
5018 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5019 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005020 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005021 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005022 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005023 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005024 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005025 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005026 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005027 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005028 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005029 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005030 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005031 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005032 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005033 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005034 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005035 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005036 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005037 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005038 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005039 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005040 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005041 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005042 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005043 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005044 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005045 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005046 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005047 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005048 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005049 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005050 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005051 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005052 } else if (Feature == "+strict-align") {
5053 Unaligned = 0;
5054 } else if (Feature == "+fp16") {
5055 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005056 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005057 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005058 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005059
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005060 switch (ArchVersion) {
5061 case 6:
5062 if (ArchProfile == llvm::ARM::PK_M)
5063 LDREX = 0;
5064 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5065 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5066 else
5067 LDREX = LDREX_W;
5068 break;
5069 case 7:
5070 if (ArchProfile == llvm::ARM::PK_M)
5071 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5072 else
5073 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5074 break;
5075 case 8:
5076 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5077 }
5078
Rafael Espindolaeb265472013-08-21 21:59:03 +00005079 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5080 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5081 return false;
5082 }
5083
5084 if (FPMath == FP_Neon)
5085 Features.push_back("+neonfp");
5086 else if (FPMath == FP_VFP)
5087 Features.push_back("-neonfp");
5088
Daniel Dunbar893d4752009-12-19 04:15:38 +00005089 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005090 auto Feature =
5091 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5092 if (Feature != Features.end())
5093 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005094
Rafael Espindolaeb265472013-08-21 21:59:03 +00005095 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005096 }
5097
Craig Topper3164f332014-03-11 03:39:26 +00005098 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005099 return llvm::StringSwitch<bool>(Feature)
5100 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005101 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005102 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005104 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005105 .Case("hwdiv", HWDiv & HWDivThumb)
5106 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005107 .Default(false);
5108 }
Renato Golin15b86152015-07-03 16:41:13 +00005109
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005110 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005111 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005112 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005113
Renato Golin15b86152015-07-03 16:41:13 +00005114 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005115 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005116 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005117 CPU = Name;
5118 return true;
5119 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005120
Craig Topper3164f332014-03-11 03:39:26 +00005121 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122
Craig Topper3164f332014-03-11 03:39:26 +00005123 void getTargetDefines(const LangOptions &Opts,
5124 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005125 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005126 Builder.defineMacro("__arm");
5127 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005128 // For bare-metal none-eabi.
5129 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5130 getTriple().getEnvironment() == llvm::Triple::EABI)
5131 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005132
Chris Lattnerecd49032009-03-02 22:27:17 +00005133 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005134 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005135
5136 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5137 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005138 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005139 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5140
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005141 if (!CPUAttr.empty())
5142 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005143
5144 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005145 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005146 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005147
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005148 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005149 // ACLE 6.5.7 Crypto Extension
5150 if (Crypto)
5151 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5152 // ACLE 6.5.8 CRC32 Extension
5153 if (CRC)
5154 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5155 // ACLE 6.5.10 Numeric Maximum and Minimum
5156 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5157 // ACLE 6.5.9 Directed Rounding
5158 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005159 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005160
5161 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5162 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005163 // NOTE that the default profile is assumed to be 'A'
5164 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005165 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5166
Bradley Smithf4affc12016-03-03 13:52:22 +00005167 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5168 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5169 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5170 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005171 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005172 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005173 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005174 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5175
5176 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5177 // instruction set such as ARM or Thumb.
5178 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5179
5180 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5181
5182 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005183 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005184 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005185
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005186 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005187 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005188 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005189
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005190 // ACLE 6.4.4 LDREX/STREX
5191 if (LDREX)
5192 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5193
5194 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005195 if (ArchVersion == 5 ||
5196 (ArchVersion == 6 && CPUProfile != "M") ||
5197 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005198 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5199
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005200 // ACLE 6.5.1 Hardware Floating Point
5201 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005202 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005203
Yi Konga44c4d72014-06-27 21:25:42 +00005204 // ACLE predefines.
5205 Builder.defineMacro("__ARM_ACLE", "200");
5206
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005207 // FP16 support (we currently only support IEEE format).
5208 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5209 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5210
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005211 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005212 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005213 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5214
Mike Stump9d54bd72009-04-08 02:07:04 +00005215 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005216
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005217 // FIXME: It's more complicated than this and we don't really support
5218 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005219 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005220 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005221 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005222
David Tweed8f676532012-10-25 13:33:01 +00005223 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005224 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005225 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005226 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005227 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005228 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005229 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005230
Tim Northover28fc0e12016-04-28 13:59:55 +00005231 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5232 ABI == "aapcs16")
5233 Builder.defineMacro("__ARM_PCS_VFP", "1");
5234
Daniel Dunbar893d4752009-12-19 04:15:38 +00005235 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005236 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005237
Zijiao Ma56a83722016-08-17 02:13:33 +00005238 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005239 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005240
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005241 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005242 Builder.defineMacro("__THUMBEL__");
5243 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005244 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005245 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005246 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005247
5248 // ACLE 6.4.9 32-bit SIMD instructions
5249 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5250 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5251
5252 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005253 if (((HWDiv & HWDivThumb) && isThumb()) ||
5254 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005255 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005256 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005257 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005258
5259 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005260 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005261
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005262 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005263 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005264 if (FPU & VFP2FPU)
5265 Builder.defineMacro("__ARM_VFPV2__");
5266 if (FPU & VFP3FPU)
5267 Builder.defineMacro("__ARM_VFPV3__");
5268 if (FPU & VFP4FPU)
5269 Builder.defineMacro("__ARM_VFPV4__");
5270 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005271
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005272 // This only gets set when Neon instructions are actually available, unlike
5273 // the VFP define, hence the soft float and arch check. This is subtly
5274 // different from gcc, we follow the intent which was that it should be set
5275 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005276 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005277 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005278 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 // current AArch32 NEON implementations do not support double-precision
5280 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005281 Builder.defineMacro("__ARM_NEON_FP",
5282 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005283 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005284
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005285 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5286 Opts.ShortWChar ? "2" : "4");
5287
5288 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5289 Opts.ShortEnums ? "1" : "4");
5290
Bradley Smithf4affc12016-03-03 13:52:22 +00005291 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005292 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5296 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005297
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005298 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005299 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005300 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 }
5302
5303 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005304 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005305 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5306 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005307 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005308 }
5309
5310 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005311 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005312 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005313
5314 if (Opts.UnsafeFPMath)
5315 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005316
5317 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5318 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005319 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005320
Craig Topper6c03a542015-10-19 04:51:35 +00005321 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5322 return llvm::makeArrayRef(BuiltinInfo,
5323 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005324 }
Craig Topper3164f332014-03-11 03:39:26 +00005325 bool isCLZForZeroUndef() const override { return false; }
5326 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005327 return IsAAPCS
5328 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005329 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5330 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005331 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005332 ArrayRef<const char *> getGCCRegNames() const override;
5333 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005334 bool validateAsmConstraint(const char *&Name,
5335 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005336 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005337 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005338 case 'l': // r0-r7
5339 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005340 case 't': // VFP Floating point register single precision
5341 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005342 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005343 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005344 case 'I':
5345 case 'J':
5346 case 'K':
5347 case 'L':
5348 case 'M':
5349 // FIXME
5350 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005351 case 'Q': // A memory address that is a single base register.
5352 Info.setAllowsMemory();
5353 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005354 case 'U': // a memory reference...
5355 switch (Name[1]) {
5356 case 'q': // ...ARMV4 ldrsb
5357 case 'v': // ...VFP load/store (reg+constant offset)
5358 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005359 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005360 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005361 case 'n': // valid address for Neon doubleword vector load/store
5362 case 'm': // valid address for Neon element and structure load/store
5363 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005364 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005365 Info.setAllowsMemory();
5366 Name++;
5367 return true;
5368 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005369 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005370 return false;
5371 }
Craig Topper3164f332014-03-11 03:39:26 +00005372 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005373 std::string R;
5374 switch (*Constraint) {
5375 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005376 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005377 Constraint++;
5378 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005379 case 'p': // 'p' should be translated to 'r' by default.
5380 R = std::string("r");
5381 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005382 default:
5383 return std::string(1, *Constraint);
5384 }
5385 return R;
5386 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005387 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005388 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005389 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005390 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005391 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005392
Bill Wendling9d1ee112012-10-25 23:28:48 +00005393 // Strip off constraint modifiers.
5394 while (Constraint[0] == '=' ||
5395 Constraint[0] == '+' ||
5396 Constraint[0] == '&')
5397 Constraint = Constraint.substr(1);
5398
5399 switch (Constraint[0]) {
5400 default: break;
5401 case 'r': {
5402 switch (Modifier) {
5403 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005404 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005405 case 'q':
5406 // A register of size 32 cannot fit a vector type.
5407 return false;
5408 }
5409 }
5410 }
5411
5412 return true;
5413 }
Craig Topper3164f332014-03-11 03:39:26 +00005414 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005415 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005416 return "";
5417 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005418
Craig Topper3164f332014-03-11 03:39:26 +00005419 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005420 switch (CC) {
5421 case CC_AAPCS:
5422 case CC_AAPCS_VFP:
5423 case CC_Swift:
5424 return CCCR_OK;
5425 default:
5426 return CCCR_Warning;
5427 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005428 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005429
Craig Topper3164f332014-03-11 03:39:26 +00005430 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005431 if (RegNo == 0) return 0;
5432 if (RegNo == 1) return 1;
5433 return -1;
5434 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005435
5436 bool hasSjLjLowering() const override {
5437 return true;
5438 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005439};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005440
Rafael Espindolaeb265472013-08-21 21:59:03 +00005441bool ARMTargetInfo::setFPMath(StringRef Name) {
5442 if (Name == "neon") {
5443 FPMath = FP_Neon;
5444 return true;
5445 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5446 Name == "vfp4") {
5447 FPMath = FP_VFP;
5448 return true;
5449 }
5450 return false;
5451}
5452
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005453const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005454 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005455 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005456 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5457
5458 // Float registers
5459 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5460 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5461 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005462 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005463
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005464 // Double registers
5465 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5466 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005467 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5468 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005469
5470 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005471 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5472 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005473};
5474
Craig Topperf054e3a2015-10-19 03:52:27 +00005475ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5476 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005477}
5478
5479const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005480 { { "a1" }, "r0" },
5481 { { "a2" }, "r1" },
5482 { { "a3" }, "r2" },
5483 { { "a4" }, "r3" },
5484 { { "v1" }, "r4" },
5485 { { "v2" }, "r5" },
5486 { { "v3" }, "r6" },
5487 { { "v4" }, "r7" },
5488 { { "v5" }, "r8" },
5489 { { "v6", "rfp" }, "r9" },
5490 { { "sl" }, "r10" },
5491 { { "fp" }, "r11" },
5492 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005493 { { "r13" }, "sp" },
5494 { { "r14" }, "lr" },
5495 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005496 // The S, D and Q registers overlap, but aren't really aliases; we
5497 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005498};
5499
Craig Topperf054e3a2015-10-19 03:52:27 +00005500ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5501 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005502}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005503
5504const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005505#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005506 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005507#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5508 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005509#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005510
Craig Topper07d3b622015-08-07 05:14:44 +00005511#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005512 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005513#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005514 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005515#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5516 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005517#include "clang/Basic/BuiltinsARM.def"
5518};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005519
5520class ARMleTargetInfo : public ARMTargetInfo {
5521public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005522 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5523 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005524 void getTargetDefines(const LangOptions &Opts,
5525 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005526 Builder.defineMacro("__ARMEL__");
5527 ARMTargetInfo::getTargetDefines(Opts, Builder);
5528 }
5529};
5530
5531class ARMbeTargetInfo : public ARMTargetInfo {
5532public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005533 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5534 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005535 void getTargetDefines(const LangOptions &Opts,
5536 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005537 Builder.defineMacro("__ARMEB__");
5538 Builder.defineMacro("__ARM_BIG_ENDIAN");
5539 ARMTargetInfo::getTargetDefines(Opts, Builder);
5540 }
5541};
Chris Lattner17df24e2008-04-21 18:56:49 +00005542
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005543class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5544 const llvm::Triple Triple;
5545public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005546 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5547 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005548 WCharType = UnsignedShort;
5549 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005550 }
5551 void getVisualStudioDefines(const LangOptions &Opts,
5552 MacroBuilder &Builder) const {
5553 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5554
5555 // FIXME: this is invalid for WindowsCE
5556 Builder.defineMacro("_M_ARM_NT", "1");
5557 Builder.defineMacro("_M_ARMT", "_M_ARM");
5558 Builder.defineMacro("_M_THUMB", "_M_ARM");
5559
5560 assert((Triple.getArch() == llvm::Triple::arm ||
5561 Triple.getArch() == llvm::Triple::thumb) &&
5562 "invalid architecture for Windows ARM target info");
5563 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5564 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5565
5566 // TODO map the complete set of values
5567 // 31: VFPv3 40: VFPv4
5568 Builder.defineMacro("_M_ARM_FP", "31");
5569 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005570 BuiltinVaListKind getBuiltinVaListKind() const override {
5571 return TargetInfo::CharPtrBuiltinVaList;
5572 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005573 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5574 switch (CC) {
5575 case CC_X86StdCall:
5576 case CC_X86ThisCall:
5577 case CC_X86FastCall:
5578 case CC_X86VectorCall:
5579 return CCCR_Ignore;
5580 case CC_C:
5581 return CCCR_OK;
5582 default:
5583 return CCCR_Warning;
5584 }
5585 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005586};
5587
5588// Windows ARM + Itanium C++ ABI Target
5589class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005591 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5592 const TargetOptions &Opts)
5593 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005594 TheCXXABI.set(TargetCXXABI::GenericARM);
5595 }
5596
5597 void getTargetDefines(const LangOptions &Opts,
5598 MacroBuilder &Builder) const override {
5599 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5600
5601 if (Opts.MSVCCompat)
5602 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5603 }
5604};
5605
5606// Windows ARM, MS (C++) ABI
5607class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5608public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005609 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5610 const TargetOptions &Opts)
5611 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005612 TheCXXABI.set(TargetCXXABI::Microsoft);
5613 }
5614
5615 void getTargetDefines(const LangOptions &Opts,
5616 MacroBuilder &Builder) const override {
5617 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5618 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5619 }
5620};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005621
Yaron Keren321249c2015-07-15 13:32:23 +00005622// ARM MinGW target
5623class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5624public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005625 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5626 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005627 TheCXXABI.set(TargetCXXABI::GenericARM);
5628 }
5629
5630 void getTargetDefines(const LangOptions &Opts,
5631 MacroBuilder &Builder) const override {
5632 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5633 DefineStd(Builder, "WIN32", Opts);
5634 DefineStd(Builder, "WINNT", Opts);
5635 Builder.defineMacro("_ARM_");
5636 addMinGWDefines(Opts, Builder);
5637 }
5638};
5639
5640// ARM Cygwin target
5641class CygwinARMTargetInfo : public ARMleTargetInfo {
5642public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005643 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5644 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005645 TLSSupported = false;
5646 WCharType = UnsignedShort;
5647 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005648 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005649 }
5650 void getTargetDefines(const LangOptions &Opts,
5651 MacroBuilder &Builder) const override {
5652 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5653 Builder.defineMacro("_ARM_");
5654 Builder.defineMacro("__CYGWIN__");
5655 Builder.defineMacro("__CYGWIN32__");
5656 DefineStd(Builder, "unix", Opts);
5657 if (Opts.CPlusPlus)
5658 Builder.defineMacro("_GNU_SOURCE");
5659 }
5660};
5661
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005662class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005663protected:
Craig Topper3164f332014-03-11 03:39:26 +00005664 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5665 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005666 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005667 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005668
Torok Edwinb2b37c62009-06-30 17:10:35 +00005669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005670 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5671 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005672 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005673 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005674 // FIXME: This should be based off of the target features in
5675 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005676 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005677
Tim Northoverd88ecb32016-01-27 19:32:40 +00005678 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005679 // Darwin on iOS uses a variant of the ARM C++ ABI.
5680 TheCXXABI.set(TargetCXXABI::WatchOS);
5681
5682 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5683 // size_t is long, it's a bit weird for it to be int.
5684 PtrDiffType = SignedLong;
5685
5686 // BOOL should be a real boolean on the new ABI
5687 UseSignedCharForObjCBool = false;
5688 } else
5689 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005690 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005691};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005692
Tim Northover573cbee2014-05-24 12:52:07 +00005693class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005694 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005695 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5696 static const char *const GCCRegNames[];
5697
James Molloy75f5f9e2014-04-16 15:33:48 +00005698 enum FPUModeEnum {
5699 FPUMode,
5700 NeonMode
5701 };
5702
5703 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005704 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005705 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005706 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005707 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005708
Tim Northovera2ee4332014-03-29 15:09:45 +00005709 static const Builtin::Info BuiltinInfo[];
5710
5711 std::string ABI;
5712
5713public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005714 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005715 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005716 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5717 WCharType = SignedInt;
5718
5719 // NetBSD apparently prefers consistency across ARM targets to consistency
5720 // across 64-bit targets.
5721 Int64Type = SignedLongLong;
5722 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005723 } else {
5724 WCharType = UnsignedInt;
5725 Int64Type = SignedLong;
5726 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005727 }
5728
Tim Northovera2ee4332014-03-29 15:09:45 +00005729 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005730 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005731 MaxAtomicInlineWidth = 128;
5732 MaxAtomicPromoteWidth = 128;
5733
Tim Northovera6a19f12015-02-06 01:25:07 +00005734 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005735 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5736
Tim Northovera2ee4332014-03-29 15:09:45 +00005737 // {} in inline assembly are neon specifiers, not assembly variant
5738 // specifiers.
5739 NoAsmVariants = true;
5740
Tim Northover7ad87af2015-01-16 18:44:04 +00005741 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5742 // contributes to the alignment of the containing aggregate in the same way
5743 // a plain (non bit-field) member of that type would, without exception for
5744 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005745 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005746 UseZeroLengthBitfieldAlignment = true;
5747
Tim Northover573cbee2014-05-24 12:52:07 +00005748 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005749 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005750
5751 if (Triple.getOS() == llvm::Triple::Linux ||
5752 Triple.getOS() == llvm::Triple::UnknownOS)
5753 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005754 }
5755
Alp Toker4925ba72014-06-07 23:30:42 +00005756 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005757 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005758 if (Name != "aapcs" && Name != "darwinpcs")
5759 return false;
5760
5761 ABI = Name;
5762 return true;
5763 }
5764
David Blaikie1cbb9712014-11-14 19:09:44 +00005765 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005766 return Name == "generic" ||
5767 llvm::AArch64::parseCPUArch(Name) !=
5768 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005769 }
5770
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005771 void getTargetDefines(const LangOptions &Opts,
5772 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005773 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005774 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005775
5776 // Target properties.
5777 Builder.defineMacro("_LP64");
5778 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005779
5780 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5781 Builder.defineMacro("__ARM_ACLE", "200");
5782 Builder.defineMacro("__ARM_ARCH", "8");
5783 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5784
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005785 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005786 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005787 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005788
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005789 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5790 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5791 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5792 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005793 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005794 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5795 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005796
5797 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5798
5799 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005800 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005801
5802 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5803 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005804 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5805 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005806
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005807 if (Opts.UnsafeFPMath)
5808 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005809
5810 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5811
5812 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5813 Opts.ShortEnums ? "1" : "4");
5814
James Molloy75f5f9e2014-04-16 15:33:48 +00005815 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005816 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005817 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005818 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005819 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005820
Bradley Smith418c5932014-05-02 15:17:51 +00005821 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005822 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005823
James Molloy75f5f9e2014-04-16 15:33:48 +00005824 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5826
5827 if (Unaligned)
5828 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005829
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005830 if (V8_1A)
5831 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5832
Reid Klecknerd167d422015-05-06 15:31:46 +00005833 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5834 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5835 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5836 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5837 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005838 }
5839
Craig Topper6c03a542015-10-19 04:51:35 +00005840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5841 return llvm::makeArrayRef(BuiltinInfo,
5842 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005843 }
5844
David Blaikie1cbb9712014-11-14 19:09:44 +00005845 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005846 return Feature == "aarch64" ||
5847 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005848 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005849 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005850 }
5851
James Molloy5e73df52014-04-16 15:06:20 +00005852 bool handleTargetFeatures(std::vector<std::string> &Features,
5853 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005854 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005855 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005856 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005857 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005858 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005859
Eric Christopher610fe112015-08-26 08:21:55 +00005860 for (const auto &Feature : Features) {
5861 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005862 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005863 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005864 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005865 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005866 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005867 if (Feature == "+strict-align")
5868 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005869 if (Feature == "+v8.1a")
5870 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005871 }
5872
James Y Knightb214cbc2016-03-04 19:00:41 +00005873 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005874
5875 return true;
5876 }
5877
John McCall477f2bb2016-03-03 06:39:32 +00005878 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5879 switch (CC) {
5880 case CC_C:
5881 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005882 case CC_PreserveMost:
5883 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005884 return CCCR_OK;
5885 default:
5886 return CCCR_Warning;
5887 }
5888 }
5889
David Blaikie1cbb9712014-11-14 19:09:44 +00005890 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005891
David Blaikie1cbb9712014-11-14 19:09:44 +00005892 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005893 return TargetInfo::AArch64ABIBuiltinVaList;
5894 }
5895
Craig Topperf054e3a2015-10-19 03:52:27 +00005896 ArrayRef<const char *> getGCCRegNames() const override;
5897 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005898
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005899 bool validateAsmConstraint(const char *&Name,
5900 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005901 switch (*Name) {
5902 default:
5903 return false;
5904 case 'w': // Floating point and SIMD registers (V0-V31)
5905 Info.setAllowsRegister();
5906 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005907 case 'I': // Constant that can be used with an ADD instruction
5908 case 'J': // Constant that can be used with a SUB instruction
5909 case 'K': // Constant that can be used with a 32-bit logical instruction
5910 case 'L': // Constant that can be used with a 64-bit logical instruction
5911 case 'M': // Constant that can be used as a 32-bit MOV immediate
5912 case 'N': // Constant that can be used as a 64-bit MOV immediate
5913 case 'Y': // Floating point constant zero
5914 case 'Z': // Integer constant zero
5915 return true;
5916 case 'Q': // A memory reference with base register and no offset
5917 Info.setAllowsMemory();
5918 return true;
5919 case 'S': // A symbolic address
5920 Info.setAllowsRegister();
5921 return true;
5922 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005923 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5924 // Utf: A memory address suitable for ldp/stp in TF mode.
5925 // Usa: An absolute symbolic address.
5926 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5927 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005928 case 'z': // Zero register, wzr or xzr
5929 Info.setAllowsRegister();
5930 return true;
5931 case 'x': // Floating point and SIMD registers (V0-V15)
5932 Info.setAllowsRegister();
5933 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005934 }
5935 return false;
5936 }
5937
Akira Hatanaka987f1862014-08-22 06:05:21 +00005938 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005939 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005940 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005941 // Strip off constraint modifiers.
5942 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5943 Constraint = Constraint.substr(1);
5944
5945 switch (Constraint[0]) {
5946 default:
5947 return true;
5948 case 'z':
5949 case 'r': {
5950 switch (Modifier) {
5951 case 'x':
5952 case 'w':
5953 // For now assume that the person knows what they're
5954 // doing with the modifier.
5955 return true;
5956 default:
5957 // By default an 'r' constraint will be in the 'x'
5958 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005959 if (Size == 64)
5960 return true;
5961
5962 SuggestedModifier = "w";
5963 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005964 }
5965 }
5966 }
5967 }
5968
David Blaikie1cbb9712014-11-14 19:09:44 +00005969 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005970
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005971 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005972 if (RegNo == 0)
5973 return 0;
5974 if (RegNo == 1)
5975 return 1;
5976 return -1;
5977 }
5978};
5979
Tim Northover573cbee2014-05-24 12:52:07 +00005980const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005981 // 32-bit Integer registers
5982 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5983 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5984 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5985
5986 // 64-bit Integer registers
5987 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5988 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5989 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5990
5991 // 32-bit floating point regsisters
5992 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5993 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5994 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5995
5996 // 64-bit floating point regsisters
5997 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5998 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
5999 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6000
6001 // Vector registers
6002 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6003 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6004 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6005};
6006
Craig Topperf054e3a2015-10-19 03:52:27 +00006007ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6008 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006009}
6010
Tim Northover573cbee2014-05-24 12:52:07 +00006011const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006012 { { "w31" }, "wsp" },
6013 { { "x29" }, "fp" },
6014 { { "x30" }, "lr" },
6015 { { "x31" }, "sp" },
6016 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6017 // don't want to substitute one of these for a different-sized one.
6018};
6019
Craig Topperf054e3a2015-10-19 03:52:27 +00006020ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6021 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006022}
6023
Tim Northover573cbee2014-05-24 12:52:07 +00006024const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006025#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006026 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006027#include "clang/Basic/BuiltinsNEON.def"
6028
6029#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006030 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006031#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006032};
James Molloy5e73df52014-04-16 15:06:20 +00006033
Tim Northover573cbee2014-05-24 12:52:07 +00006034class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006035 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006036 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006037 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006038 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006039 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006040 }
6041
6042public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006043 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6044 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006045 BigEndian = false;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006046 }
James Molloy5e73df52014-04-16 15:06:20 +00006047 void getTargetDefines(const LangOptions &Opts,
6048 MacroBuilder &Builder) const override {
6049 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006050 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006051 }
6052};
6053
Tim Northover573cbee2014-05-24 12:52:07 +00006054class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006055 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006056 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006057 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006058 }
6059
6060public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006061 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6062 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006063 void getTargetDefines(const LangOptions &Opts,
6064 MacroBuilder &Builder) const override {
6065 Builder.defineMacro("__AARCH64EB__");
6066 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6067 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006068 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006069 }
6070};
Tim Northovera2ee4332014-03-29 15:09:45 +00006071
Tim Northover573cbee2014-05-24 12:52:07 +00006072class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006073protected:
6074 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6075 MacroBuilder &Builder) const override {
6076 Builder.defineMacro("__AARCH64_SIMD__");
6077 Builder.defineMacro("__ARM64_ARCH_8__");
6078 Builder.defineMacro("__ARM_NEON__");
6079 Builder.defineMacro("__LITTLE_ENDIAN__");
6080 Builder.defineMacro("__REGISTER_PREFIX__", "");
6081 Builder.defineMacro("__arm64", "1");
6082 Builder.defineMacro("__arm64__", "1");
6083
6084 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6085 }
6086
Tim Northovera2ee4332014-03-29 15:09:45 +00006087public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006088 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6089 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006090 Int64Type = SignedLongLong;
6091 WCharType = SignedInt;
6092 UseSignedCharForObjCBool = false;
6093
Tim Northovera6a19f12015-02-06 01:25:07 +00006094 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006095 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6096
6097 TheCXXABI.set(TargetCXXABI::iOS64);
6098 }
6099
David Blaikie1cbb9712014-11-14 19:09:44 +00006100 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006101 return TargetInfo::CharPtrBuiltinVaList;
6102 }
6103};
Tim Northovera2ee4332014-03-29 15:09:45 +00006104
Tony Linthicum76329bf2011-12-12 21:14:55 +00006105// Hexagon abstract base class
6106class HexagonTargetInfo : public TargetInfo {
6107 static const Builtin::Info BuiltinInfo[];
6108 static const char * const GCCRegNames[];
6109 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6110 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006111 bool HasHVX, HasHVXDouble;
6112
Tony Linthicum76329bf2011-12-12 21:14:55 +00006113public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006114 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6115 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00006116 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006117 // Specify the vector alignment explicitly. For v512x1, the calculated
6118 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6119 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006120 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006121 "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 +00006122 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006123 SizeType = UnsignedInt;
6124 PtrDiffType = SignedInt;
6125 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006126
6127 // {} in inline assembly are packet specifiers, not assembly variant
6128 // specifiers.
6129 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006130
6131 LargeArrayMinWidth = 64;
6132 LargeArrayAlign = 64;
6133 UseBitFieldTypeAlignment = true;
6134 ZeroLengthBitfieldBoundary = 32;
6135 HasHVX = HasHVXDouble = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006136 }
6137
Craig Topper6c03a542015-10-19 04:51:35 +00006138 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6139 return llvm::makeArrayRef(BuiltinInfo,
6140 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006141 }
6142
Craig Topper3164f332014-03-11 03:39:26 +00006143 bool validateAsmConstraint(const char *&Name,
6144 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006145 switch (*Name) {
6146 case 'v':
6147 case 'q':
6148 if (HasHVX) {
6149 Info.setAllowsRegister();
6150 return true;
6151 }
6152 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006153 case 's':
6154 // Relocatable constant.
6155 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006156 }
6157 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006158 }
6159
Craig Topper3164f332014-03-11 03:39:26 +00006160 void getTargetDefines(const LangOptions &Opts,
6161 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006162
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006163 bool isCLZForZeroUndef() const override { return false; }
6164
Craig Topper3164f332014-03-11 03:39:26 +00006165 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006166 return llvm::StringSwitch<bool>(Feature)
6167 .Case("hexagon", true)
6168 .Case("hvx", HasHVX)
6169 .Case("hvx-double", HasHVXDouble)
6170 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006171 }
Craig Topper3164f332014-03-11 03:39:26 +00006172
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006173 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6174 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6175 const override;
6176
6177 bool handleTargetFeatures(std::vector<std::string> &Features,
6178 DiagnosticsEngine &Diags) override;
6179
Craig Topper3164f332014-03-11 03:39:26 +00006180 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006181 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006182 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006183 ArrayRef<const char *> getGCCRegNames() const override;
6184 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006185 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006186 return "";
6187 }
Sebastian Pop86500282012-01-13 20:37:10 +00006188
6189 static const char *getHexagonCPUSuffix(StringRef Name) {
6190 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006191 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006192 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006193 .Case("hexagonv55", "55")
6194 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006195 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006196 }
6197
Craig Topper3164f332014-03-11 03:39:26 +00006198 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006199 if (!getHexagonCPUSuffix(Name))
6200 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006201 CPU = Name;
6202 return true;
6203 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006204
6205 int getEHDataRegisterNumber(unsigned RegNo) const override {
6206 return RegNo < 2 ? RegNo : -1;
6207 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208};
6209
6210void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006211 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006212 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006213 Builder.defineMacro("__hexagon__", "1");
6214
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006215 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006216 Builder.defineMacro("__HEXAGON_V4__");
6217 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006219 Builder.defineMacro("__QDSP6_V4__");
6220 Builder.defineMacro("__QDSP6_ARCH__", "4");
6221 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006222 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006223 Builder.defineMacro("__HEXAGON_V5__");
6224 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6225 if(Opts.HexagonQdsp6Compat) {
6226 Builder.defineMacro("__QDSP6_V5__");
6227 Builder.defineMacro("__QDSP6_ARCH__", "5");
6228 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006229 } else if (CPU == "hexagonv55") {
6230 Builder.defineMacro("__HEXAGON_V55__");
6231 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6232 Builder.defineMacro("__QDSP6_V55__");
6233 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006234 } else if (CPU == "hexagonv60") {
6235 Builder.defineMacro("__HEXAGON_V60__");
6236 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6237 Builder.defineMacro("__QDSP6_V60__");
6238 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006239 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006240
6241 if (hasFeature("hvx")) {
6242 Builder.defineMacro("__HVX__");
6243 if (hasFeature("hvx-double"))
6244 Builder.defineMacro("__HVXDBL__");
6245 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006246}
6247
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006248bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6249 DiagnosticsEngine &Diags) {
6250 for (auto &F : Features) {
6251 if (F == "+hvx")
6252 HasHVX = true;
6253 else if (F == "-hvx")
6254 HasHVX = HasHVXDouble = false;
6255 else if (F == "+hvx-double")
6256 HasHVX = HasHVXDouble = true;
6257 else if (F == "-hvx-double")
6258 HasHVXDouble = false;
6259 }
6260 return true;
6261}
6262
6263bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6264 DiagnosticsEngine &Diags, StringRef CPU,
6265 const std::vector<std::string> &FeaturesVec) const {
6266 // Default for v60: -hvx, -hvx-double.
6267 Features["hvx"] = false;
6268 Features["hvx-double"] = false;
6269
6270 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6271}
6272
6273
6274const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006275 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6276 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6277 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6278 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6279 "p0", "p1", "p2", "p3",
6280 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6281};
6282
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006283ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006284 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006285}
6286
Tony Linthicum76329bf2011-12-12 21:14:55 +00006287const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6288 { { "sp" }, "r29" },
6289 { { "fp" }, "r30" },
6290 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006291};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006292
Craig Topperf054e3a2015-10-19 03:52:27 +00006293ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6294 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006295}
6296
6297
6298const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006299#define BUILTIN(ID, TYPE, ATTRS) \
6300 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6301#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6302 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006303#include "clang/Basic/BuiltinsHexagon.def"
6304};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006305
Jacques Pienaard964cc22016-03-28 21:02:54 +00006306class LanaiTargetInfo : public TargetInfo {
6307 // Class for Lanai (32-bit).
6308 // The CPU profiles supported by the Lanai backend
6309 enum CPUKind {
6310 CK_NONE,
6311 CK_V11,
6312 } CPU;
6313
6314 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6315 static const char *const GCCRegNames[];
6316
6317public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006318 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6319 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006320 // Description string has to be kept in sync with backend.
6321 resetDataLayout("E" // Big endian
6322 "-m:e" // ELF name manging
6323 "-p:32:32" // 32 bit pointers, 32 bit aligned
6324 "-i64:64" // 64 bit integers, 64 bit aligned
6325 "-a:0:32" // 32 bit alignment of objects of aggregate type
6326 "-n32" // 32 bit native integer width
6327 "-S64" // 64 bit natural stack alignment
6328 );
6329
6330 // Setting RegParmMax equal to what mregparm was set to in the old
6331 // toolchain
6332 RegParmMax = 4;
6333
6334 // Set the default CPU to V11
6335 CPU = CK_V11;
6336
6337 // Temporary approach to make everything at least word-aligned and allow for
6338 // safely casting between pointers with different alignment requirements.
6339 // TODO: Remove this when there are no more cast align warnings on the
6340 // firmware.
6341 MinGlobalAlign = 32;
6342 }
6343
6344 void getTargetDefines(const LangOptions &Opts,
6345 MacroBuilder &Builder) const override {
6346 // Define __lanai__ when building for target lanai.
6347 Builder.defineMacro("__lanai__");
6348
6349 // Set define for the CPU specified.
6350 switch (CPU) {
6351 case CK_V11:
6352 Builder.defineMacro("__LANAI_V11__");
6353 break;
6354 case CK_NONE:
6355 llvm_unreachable("Unhandled target CPU");
6356 }
6357 }
6358
6359 bool setCPU(const std::string &Name) override {
6360 CPU = llvm::StringSwitch<CPUKind>(Name)
6361 .Case("v11", CK_V11)
6362 .Default(CK_NONE);
6363
6364 return CPU != CK_NONE;
6365 }
6366
6367 bool hasFeature(StringRef Feature) const override {
6368 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6369 }
6370
6371 ArrayRef<const char *> getGCCRegNames() const override;
6372
6373 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6374
6375 BuiltinVaListKind getBuiltinVaListKind() const override {
6376 return TargetInfo::VoidPtrBuiltinVaList;
6377 }
6378
6379 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6380
6381 bool validateAsmConstraint(const char *&Name,
6382 TargetInfo::ConstraintInfo &info) const override {
6383 return false;
6384 }
6385
6386 const char *getClobbers() const override { return ""; }
6387};
6388
6389const char *const LanaiTargetInfo::GCCRegNames[] = {
6390 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6391 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6392 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6393
6394ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6395 return llvm::makeArrayRef(GCCRegNames);
6396}
6397
6398const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6399 {{"pc"}, "r2"},
6400 {{"sp"}, "r4"},
6401 {{"fp"}, "r5"},
6402 {{"rv"}, "r8"},
6403 {{"rr1"}, "r10"},
6404 {{"rr2"}, "r11"},
6405 {{"rca"}, "r15"},
6406};
6407
6408ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6409 return llvm::makeArrayRef(GCCRegAliases);
6410}
6411
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006412// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6413class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006414 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6415 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006416 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006417public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006418 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006419 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006420
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006421 int getEHDataRegisterNumber(unsigned RegNo) const override {
6422 if (RegNo == 0) return 24;
6423 if (RegNo == 1) return 25;
6424 return -1;
6425 }
6426
Craig Topper3164f332014-03-11 03:39:26 +00006427 bool handleTargetFeatures(std::vector<std::string> &Features,
6428 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006429 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006430 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6431 if (Feature != Features.end()) {
6432 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006433 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006434 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006435 }
Craig Topper3164f332014-03-11 03:39:26 +00006436 void getTargetDefines(const LangOptions &Opts,
6437 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006438 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006439 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006440
6441 if (SoftFloat)
6442 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006443 }
Craig Topper3164f332014-03-11 03:39:26 +00006444
6445 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006446 return llvm::StringSwitch<bool>(Feature)
6447 .Case("softfloat", SoftFloat)
6448 .Case("sparc", true)
6449 .Default(false);
6450 }
Craig Topper3164f332014-03-11 03:39:26 +00006451
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006452 bool hasSjLjLowering() const override {
6453 return true;
6454 }
6455
Craig Topper6c03a542015-10-19 04:51:35 +00006456 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006457 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006458 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006459 }
Craig Topper3164f332014-03-11 03:39:26 +00006460 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006461 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006462 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006463 ArrayRef<const char *> getGCCRegNames() const override;
6464 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006465 bool validateAsmConstraint(const char *&Name,
6466 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006467 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006468 switch (*Name) {
6469 case 'I': // Signed 13-bit constant
6470 case 'J': // Zero
6471 case 'K': // 32-bit constant with the low 12 bits clear
6472 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6473 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6474 case 'N': // Same as 'K' but zext (required for SIMode)
6475 case 'O': // The constant 4096
6476 return true;
6477 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006478 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006479 }
Craig Topper3164f332014-03-11 03:39:26 +00006480 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006481 // FIXME: Implement!
6482 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006483 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006484
6485 // No Sparc V7 for now, the backend doesn't support it anyway.
6486 enum CPUKind {
6487 CK_GENERIC,
6488 CK_V8,
6489 CK_SUPERSPARC,
6490 CK_SPARCLITE,
6491 CK_F934,
6492 CK_HYPERSPARC,
6493 CK_SPARCLITE86X,
6494 CK_SPARCLET,
6495 CK_TSC701,
6496 CK_V9,
6497 CK_ULTRASPARC,
6498 CK_ULTRASPARC3,
6499 CK_NIAGARA,
6500 CK_NIAGARA2,
6501 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006502 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006503 CK_MYRIAD2100,
6504 CK_MYRIAD2150,
6505 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006506 CK_LEON2,
6507 CK_LEON2_AT697E,
6508 CK_LEON2_AT697F,
6509 CK_LEON3,
6510 CK_LEON3_UT699,
6511 CK_LEON3_GR712RC,
6512 CK_LEON4,
6513 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006514 } CPU = CK_GENERIC;
6515
6516 enum CPUGeneration {
6517 CG_V8,
6518 CG_V9,
6519 };
6520
6521 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6522 switch (Kind) {
6523 case CK_GENERIC:
6524 case CK_V8:
6525 case CK_SUPERSPARC:
6526 case CK_SPARCLITE:
6527 case CK_F934:
6528 case CK_HYPERSPARC:
6529 case CK_SPARCLITE86X:
6530 case CK_SPARCLET:
6531 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006532 case CK_MYRIAD2100:
6533 case CK_MYRIAD2150:
6534 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006535 case CK_LEON2:
6536 case CK_LEON2_AT697E:
6537 case CK_LEON2_AT697F:
6538 case CK_LEON3:
6539 case CK_LEON3_UT699:
6540 case CK_LEON3_GR712RC:
6541 case CK_LEON4:
6542 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006543 return CG_V8;
6544 case CK_V9:
6545 case CK_ULTRASPARC:
6546 case CK_ULTRASPARC3:
6547 case CK_NIAGARA:
6548 case CK_NIAGARA2:
6549 case CK_NIAGARA3:
6550 case CK_NIAGARA4:
6551 return CG_V9;
6552 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006553 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006554 }
6555
6556 CPUKind getCPUKind(StringRef Name) const {
6557 return llvm::StringSwitch<CPUKind>(Name)
6558 .Case("v8", CK_V8)
6559 .Case("supersparc", CK_SUPERSPARC)
6560 .Case("sparclite", CK_SPARCLITE)
6561 .Case("f934", CK_F934)
6562 .Case("hypersparc", CK_HYPERSPARC)
6563 .Case("sparclite86x", CK_SPARCLITE86X)
6564 .Case("sparclet", CK_SPARCLET)
6565 .Case("tsc701", CK_TSC701)
6566 .Case("v9", CK_V9)
6567 .Case("ultrasparc", CK_ULTRASPARC)
6568 .Case("ultrasparc3", CK_ULTRASPARC3)
6569 .Case("niagara", CK_NIAGARA)
6570 .Case("niagara2", CK_NIAGARA2)
6571 .Case("niagara3", CK_NIAGARA3)
6572 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006573 .Case("ma2100", CK_MYRIAD2100)
6574 .Case("ma2150", CK_MYRIAD2150)
6575 .Case("ma2450", CK_MYRIAD2450)
6576 // FIXME: the myriad2[.n] spellings are obsolete,
6577 // but a grace period is needed to allow updating dependent builds.
6578 .Case("myriad2", CK_MYRIAD2100)
6579 .Case("myriad2.1", CK_MYRIAD2100)
6580 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006581 .Case("leon2", CK_LEON2)
6582 .Case("at697e", CK_LEON2_AT697E)
6583 .Case("at697f", CK_LEON2_AT697F)
6584 .Case("leon3", CK_LEON3)
6585 .Case("ut699", CK_LEON3_UT699)
6586 .Case("gr712rc", CK_LEON3_GR712RC)
6587 .Case("leon4", CK_LEON4)
6588 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006589 .Default(CK_GENERIC);
6590 }
6591
6592 bool setCPU(const std::string &Name) override {
6593 CPU = getCPUKind(Name);
6594 return CPU != CK_GENERIC;
6595 }
Gabor Greif49991682008-02-21 16:29:08 +00006596};
6597
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006598const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006599 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6600 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6601 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6602 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6603};
6604
Craig Topperf054e3a2015-10-19 03:52:27 +00006605ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6606 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006607}
6608
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006609const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006610 { { "g0" }, "r0" },
6611 { { "g1" }, "r1" },
6612 { { "g2" }, "r2" },
6613 { { "g3" }, "r3" },
6614 { { "g4" }, "r4" },
6615 { { "g5" }, "r5" },
6616 { { "g6" }, "r6" },
6617 { { "g7" }, "r7" },
6618 { { "o0" }, "r8" },
6619 { { "o1" }, "r9" },
6620 { { "o2" }, "r10" },
6621 { { "o3" }, "r11" },
6622 { { "o4" }, "r12" },
6623 { { "o5" }, "r13" },
6624 { { "o6", "sp" }, "r14" },
6625 { { "o7" }, "r15" },
6626 { { "l0" }, "r16" },
6627 { { "l1" }, "r17" },
6628 { { "l2" }, "r18" },
6629 { { "l3" }, "r19" },
6630 { { "l4" }, "r20" },
6631 { { "l5" }, "r21" },
6632 { { "l6" }, "r22" },
6633 { { "l7" }, "r23" },
6634 { { "i0" }, "r24" },
6635 { { "i1" }, "r25" },
6636 { { "i2" }, "r26" },
6637 { { "i3" }, "r27" },
6638 { { "i4" }, "r28" },
6639 { { "i5" }, "r29" },
6640 { { "i6", "fp" }, "r30" },
6641 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006642};
6643
Craig Topperf054e3a2015-10-19 03:52:27 +00006644ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6645 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006646}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006647
6648// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6649class SparcV8TargetInfo : public SparcTargetInfo {
6650public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006651 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6652 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006653 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006654 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6655 switch (getTriple().getOS()) {
6656 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006657 SizeType = UnsignedInt;
6658 IntPtrType = SignedInt;
6659 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006660 break;
6661 case llvm::Triple::NetBSD:
6662 case llvm::Triple::OpenBSD:
6663 SizeType = UnsignedLong;
6664 IntPtrType = SignedLong;
6665 PtrDiffType = SignedLong;
6666 break;
Brad Smith56495d52015-08-13 22:00:53 +00006667 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006668 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006669 }
6670
Craig Topper3164f332014-03-11 03:39:26 +00006671 void getTargetDefines(const LangOptions &Opts,
6672 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006673 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006674 switch (getCPUGeneration(CPU)) {
6675 case CG_V8:
6676 Builder.defineMacro("__sparcv8");
6677 if (getTriple().getOS() != llvm::Triple::Solaris)
6678 Builder.defineMacro("__sparcv8__");
6679 break;
6680 case CG_V9:
6681 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006682 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006683 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006684 Builder.defineMacro("__sparc_v9__");
6685 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006686 break;
6687 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006688 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006689 std::string MyriadArchValue, Myriad2Value;
6690 Builder.defineMacro("__sparc_v8__");
6691 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006692 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006693 case CK_MYRIAD2150:
6694 MyriadArchValue = "__ma2150";
6695 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006696 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006697 case CK_MYRIAD2450:
6698 MyriadArchValue = "__ma2450";
6699 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006700 break;
6701 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006702 MyriadArchValue = "__ma2100";
6703 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006704 break;
6705 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006706 Builder.defineMacro(MyriadArchValue, "1");
6707 Builder.defineMacro(MyriadArchValue+"__", "1");
6708 Builder.defineMacro("__myriad2__", Myriad2Value);
6709 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006710 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006711 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006712
6713 bool hasSjLjLowering() const override {
6714 return true;
6715 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006716};
6717
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006718// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6719class SparcV8elTargetInfo : public SparcV8TargetInfo {
6720 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006721 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6722 : SparcV8TargetInfo(Triple, Opts) {
6723 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6724 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006725 }
6726};
6727
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006728// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6729class SparcV9TargetInfo : public SparcTargetInfo {
6730public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006731 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6732 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006733 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006734 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006735 // This is an LP64 platform.
6736 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006737
6738 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006739 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006740 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006741 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006742 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006743 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006744
6745 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6746 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6747 LongDoubleWidth = 128;
6748 LongDoubleAlign = 128;
6749 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006750 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006751 }
6752
Craig Topper3164f332014-03-11 03:39:26 +00006753 void getTargetDefines(const LangOptions &Opts,
6754 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006755 SparcTargetInfo::getTargetDefines(Opts, Builder);
6756 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006757 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006758 // Solaris doesn't need these variants, but the BSDs do.
6759 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006760 Builder.defineMacro("__sparc64__");
6761 Builder.defineMacro("__sparc_v9__");
6762 Builder.defineMacro("__sparcv9__");
6763 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006764 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006765
Craig Topper3164f332014-03-11 03:39:26 +00006766 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006767 if (!SparcTargetInfo::setCPU(Name))
6768 return false;
6769 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006770 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006771};
6772
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006773class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006774 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006775 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006776 std::string CPU;
6777 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006778 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006779
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006780public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006781 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006782 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6783 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006784 IntMaxType = SignedLong;
6785 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006786 TLSSupported = true;
6787 IntWidth = IntAlign = 32;
6788 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6789 PointerWidth = PointerAlign = 64;
6790 LongDoubleWidth = 128;
6791 LongDoubleAlign = 64;
6792 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006793 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006794 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006795 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 +00006796 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6797 }
6798 void getTargetDefines(const LangOptions &Opts,
6799 MacroBuilder &Builder) const override {
6800 Builder.defineMacro("__s390__");
6801 Builder.defineMacro("__s390x__");
6802 Builder.defineMacro("__zarch__");
6803 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006804
6805 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6806 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6807 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6808 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6809
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006810 if (HasTransactionalExecution)
6811 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006812 if (Opts.ZVector)
6813 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006814 }
Craig Topper6c03a542015-10-19 04:51:35 +00006815 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6816 return llvm::makeArrayRef(BuiltinInfo,
6817 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006818 }
6819
Craig Topperf054e3a2015-10-19 03:52:27 +00006820 ArrayRef<const char *> getGCCRegNames() const override;
6821 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006822 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006823 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006824 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006825 bool validateAsmConstraint(const char *&Name,
6826 TargetInfo::ConstraintInfo &info) const override;
6827 const char *getClobbers() const override {
6828 // FIXME: Is this really right?
6829 return "";
6830 }
6831 BuiltinVaListKind getBuiltinVaListKind() const override {
6832 return TargetInfo::SystemZBuiltinVaList;
6833 }
6834 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006835 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006836 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6837 .Case("z10", true)
6838 .Case("z196", true)
6839 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006840 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006841 .Default(false);
6842
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006843 return CPUKnown;
6844 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006845 bool
6846 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6847 StringRef CPU,
6848 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006849 if (CPU == "zEC12")
6850 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006851 if (CPU == "z13") {
6852 Features["transactional-execution"] = true;
6853 Features["vector"] = true;
6854 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006855 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006856 }
6857
6858 bool handleTargetFeatures(std::vector<std::string> &Features,
6859 DiagnosticsEngine &Diags) override {
6860 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006861 for (const auto &Feature : Features) {
6862 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006863 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006864 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006865 HasVector = true;
6866 }
6867 // If we use the vector ABI, vector types are 64-bit aligned.
6868 if (HasVector) {
6869 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006870 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6871 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006872 }
6873 return true;
6874 }
6875
6876 bool hasFeature(StringRef Feature) const override {
6877 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006878 .Case("systemz", true)
6879 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006880 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006881 .Default(false);
6882 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006883
Bryan Chane3f1ed52016-04-28 13:56:43 +00006884 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6885 switch (CC) {
6886 case CC_C:
6887 case CC_Swift:
6888 return CCCR_OK;
6889 default:
6890 return CCCR_Warning;
6891 }
6892 }
6893
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006894 StringRef getABI() const override {
6895 if (HasVector)
6896 return "vector";
6897 return "";
6898 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006899
6900 bool useFloat128ManglingForLongDouble() const override {
6901 return true;
6902 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006903};
6904
6905const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6906#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006907 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006908#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6909 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006910#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006911};
6912
6913const char *const SystemZTargetInfo::GCCRegNames[] = {
6914 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6915 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6916 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6917 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6918};
6919
Craig Topperf054e3a2015-10-19 03:52:27 +00006920ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6921 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006922}
6923
6924bool SystemZTargetInfo::
6925validateAsmConstraint(const char *&Name,
6926 TargetInfo::ConstraintInfo &Info) const {
6927 switch (*Name) {
6928 default:
6929 return false;
6930
6931 case 'a': // Address register
6932 case 'd': // Data register (equivalent to 'r')
6933 case 'f': // Floating-point register
6934 Info.setAllowsRegister();
6935 return true;
6936
6937 case 'I': // Unsigned 8-bit constant
6938 case 'J': // Unsigned 12-bit constant
6939 case 'K': // Signed 16-bit constant
6940 case 'L': // Signed 20-bit displacement (on all targets we support)
6941 case 'M': // 0x7fffffff
6942 return true;
6943
6944 case 'Q': // Memory with base and unsigned 12-bit displacement
6945 case 'R': // Likewise, plus an index
6946 case 'S': // Memory with base and signed 20-bit displacement
6947 case 'T': // Likewise, plus an index
6948 Info.setAllowsMemory();
6949 return true;
6950 }
6951}
Ulrich Weigand47445072013-05-06 16:26:41 +00006952
Eric Christopherc48497a2015-09-18 21:26:24 +00006953class MSP430TargetInfo : public TargetInfo {
6954 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006955
Eric Christopherc48497a2015-09-18 21:26:24 +00006956public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006957 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6958 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006959 BigEndian = false;
6960 TLSSupported = false;
6961 IntWidth = 16;
6962 IntAlign = 16;
6963 LongWidth = 32;
6964 LongLongWidth = 64;
6965 LongAlign = LongLongAlign = 16;
6966 PointerWidth = 16;
6967 PointerAlign = 16;
6968 SuitableAlign = 16;
6969 SizeType = UnsignedInt;
6970 IntMaxType = SignedLongLong;
6971 IntPtrType = SignedInt;
6972 PtrDiffType = SignedInt;
6973 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006974 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006975 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006976 void getTargetDefines(const LangOptions &Opts,
6977 MacroBuilder &Builder) const override {
6978 Builder.defineMacro("MSP430");
6979 Builder.defineMacro("__MSP430__");
6980 // FIXME: defines for different 'flavours' of MCU
6981 }
Craig Topper6c03a542015-10-19 04:51:35 +00006982 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006983 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00006984 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006985 }
6986 bool hasFeature(StringRef Feature) const override {
6987 return Feature == "msp430";
6988 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006989 ArrayRef<const char *> getGCCRegNames() const override;
6990 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00006991 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006992 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00006993 }
6994 bool validateAsmConstraint(const char *&Name,
6995 TargetInfo::ConstraintInfo &info) const override {
6996 // FIXME: implement
6997 switch (*Name) {
6998 case 'K': // the constant 1
6999 case 'L': // constant -1^20 .. 1^19
7000 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007001 return true;
7002 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007003 // No target constraints for now.
7004 return false;
7005 }
7006 const char *getClobbers() const override {
7007 // FIXME: Is this really right?
7008 return "";
7009 }
7010 BuiltinVaListKind getBuiltinVaListKind() const override {
7011 // FIXME: implement
7012 return TargetInfo::CharPtrBuiltinVaList;
7013 }
7014};
7015
7016const char *const MSP430TargetInfo::GCCRegNames[] = {
7017 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7018 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7019
Craig Topperf054e3a2015-10-19 03:52:27 +00007020ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7021 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007022}
7023
7024// LLVM and Clang cannot be used directly to output native binaries for
7025// target, but is used to compile C code to llvm bitcode with correct
7026// type and alignment information.
7027//
7028// TCE uses the llvm bitcode as input and uses it for generating customized
7029// target processor and program binary. TCE co-design environment is
7030// publicly available in http://tce.cs.tut.fi
7031
7032static const unsigned TCEOpenCLAddrSpaceMap[] = {
7033 3, // opencl_global
7034 4, // opencl_local
7035 5, // opencl_constant
7036 // FIXME: generic has to be added to the target
7037 0, // opencl_generic
7038 0, // cuda_device
7039 0, // cuda_constant
7040 0 // cuda_shared
7041};
7042
7043class TCETargetInfo : public TargetInfo {
7044public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007045 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7046 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007047 TLSSupported = false;
7048 IntWidth = 32;
7049 LongWidth = LongLongWidth = 32;
7050 PointerWidth = 32;
7051 IntAlign = 32;
7052 LongAlign = LongLongAlign = 32;
7053 PointerAlign = 32;
7054 SuitableAlign = 32;
7055 SizeType = UnsignedInt;
7056 IntMaxType = SignedLong;
7057 IntPtrType = SignedInt;
7058 PtrDiffType = SignedInt;
7059 FloatWidth = 32;
7060 FloatAlign = 32;
7061 DoubleWidth = 32;
7062 DoubleAlign = 32;
7063 LongDoubleWidth = 32;
7064 LongDoubleAlign = 32;
7065 FloatFormat = &llvm::APFloat::IEEEsingle;
7066 DoubleFormat = &llvm::APFloat::IEEEsingle;
7067 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007068 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7069 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007070 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7071 UseAddrSpaceMapMangling = true;
7072 }
7073
7074 void getTargetDefines(const LangOptions &Opts,
7075 MacroBuilder &Builder) const override {
7076 DefineStd(Builder, "tce", Opts);
7077 Builder.defineMacro("__TCE__");
7078 Builder.defineMacro("__TCE_V1__");
7079 }
7080 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7081
Craig Topper6c03a542015-10-19 04:51:35 +00007082 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007083 const char *getClobbers() const override { return ""; }
7084 BuiltinVaListKind getBuiltinVaListKind() const override {
7085 return TargetInfo::VoidPtrBuiltinVaList;
7086 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007087 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007088 bool validateAsmConstraint(const char *&Name,
7089 TargetInfo::ConstraintInfo &info) const override {
7090 return true;
7091 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007092 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7093 return None;
7094 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007095};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007096
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007097class BPFTargetInfo : public TargetInfo {
7098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007099 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7100 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007101 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7102 SizeType = UnsignedLong;
7103 PtrDiffType = SignedLong;
7104 IntPtrType = SignedLong;
7105 IntMaxType = SignedLong;
7106 Int64Type = SignedLong;
7107 RegParmMax = 5;
7108 if (Triple.getArch() == llvm::Triple::bpfeb) {
7109 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007110 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007111 } else {
7112 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007113 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007114 }
7115 MaxAtomicPromoteWidth = 64;
7116 MaxAtomicInlineWidth = 64;
7117 TLSSupported = false;
7118 }
7119 void getTargetDefines(const LangOptions &Opts,
7120 MacroBuilder &Builder) const override {
7121 DefineStd(Builder, "bpf", Opts);
7122 Builder.defineMacro("__BPF__");
7123 }
7124 bool hasFeature(StringRef Feature) const override {
7125 return Feature == "bpf";
7126 }
7127
Craig Topper6c03a542015-10-19 04:51:35 +00007128 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007129 const char *getClobbers() const override {
7130 return "";
7131 }
7132 BuiltinVaListKind getBuiltinVaListKind() const override {
7133 return TargetInfo::VoidPtrBuiltinVaList;
7134 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007135 ArrayRef<const char *> getGCCRegNames() const override {
7136 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007137 }
7138 bool validateAsmConstraint(const char *&Name,
7139 TargetInfo::ConstraintInfo &info) const override {
7140 return true;
7141 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007142 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7143 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007144 }
7145};
7146
Daniel Sanders4672af62016-05-27 11:51:02 +00007147class MipsTargetInfo : public TargetInfo {
7148 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007149 StringRef Layout;
7150
7151 if (ABI == "o32")
7152 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7153 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007154 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007155 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007156 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007157 else
7158 llvm_unreachable("Invalid ABI");
7159
7160 if (BigEndian)
7161 resetDataLayout(("E-" + Layout).str());
7162 else
7163 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007164 }
7165
Akira Hatanaka9064e362013-10-29 18:30:33 +00007166
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007167 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007168 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007169 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007170 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007171 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007172 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007173 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007174 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007175 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007176 enum DspRevEnum {
7177 NoDSP, DSP1, DSP2
7178 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007179 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007180
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007181protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007182 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007183 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007184
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007185public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007186 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007187 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7188 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7189 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007190 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007191 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7192 getTriple().getArch() == llvm::Triple::mips64;
7193
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007194 setABI((getTriple().getArch() == llvm::Triple::mips ||
7195 getTriple().getArch() == llvm::Triple::mipsel)
7196 ? "o32"
7197 : "n64");
7198
7199 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007200 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007201
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007202 bool isNaN2008Default() const {
7203 return CPU == "mips32r6" || CPU == "mips64r6";
7204 }
7205
7206 bool isFP64Default() const {
7207 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7208 }
7209
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007210 bool isNan2008() const override {
7211 return IsNan2008;
7212 }
7213
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007214 bool processorSupportsGPR64() const {
7215 return llvm::StringSwitch<bool>(CPU)
7216 .Case("mips3", true)
7217 .Case("mips4", true)
7218 .Case("mips5", true)
7219 .Case("mips64", true)
7220 .Case("mips64r2", true)
7221 .Case("mips64r3", true)
7222 .Case("mips64r5", true)
7223 .Case("mips64r6", true)
7224 .Case("octeon", true)
7225 .Default(false);
7226 return false;
7227 }
7228
Alp Toker4925ba72014-06-07 23:30:42 +00007229 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007230 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007231 if (Name == "o32") {
7232 setO32ABITypes();
7233 ABI = Name;
7234 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007235 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007236
7237 if (Name == "n32") {
7238 setN32ABITypes();
7239 ABI = Name;
7240 return true;
7241 }
7242 if (Name == "n64") {
7243 setN64ABITypes();
7244 ABI = Name;
7245 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007246 }
7247 return false;
7248 }
7249
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007250 void setO32ABITypes() {
7251 Int64Type = SignedLongLong;
7252 IntMaxType = Int64Type;
7253 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7254 LongDoubleWidth = LongDoubleAlign = 64;
7255 LongWidth = LongAlign = 32;
7256 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7257 PointerWidth = PointerAlign = 32;
7258 PtrDiffType = SignedInt;
7259 SizeType = UnsignedInt;
7260 SuitableAlign = 64;
7261 }
7262
7263 void setN32N64ABITypes() {
7264 LongDoubleWidth = LongDoubleAlign = 128;
7265 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7266 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7267 LongDoubleWidth = LongDoubleAlign = 64;
7268 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7269 }
7270 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7271 SuitableAlign = 128;
7272 }
7273
Daniel Sanders4672af62016-05-27 11:51:02 +00007274 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007275 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007276 Int64Type = SignedLong;
7277 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007278 LongWidth = LongAlign = 64;
7279 PointerWidth = PointerAlign = 64;
7280 PtrDiffType = SignedLong;
7281 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007282 }
7283
7284 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007285 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007286 Int64Type = SignedLongLong;
7287 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007288 LongWidth = LongAlign = 32;
7289 PointerWidth = PointerAlign = 32;
7290 PtrDiffType = SignedInt;
7291 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007292 }
7293
Craig Topper3164f332014-03-11 03:39:26 +00007294 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007295 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007296 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007297 .Case("mips1", true)
7298 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007299 .Case("mips3", true)
7300 .Case("mips4", true)
7301 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007302 .Case("mips32", true)
7303 .Case("mips32r2", true)
7304 .Case("mips32r3", true)
7305 .Case("mips32r5", true)
7306 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007307 .Case("mips64", true)
7308 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007309 .Case("mips64r3", true)
7310 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007311 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007312 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007313 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007314 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007315 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007316 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007317 bool
7318 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7319 StringRef CPU,
7320 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007321 if (CPU.empty())
7322 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007323 if (CPU == "octeon")
7324 Features["mips64r2"] = Features["cnmips"] = true;
7325 else
7326 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007327 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007328 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007329
Craig Topper3164f332014-03-11 03:39:26 +00007330 void getTargetDefines(const LangOptions &Opts,
7331 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007332 if (BigEndian) {
7333 DefineStd(Builder, "MIPSEB", Opts);
7334 Builder.defineMacro("_MIPSEB");
7335 } else {
7336 DefineStd(Builder, "MIPSEL", Opts);
7337 Builder.defineMacro("_MIPSEL");
7338 }
7339
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007340 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007341 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007342 if (Opts.GNUMode)
7343 Builder.defineMacro("mips");
7344
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007345 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007346 Builder.defineMacro("__mips", "32");
7347 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7348 } else {
7349 Builder.defineMacro("__mips", "64");
7350 Builder.defineMacro("__mips64");
7351 Builder.defineMacro("__mips64__");
7352 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7353 }
7354
7355 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7356 .Cases("mips32", "mips64", "1")
7357 .Cases("mips32r2", "mips64r2", "2")
7358 .Cases("mips32r3", "mips64r3", "3")
7359 .Cases("mips32r5", "mips64r5", "5")
7360 .Cases("mips32r6", "mips64r6", "6")
7361 .Default("");
7362 if (!ISARev.empty())
7363 Builder.defineMacro("__mips_isa_rev", ISARev);
7364
7365 if (ABI == "o32") {
7366 Builder.defineMacro("__mips_o32");
7367 Builder.defineMacro("_ABIO32", "1");
7368 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007369 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007370 Builder.defineMacro("__mips_n32");
7371 Builder.defineMacro("_ABIN32", "2");
7372 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7373 } else if (ABI == "n64") {
7374 Builder.defineMacro("__mips_n64");
7375 Builder.defineMacro("_ABI64", "3");
7376 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7377 } else
7378 llvm_unreachable("Invalid ABI.");
7379
Simon Atanasyan683535b2012-08-29 19:14:58 +00007380 Builder.defineMacro("__REGISTER_PREFIX__", "");
7381
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007382 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007383 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007384 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007385 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007386 case SoftFloat:
7387 Builder.defineMacro("__mips_soft_float", Twine(1));
7388 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007389 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007390
Simon Atanasyan16071912013-04-14 14:07:30 +00007391 if (IsSingleFloat)
7392 Builder.defineMacro("__mips_single_float", Twine(1));
7393
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007394 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7395 Builder.defineMacro("_MIPS_FPSET",
7396 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7397
Simon Atanasyan72244b62012-07-05 16:06:06 +00007398 if (IsMips16)
7399 Builder.defineMacro("__mips16", Twine(1));
7400
Simon Atanasyan60777612013-04-14 14:07:51 +00007401 if (IsMicromips)
7402 Builder.defineMacro("__mips_micromips", Twine(1));
7403
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007404 if (IsNan2008)
7405 Builder.defineMacro("__mips_nan2008", Twine(1));
7406
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007407 switch (DspRev) {
7408 default:
7409 break;
7410 case DSP1:
7411 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7412 Builder.defineMacro("__mips_dsp", Twine(1));
7413 break;
7414 case DSP2:
7415 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7416 Builder.defineMacro("__mips_dspr2", Twine(1));
7417 Builder.defineMacro("__mips_dsp", Twine(1));
7418 break;
7419 }
7420
Jack Carter44ff1e52013-08-12 17:20:29 +00007421 if (HasMSA)
7422 Builder.defineMacro("__mips_msa", Twine(1));
7423
Simon Atanasyan26f19672012-04-05 19:28:31 +00007424 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7425 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7426 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007427
7428 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7429 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007430
7431 // These shouldn't be defined for MIPS-I but there's no need to check
7432 // for that since MIPS-I isn't supported.
7433 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7434 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7435 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007436
7437 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7438 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7439 // the instructions exist but using them violates the ABI since they
7440 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7441 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007442 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007443 }
7444
Craig Topper6c03a542015-10-19 04:51:35 +00007445 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7446 return llvm::makeArrayRef(BuiltinInfo,
7447 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007448 }
Craig Topper3164f332014-03-11 03:39:26 +00007449 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007450 return llvm::StringSwitch<bool>(Feature)
7451 .Case("mips", true)
7452 .Case("fp64", HasFP64)
7453 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007454 }
Craig Topper3164f332014-03-11 03:39:26 +00007455 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007456 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007457 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007458 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007459 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007460 // CPU register names
7461 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007462 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7463 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7464 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007465 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7466 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007467 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7468 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7469 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7470 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007471 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007472 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007473 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7474 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007475 // MSA register names
7476 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7477 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7478 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7479 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7480 // MSA control register names
7481 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7482 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007483 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007484 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007485 }
Craig Topper3164f332014-03-11 03:39:26 +00007486 bool validateAsmConstraint(const char *&Name,
7487 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007488 switch (*Name) {
7489 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007490 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007491 case 'r': // CPU registers.
7492 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007493 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007494 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007495 case 'c': // $25 for indirect jumps
7496 case 'l': // lo register
7497 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007498 Info.setAllowsRegister();
7499 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007500 case 'I': // Signed 16-bit constant
7501 case 'J': // Integer 0
7502 case 'K': // Unsigned 16-bit constant
7503 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7504 case 'M': // Constants not loadable via lui, addiu, or ori
7505 case 'N': // Constant -1 to -65535
7506 case 'O': // A signed 15-bit constant
7507 case 'P': // A constant between 1 go 65535
7508 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007509 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007510 Info.setAllowsMemory();
7511 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007512 case 'Z':
7513 if (Name[1] == 'C') { // An address usable by ll, and sc.
7514 Info.setAllowsMemory();
7515 Name++; // Skip over 'Z'.
7516 return true;
7517 }
7518 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007519 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007520 }
7521
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007522 std::string convertConstraint(const char *&Constraint) const override {
7523 std::string R;
7524 switch (*Constraint) {
7525 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7526 if (Constraint[1] == 'C') {
7527 R = std::string("^") + std::string(Constraint, 2);
7528 Constraint++;
7529 return R;
7530 }
7531 break;
7532 }
7533 return TargetInfo::convertConstraint(Constraint);
7534 }
7535
Craig Topper3164f332014-03-11 03:39:26 +00007536 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007537 // In GCC, $1 is not widely used in generated code (it's used only in a few
7538 // specific situations), so there is no real need for users to add it to
7539 // the clobbers list if they want to use it in their inline assembly code.
7540 //
7541 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7542 // code generation, so using it in inline assembly without adding it to the
7543 // clobbers list can cause conflicts between the inline assembly code and
7544 // the surrounding generated code.
7545 //
7546 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7547 // operands, which will conflict with the ".set at" assembler option (which
7548 // we use only for inline assembly, in order to maintain compatibility with
7549 // GCC) and will also conflict with the user's usage of $1.
7550 //
7551 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7552 // register for generated code is to automatically clobber $1 for all inline
7553 // assembly code.
7554 //
7555 // FIXME: We should automatically clobber $1 only for inline assembly code
7556 // which actually uses it. This would allow LLVM to use $1 for inline
7557 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007558 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007559 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007560
Craig Topper3164f332014-03-11 03:39:26 +00007561 bool handleTargetFeatures(std::vector<std::string> &Features,
7562 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007563 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007564 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007565 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007566 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007567 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007568 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007569 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007570
Eric Christopher610fe112015-08-26 08:21:55 +00007571 for (const auto &Feature : Features) {
7572 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007573 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007574 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007575 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007576 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007577 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007578 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007579 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007580 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007581 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007582 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007583 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007584 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007585 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007586 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007587 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007588 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007589 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007590 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007591 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007592 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007593 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007594 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007595
James Y Knightb214cbc2016-03-04 19:00:41 +00007596 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007597
Rafael Espindolaeb265472013-08-21 21:59:03 +00007598 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007599 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007600
Craig Topper3164f332014-03-11 03:39:26 +00007601 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007602 if (RegNo == 0) return 4;
7603 if (RegNo == 1) return 5;
7604 return -1;
7605 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007606
7607 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007608
7609 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7610 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7611 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7612 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7613 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7614 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7615 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7616 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7617 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7618 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7619 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7620 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7621 {{"ra"}, "$31"}};
7622 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7623 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7624 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7625 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7626 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7627 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7628 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7629 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7630 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7631 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7632 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7633 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007634 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007635 return llvm::makeArrayRef(O32RegAliases);
7636 return llvm::makeArrayRef(NewABIRegAliases);
7637 }
7638
7639 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007640 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007641 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007642
7643 bool validateTarget(DiagnosticsEngine &Diags) const override {
7644 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7645 // this yet. It's better to fail here than on the backend assertion.
7646 if (processorSupportsGPR64() && ABI == "o32") {
7647 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7648 return false;
7649 }
7650
7651 // 64-bit ABI's require 64-bit CPU's.
7652 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7653 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7654 return false;
7655 }
7656
7657 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7658 // can't handle this yet. It's better to fail here than on the
7659 // backend assertion.
7660 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7661 getTriple().getArch() == llvm::Triple::mips64el) &&
7662 ABI == "o32") {
7663 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7664 << ABI << getTriple().str();
7665 return false;
7666 }
7667
7668 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7669 // can't handle this yet. It's better to fail here than on the
7670 // backend assertion.
7671 if ((getTriple().getArch() == llvm::Triple::mips ||
7672 getTriple().getArch() == llvm::Triple::mipsel) &&
7673 (ABI == "n32" || ABI == "n64")) {
7674 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7675 << ABI << getTriple().str();
7676 return false;
7677 }
7678
7679 return true;
7680 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007681};
7682
Daniel Sanders4672af62016-05-27 11:51:02 +00007683const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007684#define BUILTIN(ID, TYPE, ATTRS) \
7685 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7686#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7687 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007688#include "clang/Basic/BuiltinsMips.def"
7689};
7690
Ivan Krasindd7403e2011-08-24 20:22:22 +00007691class PNaClTargetInfo : public TargetInfo {
7692public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007693 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7694 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007695 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007696 this->LongAlign = 32;
7697 this->LongWidth = 32;
7698 this->PointerAlign = 32;
7699 this->PointerWidth = 32;
7700 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007701 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007702 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007703 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007704 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007705 this->SizeType = TargetInfo::UnsignedInt;
7706 this->PtrDiffType = TargetInfo::SignedInt;
7707 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007708 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007709 }
7710
Craig Toppere6f17d02014-03-11 04:07:52 +00007711 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007712 Builder.defineMacro("__le32__");
7713 Builder.defineMacro("__pnacl__");
7714 }
Craig Topper3164f332014-03-11 03:39:26 +00007715 void getTargetDefines(const LangOptions &Opts,
7716 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007717 getArchDefines(Opts, Builder);
7718 }
Craig Topper3164f332014-03-11 03:39:26 +00007719 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007720 return Feature == "pnacl";
7721 }
Craig Topper6c03a542015-10-19 04:51:35 +00007722 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007723 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007724 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007725 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007726 ArrayRef<const char *> getGCCRegNames() const override;
7727 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007728 bool validateAsmConstraint(const char *&Name,
7729 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007730 return false;
7731 }
7732
Craig Topper3164f332014-03-11 03:39:26 +00007733 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007734 return "";
7735 }
7736};
7737
Craig Topperf054e3a2015-10-19 03:52:27 +00007738ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7739 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007740}
7741
Craig Topperf054e3a2015-10-19 03:52:27 +00007742ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7743 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007744}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007745
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007746// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007747class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007748public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007749 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7750 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007751
7752 BuiltinVaListKind getBuiltinVaListKind() const override {
7753 return TargetInfo::PNaClABIBuiltinVaList;
7754 }
7755};
7756
JF Bastien643817d2014-09-12 17:52:47 +00007757class Le64TargetInfo : public TargetInfo {
7758 static const Builtin::Info BuiltinInfo[];
7759
7760public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007761 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7762 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007763 BigEndian = false;
7764 NoAsmVariants = true;
7765 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7766 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007767 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007768 }
7769
7770 void getTargetDefines(const LangOptions &Opts,
7771 MacroBuilder &Builder) const override {
7772 DefineStd(Builder, "unix", Opts);
7773 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7774 Builder.defineMacro("__ELF__");
7775 }
Craig Topper6c03a542015-10-19 04:51:35 +00007776 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7777 return llvm::makeArrayRef(BuiltinInfo,
7778 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007779 }
7780 BuiltinVaListKind getBuiltinVaListKind() const override {
7781 return TargetInfo::PNaClABIBuiltinVaList;
7782 }
7783 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007784 ArrayRef<const char *> getGCCRegNames() const override {
7785 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007786 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007787 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7788 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007789 }
7790 bool validateAsmConstraint(const char *&Name,
7791 TargetInfo::ConstraintInfo &Info) const override {
7792 return false;
7793 }
7794
7795 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007796};
Dan Gohmanc2853072015-09-03 22:51:53 +00007797
7798class WebAssemblyTargetInfo : public TargetInfo {
7799 static const Builtin::Info BuiltinInfo[];
7800
7801 enum SIMDEnum {
7802 NoSIMD,
7803 SIMD128,
7804 } SIMDLevel;
7805
7806public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007807 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007808 : TargetInfo(T), SIMDLevel(NoSIMD) {
7809 BigEndian = false;
7810 NoAsmVariants = true;
7811 SuitableAlign = 128;
7812 LargeArrayMinWidth = 128;
7813 LargeArrayAlign = 128;
7814 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007815 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007816 LongDoubleWidth = LongDoubleAlign = 128;
7817 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Dan Gohmanc2853072015-09-03 22:51:53 +00007818 }
7819
7820protected:
7821 void getTargetDefines(const LangOptions &Opts,
7822 MacroBuilder &Builder) const override {
7823 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7824 if (SIMDLevel >= SIMD128)
7825 Builder.defineMacro("__wasm_simd128__");
7826 }
7827
7828private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007829 bool
7830 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7831 StringRef CPU,
7832 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007833 if (CPU == "bleeding-edge")
7834 Features["simd128"] = true;
7835 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7836 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007837 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007838 return llvm::StringSwitch<bool>(Feature)
7839 .Case("simd128", SIMDLevel >= SIMD128)
7840 .Default(false);
7841 }
7842 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007843 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007844 for (const auto &Feature : Features) {
7845 if (Feature == "+simd128") {
7846 SIMDLevel = std::max(SIMDLevel, SIMD128);
7847 continue;
7848 }
7849 if (Feature == "-simd128") {
7850 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7851 continue;
7852 }
7853
7854 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7855 << "-target-feature";
7856 return false;
7857 }
7858 return true;
7859 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007860 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007861 return llvm::StringSwitch<bool>(Name)
7862 .Case("mvp", true)
7863 .Case("bleeding-edge", true)
7864 .Case("generic", true)
7865 .Default(false);
7866 }
Craig Topper6c03a542015-10-19 04:51:35 +00007867 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7868 return llvm::makeArrayRef(BuiltinInfo,
7869 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007870 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007871 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007872 return VoidPtrBuiltinVaList;
7873 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007874 ArrayRef<const char *> getGCCRegNames() const final {
7875 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007876 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007877 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7878 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007879 }
7880 bool
7881 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007882 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007883 return false;
7884 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007885 const char *getClobbers() const final { return ""; }
7886 bool isCLZForZeroUndef() const final { return false; }
7887 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007888 IntType getIntTypeByWidth(unsigned BitWidth,
7889 bool IsSigned) const final {
7890 // WebAssembly prefers long long for explicitly 64-bit integers.
7891 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7892 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7893 }
7894 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7895 bool IsSigned) const final {
7896 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7897 return BitWidth == 64
7898 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7899 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7900 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007901};
7902
7903const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7904#define BUILTIN(ID, TYPE, ATTRS) \
7905 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7906#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7907 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7908#include "clang/Basic/BuiltinsWebAssembly.def"
7909};
7910
7911class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007913 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7914 const TargetOptions &Opts)
7915 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007916 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007917 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007918 }
7919
7920protected:
7921 void getTargetDefines(const LangOptions &Opts,
7922 MacroBuilder &Builder) const override {
7923 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7924 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7925 }
7926};
7927
7928class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7929public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007930 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7931 const TargetOptions &Opts)
7932 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007933 LongAlign = LongWidth = 64;
7934 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007935 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007936 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007937 }
7938
7939protected:
7940 void getTargetDefines(const LangOptions &Opts,
7941 MacroBuilder &Builder) const override {
7942 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7943 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7944 }
7945};
7946
JF Bastien643817d2014-09-12 17:52:47 +00007947const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7948#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007949 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007950#include "clang/Basic/BuiltinsLe64.def"
7951};
7952
Eric Christopherc48497a2015-09-18 21:26:24 +00007953static const unsigned SPIRAddrSpaceMap[] = {
7954 1, // opencl_global
7955 3, // opencl_local
7956 2, // opencl_constant
7957 4, // opencl_generic
7958 0, // cuda_device
7959 0, // cuda_constant
7960 0 // cuda_shared
7961};
7962class SPIRTargetInfo : public TargetInfo {
7963public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007964 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7965 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007966 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7967 "SPIR target must use unknown OS");
7968 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7969 "SPIR target must use unknown environment type");
7970 BigEndian = false;
7971 TLSSupported = false;
7972 LongWidth = LongAlign = 64;
7973 AddrSpaceMap = &SPIRAddrSpaceMap;
7974 UseAddrSpaceMapMangling = true;
7975 // Define available target features
7976 // These must be defined in sorted order!
7977 NoAsmVariants = true;
7978 }
7979 void getTargetDefines(const LangOptions &Opts,
7980 MacroBuilder &Builder) const override {
7981 DefineStd(Builder, "SPIR", Opts);
7982 }
7983 bool hasFeature(StringRef Feature) const override {
7984 return Feature == "spir";
7985 }
Craig Topper3164f332014-03-11 03:39:26 +00007986
Craig Topper6c03a542015-10-19 04:51:35 +00007987 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007988 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007989 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007990 bool validateAsmConstraint(const char *&Name,
7991 TargetInfo::ConstraintInfo &info) const override {
7992 return true;
7993 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007994 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7995 return None;
7996 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007997 BuiltinVaListKind getBuiltinVaListKind() const override {
7998 return TargetInfo::VoidPtrBuiltinVaList;
7999 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008000
Eric Christopherc48497a2015-09-18 21:26:24 +00008001 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008002 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8003 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008004 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008005
Eric Christopherc48497a2015-09-18 21:26:24 +00008006 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8007 return CC_SpirFunction;
8008 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008009
8010 void setSupportedOpenCLOpts() override {
8011 // Assume all OpenCL extensions and optional core features are supported
8012 // for SPIR since it is a generic target.
8013 getSupportedOpenCLOpts().setAll();
8014 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008015};
Guy Benyeib798fc92012-12-11 21:38:14 +00008016
Eric Christopherc48497a2015-09-18 21:26:24 +00008017class SPIR32TargetInfo : public SPIRTargetInfo {
8018public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008019 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8020 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008021 PointerWidth = PointerAlign = 32;
8022 SizeType = TargetInfo::UnsignedInt;
8023 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008024 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8025 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008026 }
8027 void getTargetDefines(const LangOptions &Opts,
8028 MacroBuilder &Builder) const override {
8029 DefineStd(Builder, "SPIR32", Opts);
8030 }
8031};
Guy Benyeib798fc92012-12-11 21:38:14 +00008032
Eric Christopherc48497a2015-09-18 21:26:24 +00008033class SPIR64TargetInfo : public SPIRTargetInfo {
8034public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008035 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8036 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008037 PointerWidth = PointerAlign = 64;
8038 SizeType = TargetInfo::UnsignedLong;
8039 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008040 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8041 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008042 }
8043 void getTargetDefines(const LangOptions &Opts,
8044 MacroBuilder &Builder) const override {
8045 DefineStd(Builder, "SPIR64", Opts);
8046 }
8047};
Guy Benyeib798fc92012-12-11 21:38:14 +00008048
Robert Lytton0e076492013-08-13 09:43:10 +00008049class XCoreTargetInfo : public TargetInfo {
8050 static const Builtin::Info BuiltinInfo[];
8051public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008052 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8053 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008054 BigEndian = false;
8055 NoAsmVariants = true;
8056 LongLongAlign = 32;
8057 SuitableAlign = 32;
8058 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008059 SizeType = UnsignedInt;
8060 PtrDiffType = SignedInt;
8061 IntPtrType = SignedInt;
8062 WCharType = UnsignedChar;
8063 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008064 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008065 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8066 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008067 }
Craig Topper3164f332014-03-11 03:39:26 +00008068 void getTargetDefines(const LangOptions &Opts,
8069 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008070 Builder.defineMacro("__XS1B__");
8071 }
Craig Topper6c03a542015-10-19 04:51:35 +00008072 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8073 return llvm::makeArrayRef(BuiltinInfo,
8074 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008075 }
Craig Topper3164f332014-03-11 03:39:26 +00008076 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008077 return TargetInfo::VoidPtrBuiltinVaList;
8078 }
Craig Topper3164f332014-03-11 03:39:26 +00008079 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008080 return "";
8081 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008082 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008083 static const char * const GCCRegNames[] = {
8084 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8085 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8086 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008087 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008088 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008089 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8090 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008091 }
Craig Topper3164f332014-03-11 03:39:26 +00008092 bool validateAsmConstraint(const char *&Name,
8093 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008094 return false;
8095 }
Craig Topper3164f332014-03-11 03:39:26 +00008096 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008097 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8098 return (RegNo < 2)? RegNo : -1;
8099 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008100 bool allowsLargerPreferedTypeAlignment() const override {
8101 return false;
8102 }
Robert Lytton0e076492013-08-13 09:43:10 +00008103};
8104
8105const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008106#define BUILTIN(ID, TYPE, ATTRS) \
8107 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8108#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8109 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008110#include "clang/Basic/BuiltinsXCore.def"
8111};
Robert Lytton0e076492013-08-13 09:43:10 +00008112
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008113// x86_32 Android target
8114class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8115public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8117 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008118 SuitableAlign = 32;
8119 LongDoubleWidth = 64;
8120 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8121 }
8122};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008123
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008124// x86_64 Android target
8125class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8126public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8128 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008129 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8130 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008131
8132 bool useFloat128ManglingForLongDouble() const override {
8133 return true;
8134 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008135};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008136
8137// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8138class RenderScript32TargetInfo : public ARMleTargetInfo {
8139public:
8140 RenderScript32TargetInfo(const llvm::Triple &Triple,
8141 const TargetOptions &Opts)
8142 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8143 Triple.getOSName(),
8144 Triple.getEnvironmentName()),
8145 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008146 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008147 LongWidth = LongAlign = 64;
8148 }
8149 void getTargetDefines(const LangOptions &Opts,
8150 MacroBuilder &Builder) const override {
8151 Builder.defineMacro("__RENDERSCRIPT__");
8152 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8153 }
8154};
8155
8156// 64-bit RenderScript is aarch64
8157class RenderScript64TargetInfo : public AArch64leTargetInfo {
8158public:
8159 RenderScript64TargetInfo(const llvm::Triple &Triple,
8160 const TargetOptions &Opts)
8161 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8162 Triple.getOSName(),
8163 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008164 Opts) {
8165 IsRenderScriptTarget = true;
8166 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008167
8168 void getTargetDefines(const LangOptions &Opts,
8169 MacroBuilder &Builder) const override {
8170 Builder.defineMacro("__RENDERSCRIPT__");
8171 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8172 }
8173};
8174
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008175} // end anonymous namespace
8176
Chris Lattner5ba61f02006-10-14 07:39:34 +00008177//===----------------------------------------------------------------------===//
8178// Driver code
8179//===----------------------------------------------------------------------===//
8180
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8182 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008183 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008184
Daniel Dunbar52322032009-08-18 05:47:58 +00008185 switch (Triple.getArch()) {
8186 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008187 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008188
Tim Northover2a0783d2014-05-30 14:14:07 +00008189 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008191
8192 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008193 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008194
Jacques Pienaard964cc22016-03-28 21:02:54 +00008195 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008196 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008197
Tim Northover2a0783d2014-05-30 14:14:07 +00008198 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008199 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008201
8202 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008203 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008204 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008205 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008206 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008207 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008208 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008209 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008210 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008211 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008213 }
8214
Christian Pirker9b019ae2014-02-25 13:51:00 +00008215 case llvm::Triple::aarch64_be:
8216 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008217 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008218 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008219 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008220 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008221 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008222 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008223 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008225 }
8226
Daniel Dunbar52322032009-08-18 05:47:58 +00008227 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008228 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008229 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008230 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008231
Daniel Dunbar52322032009-08-18 05:47:58 +00008232 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008233 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008235 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008236 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008237 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008238 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008239 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008241 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008242 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008243 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008245 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008246 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008247 case llvm::Triple::Win32:
8248 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008249 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008250 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008251 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008252 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008253 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008254 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008255 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008256 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008258 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008259 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008260 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008261 }
8262
8263 case llvm::Triple::armeb:
8264 case llvm::Triple::thumbeb:
8265 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008266 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008267
8268 switch (os) {
8269 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008270 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008271 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008272 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008273 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008274 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008275 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008277 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008279 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008280 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008281 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008283 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008284 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008285 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008286
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008287 case llvm::Triple::bpfeb:
8288 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008290
Daniel Dunbar52322032009-08-18 05:47:58 +00008291 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008292 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008293
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008294 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008295 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008296 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008297 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008298 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008299 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008300 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008301 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008302 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008303 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008304 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008305 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008306 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008307
8308 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008309 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008310 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008311 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008312 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008313 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008314 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008315 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008316 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008317 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008318 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008319 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008320 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008321 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008322 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008323
Akira Hatanakabef17452011-09-20 19:21:49 +00008324 case llvm::Triple::mips64:
8325 switch (os) {
8326 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008327 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008328 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008329 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008330 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008331 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008332 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008333 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008334 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008335 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008336 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008337 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008338 }
8339
8340 case llvm::Triple::mips64el:
8341 switch (os) {
8342 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008343 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008344 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008345 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008346 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008347 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008348 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008349 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008350 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008351 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008352 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008353 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008354 }
8355
Ivan Krasindd7403e2011-08-24 20:22:22 +00008356 case llvm::Triple::le32:
8357 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008358 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008360 default:
8361 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008362 }
8363
JF Bastien643817d2014-09-12 17:52:47 +00008364 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008365 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008366
Daniel Dunbar52322032009-08-18 05:47:58 +00008367 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008368 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008370 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008371 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008372 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008373 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008374 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008375 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008376 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008377 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008379 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008381 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008382 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008383 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008384
8385 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008386 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008388 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008389 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008391 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008392 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008393 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008394 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008395 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008397 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008398 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008399 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008400
Bill Schmidt778d3872013-07-26 01:36:11 +00008401 case llvm::Triple::ppc64le:
8402 switch (os) {
8403 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008404 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008405 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008406 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008407 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008409 }
8410
Peter Collingbournec947aae2012-05-20 23:28:41 +00008411 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008412 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008413 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008414 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008415
Tom Stellardd8e38a32015-01-06 20:34:47 +00008416 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008417 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008419
Daniel Dunbar52322032009-08-18 05:47:58 +00008420 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008421 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008422 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008424 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008426 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008428 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008430 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008432 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008434 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008435
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008436 // The 'sparcel' architecture copies all the above cases except for Solaris.
8437 case llvm::Triple::sparcel:
8438 switch (os) {
8439 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008440 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008441 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008443 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008445 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008447 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008449 }
8450
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008451 case llvm::Triple::sparcv9:
8452 switch (os) {
8453 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008455 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008457 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008459 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008461 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008462 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008463 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008464 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008465 }
8466
Ulrich Weigand47445072013-05-06 16:26:41 +00008467 case llvm::Triple::systemz:
8468 switch (os) {
8469 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008470 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008471 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008473 }
8474
Eli Friedmana9c3d712009-08-19 20:47:07 +00008475 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008477
Daniel Dunbar52322032009-08-18 05:47:58 +00008478 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008479 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008481
Daniel Dunbar52322032009-08-18 05:47:58 +00008482 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008483 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008484 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008485 case llvm::Triple::Linux: {
8486 switch (Triple.getEnvironment()) {
8487 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008488 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008489 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008491 }
8492 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008493 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008495 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008496 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008497 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008499 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008500 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008501 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008502 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008503 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008504 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008505 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008506 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008507 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008508 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008509 case llvm::Triple::Win32: {
8510 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008511 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008512 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008513 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008514 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008515 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008516 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008517 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008518 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008519 }
8520 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008521 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008522 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008523 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008524 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008525 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008527 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008528 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008529 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008530 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008531 }
8532
8533 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008534 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008536
Daniel Dunbar52322032009-08-18 05:47:58 +00008537 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008538 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008540 case llvm::Triple::Linux: {
8541 switch (Triple.getEnvironment()) {
8542 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008544 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008546 }
8547 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008548 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008550 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008552 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008554 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008556 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008558 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008560 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008562 case llvm::Triple::Win32: {
8563 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008564 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008566 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008568 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008569 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008571 }
8572 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008573 case llvm::Triple::Haiku:
8574 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008575 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008577 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008579 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008581 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008582
Douglas Katzman78d7c542015-05-12 21:18:10 +00008583 case llvm::Triple::spir: {
8584 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8585 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8586 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008588 }
8589 case llvm::Triple::spir64: {
8590 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8591 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8592 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008594 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008595 case llvm::Triple::wasm32:
8596 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8597 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008599 case llvm::Triple::wasm64:
8600 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8601 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008602 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008603
8604 case llvm::Triple::renderscript32:
8605 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8606 case llvm::Triple::renderscript64:
8607 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008608 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008609}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008610
8611/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008612/// options.
Alp Toker80758082014-07-06 05:26:44 +00008613TargetInfo *
8614TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008615 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008616 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008617
8618 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008619 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008620 if (!Target) {
8621 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008622 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008623 }
Alp Toker80758082014-07-06 05:26:44 +00008624 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008625
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008626 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008627 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8628 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008629 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008630 }
8631
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008632 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008633 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8634 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008635 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008636 }
8637
Rafael Espindolaeb265472013-08-21 21:59:03 +00008638 // Set the fp math unit.
8639 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8640 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008641 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008642 }
8643
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008644 // Compute the default target features, we need the target to handle this
8645 // because features may have dependencies on one another.
8646 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008647 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8648 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008649 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008650
8651 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008652 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008653 for (const auto &F : Features)
8654 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8655
Eric Christopher3ff21b32013-10-16 21:26:26 +00008656 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008657 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008658
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008659 Target->setSupportedOpenCLOpts();
8660
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008661 if (!Target->validateTarget(Diags))
8662 return nullptr;
8663
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008664 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008665}