blob: 62ecd1e28ce6d029defbd128008956b89c3c4dcd [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000873
Ulrich Weigand8afad612014-07-28 13:17:52 +0000874protected:
875 std::string ABI;
876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000878 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000879 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
880 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000881 HasBPERMD(false), HasExtDiv(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000882 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000883 LongDoubleWidth = LongDoubleAlign = 128;
884 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
885 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000886
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 /// \brief Flags for architecture specific defines.
888 typedef enum {
889 ArchDefineNone = 0,
890 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
891 ArchDefinePpcgr = 1 << 1,
892 ArchDefinePpcsq = 1 << 2,
893 ArchDefine440 = 1 << 3,
894 ArchDefine603 = 1 << 4,
895 ArchDefine604 = 1 << 5,
896 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000897 ArchDefinePwr5 = 1 << 7,
898 ArchDefinePwr5x = 1 << 8,
899 ArchDefinePwr6 = 1 << 9,
900 ArchDefinePwr6x = 1 << 10,
901 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000902 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000903 ArchDefinePwr9 = 1 << 13,
904 ArchDefineA2 = 1 << 14,
905 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000906 } ArchDefineTypes;
907
Bill Schmidt38378a02013-02-01 20:23:10 +0000908 // Note: GCC recognizes the following additional cpus:
909 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
910 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
911 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000912 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000913 bool CPUKnown = llvm::StringSwitch<bool>(Name)
914 .Case("generic", true)
915 .Case("440", true)
916 .Case("450", true)
917 .Case("601", true)
918 .Case("602", true)
919 .Case("603", true)
920 .Case("603e", true)
921 .Case("603ev", true)
922 .Case("604", true)
923 .Case("604e", true)
924 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000925 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000926 .Case("g3", true)
927 .Case("7400", true)
928 .Case("g4", true)
929 .Case("7450", true)
930 .Case("g4+", true)
931 .Case("750", true)
932 .Case("970", true)
933 .Case("g5", true)
934 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000935 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000936 .Case("e500mc", true)
937 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000938 .Case("power3", true)
939 .Case("pwr3", true)
940 .Case("power4", true)
941 .Case("pwr4", true)
942 .Case("power5", true)
943 .Case("pwr5", true)
944 .Case("power5x", true)
945 .Case("pwr5x", true)
946 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000947 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("power6x", true)
949 .Case("pwr6x", true)
950 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000952 .Case("power8", true)
953 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000954 .Case("power9", true)
955 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000956 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000957 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000958 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000959 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000960 .Case("powerpc64le", true)
961 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Default(false);
963
964 if (CPUKnown)
965 CPU = Name;
966
967 return CPUKnown;
968 }
969
Ulrich Weigand8afad612014-07-28 13:17:52 +0000970
971 StringRef getABI() const override { return ABI; }
972
Craig Topper6c03a542015-10-19 04:51:35 +0000973 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
974 return llvm::makeArrayRef(BuiltinInfo,
975 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000976 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000977
Craig Topper3164f332014-03-11 03:39:26 +0000978 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000979
Craig Topper3164f332014-03-11 03:39:26 +0000980 void getTargetDefines(const LangOptions &Opts,
981 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000982
Eric Christopher8c47b422015-10-09 18:39:55 +0000983 bool
984 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
985 StringRef CPU,
986 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000987
Craig Topper3164f332014-03-11 03:39:26 +0000988 bool handleTargetFeatures(std::vector<std::string> &Features,
989 DiagnosticsEngine &Diags) override;
990 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000991 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
992 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000993
Craig Topperf054e3a2015-10-19 03:52:27 +0000994 ArrayRef<const char *> getGCCRegNames() const override;
995 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000996 bool validateAsmConstraint(const char *&Name,
997 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000998 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000999 default: return false;
1000 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001002 case 'b': // Base register
1003 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001004 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001005 break;
1006 // FIXME: The following are added to allow parsing.
1007 // I just took a guess at what the actions should be.
1008 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001009 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001010 case 'v': // Altivec vector register
1011 Info.setAllowsRegister();
1012 break;
1013 case 'w':
1014 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'd':// VSX vector register to hold vector double data
1016 case 'f':// VSX vector register to hold vector float data
1017 case 's':// VSX vector register to hold scalar float data
1018 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001019 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001020 break;
1021 default:
1022 return false;
1023 }
1024 Info.setAllowsRegister();
1025 Name++; // Skip over 'w'.
1026 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001027 case 'h': // `MQ', `CTR', or `LINK' register
1028 case 'q': // `MQ' register
1029 case 'c': // `CTR' register
1030 case 'l': // `LINK' register
1031 case 'x': // `CR' register (condition register) number 0
1032 case 'y': // `CR' register (condition register)
1033 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001034 Info.setAllowsRegister();
1035 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // (use `L' instead for SImode constants)
1039 case 'K': // Unsigned 16-bit constant
1040 case 'L': // Signed 16-bit constant shifted left 16 bits
1041 case 'M': // Constant larger than 31
1042 case 'N': // Exact power of 2
1043 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001044 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001048 break;
1049 case 'm': // Memory operand. Note that on PowerPC targets, m can
1050 // include addresses that update the base register. It
1051 // is therefore only safe to use `m' in an asm statement
1052 // if that asm statement accesses the operand exactly once.
1053 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001054 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001055 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001056 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001058 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1059 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001060 // register to be updated.
1061 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001062 if (Name[1] != 's')
1063 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001064 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001065 // include any automodification of the base register. Unlike
1066 // `m', this constraint can be used in asm statements that
1067 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001068 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001069 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001070 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 'Z': // Memory operand that is an indexed or indirect from a
1075 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001076 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001077 Info.setAllowsMemory();
1078 Info.setAllowsRegister();
1079 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001081 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // register (`p' is preferable for asm statements)
1083 case 'S': // Constant suitable as a 64-bit mask operand
1084 case 'T': // Constant suitable as a 32-bit mask operand
1085 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001086 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001087 // instructions
1088 case 'W': // Vector constant that does not require memory
1089 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001090 break;
1091 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
John Thompson07a61a42010-06-24 22:44:13 +00001093 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001094 }
Craig Topper3164f332014-03-11 03:39:26 +00001095 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001096 std::string R;
1097 switch (*Constraint) {
1098 case 'e':
1099 case 'w':
1100 // Two-character constraint; add "^" hint for later parsing.
1101 R = std::string("^") + std::string(Constraint, 2);
1102 Constraint++;
1103 break;
1104 default:
1105 return TargetInfo::convertConstraint(Constraint);
1106 }
1107 return R;
1108 }
Craig Topper3164f332014-03-11 03:39:26 +00001109 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001111 }
Craig Topper3164f332014-03-11 03:39:26 +00001112 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001113 if (RegNo == 0) return 3;
1114 if (RegNo == 1) return 4;
1115 return -1;
1116 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001117
1118 bool hasSjLjLowering() const override {
1119 return true;
1120 }
David Majnemer2617ea62015-06-09 18:05:33 +00001121
1122 bool useFloat128ManglingForLongDouble() const override {
1123 return LongDoubleWidth == 128 &&
1124 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1125 getTriple().isOSBinFormatELF();
1126 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001127};
Anders Carlssonf511f642007-11-27 04:11:28 +00001128
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001129const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001130#define BUILTIN(ID, TYPE, ATTRS) \
1131 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1132#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1133 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001134#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001136
Eric Christopher917e9522014-11-18 22:36:15 +00001137/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001138/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001139bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001140 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001141 for (const auto &Feature : Features) {
1142 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001143 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001144 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001145 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001146 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001147 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001148 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001149 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001150 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001151 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001152 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001153 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001154 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001155 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001156 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001157 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001158 } else if (Feature == "+float128") {
1159 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001160 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161 // TODO: Finish this list and add an assert that we've handled them
1162 // all.
1163 }
Eric Christopher02c33352015-08-25 00:59:11 +00001164
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001165 return true;
1166}
1167
Chris Lattnerecd49032009-03-02 22:27:17 +00001168/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1169/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001170void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001171 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001172 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001173 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001174 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001176 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001177 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001179 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001180 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001181 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001182 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001183 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001186 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1187 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001188 } else {
1189 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1190 getTriple().getOS() != llvm::Triple::OpenBSD)
1191 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001192 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001193
Ulrich Weigand8afad612014-07-28 13:17:52 +00001194 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001195 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001196 Builder.defineMacro("_CALL_ELF", "1");
1197 if (ABI == "elfv2")
1198 Builder.defineMacro("_CALL_ELF", "2");
1199
Chris Lattnerecd49032009-03-02 22:27:17 +00001200 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001201 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1202 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001203
Chris Lattnerecd49032009-03-02 22:27:17 +00001204 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001205 if (LongDoubleWidth == 128)
1206 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001207
John Thompsone467e192009-11-19 17:18:50 +00001208 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001209 Builder.defineMacro("__VEC__", "10206");
1210 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001211 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001212
1213 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1215 .Case("440", ArchDefineName)
1216 .Case("450", ArchDefineName | ArchDefine440)
1217 .Case("601", ArchDefineName)
1218 .Case("602", ArchDefineName | ArchDefinePpcgr)
1219 .Case("603", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1221 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("604", ArchDefineName | ArchDefinePpcgr)
1223 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1224 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001225 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001226 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1227 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1228 .Case("750", ArchDefineName | ArchDefinePpcgr)
1229 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1230 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001231 .Case("a2", ArchDefineA2)
1232 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001233 .Case("pwr3", ArchDefinePpcgr)
1234 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1235 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1236 | ArchDefinePpcsq)
1237 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1238 | ArchDefinePpcgr | ArchDefinePpcsq)
1239 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1240 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1242 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1243 | ArchDefinePpcsq)
1244 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1245 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001246 | ArchDefinePpcgr | ArchDefinePpcsq)
1247 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1248 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1249 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001250 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1251 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1252 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1253 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001254 .Case("power3", ArchDefinePpcgr)
1255 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1256 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
1258 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1259 | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1261 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1263 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1264 | ArchDefinePpcsq)
1265 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1266 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001267 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1269 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1270 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001271 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1272 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1273 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1274 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001275 .Default(ArchDefineNone);
1276
1277 if (defs & ArchDefineName)
1278 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1279 if (defs & ArchDefinePpcgr)
1280 Builder.defineMacro("_ARCH_PPCGR");
1281 if (defs & ArchDefinePpcsq)
1282 Builder.defineMacro("_ARCH_PPCSQ");
1283 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001285 if (defs & ArchDefine603)
1286 Builder.defineMacro("_ARCH_603");
1287 if (defs & ArchDefine604)
1288 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001289 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001290 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001291 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001292 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001293 if (defs & ArchDefinePwr5x)
1294 Builder.defineMacro("_ARCH_PWR5X");
1295 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001297 if (defs & ArchDefinePwr6x)
1298 Builder.defineMacro("_ARCH_PWR6X");
1299 if (defs & ArchDefinePwr7)
1300 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001301 if (defs & ArchDefinePwr8)
1302 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001303 if (defs & ArchDefinePwr9)
1304 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001305 if (defs & ArchDefineA2)
1306 Builder.defineMacro("_ARCH_A2");
1307 if (defs & ArchDefineA2q) {
1308 Builder.defineMacro("_ARCH_A2Q");
1309 Builder.defineMacro("_ARCH_QP");
1310 }
1311
1312 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1313 Builder.defineMacro("__bg__");
1314 Builder.defineMacro("__THW_BLUEGENE__");
1315 Builder.defineMacro("__bgq__");
1316 Builder.defineMacro("__TOS_BGQ__");
1317 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001318
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001319 if (HasVSX)
1320 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001321 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001322 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001323 if (HasP8Crypto)
1324 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001325 if (HasHTM)
1326 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001327 if (HasFloat128)
1328 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001329
1330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1333 if (PointerWidth == 64)
1334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001335
Bill Schmidt38378a02013-02-01 20:23:10 +00001336 // FIXME: The following are not yet generated here by Clang, but are
1337 // generated by GCC:
1338 //
1339 // _SOFT_FLOAT_
1340 // __RECIP_PRECISION__
1341 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001342 // __RECIP__
1343 // __RECIPF__
1344 // __RSQRTE__
1345 // __RSQRTEF__
1346 // _SOFT_DOUBLE_
1347 // __NO_LWSYNC__
1348 // __HAVE_BSWAP__
1349 // __LONGDOUBLE128
1350 // __CMODEL_MEDIUM__
1351 // __CMODEL_LARGE__
1352 // _CALL_SYSV
1353 // _CALL_DARWIN
1354 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001355}
1356
Eric Christophera8a14c32015-08-31 18:39:16 +00001357// Handle explicit options being passed to the compiler here: if we've
1358// explicitly turned off vsx and turned on power8-vector or direct-move then
1359// go ahead and error since the customer has expressed a somewhat incompatible
1360// set of options.
1361static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001362 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001363
1364 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1365 FeaturesVec.end()) {
1366 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1367 FeaturesVec.end()) {
1368 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1369 << "-mno-vsx";
1370 return false;
1371 }
1372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1374 FeaturesVec.end()) {
1375 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1376 << "-mno-vsx";
1377 return false;
1378 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001379
1380 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1381 FeaturesVec.end()) {
1382 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1383 << "-mno-vsx";
1384 return false;
1385 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001386 }
1387
1388 return true;
1389}
1390
Eric Christopher8c47b422015-10-09 18:39:55 +00001391bool PPCTargetInfo::initFeatureMap(
1392 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1393 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001394 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("7400", true)
1396 .Case("g4", true)
1397 .Case("7450", true)
1398 .Case("g4+", true)
1399 .Case("970", true)
1400 .Case("g5", true)
1401 .Case("pwr6", true)
1402 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001403 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001404 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001405 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001406 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001407 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001408
1409 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001410 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001412 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001413 .Case("pwr8", true)
1414 .Default(false);
1415 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1416 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001417 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001418 .Case("pwr8", true)
1419 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001420 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1421 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001422 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001423 .Case("pwr8", true)
1424 .Case("pwr7", true)
1425 .Default(false);
1426 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1427 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001428 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001429 .Case("pwr8", true)
1430 .Case("pwr7", true)
1431 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001432 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001437 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001443
Eric Christophera8a14c32015-08-31 18:39:16 +00001444 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1445 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001446
Eric Christopher007b0a02015-08-28 22:32:01 +00001447 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001448}
1449
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001450bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001451 return llvm::StringSwitch<bool>(Feature)
1452 .Case("powerpc", true)
1453 .Case("vsx", HasVSX)
1454 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001455 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001456 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001457 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001458 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 .Case("bpermd", HasBPERMD)
1460 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001461 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001462 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001463}
Chris Lattner17df24e2008-04-21 18:56:49 +00001464
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001465void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1466 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001467 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1468 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1469 // incompatible options.
1470 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001471 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001472 Features[Name] = Features["vsx"] = true;
1473 } else if (Name == "power8-vector") {
1474 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001475 } else if (Name == "float128") {
1476 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001477 } else {
1478 Features[Name] = true;
1479 }
1480 } else {
1481 if (Name == "vsx") {
1482 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001483 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001484 } else {
1485 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001486 }
1487 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001488}
1489
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001490const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001491 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1492 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1493 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1494 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1495 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1496 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1497 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1498 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001499 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001500 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001502 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1503 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1504 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1505 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001506 "vrsave", "vscr",
1507 "spe_acc", "spefscr",
1508 "sfp"
1509};
Chris Lattner10a5b382007-01-29 05:24:35 +00001510
Craig Topperf054e3a2015-10-19 03:52:27 +00001511ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1512 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001513}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001514
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001515const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1516 // While some of these aliases do map to different registers
1517 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001518 { { "0" }, "r0" },
1519 { { "1"}, "r1" },
1520 { { "2" }, "r2" },
1521 { { "3" }, "r3" },
1522 { { "4" }, "r4" },
1523 { { "5" }, "r5" },
1524 { { "6" }, "r6" },
1525 { { "7" }, "r7" },
1526 { { "8" }, "r8" },
1527 { { "9" }, "r9" },
1528 { { "10" }, "r10" },
1529 { { "11" }, "r11" },
1530 { { "12" }, "r12" },
1531 { { "13" }, "r13" },
1532 { { "14" }, "r14" },
1533 { { "15" }, "r15" },
1534 { { "16" }, "r16" },
1535 { { "17" }, "r17" },
1536 { { "18" }, "r18" },
1537 { { "19" }, "r19" },
1538 { { "20" }, "r20" },
1539 { { "21" }, "r21" },
1540 { { "22" }, "r22" },
1541 { { "23" }, "r23" },
1542 { { "24" }, "r24" },
1543 { { "25" }, "r25" },
1544 { { "26" }, "r26" },
1545 { { "27" }, "r27" },
1546 { { "28" }, "r28" },
1547 { { "29" }, "r29" },
1548 { { "30" }, "r30" },
1549 { { "31" }, "r31" },
1550 { { "fr0" }, "f0" },
1551 { { "fr1" }, "f1" },
1552 { { "fr2" }, "f2" },
1553 { { "fr3" }, "f3" },
1554 { { "fr4" }, "f4" },
1555 { { "fr5" }, "f5" },
1556 { { "fr6" }, "f6" },
1557 { { "fr7" }, "f7" },
1558 { { "fr8" }, "f8" },
1559 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001560 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001561 { { "fr11" }, "f11" },
1562 { { "fr12" }, "f12" },
1563 { { "fr13" }, "f13" },
1564 { { "fr14" }, "f14" },
1565 { { "fr15" }, "f15" },
1566 { { "fr16" }, "f16" },
1567 { { "fr17" }, "f17" },
1568 { { "fr18" }, "f18" },
1569 { { "fr19" }, "f19" },
1570 { { "fr20" }, "f20" },
1571 { { "fr21" }, "f21" },
1572 { { "fr22" }, "f22" },
1573 { { "fr23" }, "f23" },
1574 { { "fr24" }, "f24" },
1575 { { "fr25" }, "f25" },
1576 { { "fr26" }, "f26" },
1577 { { "fr27" }, "f27" },
1578 { { "fr28" }, "f28" },
1579 { { "fr29" }, "f29" },
1580 { { "fr30" }, "f30" },
1581 { { "fr31" }, "f31" },
1582 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001583};
1584
Craig Topperf054e3a2015-10-19 03:52:27 +00001585ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1586 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001588
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001591 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1592 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001593 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001594
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001595 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001596 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001597 case llvm::Triple::FreeBSD:
1598 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001599 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001600 PtrDiffType = SignedInt;
1601 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001602 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001603 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001604 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001605 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001606
Roman Divacky3ffe7462012-03-13 19:20:17 +00001607 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1608 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001609 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001610 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001611
1612 // PPC32 supports atomics up to 4 bytes.
1613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001614 }
1615
Craig Topper3164f332014-03-11 03:39:26 +00001616 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001617 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001618 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001619 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001620};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621
Bill Schmidt778d3872013-07-26 01:36:11 +00001622// Note: ABI differences may eventually require us to have a separate
1623// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001624class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001626 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1627 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001628 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001629 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001631
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001632 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001633 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001634 ABI = "elfv2";
1635 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001636 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001637 ABI = "elfv1";
1638 }
1639
1640 switch (getTriple().getOS()) {
1641 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001642 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001643 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001644 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001645 case llvm::Triple::NetBSD:
1646 IntMaxType = SignedLongLong;
1647 Int64Type = SignedLongLong;
1648 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001649 default:
1650 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001651 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001652
1653 // PPC64 supports atomics up to 8 bytes.
1654 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001655 }
Craig Topper3164f332014-03-11 03:39:26 +00001656 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001657 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001659 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001660 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001661 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001662 ABI = Name;
1663 return true;
1664 }
1665 return false;
1666 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001667};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001669class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001671 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1672 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001674 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001675 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001676 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001677 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001679 }
Craig Topper3164f332014-03-11 03:39:26 +00001680 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001681 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001682 }
1683};
1684
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001685class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001686public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001687 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1688 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001689 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001690 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001691 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001692 }
1693};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695static const unsigned NVPTXAddrSpaceMap[] = {
1696 1, // opencl_global
1697 3, // opencl_local
1698 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001699 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001700 0, // opencl_generic
1701 1, // cuda_device
1702 4, // cuda_constant
1703 3, // cuda_shared
1704};
1705
1706class NVPTXTargetInfo : public TargetInfo {
1707 static const char *const GCCRegNames[];
1708 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001709 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001710
Eric Christopherc48497a2015-09-18 21:26:24 +00001711public:
Justin Lebar76945b22016-04-29 23:05:19 +00001712 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 TLSSupported = false;
1715 LongWidth = LongAlign = 64;
1716 AddrSpaceMap = &NVPTXAddrSpaceMap;
1717 UseAddrSpaceMapMangling = true;
1718 // Define available target features
1719 // These must be defined in sorted order!
1720 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001721 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001722
1723 // If possible, get a TargetInfo for our host triple, so we can match its
1724 // types.
1725 llvm::Triple HostTriple(Opts.HostTriple);
1726 if (HostTriple.isNVPTX())
1727 return;
1728 std::unique_ptr<TargetInfo> HostTarget(
1729 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1730 if (!HostTarget) {
1731 return;
1732 }
1733
1734 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1735 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1736 BoolWidth = HostTarget->getBoolWidth();
1737 BoolAlign = HostTarget->getBoolAlign();
1738 IntWidth = HostTarget->getIntWidth();
1739 IntAlign = HostTarget->getIntAlign();
1740 HalfWidth = HostTarget->getHalfWidth();
1741 HalfAlign = HostTarget->getHalfAlign();
1742 FloatWidth = HostTarget->getFloatWidth();
1743 FloatAlign = HostTarget->getFloatAlign();
1744 DoubleWidth = HostTarget->getDoubleWidth();
1745 DoubleAlign = HostTarget->getDoubleAlign();
1746 LongWidth = HostTarget->getLongWidth();
1747 LongAlign = HostTarget->getLongAlign();
1748 LongLongWidth = HostTarget->getLongLongWidth();
1749 LongLongAlign = HostTarget->getLongLongAlign();
1750 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1751 DefaultAlignForAttributeAligned =
1752 HostTarget->getDefaultAlignForAttributeAligned();
1753 SizeType = HostTarget->getSizeType();
1754 IntMaxType = HostTarget->getIntMaxType();
1755 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1756 IntPtrType = HostTarget->getIntPtrType();
1757 WCharType = HostTarget->getWCharType();
1758 WIntType = HostTarget->getWIntType();
1759 Char16Type = HostTarget->getChar16Type();
1760 Char32Type = HostTarget->getChar32Type();
1761 Int64Type = HostTarget->getInt64Type();
1762 SigAtomicType = HostTarget->getSigAtomicType();
1763 ProcessIDType = HostTarget->getProcessIDType();
1764
1765 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1766 UseZeroLengthBitfieldAlignment =
1767 HostTarget->useZeroLengthBitfieldAlignment();
1768 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1769 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1770
Justin Lebar5057f172016-09-09 20:35:43 +00001771 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1772 // we need those macros to be identical on host and device, because (among
1773 // other things) they affect which standard library classes are defined, and
1774 // we need all classes to be defined on both the host and device.
1775 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // Properties intentionally not copied from host:
1778 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1779 // host/device boundary.
1780 // - SuitableAlign: Not visible across the host/device boundary, and may
1781 // correctly be different on host/device, e.g. if host has wider vector
1782 // types than device.
1783 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1784 // as its double type, but that's not necessarily true on the host.
1785 // TODO: nvcc emits a warning when using long double on device; we should
1786 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001787 }
1788 void getTargetDefines(const LangOptions &Opts,
1789 MacroBuilder &Builder) const override {
1790 Builder.defineMacro("__PTX__");
1791 Builder.defineMacro("__NVPTX__");
1792 if (Opts.CUDAIsDevice) {
1793 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001794 std::string CUDAArchCode = [this] {
1795 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001796 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001797 assert(false && "No GPU arch when compiling CUDA device code.");
1798 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001819 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001821 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001822 return "620";
1823 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001824 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001825 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001826 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001827 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
Craig Topper6c03a542015-10-19 04:51:35 +00001829 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1830 return llvm::makeArrayRef(BuiltinInfo,
1831 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 }
1833 bool hasFeature(StringRef Feature) const override {
1834 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001835 }
1836
Craig Topperf054e3a2015-10-19 03:52:27 +00001837 ArrayRef<const char *> getGCCRegNames() const override;
1838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001839 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001840 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 }
1842 bool validateAsmConstraint(const char *&Name,
1843 TargetInfo::ConstraintInfo &Info) const override {
1844 switch (*Name) {
1845 default:
1846 return false;
1847 case 'c':
1848 case 'h':
1849 case 'r':
1850 case 'l':
1851 case 'f':
1852 case 'd':
1853 Info.setAllowsRegister();
1854 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001855 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001856 }
1857 const char *getClobbers() const override {
1858 // FIXME: Is this really right?
1859 return "";
1860 }
1861 BuiltinVaListKind getBuiltinVaListKind() const override {
1862 // FIXME: implement
1863 return TargetInfo::CharPtrBuiltinVaList;
1864 }
1865 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001866 GPU = StringToCudaArch(Name);
1867 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001868 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001869 void setSupportedOpenCLOpts() override {
1870 auto &Opts = getSupportedOpenCLOpts();
1871 Opts.cl_clang_storage_class_specifiers = 1;
1872 Opts.cl_khr_gl_sharing = 1;
1873 Opts.cl_khr_icd = 1;
1874
1875 Opts.cl_khr_fp64 = 1;
1876 Opts.cl_khr_byte_addressable_store = 1;
1877 Opts.cl_khr_global_int32_base_atomics = 1;
1878 Opts.cl_khr_global_int32_extended_atomics = 1;
1879 Opts.cl_khr_local_int32_base_atomics = 1;
1880 Opts.cl_khr_local_int32_extended_atomics = 1;
1881 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001882};
1883
1884const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1885#define BUILTIN(ID, TYPE, ATTRS) \
1886 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1887#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1888 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1889#include "clang/Basic/BuiltinsNVPTX.def"
1890};
1891
1892const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1893
Craig Topperf054e3a2015-10-19 03:52:27 +00001894ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1895 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001896}
1897
1898class NVPTX32TargetInfo : public NVPTXTargetInfo {
1899public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001900 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1901 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001902 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 PointerWidth = PointerAlign = 32;
1904 SizeType = TargetInfo::UnsignedInt;
1905 PtrDiffType = TargetInfo::SignedInt;
1906 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001907 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001908 }
1909};
1910
1911class NVPTX64TargetInfo : public NVPTXTargetInfo {
1912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001913 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1914 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001915 PointerWidth = PointerAlign = 64;
1916 SizeType = TargetInfo::UnsignedLong;
1917 PtrDiffType = TargetInfo::SignedLong;
1918 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001919 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 }
1921};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001922
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001923static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // opencl_global
1925 3, // opencl_local
1926 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001927 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001928 1, // cuda_device
1929 2, // cuda_constant
1930 3 // cuda_shared
1931};
1932
Tom Stellarda96344b2014-08-21 13:58:40 +00001933// If you edit the description strings, make sure you update
1934// getPointerWidthV().
1935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001937 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1938 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001939
Craig Topper273dbc62015-10-18 05:29:26 +00001940static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001941 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001942 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1943 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944
Matt Arsenault250024f2016-06-08 01:56:42 +00001945class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001946 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001947 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001948
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001949 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001950 enum GPUKind {
1951 GK_NONE,
1952 GK_R600,
1953 GK_R600_DOUBLE_OPS,
1954 GK_R700,
1955 GK_R700_DOUBLE_OPS,
1956 GK_EVERGREEN,
1957 GK_EVERGREEN_DOUBLE_OPS,
1958 GK_NORTHERN_ISLANDS,
1959 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001960 GK_GFX6,
1961 GK_GFX7,
1962 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001963 } GPU;
1964
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 bool hasFP64:1;
1966 bool hasFMAF:1;
1967 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00001968 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001969
Matt Arsenault250024f2016-06-08 01:56:42 +00001970 static bool isAMDGCN(const llvm::Triple &TT) {
1971 return TT.getArch() == llvm::Triple::amdgcn;
1972 }
1973
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001975 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001976 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001977 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 hasFP64(false),
1979 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001980 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00001981 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001982 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001983 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001984 hasFMAF = true;
1985 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001986 }
Matt Arsenault250024f2016-06-08 01:56:42 +00001987
1988 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1989 DataLayoutStringSI : DataLayoutStringR600);
1990
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001991 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001992 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001993 }
1994
Tom Stellarda96344b2014-08-21 13:58:40 +00001995 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1996 if (GPU <= GK_CAYMAN)
1997 return 32;
1998
1999 switch(AddrSpace) {
2000 default:
2001 return 64;
2002 case 0:
2003 case 3:
2004 case 5:
2005 return 32;
2006 }
2007 }
2008
Yaxun Liu26f75662016-08-19 05:17:25 +00002009 uint64_t getMaxPointerWidth() const override {
2010 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2011 }
2012
Craig Topper3164f332014-03-11 03:39:26 +00002013 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002014 return "";
2015 }
2016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002018
Craig Topperf054e3a2015-10-19 03:52:27 +00002019 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2020 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002021 }
2022
Craig Topper3164f332014-03-11 03:39:26 +00002023 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002024 TargetInfo::ConstraintInfo &Info) const override {
2025 switch (*Name) {
2026 default: break;
2027 case 'v': // vgpr
2028 case 's': // sgpr
2029 Info.setAllowsRegister();
2030 return true;
2031 }
2032 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002033 }
2034
Matt Arsenault250024f2016-06-08 01:56:42 +00002035 bool initFeatureMap(llvm::StringMap<bool> &Features,
2036 DiagnosticsEngine &Diags, StringRef CPU,
2037 const std::vector<std::string> &FeatureVec) const override;
2038
Yaxun Liu2c17e822016-08-09 19:43:38 +00002039 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2040 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002041 bool hasFP32Denormals = false;
2042 bool hasFP64Denormals = false;
2043 for (auto &I : TargetOpts.FeaturesAsWritten) {
2044 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2045 hasFP32Denormals = true;
2046 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2047 hasFP64Denormals = true;
2048 }
2049 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002050 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2051 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2052 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002053 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002054 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002055 }
2056
Craig Topper6c03a542015-10-19 04:51:35 +00002057 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2058 return llvm::makeArrayRef(BuiltinInfo,
2059 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002060 }
2061
Craig Topper3164f332014-03-11 03:39:26 +00002062 void getTargetDefines(const LangOptions &Opts,
2063 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002064 if (getTriple().getArch() == llvm::Triple::amdgcn)
2065 Builder.defineMacro("__AMDGCN__");
2066 else
2067 Builder.defineMacro("__R600__");
2068
Jan Veselyeebeaea2015-05-04 19:53:36 +00002069 if (hasFMAF)
2070 Builder.defineMacro("__HAS_FMAF__");
2071 if (hasLDEXPF)
2072 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002073 if (hasFP64)
2074 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002075 }
2076
Craig Topper3164f332014-03-11 03:39:26 +00002077 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002078 return TargetInfo::CharPtrBuiltinVaList;
2079 }
2080
Matt Arsenault250024f2016-06-08 01:56:42 +00002081 static GPUKind parseR600Name(StringRef Name) {
2082 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002083 .Case("r600" , GK_R600)
2084 .Case("rv610", GK_R600)
2085 .Case("rv620", GK_R600)
2086 .Case("rv630", GK_R600)
2087 .Case("rv635", GK_R600)
2088 .Case("rs780", GK_R600)
2089 .Case("rs880", GK_R600)
2090 .Case("rv670", GK_R600_DOUBLE_OPS)
2091 .Case("rv710", GK_R700)
2092 .Case("rv730", GK_R700)
2093 .Case("rv740", GK_R700_DOUBLE_OPS)
2094 .Case("rv770", GK_R700_DOUBLE_OPS)
2095 .Case("palm", GK_EVERGREEN)
2096 .Case("cedar", GK_EVERGREEN)
2097 .Case("sumo", GK_EVERGREEN)
2098 .Case("sumo2", GK_EVERGREEN)
2099 .Case("redwood", GK_EVERGREEN)
2100 .Case("juniper", GK_EVERGREEN)
2101 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2102 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2103 .Case("barts", GK_NORTHERN_ISLANDS)
2104 .Case("turks", GK_NORTHERN_ISLANDS)
2105 .Case("caicos", GK_NORTHERN_ISLANDS)
2106 .Case("cayman", GK_CAYMAN)
2107 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 .Default(GK_NONE);
2109 }
2110
2111 static GPUKind parseAMDGCNName(StringRef Name) {
2112 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002113 .Case("tahiti", GK_GFX6)
2114 .Case("pitcairn", GK_GFX6)
2115 .Case("verde", GK_GFX6)
2116 .Case("oland", GK_GFX6)
2117 .Case("hainan", GK_GFX6)
2118 .Case("bonaire", GK_GFX7)
2119 .Case("kabini", GK_GFX7)
2120 .Case("kaveri", GK_GFX7)
2121 .Case("hawaii", GK_GFX7)
2122 .Case("mullins", GK_GFX7)
2123 .Case("tonga", GK_GFX8)
2124 .Case("iceland", GK_GFX8)
2125 .Case("carrizo", GK_GFX8)
2126 .Case("fiji", GK_GFX8)
2127 .Case("stoney", GK_GFX8)
2128 .Case("polaris10", GK_GFX8)
2129 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002130 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002131 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002132
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 bool setCPU(const std::string &Name) override {
2134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 GPU = parseAMDGCNName(Name);
2136 else
2137 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002138
Matt Arsenault250024f2016-06-08 01:56:42 +00002139 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002140 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002141
Jan Vesely211ba782016-06-17 02:25:03 +00002142 void setSupportedOpenCLOpts() override {
2143 auto &Opts = getSupportedOpenCLOpts();
2144 Opts.cl_clang_storage_class_specifiers = 1;
2145 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002146
Jan Vesely211ba782016-06-17 02:25:03 +00002147 if (hasFP64)
2148 Opts.cl_khr_fp64 = 1;
2149 if (GPU >= GK_EVERGREEN) {
2150 Opts.cl_khr_byte_addressable_store = 1;
2151 Opts.cl_khr_global_int32_base_atomics = 1;
2152 Opts.cl_khr_global_int32_extended_atomics = 1;
2153 Opts.cl_khr_local_int32_base_atomics = 1;
2154 Opts.cl_khr_local_int32_extended_atomics = 1;
2155 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002156 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002157 Opts.cl_khr_fp16 = 1;
2158 Opts.cl_khr_int64_base_atomics = 1;
2159 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002160 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002161 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002162 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002163 Opts.cl_amd_media_ops = 1;
2164 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002165 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002166 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002167
Yaxun Liu99444cb2016-08-03 20:38:06 +00002168 LangAS::ID getOpenCLImageAddrSpace() const override {
2169 return LangAS::opencl_constant;
2170 }
2171
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002172 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2173 switch (CC) {
2174 default:
2175 return CCCR_Warning;
2176 case CC_C:
2177 case CC_OpenCLKernel:
2178 return CCCR_OK;
2179 }
2180 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002181};
2182
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002183const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002184#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002186#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2187 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002188#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002189};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002190const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002191 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2192 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2193 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2194 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2195 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2196 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2197 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2198 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2199 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2200 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2201 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2202 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2203 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2204 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2205 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2206 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2207 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2208 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2209 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2210 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2211 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2212 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2213 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2214 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2215 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2216 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2217 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2218 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2219 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2220 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2221 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2222 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2223 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2224 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2225 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2226 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2227 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2228 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2229 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2230 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2231 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2232 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2233 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2234 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2235 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2236 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2237 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002238 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002239 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2240 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002241};
2242
Craig Topperf054e3a2015-10-19 03:52:27 +00002243ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2244 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002245}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002246
Matt Arsenault250024f2016-06-08 01:56:42 +00002247bool AMDGPUTargetInfo::initFeatureMap(
2248 llvm::StringMap<bool> &Features,
2249 DiagnosticsEngine &Diags, StringRef CPU,
2250 const std::vector<std::string> &FeatureVec) const {
2251
2252 // XXX - What does the member GPU mean if device name string passed here?
2253 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2254 if (CPU.empty())
2255 CPU = "tahiti";
2256
2257 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002258 case GK_GFX6:
2259 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002260 break;
2261
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002262 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002263 Features["s-memrealtime"] = true;
2264 Features["16-bit-insts"] = true;
2265 break;
2266
2267 case GK_NONE:
2268 return false;
2269 default:
2270 llvm_unreachable("unhandled subtarget");
2271 }
2272 } else {
2273 if (CPU.empty())
2274 CPU = "r600";
2275
2276 switch (parseR600Name(CPU)) {
2277 case GK_R600:
2278 case GK_R700:
2279 case GK_EVERGREEN:
2280 case GK_NORTHERN_ISLANDS:
2281 break;
2282 case GK_R600_DOUBLE_OPS:
2283 case GK_R700_DOUBLE_OPS:
2284 case GK_EVERGREEN_DOUBLE_OPS:
2285 case GK_CAYMAN:
2286 Features["fp64"] = true;
2287 break;
2288 case GK_NONE:
2289 return false;
2290 default:
2291 llvm_unreachable("unhandled subtarget");
2292 }
2293 }
2294
2295 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2296}
2297
Eli Friedman3fd920a2008-08-20 02:34:37 +00002298// Namespace for x86 abstract base class
2299const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002300#define BUILTIN(ID, TYPE, ATTRS) \
2301 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002302#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002303 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002304#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002305 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002306#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2307 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002308#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002309};
Eli Friedmanb5366062008-05-20 14:21:01 +00002310
Nuno Lopescfca1f02009-12-23 17:49:57 +00002311static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002312 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2313 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002314 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002315 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2316 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2317 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002318 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002319 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2320 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002321 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2322 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2323 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2324 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2325 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2326 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2327 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2328 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002329};
2330
Eric Christophercdd36352011-06-21 00:05:20 +00002331const TargetInfo::AddlRegName AddlRegNames[] = {
2332 { { "al", "ah", "eax", "rax" }, 0 },
2333 { { "bl", "bh", "ebx", "rbx" }, 3 },
2334 { { "cl", "ch", "ecx", "rcx" }, 2 },
2335 { { "dl", "dh", "edx", "rdx" }, 1 },
2336 { { "esi", "rsi" }, 4 },
2337 { { "edi", "rdi" }, 5 },
2338 { { "esp", "rsp" }, 7 },
2339 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002340 { { "r8d", "r8w", "r8b" }, 38 },
2341 { { "r9d", "r9w", "r9b" }, 39 },
2342 { { "r10d", "r10w", "r10b" }, 40 },
2343 { { "r11d", "r11w", "r11b" }, 41 },
2344 { { "r12d", "r12w", "r12b" }, 42 },
2345 { { "r13d", "r13w", "r13b" }, 43 },
2346 { { "r14d", "r14w", "r14b" }, 44 },
2347 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002348};
2349
2350// X86 target abstract base class; x86-32 and x86-64 are very close, so
2351// most of the implementation can be shared.
2352class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002353 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002354 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002355 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002356 enum MMX3DNowEnum {
2357 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002358 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002359 enum XOPEnum {
2360 NoXOP,
2361 SSE4A,
2362 FMA4,
2363 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002364 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002365
Craig Topper543f3bd2015-10-14 23:47:57 +00002366 bool HasAES = false;
2367 bool HasPCLMUL = false;
2368 bool HasLZCNT = false;
2369 bool HasRDRND = false;
2370 bool HasFSGSBASE = false;
2371 bool HasBMI = false;
2372 bool HasBMI2 = false;
2373 bool HasPOPCNT = false;
2374 bool HasRTM = false;
2375 bool HasPRFCHW = false;
2376 bool HasRDSEED = false;
2377 bool HasADX = false;
2378 bool HasTBM = false;
2379 bool HasFMA = false;
2380 bool HasF16C = false;
2381 bool HasAVX512CD = false;
2382 bool HasAVX512ER = false;
2383 bool HasAVX512PF = false;
2384 bool HasAVX512DQ = false;
2385 bool HasAVX512BW = false;
2386 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002387 bool HasAVX512VBMI = false;
2388 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002389 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002390 bool HasMPX = false;
2391 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002392 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002393 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002394 bool HasXSAVE = false;
2395 bool HasXSAVEOPT = false;
2396 bool HasXSAVEC = false;
2397 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002398 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002399 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002400 bool HasCLFLUSHOPT = false;
2401 bool HasPCOMMIT = false;
2402 bool HasCLWB = false;
2403 bool HasUMIP = false;
2404 bool HasMOVBE = false;
2405 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002406
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002407 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2408 ///
2409 /// Each enumeration represents a particular CPU supported by Clang. These
2410 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2411 enum CPUKind {
2412 CK_Generic,
2413
2414 /// \name i386
2415 /// i386-generation processors.
2416 //@{
2417 CK_i386,
2418 //@}
2419
2420 /// \name i486
2421 /// i486-generation processors.
2422 //@{
2423 CK_i486,
2424 CK_WinChipC6,
2425 CK_WinChip2,
2426 CK_C3,
2427 //@}
2428
2429 /// \name i586
2430 /// i586-generation processors, P5 microarchitecture based.
2431 //@{
2432 CK_i586,
2433 CK_Pentium,
2434 CK_PentiumMMX,
2435 //@}
2436
2437 /// \name i686
2438 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2439 //@{
2440 CK_i686,
2441 CK_PentiumPro,
2442 CK_Pentium2,
2443 CK_Pentium3,
2444 CK_Pentium3M,
2445 CK_PentiumM,
2446 CK_C3_2,
2447
2448 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2449 /// Clang however has some logic to suport this.
2450 // FIXME: Warn, deprecate, and potentially remove this.
2451 CK_Yonah,
2452 //@}
2453
2454 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002455 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002456 //@{
2457 CK_Pentium4,
2458 CK_Pentium4M,
2459 CK_Prescott,
2460 CK_Nocona,
2461 //@}
2462
2463 /// \name Core
2464 /// Core microarchitecture based processors.
2465 //@{
2466 CK_Core2,
2467
2468 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2469 /// codename which GCC no longer accepts as an option to -march, but Clang
2470 /// has some logic for recognizing it.
2471 // FIXME: Warn, deprecate, and potentially remove this.
2472 CK_Penryn,
2473 //@}
2474
2475 /// \name Atom
2476 /// Atom processors
2477 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002478 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002479 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002480 //@}
2481
2482 /// \name Nehalem
2483 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002484 CK_Nehalem,
2485
2486 /// \name Westmere
2487 /// Westmere microarchitecture based processors.
2488 CK_Westmere,
2489
2490 /// \name Sandy Bridge
2491 /// Sandy Bridge microarchitecture based processors.
2492 CK_SandyBridge,
2493
2494 /// \name Ivy Bridge
2495 /// Ivy Bridge microarchitecture based processors.
2496 CK_IvyBridge,
2497
2498 /// \name Haswell
2499 /// Haswell microarchitecture based processors.
2500 CK_Haswell,
2501
2502 /// \name Broadwell
2503 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002504 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002505
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002506 /// \name Skylake Client
2507 /// Skylake client microarchitecture based processors.
2508 CK_SkylakeClient,
2509
2510 /// \name Skylake Server
2511 /// Skylake server microarchitecture based processors.
2512 CK_SkylakeServer,
2513
2514 /// \name Cannonlake Client
2515 /// Cannonlake client microarchitecture based processors.
2516 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002517
Craig Topper449314e2013-08-20 07:09:39 +00002518 /// \name Knights Landing
2519 /// Knights Landing processor.
2520 CK_KNL,
2521
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002522 /// \name Lakemont
2523 /// Lakemont microarchitecture based processors.
2524 CK_Lakemont,
2525
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002526 /// \name K6
2527 /// K6 architecture processors.
2528 //@{
2529 CK_K6,
2530 CK_K6_2,
2531 CK_K6_3,
2532 //@}
2533
2534 /// \name K7
2535 /// K7 architecture processors.
2536 //@{
2537 CK_Athlon,
2538 CK_AthlonThunderbird,
2539 CK_Athlon4,
2540 CK_AthlonXP,
2541 CK_AthlonMP,
2542 //@}
2543
2544 /// \name K8
2545 /// K8 architecture processors.
2546 //@{
2547 CK_Athlon64,
2548 CK_Athlon64SSE3,
2549 CK_AthlonFX,
2550 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002551 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002552 CK_Opteron,
2553 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002554 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002555 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002556
Benjamin Kramer569f2152012-01-10 11:50:18 +00002557 /// \name Bobcat
2558 /// Bobcat architecture processors.
2559 //@{
2560 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002561 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002562 //@}
2563
2564 /// \name Bulldozer
2565 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002566 //@{
2567 CK_BDVER1,
2568 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002569 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002570 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002571 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002572
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002573 /// This specification is deprecated and will be removed in the future.
2574 /// Users should prefer \see CK_K8.
2575 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002576 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002577 CK_x86_64,
2578 //@}
2579
2580 /// \name Geode
2581 /// Geode processors.
2582 //@{
2583 CK_Geode
2584 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002585 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002586
Eric Christopherc50738f2015-08-27 00:05:50 +00002587 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002588 return llvm::StringSwitch<CPUKind>(CPU)
2589 .Case("i386", CK_i386)
2590 .Case("i486", CK_i486)
2591 .Case("winchip-c6", CK_WinChipC6)
2592 .Case("winchip2", CK_WinChip2)
2593 .Case("c3", CK_C3)
2594 .Case("i586", CK_i586)
2595 .Case("pentium", CK_Pentium)
2596 .Case("pentium-mmx", CK_PentiumMMX)
2597 .Case("i686", CK_i686)
2598 .Case("pentiumpro", CK_PentiumPro)
2599 .Case("pentium2", CK_Pentium2)
2600 .Case("pentium3", CK_Pentium3)
2601 .Case("pentium3m", CK_Pentium3M)
2602 .Case("pentium-m", CK_PentiumM)
2603 .Case("c3-2", CK_C3_2)
2604 .Case("yonah", CK_Yonah)
2605 .Case("pentium4", CK_Pentium4)
2606 .Case("pentium4m", CK_Pentium4M)
2607 .Case("prescott", CK_Prescott)
2608 .Case("nocona", CK_Nocona)
2609 .Case("core2", CK_Core2)
2610 .Case("penryn", CK_Penryn)
2611 .Case("bonnell", CK_Bonnell)
2612 .Case("atom", CK_Bonnell) // Legacy name.
2613 .Case("silvermont", CK_Silvermont)
2614 .Case("slm", CK_Silvermont) // Legacy name.
2615 .Case("nehalem", CK_Nehalem)
2616 .Case("corei7", CK_Nehalem) // Legacy name.
2617 .Case("westmere", CK_Westmere)
2618 .Case("sandybridge", CK_SandyBridge)
2619 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2620 .Case("ivybridge", CK_IvyBridge)
2621 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2622 .Case("haswell", CK_Haswell)
2623 .Case("core-avx2", CK_Haswell) // Legacy name.
2624 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002625 .Case("skylake", CK_SkylakeClient)
2626 .Case("skylake-avx512", CK_SkylakeServer)
2627 .Case("skx", CK_SkylakeServer) // Legacy name.
2628 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002629 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002630 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002631 .Case("k6", CK_K6)
2632 .Case("k6-2", CK_K6_2)
2633 .Case("k6-3", CK_K6_3)
2634 .Case("athlon", CK_Athlon)
2635 .Case("athlon-tbird", CK_AthlonThunderbird)
2636 .Case("athlon-4", CK_Athlon4)
2637 .Case("athlon-xp", CK_AthlonXP)
2638 .Case("athlon-mp", CK_AthlonMP)
2639 .Case("athlon64", CK_Athlon64)
2640 .Case("athlon64-sse3", CK_Athlon64SSE3)
2641 .Case("athlon-fx", CK_AthlonFX)
2642 .Case("k8", CK_K8)
2643 .Case("k8-sse3", CK_K8SSE3)
2644 .Case("opteron", CK_Opteron)
2645 .Case("opteron-sse3", CK_OpteronSSE3)
2646 .Case("barcelona", CK_AMDFAM10)
2647 .Case("amdfam10", CK_AMDFAM10)
2648 .Case("btver1", CK_BTVER1)
2649 .Case("btver2", CK_BTVER2)
2650 .Case("bdver1", CK_BDVER1)
2651 .Case("bdver2", CK_BDVER2)
2652 .Case("bdver3", CK_BDVER3)
2653 .Case("bdver4", CK_BDVER4)
2654 .Case("x86-64", CK_x86_64)
2655 .Case("geode", CK_Geode)
2656 .Default(CK_Generic);
2657 }
2658
Rafael Espindolaeb265472013-08-21 21:59:03 +00002659 enum FPMathKind {
2660 FP_Default,
2661 FP_SSE,
2662 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002663 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002664
Eli Friedman3fd920a2008-08-20 02:34:37 +00002665public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002666 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2667 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002668 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002669 }
Craig Topper3164f332014-03-11 03:39:26 +00002670 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002671 // X87 evaluates with 80 bits "long double" precision.
2672 return SSELevel == NoSSE ? 2 : 0;
2673 }
Craig Topper6c03a542015-10-19 04:51:35 +00002674 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2675 return llvm::makeArrayRef(BuiltinInfo,
2676 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002677 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002678 ArrayRef<const char *> getGCCRegNames() const override {
2679 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002680 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002681 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2682 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002683 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002684 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2685 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002686 }
Eric Christopherd9832702015-06-29 21:00:05 +00002687 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002688 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002689 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002690
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002691 bool validateGlobalRegisterVariable(StringRef RegName,
2692 unsigned RegSize,
2693 bool &HasSizeMismatch) const override {
2694 // esp and ebp are the only 32-bit registers the x86 backend can currently
2695 // handle.
2696 if (RegName.equals("esp") || RegName.equals("ebp")) {
2697 // Check that the register size is 32-bit.
2698 HasSizeMismatch = RegSize != 32;
2699 return true;
2700 }
2701
2702 return false;
2703 }
2704
Akira Hatanaka974131e2014-09-18 18:17:18 +00002705 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2706
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002707 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2708
Akira Hatanaka974131e2014-09-18 18:17:18 +00002709 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2710
Craig Topper3164f332014-03-11 03:39:26 +00002711 std::string convertConstraint(const char *&Constraint) const override;
2712 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002713 return "~{dirflag},~{fpsr},~{flags}";
2714 }
Craig Topper3164f332014-03-11 03:39:26 +00002715 void getTargetDefines(const LangOptions &Opts,
2716 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002717 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2718 bool Enabled);
2719 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2720 bool Enabled);
2721 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2722 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002723 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2724 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002725 setFeatureEnabledImpl(Features, Name, Enabled);
2726 }
2727 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002728 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002729 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2730 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002731 bool
2732 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2733 StringRef CPU,
2734 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002735 bool hasFeature(StringRef Feature) const override;
2736 bool handleTargetFeatures(std::vector<std::string> &Features,
2737 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002738 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002739 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2740 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002741 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002742 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002743 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002744 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002745 return "no-mmx";
2746 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002747 }
Craig Topper3164f332014-03-11 03:39:26 +00002748 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002749 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002750
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002751 // Perform any per-CPU checks necessary to determine if this CPU is
2752 // acceptable.
2753 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2754 // invalid without explaining *why*.
2755 switch (CPU) {
2756 case CK_Generic:
2757 // No processor selected!
2758 return false;
2759
2760 case CK_i386:
2761 case CK_i486:
2762 case CK_WinChipC6:
2763 case CK_WinChip2:
2764 case CK_C3:
2765 case CK_i586:
2766 case CK_Pentium:
2767 case CK_PentiumMMX:
2768 case CK_i686:
2769 case CK_PentiumPro:
2770 case CK_Pentium2:
2771 case CK_Pentium3:
2772 case CK_Pentium3M:
2773 case CK_PentiumM:
2774 case CK_Yonah:
2775 case CK_C3_2:
2776 case CK_Pentium4:
2777 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002778 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002779 case CK_Prescott:
2780 case CK_K6:
2781 case CK_K6_2:
2782 case CK_K6_3:
2783 case CK_Athlon:
2784 case CK_AthlonThunderbird:
2785 case CK_Athlon4:
2786 case CK_AthlonXP:
2787 case CK_AthlonMP:
2788 case CK_Geode:
2789 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002790 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002791 return false;
2792
2793 // Fallthrough
2794 case CK_Nocona:
2795 case CK_Core2:
2796 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002797 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002798 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002799 case CK_Nehalem:
2800 case CK_Westmere:
2801 case CK_SandyBridge:
2802 case CK_IvyBridge:
2803 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002804 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002805 case CK_SkylakeClient:
2806 case CK_SkylakeServer:
2807 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002808 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002809 case CK_Athlon64:
2810 case CK_Athlon64SSE3:
2811 case CK_AthlonFX:
2812 case CK_K8:
2813 case CK_K8SSE3:
2814 case CK_Opteron:
2815 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002816 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002817 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002818 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002819 case CK_BDVER1:
2820 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002821 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002822 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002823 case CK_x86_64:
2824 return true;
2825 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002826 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002827 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002828
Craig Topper3164f332014-03-11 03:39:26 +00002829 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002830
Craig Topper3164f332014-03-11 03:39:26 +00002831 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002832 // Most of the non-ARM calling conventions are i386 conventions.
2833 switch (CC) {
2834 case CC_X86ThisCall:
2835 case CC_X86FastCall:
2836 case CC_X86StdCall:
2837 case CC_X86VectorCall:
2838 case CC_C:
2839 case CC_Swift:
2840 case CC_X86Pascal:
2841 case CC_IntelOclBicc:
2842 return CCCR_OK;
2843 default:
2844 return CCCR_Warning;
2845 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002846 }
2847
Craig Topper3164f332014-03-11 03:39:26 +00002848 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002849 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002850 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002851
2852 bool hasSjLjLowering() const override {
2853 return true;
2854 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002855
2856 void setSupportedOpenCLOpts() override {
2857 getSupportedOpenCLOpts().setAll();
2858 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002859};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002860
Rafael Espindolaeb265472013-08-21 21:59:03 +00002861bool X86TargetInfo::setFPMath(StringRef Name) {
2862 if (Name == "387") {
2863 FPMath = FP_387;
2864 return true;
2865 }
2866 if (Name == "sse") {
2867 FPMath = FP_SSE;
2868 return true;
2869 }
2870 return false;
2871}
2872
Eric Christopher007b0a02015-08-28 22:32:01 +00002873bool X86TargetInfo::initFeatureMap(
2874 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002875 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002876 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002877 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002878 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002879 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002880
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002881 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002882
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002883 // Enable X87 for all X86 processors but Lakemont.
2884 if (Kind != CK_Lakemont)
2885 setFeatureEnabledImpl(Features, "x87", true);
2886
2887 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002888 case CK_Generic:
2889 case CK_i386:
2890 case CK_i486:
2891 case CK_i586:
2892 case CK_Pentium:
2893 case CK_i686:
2894 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002895 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002896 break;
2897 case CK_PentiumMMX:
2898 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002899 case CK_K6:
2900 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002901 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002902 break;
2903 case CK_Pentium3:
2904 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002905 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002906 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002907 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 break;
2909 case CK_PentiumM:
2910 case CK_Pentium4:
2911 case CK_Pentium4M:
2912 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002913 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002914 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002915 break;
2916 case CK_Yonah:
2917 case CK_Prescott:
2918 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002919 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002920 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002921 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002922 break;
2923 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002924 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002925 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002926 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002927 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002928 break;
2929 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002930 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002931 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002932 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002933 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002934 case CK_Cannonlake:
2935 setFeatureEnabledImpl(Features, "avx512ifma", true);
2936 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2937 setFeatureEnabledImpl(Features, "sha", true);
2938 setFeatureEnabledImpl(Features, "umip", true);
2939 // FALLTHROUGH
2940 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002941 setFeatureEnabledImpl(Features, "avx512f", true);
2942 setFeatureEnabledImpl(Features, "avx512cd", true);
2943 setFeatureEnabledImpl(Features, "avx512dq", true);
2944 setFeatureEnabledImpl(Features, "avx512bw", true);
2945 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002946 setFeatureEnabledImpl(Features, "pku", true);
2947 setFeatureEnabledImpl(Features, "pcommit", true);
2948 setFeatureEnabledImpl(Features, "clwb", true);
2949 // FALLTHROUGH
2950 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002951 setFeatureEnabledImpl(Features, "xsavec", true);
2952 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002953 setFeatureEnabledImpl(Features, "mpx", true);
2954 setFeatureEnabledImpl(Features, "sgx", true);
2955 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002956 // FALLTHROUGH
2957 case CK_Broadwell:
2958 setFeatureEnabledImpl(Features, "rdseed", true);
2959 setFeatureEnabledImpl(Features, "adx", true);
2960 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002961 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002962 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002963 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002964 setFeatureEnabledImpl(Features, "bmi", true);
2965 setFeatureEnabledImpl(Features, "bmi2", true);
2966 setFeatureEnabledImpl(Features, "rtm", true);
2967 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002968 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002969 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002970 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002971 setFeatureEnabledImpl(Features, "rdrnd", true);
2972 setFeatureEnabledImpl(Features, "f16c", true);
2973 setFeatureEnabledImpl(Features, "fsgsbase", true);
2974 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002975 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002976 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002977 setFeatureEnabledImpl(Features, "xsave", true);
2978 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002979 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002980 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002981 case CK_Silvermont:
2982 setFeatureEnabledImpl(Features, "aes", true);
2983 setFeatureEnabledImpl(Features, "pclmul", true);
2984 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002985 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002986 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002987 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002988 setFeatureEnabledImpl(Features, "cx16", true);
2989 break;
2990 case CK_KNL:
2991 setFeatureEnabledImpl(Features, "avx512f", true);
2992 setFeatureEnabledImpl(Features, "avx512cd", true);
2993 setFeatureEnabledImpl(Features, "avx512er", true);
2994 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002995 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002996 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002997 setFeatureEnabledImpl(Features, "rdseed", true);
2998 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002999 setFeatureEnabledImpl(Features, "lzcnt", true);
3000 setFeatureEnabledImpl(Features, "bmi", true);
3001 setFeatureEnabledImpl(Features, "bmi2", true);
3002 setFeatureEnabledImpl(Features, "rtm", true);
3003 setFeatureEnabledImpl(Features, "fma", true);
3004 setFeatureEnabledImpl(Features, "rdrnd", true);
3005 setFeatureEnabledImpl(Features, "f16c", true);
3006 setFeatureEnabledImpl(Features, "fsgsbase", true);
3007 setFeatureEnabledImpl(Features, "aes", true);
3008 setFeatureEnabledImpl(Features, "pclmul", true);
3009 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003010 setFeatureEnabledImpl(Features, "xsaveopt", true);
3011 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003012 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003013 break;
3014 case CK_K6_2:
3015 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003016 case CK_WinChip2:
3017 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003018 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003019 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003020 case CK_Athlon:
3021 case CK_AthlonThunderbird:
3022 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003023 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003024 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003025 case CK_Athlon4:
3026 case CK_AthlonXP:
3027 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003028 setFeatureEnabledImpl(Features, "sse", true);
3029 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003030 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003031 break;
3032 case CK_K8:
3033 case CK_Opteron:
3034 case CK_Athlon64:
3035 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003036 setFeatureEnabledImpl(Features, "sse2", true);
3037 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003038 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003040 case CK_AMDFAM10:
3041 setFeatureEnabledImpl(Features, "sse4a", true);
3042 setFeatureEnabledImpl(Features, "lzcnt", true);
3043 setFeatureEnabledImpl(Features, "popcnt", true);
3044 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 case CK_K8SSE3:
3046 case CK_OpteronSSE3:
3047 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003048 setFeatureEnabledImpl(Features, "sse3", true);
3049 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003050 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003051 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003052 case CK_BTVER2:
3053 setFeatureEnabledImpl(Features, "avx", true);
3054 setFeatureEnabledImpl(Features, "aes", true);
3055 setFeatureEnabledImpl(Features, "pclmul", true);
3056 setFeatureEnabledImpl(Features, "bmi", true);
3057 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003058 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003059 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003060 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003061 setFeatureEnabledImpl(Features, "ssse3", true);
3062 setFeatureEnabledImpl(Features, "sse4a", true);
3063 setFeatureEnabledImpl(Features, "lzcnt", true);
3064 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003065 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003066 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003067 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003068 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003069 case CK_BDVER4:
3070 setFeatureEnabledImpl(Features, "avx2", true);
3071 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003072 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003073 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003074 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003075 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003076 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003077 // FALLTHROUGH
3078 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003079 setFeatureEnabledImpl(Features, "bmi", true);
3080 setFeatureEnabledImpl(Features, "fma", true);
3081 setFeatureEnabledImpl(Features, "f16c", true);
3082 setFeatureEnabledImpl(Features, "tbm", true);
3083 // FALLTHROUGH
3084 case CK_BDVER1:
3085 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003086 setFeatureEnabledImpl(Features, "xop", true);
3087 setFeatureEnabledImpl(Features, "lzcnt", true);
3088 setFeatureEnabledImpl(Features, "aes", true);
3089 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003090 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003091 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003092 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003093 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003094 break;
Eli Friedman33465822011-07-08 23:31:17 +00003095 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003096 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3097 return false;
3098
3099 // Can't do this earlier because we need to be able to explicitly enable
3100 // or disable these features and the things that they depend upon.
3101
3102 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3103 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003104 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003105 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3106 FeaturesVec.end())
3107 Features["popcnt"] = true;
3108
3109 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3110 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003111 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003112 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3113 FeaturesVec.end())
3114 Features["prfchw"] = true;
3115
Eric Christophera7260af2015-10-08 20:10:18 +00003116 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3117 // then enable MMX.
3118 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003119 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003120 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3121 FeaturesVec.end())
3122 Features["mmx"] = true;
3123
Eric Christopherbbd746d2015-10-08 20:10:14 +00003124 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003125}
3126
Rafael Espindolae62e2792013-08-20 13:44:29 +00003127void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003128 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003129 if (Enabled) {
3130 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003131 case AVX512F:
3132 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003133 case AVX2:
3134 Features["avx2"] = true;
3135 case AVX:
3136 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003137 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003138 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003139 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003141 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 case SSSE3:
3143 Features["ssse3"] = true;
3144 case SSE3:
3145 Features["sse3"] = true;
3146 case SSE2:
3147 Features["sse2"] = true;
3148 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003149 Features["sse"] = true;
3150 case NoSSE:
3151 break;
3152 }
3153 return;
3154 }
3155
3156 switch (Level) {
3157 case NoSSE:
3158 case SSE1:
3159 Features["sse"] = false;
3160 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003161 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3162 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 case SSE3:
3164 Features["sse3"] = false;
3165 setXOPLevel(Features, NoXOP, false);
3166 case SSSE3:
3167 Features["ssse3"] = false;
3168 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003169 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003170 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003171 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003172 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003173 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3174 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003175 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003176 case AVX2:
3177 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003178 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003179 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003180 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003181 Features["avx512vl"] = Features["avx512vbmi"] =
3182 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183 }
3184}
3185
3186void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003187 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003188 if (Enabled) {
3189 switch (Level) {
3190 case AMD3DNowAthlon:
3191 Features["3dnowa"] = true;
3192 case AMD3DNow:
3193 Features["3dnow"] = true;
3194 case MMX:
3195 Features["mmx"] = true;
3196 case NoMMX3DNow:
3197 break;
3198 }
3199 return;
3200 }
3201
3202 switch (Level) {
3203 case NoMMX3DNow:
3204 case MMX:
3205 Features["mmx"] = false;
3206 case AMD3DNow:
3207 Features["3dnow"] = false;
3208 case AMD3DNowAthlon:
3209 Features["3dnowa"] = false;
3210 }
3211}
3212
3213void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003214 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003215 if (Enabled) {
3216 switch (Level) {
3217 case XOP:
3218 Features["xop"] = true;
3219 case FMA4:
3220 Features["fma4"] = true;
3221 setSSELevel(Features, AVX, true);
3222 case SSE4A:
3223 Features["sse4a"] = true;
3224 setSSELevel(Features, SSE3, true);
3225 case NoXOP:
3226 break;
3227 }
3228 return;
3229 }
3230
3231 switch (Level) {
3232 case NoXOP:
3233 case SSE4A:
3234 Features["sse4a"] = false;
3235 case FMA4:
3236 Features["fma4"] = false;
3237 case XOP:
3238 Features["xop"] = false;
3239 }
3240}
3241
Craig Topper86d79ef2013-09-17 04:51:29 +00003242void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3243 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003244 // This is a bit of a hack to deal with the sse4 target feature when used
3245 // as part of the target attribute. We handle sse4 correctly everywhere
3246 // else. See below for more information on how we handle the sse4 options.
3247 if (Name != "sse4")
3248 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003249
Craig Topper29561122013-09-19 01:13:07 +00003250 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003251 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003252 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003253 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003254 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003255 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003256 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003257 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003258 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003259 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003260 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003262 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003263 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003264 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003265 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003266 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003268 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003269 if (Enabled)
3270 setSSELevel(Features, SSE2, Enabled);
3271 } else if (Name == "pclmul") {
3272 if (Enabled)
3273 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003274 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003275 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003276 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003277 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003278 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003279 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003280 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3281 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3282 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003283 if (Enabled)
3284 setSSELevel(Features, AVX512F, Enabled);
3285 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286 if (Enabled)
3287 setSSELevel(Features, AVX, Enabled);
3288 } else if (Name == "fma4") {
3289 setXOPLevel(Features, FMA4, Enabled);
3290 } else if (Name == "xop") {
3291 setXOPLevel(Features, XOP, Enabled);
3292 } else if (Name == "sse4a") {
3293 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003294 } else if (Name == "f16c") {
3295 if (Enabled)
3296 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003297 } else if (Name == "sha") {
3298 if (Enabled)
3299 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003300 } else if (Name == "sse4") {
3301 // We can get here via the __target__ attribute since that's not controlled
3302 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3303 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3304 // disabled.
3305 if (Enabled)
3306 setSSELevel(Features, SSE42, Enabled);
3307 else
3308 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003309 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003310 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003311 Features["xsaveopt"] = false;
3312 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003313 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003314 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003315 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003316}
3317
Eric Christopher3ff21b32013-10-16 21:26:26 +00003318/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003319/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003320bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003321 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003322 for (const auto &Feature : Features) {
3323 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003324 continue;
3325
Eric Christopher610fe112015-08-26 08:21:55 +00003326 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003327 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003328 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003329 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003331 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003333 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003334 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003335 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003336 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003337 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003338 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003339 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003341 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003342 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003343 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003344 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003345 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003346 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003347 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003349 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003350 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003351 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003352 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003353 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003354 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003355 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003356 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003357 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003358 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003359 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003360 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003361 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003363 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003365 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003366 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003367 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003368 } else if (Feature == "+avx512vbmi") {
3369 HasAVX512VBMI = true;
3370 } else if (Feature == "+avx512ifma") {
3371 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003372 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003373 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003374 } else if (Feature == "+mpx") {
3375 HasMPX = true;
3376 } else if (Feature == "+movbe") {
3377 HasMOVBE = true;
3378 } else if (Feature == "+sgx") {
3379 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003380 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003381 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003382 } else if (Feature == "+fxsr") {
3383 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003384 } else if (Feature == "+xsave") {
3385 HasXSAVE = true;
3386 } else if (Feature == "+xsaveopt") {
3387 HasXSAVEOPT = true;
3388 } else if (Feature == "+xsavec") {
3389 HasXSAVEC = true;
3390 } else if (Feature == "+xsaves") {
3391 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003392 } else if (Feature == "+mwaitx") {
3393 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003394 } else if (Feature == "+pku") {
3395 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003396 } else if (Feature == "+clflushopt") {
3397 HasCLFLUSHOPT = true;
3398 } else if (Feature == "+pcommit") {
3399 HasPCOMMIT = true;
3400 } else if (Feature == "+clwb") {
3401 HasCLWB = true;
3402 } else if (Feature == "+umip") {
3403 HasUMIP = true;
3404 } else if (Feature == "+prefetchwt1") {
3405 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003406 }
3407
Benjamin Kramer27402c62012-03-05 15:10:44 +00003408 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003409 .Case("+avx512f", AVX512F)
3410 .Case("+avx2", AVX2)
3411 .Case("+avx", AVX)
3412 .Case("+sse4.2", SSE42)
3413 .Case("+sse4.1", SSE41)
3414 .Case("+ssse3", SSSE3)
3415 .Case("+sse3", SSE3)
3416 .Case("+sse2", SSE2)
3417 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003418 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003419 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003420
Eli Friedman33465822011-07-08 23:31:17 +00003421 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003422 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003423 .Case("+3dnowa", AMD3DNowAthlon)
3424 .Case("+3dnow", AMD3DNow)
3425 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003426 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003427 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003428
3429 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003430 .Case("+xop", XOP)
3431 .Case("+fma4", FMA4)
3432 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003433 .Default(NoXOP);
3434 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003435 }
Eli Friedman33465822011-07-08 23:31:17 +00003436
Rafael Espindolaeb265472013-08-21 21:59:03 +00003437 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3438 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003439 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3440 (FPMath == FP_387 && SSELevel >= SSE1)) {
3441 Diags.Report(diag::err_target_unsupported_fpmath) <<
3442 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003443 return false;
3444 }
3445
Alexey Bataev00396512015-07-02 03:40:19 +00003446 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003447 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003448 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003449}
Chris Lattnerecd49032009-03-02 22:27:17 +00003450
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003451/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3452/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003453void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003454 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003455 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003456 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003457 Builder.defineMacro("__amd64__");
3458 Builder.defineMacro("__amd64");
3459 Builder.defineMacro("__x86_64");
3460 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003461 if (getTriple().getArchName() == "x86_64h") {
3462 Builder.defineMacro("__x86_64h");
3463 Builder.defineMacro("__x86_64h__");
3464 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003465 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003466 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003467 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003468
Chris Lattnerecd49032009-03-02 22:27:17 +00003469 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003470 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3471 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003472 switch (CPU) {
3473 case CK_Generic:
3474 break;
3475 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003476 // The rest are coming from the i386 define above.
3477 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003478 break;
3479 case CK_i486:
3480 case CK_WinChipC6:
3481 case CK_WinChip2:
3482 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003483 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003484 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003485 case CK_PentiumMMX:
3486 Builder.defineMacro("__pentium_mmx__");
3487 Builder.defineMacro("__tune_pentium_mmx__");
3488 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003489 case CK_i586:
3490 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003491 defineCPUMacros(Builder, "i586");
3492 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003494 case CK_Pentium3:
3495 case CK_Pentium3M:
3496 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003497 Builder.defineMacro("__tune_pentium3__");
3498 // Fallthrough
3499 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003500 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003501 Builder.defineMacro("__tune_pentium2__");
3502 // Fallthrough
3503 case CK_PentiumPro:
3504 Builder.defineMacro("__tune_i686__");
3505 Builder.defineMacro("__tune_pentiumpro__");
3506 // Fallthrough
3507 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003508 Builder.defineMacro("__i686");
3509 Builder.defineMacro("__i686__");
3510 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3511 Builder.defineMacro("__pentiumpro");
3512 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003513 break;
3514 case CK_Pentium4:
3515 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003516 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003517 break;
3518 case CK_Yonah:
3519 case CK_Prescott:
3520 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003521 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003522 break;
3523 case CK_Core2:
3524 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003525 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003526 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003527 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003528 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003529 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003530 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003531 defineCPUMacros(Builder, "slm");
3532 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003533 case CK_Nehalem:
3534 case CK_Westmere:
3535 case CK_SandyBridge:
3536 case CK_IvyBridge:
3537 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003538 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003539 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003540 // FIXME: Historically, we defined this legacy name, it would be nice to
3541 // remove it at some point. We've never exposed fine-grained names for
3542 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003543 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003544 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003545 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003546 defineCPUMacros(Builder, "skx");
3547 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003548 case CK_Cannonlake:
3549 break;
Craig Topper449314e2013-08-20 07:09:39 +00003550 case CK_KNL:
3551 defineCPUMacros(Builder, "knl");
3552 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003553 case CK_Lakemont:
3554 Builder.defineMacro("__tune_lakemont__");
3555 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003557 Builder.defineMacro("__k6_2__");
3558 Builder.defineMacro("__tune_k6_2__");
3559 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003560 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003561 if (CPU != CK_K6_2) { // In case of fallthrough
3562 // FIXME: GCC may be enabling these in cases where some other k6
3563 // architecture is specified but -m3dnow is explicitly provided. The
3564 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003565 Builder.defineMacro("__k6_3__");
3566 Builder.defineMacro("__tune_k6_3__");
3567 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003568 // Fallthrough
3569 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003570 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003571 break;
3572 case CK_Athlon:
3573 case CK_AthlonThunderbird:
3574 case CK_Athlon4:
3575 case CK_AthlonXP:
3576 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003577 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003578 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003579 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003580 Builder.defineMacro("__tune_athlon_sse__");
3581 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003582 break;
3583 case CK_K8:
3584 case CK_K8SSE3:
3585 case CK_x86_64:
3586 case CK_Opteron:
3587 case CK_OpteronSSE3:
3588 case CK_Athlon64:
3589 case CK_Athlon64SSE3:
3590 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003591 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003592 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003593 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003594 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003595 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003596 case CK_BTVER1:
3597 defineCPUMacros(Builder, "btver1");
3598 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003599 case CK_BTVER2:
3600 defineCPUMacros(Builder, "btver2");
3601 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003602 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003603 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003604 break;
3605 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003606 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003607 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003608 case CK_BDVER3:
3609 defineCPUMacros(Builder, "bdver3");
3610 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003611 case CK_BDVER4:
3612 defineCPUMacros(Builder, "bdver4");
3613 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003614 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003615 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003616 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003617 }
Chris Lattner96e43572009-03-02 22:40:39 +00003618
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003619 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003620 Builder.defineMacro("__REGISTER_PREFIX__", "");
3621
Chris Lattner6df41af2009-04-19 17:32:33 +00003622 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3623 // functions in glibc header files that use FP Stack inline asm which the
3624 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003625 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003626
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003627 if (HasAES)
3628 Builder.defineMacro("__AES__");
3629
Craig Topper3f122a72012-05-31 05:18:48 +00003630 if (HasPCLMUL)
3631 Builder.defineMacro("__PCLMUL__");
3632
Craig Topper22967d42011-12-25 05:06:45 +00003633 if (HasLZCNT)
3634 Builder.defineMacro("__LZCNT__");
3635
Benjamin Kramer1e250392012-07-07 09:39:18 +00003636 if (HasRDRND)
3637 Builder.defineMacro("__RDRND__");
3638
Craig Topper8c7f2512014-11-03 06:51:41 +00003639 if (HasFSGSBASE)
3640 Builder.defineMacro("__FSGSBASE__");
3641
Craig Topper22967d42011-12-25 05:06:45 +00003642 if (HasBMI)
3643 Builder.defineMacro("__BMI__");
3644
3645 if (HasBMI2)
3646 Builder.defineMacro("__BMI2__");
3647
Craig Topper1de83482011-12-29 16:10:46 +00003648 if (HasPOPCNT)
3649 Builder.defineMacro("__POPCNT__");
3650
Michael Liao625a8752012-11-10 05:17:46 +00003651 if (HasRTM)
3652 Builder.defineMacro("__RTM__");
3653
Michael Liao74f4eaf2013-03-26 17:52:08 +00003654 if (HasPRFCHW)
3655 Builder.defineMacro("__PRFCHW__");
3656
Michael Liaoffaae352013-03-29 05:17:55 +00003657 if (HasRDSEED)
3658 Builder.defineMacro("__RDSEED__");
3659
Robert Khasanov50e6f582014-09-19 09:53:48 +00003660 if (HasADX)
3661 Builder.defineMacro("__ADX__");
3662
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003663 if (HasTBM)
3664 Builder.defineMacro("__TBM__");
3665
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003666 if (HasMWAITX)
3667 Builder.defineMacro("__MWAITX__");
3668
Rafael Espindolae62e2792013-08-20 13:44:29 +00003669 switch (XOPLevel) {
3670 case XOP:
3671 Builder.defineMacro("__XOP__");
3672 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003673 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003674 case SSE4A:
3675 Builder.defineMacro("__SSE4A__");
3676 case NoXOP:
3677 break;
3678 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003679
Craig Topperbba778b2012-06-03 21:46:30 +00003680 if (HasFMA)
3681 Builder.defineMacro("__FMA__");
3682
Manman Rena45358c2012-10-11 00:59:55 +00003683 if (HasF16C)
3684 Builder.defineMacro("__F16C__");
3685
Craig Topper679b53a2013-08-21 05:29:10 +00003686 if (HasAVX512CD)
3687 Builder.defineMacro("__AVX512CD__");
3688 if (HasAVX512ER)
3689 Builder.defineMacro("__AVX512ER__");
3690 if (HasAVX512PF)
3691 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003692 if (HasAVX512DQ)
3693 Builder.defineMacro("__AVX512DQ__");
3694 if (HasAVX512BW)
3695 Builder.defineMacro("__AVX512BW__");
3696 if (HasAVX512VL)
3697 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003698 if (HasAVX512VBMI)
3699 Builder.defineMacro("__AVX512VBMI__");
3700 if (HasAVX512IFMA)
3701 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003702
Ben Langmuir58078d02013-09-19 13:22:04 +00003703 if (HasSHA)
3704 Builder.defineMacro("__SHA__");
3705
Craig Toppere33f51f2015-10-16 06:22:36 +00003706 if (HasFXSR)
3707 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003708 if (HasXSAVE)
3709 Builder.defineMacro("__XSAVE__");
3710 if (HasXSAVEOPT)
3711 Builder.defineMacro("__XSAVEOPT__");
3712 if (HasXSAVEC)
3713 Builder.defineMacro("__XSAVEC__");
3714 if (HasXSAVES)
3715 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003716 if (HasPKU)
3717 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003718 if (HasCX16)
3719 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3720
Chris Lattner96e43572009-03-02 22:40:39 +00003721 // Each case falls through to the previous one here.
3722 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003723 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003724 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003725 case AVX2:
3726 Builder.defineMacro("__AVX2__");
3727 case AVX:
3728 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003729 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003730 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003731 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003732 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003733 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003735 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003737 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003738 Builder.defineMacro("__SSE2__");
3739 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003740 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003741 Builder.defineMacro("__SSE__");
3742 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003743 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003744 break;
3745 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003746
Derek Schuffc7dd7222012-10-11 15:52:22 +00003747 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003748 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003749 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003750 case AVX2:
3751 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003752 case SSE42:
3753 case SSE41:
3754 case SSSE3:
3755 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003756 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003757 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003758 break;
3759 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003760 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003761 break;
3762 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003763 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003764 }
3765 }
3766
Anders Carlssone437c682010-01-27 03:47:49 +00003767 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003768 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003769 case AMD3DNowAthlon:
3770 Builder.defineMacro("__3dNOW_A__");
3771 case AMD3DNow:
3772 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003773 case MMX:
3774 Builder.defineMacro("__MMX__");
3775 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003776 break;
3777 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003778
3779 if (CPU >= CK_i486) {
3780 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3781 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3782 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3783 }
3784 if (CPU >= CK_i586)
3785 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003786}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003787
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003788bool X86TargetInfo::hasFeature(StringRef Feature) const {
3789 return llvm::StringSwitch<bool>(Feature)
3790 .Case("aes", HasAES)
3791 .Case("avx", SSELevel >= AVX)
3792 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003793 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003794 .Case("avx512cd", HasAVX512CD)
3795 .Case("avx512er", HasAVX512ER)
3796 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003797 .Case("avx512dq", HasAVX512DQ)
3798 .Case("avx512bw", HasAVX512BW)
3799 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003800 .Case("avx512vbmi", HasAVX512VBMI)
3801 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003802 .Case("bmi", HasBMI)
3803 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003804 .Case("clflushopt", HasCLFLUSHOPT)
3805 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003806 .Case("cx16", HasCX16)
3807 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003808 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003809 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003810 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003811 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003812 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003813 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3814 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3815 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003816 .Case("movbe", HasMOVBE)
3817 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003818 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003819 .Case("pcommit", HasPCOMMIT)
3820 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003821 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003822 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003823 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003824 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003825 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003826 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003827 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003828 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003829 .Case("sse", SSELevel >= SSE1)
3830 .Case("sse2", SSELevel >= SSE2)
3831 .Case("sse3", SSELevel >= SSE3)
3832 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003833 .Case("sse4.1", SSELevel >= SSE41)
3834 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003835 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003836 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003837 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003838 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003839 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3840 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003841 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003842 .Case("xsave", HasXSAVE)
3843 .Case("xsavec", HasXSAVEC)
3844 .Case("xsaves", HasXSAVES)
3845 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003846 .Default(false);
3847}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003848
Eric Christopherd9832702015-06-29 21:00:05 +00003849// We can't use a generic validation scheme for the features accepted here
3850// versus subtarget features accepted in the target attribute because the
3851// bitfield structure that's initialized in the runtime only supports the
3852// below currently rather than the full range of subtarget features. (See
3853// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3854bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3855 return llvm::StringSwitch<bool>(FeatureStr)
3856 .Case("cmov", true)
3857 .Case("mmx", true)
3858 .Case("popcnt", true)
3859 .Case("sse", true)
3860 .Case("sse2", true)
3861 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003862 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003863 .Case("sse4.1", true)
3864 .Case("sse4.2", true)
3865 .Case("avx", true)
3866 .Case("avx2", true)
3867 .Case("sse4a", true)
3868 .Case("fma4", true)
3869 .Case("xop", true)
3870 .Case("fma", true)
3871 .Case("avx512f", true)
3872 .Case("bmi", true)
3873 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003874 .Case("aes", true)
3875 .Case("pclmul", true)
3876 .Case("avx512vl", true)
3877 .Case("avx512bw", true)
3878 .Case("avx512dq", true)
3879 .Case("avx512cd", true)
3880 .Case("avx512er", true)
3881 .Case("avx512pf", true)
3882 .Case("avx512vbmi", true)
3883 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003884 .Default(false);
3885}
3886
Eli Friedman3fd920a2008-08-20 02:34:37 +00003887bool
Anders Carlsson58436352009-02-28 17:11:49 +00003888X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003889 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003890 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003891 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003892 // Constant constraints.
3893 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3894 // instructions.
3895 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3896 // x86_64 instructions.
3897 case 's':
3898 Info.setRequiresImmediate();
3899 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003900 case 'I':
3901 Info.setRequiresImmediate(0, 31);
3902 return true;
3903 case 'J':
3904 Info.setRequiresImmediate(0, 63);
3905 return true;
3906 case 'K':
3907 Info.setRequiresImmediate(-128, 127);
3908 return true;
3909 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003910 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003911 return true;
3912 case 'M':
3913 Info.setRequiresImmediate(0, 3);
3914 return true;
3915 case 'N':
3916 Info.setRequiresImmediate(0, 255);
3917 return true;
3918 case 'O':
3919 Info.setRequiresImmediate(0, 127);
3920 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003921 // Register constraints.
3922 case 'Y': // 'Y' is the first character for several 2-character constraints.
3923 // Shift the pointer to the second character of the constraint.
3924 Name++;
3925 switch (*Name) {
3926 default:
3927 return false;
3928 case '0': // First SSE register.
3929 case 't': // Any SSE register, when SSE2 is enabled.
3930 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3931 case 'm': // Any MMX register, when inter-unit moves enabled.
3932 Info.setAllowsRegister();
3933 return true;
3934 }
3935 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003936 // Constraint 'f' cannot be used for output operands.
3937 if (Info.ConstraintStr[0] == '=')
3938 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003939 Info.setAllowsRegister();
3940 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003941 case 'a': // eax.
3942 case 'b': // ebx.
3943 case 'c': // ecx.
3944 case 'd': // edx.
3945 case 'S': // esi.
3946 case 'D': // edi.
3947 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003948 case 't': // Top of floating point stack.
3949 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003950 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003951 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003952 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003953 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003954 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3955 case 'l': // "Index" registers: any general register that can be used as an
3956 // index in a base+index memory access.
3957 Info.setAllowsRegister();
3958 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003959 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003960 case 'C': // SSE floating point constant.
3961 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003962 return true;
3963 }
3964}
3965
Akira Hatanaka974131e2014-09-18 18:17:18 +00003966bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3967 unsigned Size) const {
3968 // Strip off constraint modifiers.
3969 while (Constraint[0] == '=' ||
3970 Constraint[0] == '+' ||
3971 Constraint[0] == '&')
3972 Constraint = Constraint.substr(1);
3973
3974 return validateOperandSize(Constraint, Size);
3975}
3976
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003977bool X86TargetInfo::validateInputSize(StringRef Constraint,
3978 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003979 return validateOperandSize(Constraint, Size);
3980}
3981
3982bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3983 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003984 switch (Constraint[0]) {
3985 default: break;
3986 case 'y':
3987 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003988 case 'f':
3989 case 't':
3990 case 'u':
3991 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003992 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003993 if (SSELevel >= AVX512F)
3994 // 512-bit zmm registers can be used if target supports AVX512F.
3995 return Size <= 512U;
3996 else if (SSELevel >= AVX)
3997 // 256-bit ymm registers can be used if target supports AVX.
3998 return Size <= 256U;
3999 return Size <= 128U;
4000 case 'Y':
4001 // 'Y' is the first character for several 2-character constraints.
4002 switch (Constraint[1]) {
4003 default: break;
4004 case 'm':
4005 // 'Ym' is synonymous with 'y'.
4006 return Size <= 64;
4007 case 'i':
4008 case 't':
4009 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4010 if (SSELevel >= AVX512F)
4011 return Size <= 512U;
4012 else if (SSELevel >= AVX)
4013 return Size <= 256U;
4014 return SSELevel >= SSE2 && Size <= 128U;
4015 }
4016
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004017 }
4018
4019 return true;
4020}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004021
Eli Friedman3fd920a2008-08-20 02:34:37 +00004022std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004023X86TargetInfo::convertConstraint(const char *&Constraint) const {
4024 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004025 case 'a': return std::string("{ax}");
4026 case 'b': return std::string("{bx}");
4027 case 'c': return std::string("{cx}");
4028 case 'd': return std::string("{dx}");
4029 case 'S': return std::string("{si}");
4030 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004031 case 'p': // address
4032 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004033 case 't': // top of floating point stack.
4034 return std::string("{st}");
4035 case 'u': // second from top of floating point stack.
4036 return std::string("{st(1)}"); // second from top of floating point stack.
4037 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004038 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004039 }
4040}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004041
Eli Friedman3fd920a2008-08-20 02:34:37 +00004042// X86-32 generic target
4043class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004044public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004045 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4046 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004047 DoubleAlign = LongLongAlign = 32;
4048 LongDoubleWidth = 96;
4049 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004050 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004051 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004052 SizeType = UnsignedInt;
4053 PtrDiffType = SignedInt;
4054 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004055 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004056
4057 // Use fpret for all types.
4058 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4059 (1 << TargetInfo::Double) |
4060 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004061
4062 // x86-32 has atomics up to 8 bytes
4063 // FIXME: Check that we actually have cmpxchg8b before setting
4064 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4065 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004066 }
Craig Topper3164f332014-03-11 03:39:26 +00004067 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004068 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004069 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004070
Craig Topper3164f332014-03-11 03:39:26 +00004071 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004072 if (RegNo == 0) return 0;
4073 if (RegNo == 1) return 2;
4074 return -1;
4075 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004076 bool validateOperandSize(StringRef Constraint,
4077 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004078 switch (Constraint[0]) {
4079 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004080 case 'R':
4081 case 'q':
4082 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004083 case 'a':
4084 case 'b':
4085 case 'c':
4086 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004087 case 'S':
4088 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004089 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004090 case 'A':
4091 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004092 }
4093
Akira Hatanaka974131e2014-09-18 18:17:18 +00004094 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004095 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004096};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004097
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004098class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4099public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004100 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4101 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004102
Craig Topper3164f332014-03-11 03:39:26 +00004103 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004104 unsigned Major, Minor, Micro;
4105 getTriple().getOSVersion(Major, Minor, Micro);
4106 // New NetBSD uses the default rounding mode.
4107 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4108 return X86_32TargetInfo::getFloatEvalMethod();
4109 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004110 return 1;
4111 }
4112};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004113
Eli Friedmane3aa4542009-07-05 18:47:56 +00004114class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4115public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004116 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4117 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004118 SizeType = UnsignedLong;
4119 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004120 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004121 }
4122};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004123
Eli Friedman9fa28852012-08-08 23:57:20 +00004124class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4125public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004126 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4127 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004128 SizeType = UnsignedLong;
4129 IntPtrType = SignedLong;
4130 PtrDiffType = SignedLong;
4131 }
4132};
Eli Friedman9fa28852012-08-08 23:57:20 +00004133
Torok Edwinb2b37c62009-06-30 17:10:35 +00004134class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004135public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004136 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4137 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004138 LongDoubleWidth = 128;
4139 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004140 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004141 MaxVectorAlign = 256;
4142 // The watchOS simulator uses the builtin bool type for Objective-C.
4143 llvm::Triple T = llvm::Triple(Triple);
4144 if (T.isWatchOS())
4145 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004146 SizeType = UnsignedLong;
4147 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004148 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004149 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004150 }
4151
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004152 bool handleTargetFeatures(std::vector<std::string> &Features,
4153 DiagnosticsEngine &Diags) override {
4154 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4155 Diags))
4156 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004157 // We now know the features we have: we can decide how to align vectors.
4158 MaxVectorAlign =
4159 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004160 return true;
4161 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004162};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004163
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004164// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004165class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004166public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004167 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4168 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004169 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004170 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004171 bool IsWinCOFF =
4172 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004173 resetDataLayout(IsWinCOFF
4174 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4175 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004176 }
Craig Topper3164f332014-03-11 03:39:26 +00004177 void getTargetDefines(const LangOptions &Opts,
4178 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004179 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4180 }
4181};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004182
4183// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004184class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004185public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004186 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4187 const TargetOptions &Opts)
4188 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004189 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004190 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4191 }
Craig Topper3164f332014-03-11 03:39:26 +00004192 void getTargetDefines(const LangOptions &Opts,
4193 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004194 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4195 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4196 // The value of the following reflects processor type.
4197 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4198 // We lost the original triple, so we use the default.
4199 Builder.defineMacro("_M_IX86", "600");
4200 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004201};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004202
David Majnemerae1ed0e2015-05-28 04:36:18 +00004203static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004204 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4205 // supports __declspec natively under -fms-extensions, but we define a no-op
4206 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004207 if (Opts.MicrosoftExt)
4208 Builder.defineMacro("__declspec", "__declspec");
4209 else
4210 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4211
4212 if (!Opts.MicrosoftExt) {
4213 // Provide macros for all the calling convention keywords. Provide both
4214 // single and double underscore prefixed variants. These are available on
4215 // x64 as well as x86, even though they have no effect.
4216 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4217 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004218 std::string GCCSpelling = "__attribute__((__";
4219 GCCSpelling += CC;
4220 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004221 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4222 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4223 }
4224 }
4225}
4226
David Majnemerae1ed0e2015-05-28 04:36:18 +00004227static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4228 Builder.defineMacro("__MSVCRT__");
4229 Builder.defineMacro("__MINGW32__");
4230 addCygMingDefines(Opts, Builder);
4231}
4232
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004233// x86-32 MinGW target
4234class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4235public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004236 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4237 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004238 void getTargetDefines(const LangOptions &Opts,
4239 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004240 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004241 DefineStd(Builder, "WIN32", Opts);
4242 DefineStd(Builder, "WINNT", Opts);
4243 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004244 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004245 }
4246};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004247
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004248// x86-32 Cygwin target
4249class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4250public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004251 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4252 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004253 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004254 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004255 resetDataLayout("e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004256 }
Craig Topper3164f332014-03-11 03:39:26 +00004257 void getTargetDefines(const LangOptions &Opts,
4258 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004259 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004260 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004261 Builder.defineMacro("__CYGWIN__");
4262 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004263 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004264 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004265 if (Opts.CPlusPlus)
4266 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004267 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004268};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004269
Chris Lattnerb986aba2010-04-11 19:29:39 +00004270// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004271class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004272public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004273 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004274 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004275 }
Craig Topper3164f332014-03-11 03:39:26 +00004276 void getTargetDefines(const LangOptions &Opts,
4277 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004278 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004279 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004280 }
4281};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004282
Alexey Bataevc99b0492015-11-25 09:24:26 +00004283// X86-32 MCU target
4284class MCUX86_32TargetInfo : public X86_32TargetInfo {
4285public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004286 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4287 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004288 LongDoubleWidth = 64;
4289 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004290 resetDataLayout("e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32");
Andrey Bokhanko6e34c1d2016-02-04 11:54:45 +00004291 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004292 }
4293
4294 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4295 // On MCU we support only C calling convention.
4296 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4297 }
4298
4299 void getTargetDefines(const LangOptions &Opts,
4300 MacroBuilder &Builder) const override {
4301 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4302 Builder.defineMacro("__iamcu");
4303 Builder.defineMacro("__iamcu__");
4304 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004305
4306 bool allowsLargerPreferedTypeAlignment() const override {
4307 return false;
4308 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004309};
4310
Douglas Gregor9fabd852011-07-01 22:41:14 +00004311// RTEMS Target
4312template<typename Target>
4313class RTEMSTargetInfo : public OSTargetInfo<Target> {
4314protected:
Craig Topper3164f332014-03-11 03:39:26 +00004315 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4316 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004317 // RTEMS defines; list based off of gcc output
4318
Douglas Gregor9fabd852011-07-01 22:41:14 +00004319 Builder.defineMacro("__rtems__");
4320 Builder.defineMacro("__ELF__");
4321 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004322
Douglas Gregor9fabd852011-07-01 22:41:14 +00004323public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004324 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4325 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004326 switch (Triple.getArch()) {
4327 default:
4328 case llvm::Triple::x86:
4329 // this->MCountName = ".mcount";
4330 break;
4331 case llvm::Triple::mips:
4332 case llvm::Triple::mipsel:
4333 case llvm::Triple::ppc:
4334 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004335 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004336 // this->MCountName = "_mcount";
4337 break;
4338 case llvm::Triple::arm:
4339 // this->MCountName = "__mcount";
4340 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004341 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004342 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004343};
4344
Douglas Gregor9fabd852011-07-01 22:41:14 +00004345// x86-32 RTEMS target
4346class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4347public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004348 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4349 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004350 SizeType = UnsignedLong;
4351 IntPtrType = SignedLong;
4352 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004353 }
Craig Topper3164f332014-03-11 03:39:26 +00004354 void getTargetDefines(const LangOptions &Opts,
4355 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004356 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4357 Builder.defineMacro("__INTEL__");
4358 Builder.defineMacro("__rtems__");
4359 }
4360};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004361
Eli Friedman3fd920a2008-08-20 02:34:37 +00004362// x86-64 generic target
4363class X86_64TargetInfo : public X86TargetInfo {
4364public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004365 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4366 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004367 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004368 bool IsWinCOFF =
4369 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004370 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004371 LongDoubleWidth = 128;
4372 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004373 LargeArrayMinWidth = 128;
4374 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004375 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004376 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4377 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4378 IntPtrType = IsX32 ? SignedInt : SignedLong;
4379 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004380 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004381 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004382
Eric Christopher917e9522014-11-18 22:36:15 +00004383 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004384 resetDataLayout(IsX32
4385 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4386 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4387 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004388
4389 // Use fpret only for long double.
4390 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004391
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004392 // Use fp2ret for _Complex long double.
4393 ComplexLongDoubleUsesFP2Ret = true;
4394
Charles Davisc7d5c942015-09-17 20:55:33 +00004395 // Make __builtin_ms_va_list available.
4396 HasBuiltinMSVaList = true;
4397
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004398 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004399 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004400 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004401 }
Craig Topper3164f332014-03-11 03:39:26 +00004402 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004403 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004404 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004405
Craig Topper3164f332014-03-11 03:39:26 +00004406 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004407 if (RegNo == 0) return 0;
4408 if (RegNo == 1) return 1;
4409 return -1;
4410 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004411
Craig Topper3164f332014-03-11 03:39:26 +00004412 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004413 switch (CC) {
4414 case CC_C:
4415 case CC_Swift:
4416 case CC_X86VectorCall:
4417 case CC_IntelOclBicc:
4418 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004419 case CC_PreserveMost:
4420 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004421 return CCCR_OK;
4422 default:
4423 return CCCR_Warning;
4424 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004425 }
4426
Craig Topper3164f332014-03-11 03:39:26 +00004427 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004428 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004429 }
4430
Pavel Chupinfd223e12014-08-04 12:39:43 +00004431 // for x32 we need it here explicitly
4432 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004433 unsigned getUnwindWordWidth() const override { return 64; }
4434 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004435
4436 bool validateGlobalRegisterVariable(StringRef RegName,
4437 unsigned RegSize,
4438 bool &HasSizeMismatch) const override {
4439 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4440 // handle.
4441 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4442 // Check that the register size is 64-bit.
4443 HasSizeMismatch = RegSize != 64;
4444 return true;
4445 }
4446
4447 // Check if the register is a 32-bit register the backend can handle.
4448 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4449 HasSizeMismatch);
4450 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004451};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004452
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004453// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004454class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004455public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004456 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4457 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004458 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004459 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004460 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004461 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004462 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004463 SizeType = UnsignedLongLong;
4464 PtrDiffType = SignedLongLong;
4465 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004466 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004467
Craig Topper3164f332014-03-11 03:39:26 +00004468 void getTargetDefines(const LangOptions &Opts,
4469 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004470 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004471 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004472 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004473
Craig Topper3164f332014-03-11 03:39:26 +00004474 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004475 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004476 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004477
Craig Topper3164f332014-03-11 03:39:26 +00004478 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004479 switch (CC) {
4480 case CC_X86StdCall:
4481 case CC_X86ThisCall:
4482 case CC_X86FastCall:
4483 return CCCR_Ignore;
4484 case CC_C:
4485 case CC_X86VectorCall:
4486 case CC_IntelOclBicc:
4487 case CC_X86_64SysV:
4488 return CCCR_OK;
4489 default:
4490 return CCCR_Warning;
4491 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004492 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004493};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004494
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004496class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004498 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4499 const TargetOptions &Opts)
4500 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004501 LongDoubleWidth = LongDoubleAlign = 64;
4502 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004503 }
Craig Topper3164f332014-03-11 03:39:26 +00004504 void getTargetDefines(const LangOptions &Opts,
4505 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004506 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4507 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004508 Builder.defineMacro("_M_X64", "100");
4509 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004510 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004511};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004512
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004513// x86-64 MinGW target
4514class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4515public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004516 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4517 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004518 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4519 // with x86 FP ops. Weird.
4520 LongDoubleWidth = LongDoubleAlign = 128;
4521 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4522 }
4523
Craig Topper3164f332014-03-11 03:39:26 +00004524 void getTargetDefines(const LangOptions &Opts,
4525 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004526 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004527 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004528 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004529 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004530
4531 // GCC defines this macro when it is using __gxx_personality_seh0.
4532 if (!Opts.SjLjExceptions)
4533 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004534 }
4535};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004536
Yaron Kerend030d112015-07-22 17:38:19 +00004537// x86-64 Cygwin target
4538class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4539public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004540 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4541 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004542 TLSSupported = false;
4543 WCharType = UnsignedShort;
4544 }
4545 void getTargetDefines(const LangOptions &Opts,
4546 MacroBuilder &Builder) const override {
4547 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4548 Builder.defineMacro("__x86_64__");
4549 Builder.defineMacro("__CYGWIN__");
4550 Builder.defineMacro("__CYGWIN64__");
4551 addCygMingDefines(Opts, Builder);
4552 DefineStd(Builder, "unix", Opts);
4553 if (Opts.CPlusPlus)
4554 Builder.defineMacro("_GNU_SOURCE");
4555
4556 // GCC defines this macro when it is using __gxx_personality_seh0.
4557 if (!Opts.SjLjExceptions)
4558 Builder.defineMacro("__SEH__");
4559 }
4560};
4561
Eli Friedman2857ccb2009-07-01 03:36:11 +00004562class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4563public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004564 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4565 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004566 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004567 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4568 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004569 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004570 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004571 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004572 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004573
4574 bool handleTargetFeatures(std::vector<std::string> &Features,
4575 DiagnosticsEngine &Diags) override {
4576 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4577 Diags))
4578 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004579 // We now know the features we have: we can decide how to align vectors.
4580 MaxVectorAlign =
4581 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004582 return true;
4583 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004584};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004585
Eli Friedman245f2292009-07-05 22:31:18 +00004586class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4587public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004588 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4589 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004590 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004591 Int64Type = SignedLongLong;
4592 }
4593};
Eli Friedman245f2292009-07-05 22:31:18 +00004594
Eli Friedman9fa28852012-08-08 23:57:20 +00004595class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4596public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004597 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4598 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004599 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004600 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004601 }
4602};
Tim Northover9bb857a2013-01-31 12:13:10 +00004603
Eli Friedmanf05b7722008-08-20 07:44:10 +00004604class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004605 // Possible FPU choices.
4606 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004607 VFP2FPU = (1 << 0),
4608 VFP3FPU = (1 << 1),
4609 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004610 NeonFPU = (1 << 3),
4611 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004612 };
4613
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004614 // Possible HWDiv features.
4615 enum HWDivMode {
4616 HWDivThumb = (1 << 0),
4617 HWDivARM = (1 << 1)
4618 };
4619
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004620 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004621 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004622 }
4623
4624 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4625 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004626
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004627 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004628
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004629 StringRef CPUProfile;
4630 StringRef CPUAttr;
4631
Rafael Espindolaeb265472013-08-21 21:59:03 +00004632 enum {
4633 FP_Default,
4634 FP_VFP,
4635 FP_Neon
4636 } FPMath;
4637
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004638 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004639 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004640 unsigned ArchProfile;
4641 unsigned ArchVersion;
4642
Bernard Ogdenda13af32013-10-24 18:32:51 +00004643 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004644
Logan Chien57086ce2012-10-10 06:56:20 +00004645 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004646 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004647
4648 // Initialized via features.
4649 unsigned SoftFloat : 1;
4650 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004651
Bernard Ogden18b57012013-10-29 09:47:51 +00004652 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004653 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004654 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004655 unsigned Unaligned : 1;
4656
4657 enum {
4658 LDREX_B = (1 << 0), /// byte (8-bit)
4659 LDREX_H = (1 << 1), /// half (16-bit)
4660 LDREX_W = (1 << 2), /// word (32-bit)
4661 LDREX_D = (1 << 3), /// double (64-bit)
4662 };
4663
4664 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004665
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004666 // ACLE 6.5.1 Hardware floating point
4667 enum {
4668 HW_FP_HP = (1 << 1), /// half (16-bit)
4669 HW_FP_SP = (1 << 2), /// single (32-bit)
4670 HW_FP_DP = (1 << 3), /// double (64-bit)
4671 };
4672 uint32_t HW_FP;
4673
Chris Lattner5cc15e02010-03-03 19:03:45 +00004674 static const Builtin::Info BuiltinInfo[];
4675
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004676 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004677 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004678
4679 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004680 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004681
Renato Golin9ba39232015-02-27 16:35:48 +00004682 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4683 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4684 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004685 SizeType = UnsignedLong;
4686 else
4687 SizeType = UnsignedInt;
4688
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004689 switch (T.getOS()) {
4690 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004691 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004692 break;
4693 case llvm::Triple::Win32:
4694 WCharType = UnsignedShort;
4695 break;
4696 case llvm::Triple::Linux:
4697 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004698 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4699 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004700 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004701 }
4702
4703 UseBitFieldTypeAlignment = true;
4704
4705 ZeroLengthBitfieldBoundary = 0;
4706
Tim Northover147cd2f2014-10-14 22:12:21 +00004707 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4708 // so set preferred for small types to 32.
4709 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004710 resetDataLayout(BigEndian
4711 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4712 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004713 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004714 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004715 resetDataLayout("e"
4716 "-m:w"
4717 "-p:32:32"
4718 "-i64:64"
4719 "-v128:64:128"
4720 "-a:0:32"
4721 "-n32"
4722 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004723 } else if (T.isOSNaCl()) {
4724 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004725 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004726 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004727 resetDataLayout(BigEndian
4728 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4729 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004730 }
4731
4732 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004733 }
4734
Tim Northover5627d392015-10-30 16:30:45 +00004735 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004736 const llvm::Triple &T = getTriple();
4737
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004738 IsAAPCS = false;
4739
Tim Northover5627d392015-10-30 16:30:45 +00004740 if (IsAAPCS16)
4741 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4742 else
4743 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004744
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004745 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004746 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004747 SizeType = UnsignedInt;
4748 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004749 SizeType = UnsignedLong;
4750
4751 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4752 WCharType = SignedInt;
4753
4754 // Do not respect the alignment of bit-field types when laying out
4755 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4756 UseBitFieldTypeAlignment = false;
4757
4758 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4759 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4760 /// gcc.
4761 ZeroLengthBitfieldBoundary = 32;
4762
Tim Northover5627d392015-10-30 16:30:45 +00004763 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4764 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004765 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004766 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004767 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004768 BigEndian
4769 ? "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 +00004770 : "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 +00004771 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004772 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004773 BigEndian
4774 ? "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 +00004775 : "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 +00004776
4777 // FIXME: Override "preferred align" for double and long long.
4778 }
4779
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004780 void setArchInfo() {
4781 StringRef ArchName = getTriple().getArchName();
4782
Renato Goline84b0002015-10-08 16:43:26 +00004783 ArchISA = llvm::ARM::parseArchISA(ArchName);
4784 CPU = llvm::ARM::getDefaultCPU(ArchName);
4785 unsigned AK = llvm::ARM::parseArch(ArchName);
4786 if (AK != llvm::ARM::AK_INVALID)
4787 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004788 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004789 }
4790
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004791 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004792 StringRef SubArch;
4793
4794 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004795 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004796 SubArch = llvm::ARM::getSubArch(ArchKind);
4797 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4798 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004799
4800 // cache CPU related strings
4801 CPUAttr = getCPUAttr();
4802 CPUProfile = getCPUProfile();
4803 }
4804
4805 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004806 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004807 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004808 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004809 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4810 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004811 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004812 if (ArchProfile == llvm::ARM::PK_M) {
4813 MaxAtomicPromoteWidth = 32;
4814 if (ShouldUseInlineAtomic)
4815 MaxAtomicInlineWidth = 32;
4816 }
4817 else {
4818 MaxAtomicPromoteWidth = 64;
4819 if (ShouldUseInlineAtomic)
4820 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004821 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004822 }
4823
4824 bool isThumb() const {
4825 return (ArchISA == llvm::ARM::IK_THUMB);
4826 }
4827
4828 bool supportsThumb() const {
4829 return CPUAttr.count('T') || ArchVersion >= 6;
4830 }
4831
4832 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004833 return CPUAttr.equals("6T2") ||
4834 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004835 }
4836
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004838 // For most sub-arches, the build attribute CPU name is enough.
4839 // For Cortex variants, it's slightly different.
4840 switch(ArchKind) {
4841 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004842 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004843 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004844 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004845 case llvm::ARM::AK_ARMV7S:
4846 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004848 return "7A";
4849 case llvm::ARM::AK_ARMV7R:
4850 return "7R";
4851 case llvm::ARM::AK_ARMV7M:
4852 return "7M";
4853 case llvm::ARM::AK_ARMV7EM:
4854 return "7EM";
4855 case llvm::ARM::AK_ARMV8A:
4856 return "8A";
4857 case llvm::ARM::AK_ARMV8_1A:
4858 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004859 case llvm::ARM::AK_ARMV8_2A:
4860 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004861 case llvm::ARM::AK_ARMV8MBaseline:
4862 return "8M_BASE";
4863 case llvm::ARM::AK_ARMV8MMainline:
4864 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004865 }
4866 }
4867
4868 StringRef getCPUProfile() const {
4869 switch(ArchProfile) {
4870 case llvm::ARM::PK_A:
4871 return "A";
4872 case llvm::ARM::PK_R:
4873 return "R";
4874 case llvm::ARM::PK_M:
4875 return "M";
4876 default:
4877 return "";
4878 }
4879 }
4880
Chris Lattner17df24e2008-04-21 18:56:49 +00004881public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004882 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004883 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4884 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004885
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004886 switch (getTriple().getOS()) {
4887 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004888 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004889 break;
4890 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004891 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004892 break;
4893 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004894
Renato Goline84b0002015-10-08 16:43:26 +00004895 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004896 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004897
Chris Lattner1a8f3942010-04-23 16:29:58 +00004898 // {} in inline assembly are neon specifiers, not assembly variant
4899 // specifiers.
4900 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004901
Eric Christopher0e261882014-12-05 01:06:59 +00004902 // FIXME: This duplicates code from the driver that sets the -target-abi
4903 // option - this code is used if -target-abi isn't passed and should
4904 // be unified in some way.
4905 if (Triple.isOSBinFormatMachO()) {
4906 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4907 // the frontend matches that.
4908 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4909 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004910 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004911 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004912 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004913 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004914 } else {
4915 setABI("apcs-gnu");
4916 }
4917 } else if (Triple.isOSWindows()) {
4918 // FIXME: this is invalid for WindowsCE
4919 setABI("aapcs");
4920 } else {
4921 // Select the default based on the platform.
4922 switch (Triple.getEnvironment()) {
4923 case llvm::Triple::Android:
4924 case llvm::Triple::GNUEABI:
4925 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004926 case llvm::Triple::MuslEABI:
4927 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004928 setABI("aapcs-linux");
4929 break;
4930 case llvm::Triple::EABIHF:
4931 case llvm::Triple::EABI:
4932 setABI("aapcs");
4933 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004934 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004935 setABI("apcs-gnu");
4936 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004937 default:
4938 if (Triple.getOS() == llvm::Triple::NetBSD)
4939 setABI("apcs-gnu");
4940 else
4941 setABI("aapcs");
4942 break;
4943 }
4944 }
John McCall86353412010-08-21 22:46:04 +00004945
4946 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004947 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004948
Renato Golin15b86152015-07-03 16:41:13 +00004949 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004950 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004951
James Molloya7139222012-03-12 09:14:10 +00004952 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004953 // the alignment of the zero-length bitfield is greater than the member
4954 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004955 // zero length bitfield.
4956 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004957
4958 if (Triple.getOS() == llvm::Triple::Linux ||
4959 Triple.getOS() == llvm::Triple::UnknownOS)
4960 this->MCountName =
4961 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004962 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004963
Alp Toker4925ba72014-06-07 23:30:42 +00004964 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004965
Craig Topper3164f332014-03-11 03:39:26 +00004966 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004967 ABI = Name;
4968
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004969 // The defaults (above) are for AAPCS, check if we need to change them.
4970 //
4971 // FIXME: We need support for -meabi... we could just mangle it into the
4972 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004973 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004974 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004975 return true;
4976 }
4977 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4978 setABIAAPCS();
4979 return true;
4980 }
4981 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004982 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004983
Renato Golinf5c4dec2015-05-27 13:33:00 +00004984 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004985 bool
4986 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4987 StringRef CPU,
4988 const std::vector<std::string> &FeaturesVec) const override {
4989
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004990 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004991 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004992
4993 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004994 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004995 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4996
4997 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004998 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004999 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5000
5001 for (const char *Feature : TargetFeatures)
5002 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005003 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005004
Eric Christopher007b0a02015-08-28 22:32:01 +00005005 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005006 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005007
Craig Topper3164f332014-03-11 03:39:26 +00005008 bool handleTargetFeatures(std::vector<std::string> &Features,
5009 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005010 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005011 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005012 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005013 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005014 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005015 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005016 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005017
Ranjeet Singhac08e532015-06-24 23:39:25 +00005018 // This does not diagnose illegal cases like having both
5019 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5020 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005021 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005022 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005023 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005024 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005025 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005026 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005027 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005028 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005029 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005030 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005031 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005032 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005033 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005034 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005035 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005036 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005037 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005038 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005039 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005040 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005041 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005042 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005043 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005044 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005045 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005046 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005047 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005048 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005049 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005050 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005051 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005052 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005053 } else if (Feature == "+strict-align") {
5054 Unaligned = 0;
5055 } else if (Feature == "+fp16") {
5056 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005057 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005058 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005059 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005060
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005061 switch (ArchVersion) {
5062 case 6:
5063 if (ArchProfile == llvm::ARM::PK_M)
5064 LDREX = 0;
5065 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5066 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5067 else
5068 LDREX = LDREX_W;
5069 break;
5070 case 7:
5071 if (ArchProfile == llvm::ARM::PK_M)
5072 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5073 else
5074 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5075 break;
5076 case 8:
5077 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5078 }
5079
Rafael Espindolaeb265472013-08-21 21:59:03 +00005080 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5081 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5082 return false;
5083 }
5084
5085 if (FPMath == FP_Neon)
5086 Features.push_back("+neonfp");
5087 else if (FPMath == FP_VFP)
5088 Features.push_back("-neonfp");
5089
Daniel Dunbar893d4752009-12-19 04:15:38 +00005090 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005091 auto Feature =
5092 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5093 if (Feature != Features.end())
5094 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005095
Rafael Espindolaeb265472013-08-21 21:59:03 +00005096 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005097 }
5098
Craig Topper3164f332014-03-11 03:39:26 +00005099 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005100 return llvm::StringSwitch<bool>(Feature)
5101 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005102 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005103 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005104 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005105 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005106 .Case("hwdiv", HWDiv & HWDivThumb)
5107 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005108 .Default(false);
5109 }
Renato Golin15b86152015-07-03 16:41:13 +00005110
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005111 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005112 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005113 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005114
Renato Golin15b86152015-07-03 16:41:13 +00005115 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005116 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005117 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005118 CPU = Name;
5119 return true;
5120 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005121
Craig Topper3164f332014-03-11 03:39:26 +00005122 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123
Craig Topper3164f332014-03-11 03:39:26 +00005124 void getTargetDefines(const LangOptions &Opts,
5125 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005126 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005127 Builder.defineMacro("__arm");
5128 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005129 // For bare-metal none-eabi.
5130 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5131 getTriple().getEnvironment() == llvm::Triple::EABI)
5132 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005133
Chris Lattnerecd49032009-03-02 22:27:17 +00005134 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005135 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005136
5137 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5138 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005139 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005140 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5141
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005142 if (!CPUAttr.empty())
5143 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005144
5145 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005146 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005147 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005148
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005149 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150 // ACLE 6.5.7 Crypto Extension
5151 if (Crypto)
5152 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5153 // ACLE 6.5.8 CRC32 Extension
5154 if (CRC)
5155 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5156 // ACLE 6.5.10 Numeric Maximum and Minimum
5157 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5158 // ACLE 6.5.9 Directed Rounding
5159 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005160 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005161
5162 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5163 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005164 // NOTE that the default profile is assumed to be 'A'
5165 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005166 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5167
Bradley Smithf4affc12016-03-03 13:52:22 +00005168 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5169 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5170 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5171 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005172 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005173 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005174 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005175 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5176
5177 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5178 // instruction set such as ARM or Thumb.
5179 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5180
5181 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5182
5183 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005184 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005185 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005186
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005187 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005188 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005189 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005190
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005191 // ACLE 6.4.4 LDREX/STREX
5192 if (LDREX)
5193 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5194
5195 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005196 if (ArchVersion == 5 ||
5197 (ArchVersion == 6 && CPUProfile != "M") ||
5198 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005199 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5200
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005201 // ACLE 6.5.1 Hardware Floating Point
5202 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005203 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005204
Yi Konga44c4d72014-06-27 21:25:42 +00005205 // ACLE predefines.
5206 Builder.defineMacro("__ARM_ACLE", "200");
5207
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005208 // FP16 support (we currently only support IEEE format).
5209 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5210 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5211
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005212 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005213 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005214 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5215
Mike Stump9d54bd72009-04-08 02:07:04 +00005216 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005217
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005218 // FIXME: It's more complicated than this and we don't really support
5219 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005220 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005221 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005222 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005223
David Tweed8f676532012-10-25 13:33:01 +00005224 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005225 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005226 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005227 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005228 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005229 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005230 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005231
Tim Northover28fc0e12016-04-28 13:59:55 +00005232 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5233 ABI == "aapcs16")
5234 Builder.defineMacro("__ARM_PCS_VFP", "1");
5235
Daniel Dunbar893d4752009-12-19 04:15:38 +00005236 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005237 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005238
Zijiao Ma56a83722016-08-17 02:13:33 +00005239 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005240 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005241
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005242 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005243 Builder.defineMacro("__THUMBEL__");
5244 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005245 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005246 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005247 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005248
5249 // ACLE 6.4.9 32-bit SIMD instructions
5250 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5251 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5252
5253 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005254 if (((HWDiv & HWDivThumb) && isThumb()) ||
5255 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005256 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005257 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005258 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005259
5260 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005261 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005262
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005263 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005264 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005265 if (FPU & VFP2FPU)
5266 Builder.defineMacro("__ARM_VFPV2__");
5267 if (FPU & VFP3FPU)
5268 Builder.defineMacro("__ARM_VFPV3__");
5269 if (FPU & VFP4FPU)
5270 Builder.defineMacro("__ARM_VFPV4__");
5271 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005272
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005273 // This only gets set when Neon instructions are actually available, unlike
5274 // the VFP define, hence the soft float and arch check. This is subtly
5275 // different from gcc, we follow the intent which was that it should be set
5276 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005277 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005278 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005279 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 // current AArch32 NEON implementations do not support double-precision
5281 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005282 Builder.defineMacro("__ARM_NEON_FP",
5283 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005284 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005285
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005286 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5287 Opts.ShortWChar ? "2" : "4");
5288
5289 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5290 Opts.ShortEnums ? "1" : "4");
5291
Bradley Smithf4affc12016-03-03 13:52:22 +00005292 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005293 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5297 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005298
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005299 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005300 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005302 }
5303
5304 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005305 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005306 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5307 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005308 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005309 }
5310
5311 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005312 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005313 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005314
5315 if (Opts.UnsafeFPMath)
5316 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005317
5318 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5319 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005320 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005321
Craig Topper6c03a542015-10-19 04:51:35 +00005322 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5323 return llvm::makeArrayRef(BuiltinInfo,
5324 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005325 }
Craig Topper3164f332014-03-11 03:39:26 +00005326 bool isCLZForZeroUndef() const override { return false; }
5327 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005328 return IsAAPCS
5329 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005330 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5331 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005332 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005333 ArrayRef<const char *> getGCCRegNames() const override;
5334 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005335 bool validateAsmConstraint(const char *&Name,
5336 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005337 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005338 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005339 case 'l': // r0-r7
5340 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005341 case 't': // VFP Floating point register single precision
5342 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005343 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005344 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005345 case 'I':
5346 case 'J':
5347 case 'K':
5348 case 'L':
5349 case 'M':
5350 // FIXME
5351 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005352 case 'Q': // A memory address that is a single base register.
5353 Info.setAllowsMemory();
5354 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005355 case 'U': // a memory reference...
5356 switch (Name[1]) {
5357 case 'q': // ...ARMV4 ldrsb
5358 case 'v': // ...VFP load/store (reg+constant offset)
5359 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005360 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005361 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005362 case 'n': // valid address for Neon doubleword vector load/store
5363 case 'm': // valid address for Neon element and structure load/store
5364 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005365 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005366 Info.setAllowsMemory();
5367 Name++;
5368 return true;
5369 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005370 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005371 return false;
5372 }
Craig Topper3164f332014-03-11 03:39:26 +00005373 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005374 std::string R;
5375 switch (*Constraint) {
5376 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005377 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005378 Constraint++;
5379 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005380 case 'p': // 'p' should be translated to 'r' by default.
5381 R = std::string("r");
5382 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005383 default:
5384 return std::string(1, *Constraint);
5385 }
5386 return R;
5387 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005388 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005389 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005390 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005391 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005392 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005393
Bill Wendling9d1ee112012-10-25 23:28:48 +00005394 // Strip off constraint modifiers.
5395 while (Constraint[0] == '=' ||
5396 Constraint[0] == '+' ||
5397 Constraint[0] == '&')
5398 Constraint = Constraint.substr(1);
5399
5400 switch (Constraint[0]) {
5401 default: break;
5402 case 'r': {
5403 switch (Modifier) {
5404 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005405 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005406 case 'q':
5407 // A register of size 32 cannot fit a vector type.
5408 return false;
5409 }
5410 }
5411 }
5412
5413 return true;
5414 }
Craig Topper3164f332014-03-11 03:39:26 +00005415 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005416 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005417 return "";
5418 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005419
Craig Topper3164f332014-03-11 03:39:26 +00005420 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005421 switch (CC) {
5422 case CC_AAPCS:
5423 case CC_AAPCS_VFP:
5424 case CC_Swift:
5425 return CCCR_OK;
5426 default:
5427 return CCCR_Warning;
5428 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005429 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005430
Craig Topper3164f332014-03-11 03:39:26 +00005431 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005432 if (RegNo == 0) return 0;
5433 if (RegNo == 1) return 1;
5434 return -1;
5435 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005436
5437 bool hasSjLjLowering() const override {
5438 return true;
5439 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005440};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005441
Rafael Espindolaeb265472013-08-21 21:59:03 +00005442bool ARMTargetInfo::setFPMath(StringRef Name) {
5443 if (Name == "neon") {
5444 FPMath = FP_Neon;
5445 return true;
5446 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5447 Name == "vfp4") {
5448 FPMath = FP_VFP;
5449 return true;
5450 }
5451 return false;
5452}
5453
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005454const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005455 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005456 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005457 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5458
5459 // Float registers
5460 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5461 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5462 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005463 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005464
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005465 // Double registers
5466 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5467 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005468 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5469 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005470
5471 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005472 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5473 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005474};
5475
Craig Topperf054e3a2015-10-19 03:52:27 +00005476ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5477 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005478}
5479
5480const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005481 { { "a1" }, "r0" },
5482 { { "a2" }, "r1" },
5483 { { "a3" }, "r2" },
5484 { { "a4" }, "r3" },
5485 { { "v1" }, "r4" },
5486 { { "v2" }, "r5" },
5487 { { "v3" }, "r6" },
5488 { { "v4" }, "r7" },
5489 { { "v5" }, "r8" },
5490 { { "v6", "rfp" }, "r9" },
5491 { { "sl" }, "r10" },
5492 { { "fp" }, "r11" },
5493 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005494 { { "r13" }, "sp" },
5495 { { "r14" }, "lr" },
5496 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005497 // The S, D and Q registers overlap, but aren't really aliases; we
5498 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005499};
5500
Craig Topperf054e3a2015-10-19 03:52:27 +00005501ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5502 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005503}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005504
5505const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005506#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005507 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005508#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5509 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005510#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005511
Craig Topper07d3b622015-08-07 05:14:44 +00005512#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005513 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005514#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005515 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005516#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5517 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005518#include "clang/Basic/BuiltinsARM.def"
5519};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005520
5521class ARMleTargetInfo : public ARMTargetInfo {
5522public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005523 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005524 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005525 void getTargetDefines(const LangOptions &Opts,
5526 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005527 Builder.defineMacro("__ARMEL__");
5528 ARMTargetInfo::getTargetDefines(Opts, Builder);
5529 }
5530};
5531
5532class ARMbeTargetInfo : public ARMTargetInfo {
5533public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005534 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005535 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005536 void getTargetDefines(const LangOptions &Opts,
5537 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005538 Builder.defineMacro("__ARMEB__");
5539 Builder.defineMacro("__ARM_BIG_ENDIAN");
5540 ARMTargetInfo::getTargetDefines(Opts, Builder);
5541 }
5542};
Chris Lattner17df24e2008-04-21 18:56:49 +00005543
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005544class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5545 const llvm::Triple Triple;
5546public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005547 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5548 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005549 WCharType = UnsignedShort;
5550 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005551 }
5552 void getVisualStudioDefines(const LangOptions &Opts,
5553 MacroBuilder &Builder) const {
5554 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5555
5556 // FIXME: this is invalid for WindowsCE
5557 Builder.defineMacro("_M_ARM_NT", "1");
5558 Builder.defineMacro("_M_ARMT", "_M_ARM");
5559 Builder.defineMacro("_M_THUMB", "_M_ARM");
5560
5561 assert((Triple.getArch() == llvm::Triple::arm ||
5562 Triple.getArch() == llvm::Triple::thumb) &&
5563 "invalid architecture for Windows ARM target info");
5564 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5565 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5566
5567 // TODO map the complete set of values
5568 // 31: VFPv3 40: VFPv4
5569 Builder.defineMacro("_M_ARM_FP", "31");
5570 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005571 BuiltinVaListKind getBuiltinVaListKind() const override {
5572 return TargetInfo::CharPtrBuiltinVaList;
5573 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005574 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5575 switch (CC) {
5576 case CC_X86StdCall:
5577 case CC_X86ThisCall:
5578 case CC_X86FastCall:
5579 case CC_X86VectorCall:
5580 return CCCR_Ignore;
5581 case CC_C:
5582 return CCCR_OK;
5583 default:
5584 return CCCR_Warning;
5585 }
5586 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005587};
5588
5589// Windows ARM + Itanium C++ ABI Target
5590class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005592 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5593 const TargetOptions &Opts)
5594 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005595 TheCXXABI.set(TargetCXXABI::GenericARM);
5596 }
5597
5598 void getTargetDefines(const LangOptions &Opts,
5599 MacroBuilder &Builder) const override {
5600 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5601
5602 if (Opts.MSVCCompat)
5603 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5604 }
5605};
5606
5607// Windows ARM, MS (C++) ABI
5608class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5609public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005610 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5611 const TargetOptions &Opts)
5612 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005613 TheCXXABI.set(TargetCXXABI::Microsoft);
5614 }
5615
5616 void getTargetDefines(const LangOptions &Opts,
5617 MacroBuilder &Builder) const override {
5618 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5619 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5620 }
5621};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005622
Yaron Keren321249c2015-07-15 13:32:23 +00005623// ARM MinGW target
5624class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005626 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5627 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005628 TheCXXABI.set(TargetCXXABI::GenericARM);
5629 }
5630
5631 void getTargetDefines(const LangOptions &Opts,
5632 MacroBuilder &Builder) const override {
5633 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5634 DefineStd(Builder, "WIN32", Opts);
5635 DefineStd(Builder, "WINNT", Opts);
5636 Builder.defineMacro("_ARM_");
5637 addMinGWDefines(Opts, Builder);
5638 }
5639};
5640
5641// ARM Cygwin target
5642class CygwinARMTargetInfo : public ARMleTargetInfo {
5643public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005644 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5645 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005646 TLSSupported = false;
5647 WCharType = UnsignedShort;
5648 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005649 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005650 }
5651 void getTargetDefines(const LangOptions &Opts,
5652 MacroBuilder &Builder) const override {
5653 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5654 Builder.defineMacro("_ARM_");
5655 Builder.defineMacro("__CYGWIN__");
5656 Builder.defineMacro("__CYGWIN32__");
5657 DefineStd(Builder, "unix", Opts);
5658 if (Opts.CPlusPlus)
5659 Builder.defineMacro("_GNU_SOURCE");
5660 }
5661};
5662
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005663class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005664protected:
Craig Topper3164f332014-03-11 03:39:26 +00005665 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5666 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005667 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005668 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005669
Torok Edwinb2b37c62009-06-30 17:10:35 +00005670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005671 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5672 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005673 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005674 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005675 // FIXME: This should be based off of the target features in
5676 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005677 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005678
Tim Northoverd88ecb32016-01-27 19:32:40 +00005679 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005680 // Darwin on iOS uses a variant of the ARM C++ ABI.
5681 TheCXXABI.set(TargetCXXABI::WatchOS);
5682
5683 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5684 // size_t is long, it's a bit weird for it to be int.
5685 PtrDiffType = SignedLong;
5686
5687 // BOOL should be a real boolean on the new ABI
5688 UseSignedCharForObjCBool = false;
5689 } else
5690 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005691 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005692};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005693
Tim Northover573cbee2014-05-24 12:52:07 +00005694class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005695 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005696 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5697 static const char *const GCCRegNames[];
5698
James Molloy75f5f9e2014-04-16 15:33:48 +00005699 enum FPUModeEnum {
5700 FPUMode,
5701 NeonMode
5702 };
5703
5704 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005705 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005706 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005707 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005708 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005709
Tim Northovera2ee4332014-03-29 15:09:45 +00005710 static const Builtin::Info BuiltinInfo[];
5711
5712 std::string ABI;
5713
5714public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005715 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005716 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005717 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5718 WCharType = SignedInt;
5719
5720 // NetBSD apparently prefers consistency across ARM targets to consistency
5721 // across 64-bit targets.
5722 Int64Type = SignedLongLong;
5723 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005724 } else {
5725 WCharType = UnsignedInt;
5726 Int64Type = SignedLong;
5727 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005728 }
5729
Tim Northovera2ee4332014-03-29 15:09:45 +00005730 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005731 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 MaxAtomicInlineWidth = 128;
5733 MaxAtomicPromoteWidth = 128;
5734
Tim Northovera6a19f12015-02-06 01:25:07 +00005735 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005736 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5737
Tim Northovera2ee4332014-03-29 15:09:45 +00005738 // {} in inline assembly are neon specifiers, not assembly variant
5739 // specifiers.
5740 NoAsmVariants = true;
5741
Tim Northover7ad87af2015-01-16 18:44:04 +00005742 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5743 // contributes to the alignment of the containing aggregate in the same way
5744 // a plain (non bit-field) member of that type would, without exception for
5745 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005746 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005747 UseZeroLengthBitfieldAlignment = true;
5748
Tim Northover573cbee2014-05-24 12:52:07 +00005749 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005750 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005751
5752 if (Triple.getOS() == llvm::Triple::Linux ||
5753 Triple.getOS() == llvm::Triple::UnknownOS)
5754 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005755 }
5756
Alp Toker4925ba72014-06-07 23:30:42 +00005757 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005758 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005759 if (Name != "aapcs" && Name != "darwinpcs")
5760 return false;
5761
5762 ABI = Name;
5763 return true;
5764 }
5765
David Blaikie1cbb9712014-11-14 19:09:44 +00005766 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005767 return Name == "generic" ||
5768 llvm::AArch64::parseCPUArch(Name) !=
5769 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005770 }
5771
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005772 void getTargetDefines(const LangOptions &Opts,
5773 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005774 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005775 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005776
5777 // Target properties.
5778 Builder.defineMacro("_LP64");
5779 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005780
5781 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5782 Builder.defineMacro("__ARM_ACLE", "200");
5783 Builder.defineMacro("__ARM_ARCH", "8");
5784 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5785
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005786 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005787 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005788 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005789
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005790 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5791 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5792 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5793 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005794 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005795 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5796 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005797
5798 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5799
5800 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005801 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005802
5803 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5804 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005805 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5806 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005807
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005808 if (Opts.UnsafeFPMath)
5809 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005810
5811 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5812
5813 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5814 Opts.ShortEnums ? "1" : "4");
5815
James Molloy75f5f9e2014-04-16 15:33:48 +00005816 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005817 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005818 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005819 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005820 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005821
Bradley Smith418c5932014-05-02 15:17:51 +00005822 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005823 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005824
James Molloy75f5f9e2014-04-16 15:33:48 +00005825 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005826 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5827
5828 if (Unaligned)
5829 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005830
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005831 if (V8_1A)
5832 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5833
Reid Klecknerd167d422015-05-06 15:31:46 +00005834 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5835 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5836 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5837 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5838 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005839 }
5840
Craig Topper6c03a542015-10-19 04:51:35 +00005841 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5842 return llvm::makeArrayRef(BuiltinInfo,
5843 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005844 }
5845
David Blaikie1cbb9712014-11-14 19:09:44 +00005846 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005847 return Feature == "aarch64" ||
5848 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005849 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005850 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005851 }
5852
James Molloy5e73df52014-04-16 15:06:20 +00005853 bool handleTargetFeatures(std::vector<std::string> &Features,
5854 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005855 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005856 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005857 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005858 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005859 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005860
Eric Christopher610fe112015-08-26 08:21:55 +00005861 for (const auto &Feature : Features) {
5862 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005863 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005864 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005865 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005866 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005867 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005868 if (Feature == "+strict-align")
5869 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005870 if (Feature == "+v8.1a")
5871 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005872 }
5873
James Y Knightb214cbc2016-03-04 19:00:41 +00005874 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005875
5876 return true;
5877 }
5878
John McCall477f2bb2016-03-03 06:39:32 +00005879 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5880 switch (CC) {
5881 case CC_C:
5882 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005883 case CC_PreserveMost:
5884 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005885 return CCCR_OK;
5886 default:
5887 return CCCR_Warning;
5888 }
5889 }
5890
David Blaikie1cbb9712014-11-14 19:09:44 +00005891 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005892
David Blaikie1cbb9712014-11-14 19:09:44 +00005893 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005894 return TargetInfo::AArch64ABIBuiltinVaList;
5895 }
5896
Craig Topperf054e3a2015-10-19 03:52:27 +00005897 ArrayRef<const char *> getGCCRegNames() const override;
5898 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005899
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005900 bool validateAsmConstraint(const char *&Name,
5901 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005902 switch (*Name) {
5903 default:
5904 return false;
5905 case 'w': // Floating point and SIMD registers (V0-V31)
5906 Info.setAllowsRegister();
5907 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005908 case 'I': // Constant that can be used with an ADD instruction
5909 case 'J': // Constant that can be used with a SUB instruction
5910 case 'K': // Constant that can be used with a 32-bit logical instruction
5911 case 'L': // Constant that can be used with a 64-bit logical instruction
5912 case 'M': // Constant that can be used as a 32-bit MOV immediate
5913 case 'N': // Constant that can be used as a 64-bit MOV immediate
5914 case 'Y': // Floating point constant zero
5915 case 'Z': // Integer constant zero
5916 return true;
5917 case 'Q': // A memory reference with base register and no offset
5918 Info.setAllowsMemory();
5919 return true;
5920 case 'S': // A symbolic address
5921 Info.setAllowsRegister();
5922 return true;
5923 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005924 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5925 // Utf: A memory address suitable for ldp/stp in TF mode.
5926 // Usa: An absolute symbolic address.
5927 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5928 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005929 case 'z': // Zero register, wzr or xzr
5930 Info.setAllowsRegister();
5931 return true;
5932 case 'x': // Floating point and SIMD registers (V0-V15)
5933 Info.setAllowsRegister();
5934 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005935 }
5936 return false;
5937 }
5938
Akira Hatanaka987f1862014-08-22 06:05:21 +00005939 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005940 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005941 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005942 // Strip off constraint modifiers.
5943 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5944 Constraint = Constraint.substr(1);
5945
5946 switch (Constraint[0]) {
5947 default:
5948 return true;
5949 case 'z':
5950 case 'r': {
5951 switch (Modifier) {
5952 case 'x':
5953 case 'w':
5954 // For now assume that the person knows what they're
5955 // doing with the modifier.
5956 return true;
5957 default:
5958 // By default an 'r' constraint will be in the 'x'
5959 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005960 if (Size == 64)
5961 return true;
5962
5963 SuggestedModifier = "w";
5964 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005965 }
5966 }
5967 }
5968 }
5969
David Blaikie1cbb9712014-11-14 19:09:44 +00005970 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005971
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005972 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005973 if (RegNo == 0)
5974 return 0;
5975 if (RegNo == 1)
5976 return 1;
5977 return -1;
5978 }
5979};
5980
Tim Northover573cbee2014-05-24 12:52:07 +00005981const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005982 // 32-bit Integer registers
5983 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5984 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5985 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5986
5987 // 64-bit Integer registers
5988 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5989 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5990 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5991
5992 // 32-bit floating point regsisters
5993 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5994 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5995 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5996
5997 // 64-bit floating point regsisters
5998 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
5999 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6000 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6001
6002 // Vector registers
6003 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6004 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6005 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6006};
6007
Craig Topperf054e3a2015-10-19 03:52:27 +00006008ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6009 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006010}
6011
Tim Northover573cbee2014-05-24 12:52:07 +00006012const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006013 { { "w31" }, "wsp" },
6014 { { "x29" }, "fp" },
6015 { { "x30" }, "lr" },
6016 { { "x31" }, "sp" },
6017 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6018 // don't want to substitute one of these for a different-sized one.
6019};
6020
Craig Topperf054e3a2015-10-19 03:52:27 +00006021ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6022 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006023}
6024
Tim Northover573cbee2014-05-24 12:52:07 +00006025const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006026#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006027 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006028#include "clang/Basic/BuiltinsNEON.def"
6029
6030#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006031 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006032#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006033};
James Molloy5e73df52014-04-16 15:06:20 +00006034
Tim Northover573cbee2014-05-24 12:52:07 +00006035class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006036 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006037 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006038 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006039 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006040 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006041 }
6042
6043public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006044 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6045 : AArch64TargetInfo(Triple, Opts) {
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;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006112 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006113
Tony Linthicum76329bf2011-12-12 21:14:55 +00006114public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006115 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6116 : TargetInfo(Triple) {
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;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006136 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006137 }
6138
Craig Topper6c03a542015-10-19 04:51:35 +00006139 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6140 return llvm::makeArrayRef(BuiltinInfo,
6141 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006142 }
6143
Craig Topper3164f332014-03-11 03:39:26 +00006144 bool validateAsmConstraint(const char *&Name,
6145 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006146 switch (*Name) {
6147 case 'v':
6148 case 'q':
6149 if (HasHVX) {
6150 Info.setAllowsRegister();
6151 return true;
6152 }
6153 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006154 case 's':
6155 // Relocatable constant.
6156 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006157 }
6158 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006159 }
6160
Craig Topper3164f332014-03-11 03:39:26 +00006161 void getTargetDefines(const LangOptions &Opts,
6162 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006163
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006164 bool isCLZForZeroUndef() const override { return false; }
6165
Craig Topper3164f332014-03-11 03:39:26 +00006166 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006167 return llvm::StringSwitch<bool>(Feature)
6168 .Case("hexagon", true)
6169 .Case("hvx", HasHVX)
6170 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006171 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006172 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006173 }
Craig Topper3164f332014-03-11 03:39:26 +00006174
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006175 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6176 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6177 const override;
6178
6179 bool handleTargetFeatures(std::vector<std::string> &Features,
6180 DiagnosticsEngine &Diags) override;
6181
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006182 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6183 bool Enabled) const override;
6184
Craig Topper3164f332014-03-11 03:39:26 +00006185 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006186 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006187 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006188 ArrayRef<const char *> getGCCRegNames() const override;
6189 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006190 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006191 return "";
6192 }
Sebastian Pop86500282012-01-13 20:37:10 +00006193
6194 static const char *getHexagonCPUSuffix(StringRef Name) {
6195 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006196 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006197 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006198 .Case("hexagonv55", "55")
6199 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006200 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006201 }
6202
Craig Topper3164f332014-03-11 03:39:26 +00006203 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006204 if (!getHexagonCPUSuffix(Name))
6205 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006206 CPU = Name;
6207 return true;
6208 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006209
6210 int getEHDataRegisterNumber(unsigned RegNo) const override {
6211 return RegNo < 2 ? RegNo : -1;
6212 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006213};
6214
6215void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006216 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006217 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006218 Builder.defineMacro("__hexagon__", "1");
6219
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006220 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006221 Builder.defineMacro("__HEXAGON_V4__");
6222 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006223 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006224 Builder.defineMacro("__QDSP6_V4__");
6225 Builder.defineMacro("__QDSP6_ARCH__", "4");
6226 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006227 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006228 Builder.defineMacro("__HEXAGON_V5__");
6229 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6230 if(Opts.HexagonQdsp6Compat) {
6231 Builder.defineMacro("__QDSP6_V5__");
6232 Builder.defineMacro("__QDSP6_ARCH__", "5");
6233 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006234 } else if (CPU == "hexagonv55") {
6235 Builder.defineMacro("__HEXAGON_V55__");
6236 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6237 Builder.defineMacro("__QDSP6_V55__");
6238 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006239 } else if (CPU == "hexagonv60") {
6240 Builder.defineMacro("__HEXAGON_V60__");
6241 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6242 Builder.defineMacro("__QDSP6_V60__");
6243 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006244 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006245
6246 if (hasFeature("hvx")) {
6247 Builder.defineMacro("__HVX__");
6248 if (hasFeature("hvx-double"))
6249 Builder.defineMacro("__HVXDBL__");
6250 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006251}
6252
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006253bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6254 DiagnosticsEngine &Diags, StringRef CPU,
6255 const std::vector<std::string> &FeaturesVec) const {
6256 // Default for v60: -hvx, -hvx-double.
6257 Features["hvx"] = false;
6258 Features["hvx-double"] = false;
6259 Features["long-calls"] = false;
6260
6261 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6262}
6263
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006264bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6265 DiagnosticsEngine &Diags) {
6266 for (auto &F : Features) {
6267 if (F == "+hvx")
6268 HasHVX = true;
6269 else if (F == "-hvx")
6270 HasHVX = HasHVXDouble = false;
6271 else if (F == "+hvx-double")
6272 HasHVX = HasHVXDouble = true;
6273 else if (F == "-hvx-double")
6274 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006275
6276 if (F == "+long-calls")
6277 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006278 else if (F == "-long-calls")
6279 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006280 }
6281 return true;
6282}
6283
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006284void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6285 StringRef Name, bool Enabled) const {
6286 if (Enabled) {
6287 if (Name == "hvx-double")
6288 Features["hvx"] = true;
6289 } else {
6290 if (Name == "hvx")
6291 Features["hvx-double"] = false;
6292 }
6293 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006294}
6295
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006296const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006297 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6298 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6299 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6300 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6301 "p0", "p1", "p2", "p3",
6302 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6303};
6304
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006305ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006306 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006307}
6308
Tony Linthicum76329bf2011-12-12 21:14:55 +00006309const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6310 { { "sp" }, "r29" },
6311 { { "fp" }, "r30" },
6312 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006313};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006314
Craig Topperf054e3a2015-10-19 03:52:27 +00006315ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6316 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006317}
6318
6319
6320const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006321#define BUILTIN(ID, TYPE, ATTRS) \
6322 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6323#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6324 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006325#include "clang/Basic/BuiltinsHexagon.def"
6326};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006327
Jacques Pienaard964cc22016-03-28 21:02:54 +00006328class LanaiTargetInfo : public TargetInfo {
6329 // Class for Lanai (32-bit).
6330 // The CPU profiles supported by the Lanai backend
6331 enum CPUKind {
6332 CK_NONE,
6333 CK_V11,
6334 } CPU;
6335
6336 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6337 static const char *const GCCRegNames[];
6338
6339public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006340 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6341 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006342 // Description string has to be kept in sync with backend.
6343 resetDataLayout("E" // Big endian
6344 "-m:e" // ELF name manging
6345 "-p:32:32" // 32 bit pointers, 32 bit aligned
6346 "-i64:64" // 64 bit integers, 64 bit aligned
6347 "-a:0:32" // 32 bit alignment of objects of aggregate type
6348 "-n32" // 32 bit native integer width
6349 "-S64" // 64 bit natural stack alignment
6350 );
6351
6352 // Setting RegParmMax equal to what mregparm was set to in the old
6353 // toolchain
6354 RegParmMax = 4;
6355
6356 // Set the default CPU to V11
6357 CPU = CK_V11;
6358
6359 // Temporary approach to make everything at least word-aligned and allow for
6360 // safely casting between pointers with different alignment requirements.
6361 // TODO: Remove this when there are no more cast align warnings on the
6362 // firmware.
6363 MinGlobalAlign = 32;
6364 }
6365
6366 void getTargetDefines(const LangOptions &Opts,
6367 MacroBuilder &Builder) const override {
6368 // Define __lanai__ when building for target lanai.
6369 Builder.defineMacro("__lanai__");
6370
6371 // Set define for the CPU specified.
6372 switch (CPU) {
6373 case CK_V11:
6374 Builder.defineMacro("__LANAI_V11__");
6375 break;
6376 case CK_NONE:
6377 llvm_unreachable("Unhandled target CPU");
6378 }
6379 }
6380
6381 bool setCPU(const std::string &Name) override {
6382 CPU = llvm::StringSwitch<CPUKind>(Name)
6383 .Case("v11", CK_V11)
6384 .Default(CK_NONE);
6385
6386 return CPU != CK_NONE;
6387 }
6388
6389 bool hasFeature(StringRef Feature) const override {
6390 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6391 }
6392
6393 ArrayRef<const char *> getGCCRegNames() const override;
6394
6395 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6396
6397 BuiltinVaListKind getBuiltinVaListKind() const override {
6398 return TargetInfo::VoidPtrBuiltinVaList;
6399 }
6400
6401 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6402
6403 bool validateAsmConstraint(const char *&Name,
6404 TargetInfo::ConstraintInfo &info) const override {
6405 return false;
6406 }
6407
6408 const char *getClobbers() const override { return ""; }
6409};
6410
6411const char *const LanaiTargetInfo::GCCRegNames[] = {
6412 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6413 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6414 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6415
6416ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6417 return llvm::makeArrayRef(GCCRegNames);
6418}
6419
6420const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6421 {{"pc"}, "r2"},
6422 {{"sp"}, "r4"},
6423 {{"fp"}, "r5"},
6424 {{"rv"}, "r8"},
6425 {{"rr1"}, "r10"},
6426 {{"rr2"}, "r11"},
6427 {{"rca"}, "r15"},
6428};
6429
6430ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6431 return llvm::makeArrayRef(GCCRegAliases);
6432}
6433
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006434// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6435class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006436 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6437 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006438 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006439public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006440 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006441 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006442
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006443 int getEHDataRegisterNumber(unsigned RegNo) const override {
6444 if (RegNo == 0) return 24;
6445 if (RegNo == 1) return 25;
6446 return -1;
6447 }
6448
Craig Topper3164f332014-03-11 03:39:26 +00006449 bool handleTargetFeatures(std::vector<std::string> &Features,
6450 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006451 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006452 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6453 if (Feature != Features.end()) {
6454 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006455 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006456 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006457 }
Craig Topper3164f332014-03-11 03:39:26 +00006458 void getTargetDefines(const LangOptions &Opts,
6459 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006460 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006461 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006462
6463 if (SoftFloat)
6464 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006465 }
Craig Topper3164f332014-03-11 03:39:26 +00006466
6467 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006468 return llvm::StringSwitch<bool>(Feature)
6469 .Case("softfloat", SoftFloat)
6470 .Case("sparc", true)
6471 .Default(false);
6472 }
Craig Topper3164f332014-03-11 03:39:26 +00006473
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006474 bool hasSjLjLowering() const override {
6475 return true;
6476 }
6477
Craig Topper6c03a542015-10-19 04:51:35 +00006478 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006479 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006480 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006481 }
Craig Topper3164f332014-03-11 03:39:26 +00006482 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006483 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006484 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006485 ArrayRef<const char *> getGCCRegNames() const override;
6486 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006487 bool validateAsmConstraint(const char *&Name,
6488 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006489 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006490 switch (*Name) {
6491 case 'I': // Signed 13-bit constant
6492 case 'J': // Zero
6493 case 'K': // 32-bit constant with the low 12 bits clear
6494 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6495 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6496 case 'N': // Same as 'K' but zext (required for SIMode)
6497 case 'O': // The constant 4096
6498 return true;
6499 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006500 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006501 }
Craig Topper3164f332014-03-11 03:39:26 +00006502 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006503 // FIXME: Implement!
6504 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006505 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006506
6507 // No Sparc V7 for now, the backend doesn't support it anyway.
6508 enum CPUKind {
6509 CK_GENERIC,
6510 CK_V8,
6511 CK_SUPERSPARC,
6512 CK_SPARCLITE,
6513 CK_F934,
6514 CK_HYPERSPARC,
6515 CK_SPARCLITE86X,
6516 CK_SPARCLET,
6517 CK_TSC701,
6518 CK_V9,
6519 CK_ULTRASPARC,
6520 CK_ULTRASPARC3,
6521 CK_NIAGARA,
6522 CK_NIAGARA2,
6523 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006524 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006525 CK_MYRIAD2100,
6526 CK_MYRIAD2150,
6527 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006528 CK_LEON2,
6529 CK_LEON2_AT697E,
6530 CK_LEON2_AT697F,
6531 CK_LEON3,
6532 CK_LEON3_UT699,
6533 CK_LEON3_GR712RC,
6534 CK_LEON4,
6535 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006536 } CPU = CK_GENERIC;
6537
6538 enum CPUGeneration {
6539 CG_V8,
6540 CG_V9,
6541 };
6542
6543 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6544 switch (Kind) {
6545 case CK_GENERIC:
6546 case CK_V8:
6547 case CK_SUPERSPARC:
6548 case CK_SPARCLITE:
6549 case CK_F934:
6550 case CK_HYPERSPARC:
6551 case CK_SPARCLITE86X:
6552 case CK_SPARCLET:
6553 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006554 case CK_MYRIAD2100:
6555 case CK_MYRIAD2150:
6556 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006557 case CK_LEON2:
6558 case CK_LEON2_AT697E:
6559 case CK_LEON2_AT697F:
6560 case CK_LEON3:
6561 case CK_LEON3_UT699:
6562 case CK_LEON3_GR712RC:
6563 case CK_LEON4:
6564 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006565 return CG_V8;
6566 case CK_V9:
6567 case CK_ULTRASPARC:
6568 case CK_ULTRASPARC3:
6569 case CK_NIAGARA:
6570 case CK_NIAGARA2:
6571 case CK_NIAGARA3:
6572 case CK_NIAGARA4:
6573 return CG_V9;
6574 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006575 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006576 }
6577
6578 CPUKind getCPUKind(StringRef Name) const {
6579 return llvm::StringSwitch<CPUKind>(Name)
6580 .Case("v8", CK_V8)
6581 .Case("supersparc", CK_SUPERSPARC)
6582 .Case("sparclite", CK_SPARCLITE)
6583 .Case("f934", CK_F934)
6584 .Case("hypersparc", CK_HYPERSPARC)
6585 .Case("sparclite86x", CK_SPARCLITE86X)
6586 .Case("sparclet", CK_SPARCLET)
6587 .Case("tsc701", CK_TSC701)
6588 .Case("v9", CK_V9)
6589 .Case("ultrasparc", CK_ULTRASPARC)
6590 .Case("ultrasparc3", CK_ULTRASPARC3)
6591 .Case("niagara", CK_NIAGARA)
6592 .Case("niagara2", CK_NIAGARA2)
6593 .Case("niagara3", CK_NIAGARA3)
6594 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006595 .Case("ma2100", CK_MYRIAD2100)
6596 .Case("ma2150", CK_MYRIAD2150)
6597 .Case("ma2450", CK_MYRIAD2450)
6598 // FIXME: the myriad2[.n] spellings are obsolete,
6599 // but a grace period is needed to allow updating dependent builds.
6600 .Case("myriad2", CK_MYRIAD2100)
6601 .Case("myriad2.1", CK_MYRIAD2100)
6602 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006603 .Case("leon2", CK_LEON2)
6604 .Case("at697e", CK_LEON2_AT697E)
6605 .Case("at697f", CK_LEON2_AT697F)
6606 .Case("leon3", CK_LEON3)
6607 .Case("ut699", CK_LEON3_UT699)
6608 .Case("gr712rc", CK_LEON3_GR712RC)
6609 .Case("leon4", CK_LEON4)
6610 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006611 .Default(CK_GENERIC);
6612 }
6613
6614 bool setCPU(const std::string &Name) override {
6615 CPU = getCPUKind(Name);
6616 return CPU != CK_GENERIC;
6617 }
Gabor Greif49991682008-02-21 16:29:08 +00006618};
6619
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006620const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006621 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6622 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6623 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6624 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6625};
6626
Craig Topperf054e3a2015-10-19 03:52:27 +00006627ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6628 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006629}
6630
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006631const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006632 { { "g0" }, "r0" },
6633 { { "g1" }, "r1" },
6634 { { "g2" }, "r2" },
6635 { { "g3" }, "r3" },
6636 { { "g4" }, "r4" },
6637 { { "g5" }, "r5" },
6638 { { "g6" }, "r6" },
6639 { { "g7" }, "r7" },
6640 { { "o0" }, "r8" },
6641 { { "o1" }, "r9" },
6642 { { "o2" }, "r10" },
6643 { { "o3" }, "r11" },
6644 { { "o4" }, "r12" },
6645 { { "o5" }, "r13" },
6646 { { "o6", "sp" }, "r14" },
6647 { { "o7" }, "r15" },
6648 { { "l0" }, "r16" },
6649 { { "l1" }, "r17" },
6650 { { "l2" }, "r18" },
6651 { { "l3" }, "r19" },
6652 { { "l4" }, "r20" },
6653 { { "l5" }, "r21" },
6654 { { "l6" }, "r22" },
6655 { { "l7" }, "r23" },
6656 { { "i0" }, "r24" },
6657 { { "i1" }, "r25" },
6658 { { "i2" }, "r26" },
6659 { { "i3" }, "r27" },
6660 { { "i4" }, "r28" },
6661 { { "i5" }, "r29" },
6662 { { "i6", "fp" }, "r30" },
6663 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006664};
6665
Craig Topperf054e3a2015-10-19 03:52:27 +00006666ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6667 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006668}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006669
6670// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6671class SparcV8TargetInfo : public SparcTargetInfo {
6672public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006673 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6674 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006675 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006676 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6677 switch (getTriple().getOS()) {
6678 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006679 SizeType = UnsignedInt;
6680 IntPtrType = SignedInt;
6681 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006682 break;
6683 case llvm::Triple::NetBSD:
6684 case llvm::Triple::OpenBSD:
6685 SizeType = UnsignedLong;
6686 IntPtrType = SignedLong;
6687 PtrDiffType = SignedLong;
6688 break;
Brad Smith56495d52015-08-13 22:00:53 +00006689 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006690 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006691 }
6692
Craig Topper3164f332014-03-11 03:39:26 +00006693 void getTargetDefines(const LangOptions &Opts,
6694 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006695 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006696 switch (getCPUGeneration(CPU)) {
6697 case CG_V8:
6698 Builder.defineMacro("__sparcv8");
6699 if (getTriple().getOS() != llvm::Triple::Solaris)
6700 Builder.defineMacro("__sparcv8__");
6701 break;
6702 case CG_V9:
6703 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006704 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006705 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006706 Builder.defineMacro("__sparc_v9__");
6707 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006708 break;
6709 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006710 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006711 std::string MyriadArchValue, Myriad2Value;
6712 Builder.defineMacro("__sparc_v8__");
6713 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006714 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006715 case CK_MYRIAD2150:
6716 MyriadArchValue = "__ma2150";
6717 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006718 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006719 case CK_MYRIAD2450:
6720 MyriadArchValue = "__ma2450";
6721 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006722 break;
6723 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006724 MyriadArchValue = "__ma2100";
6725 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006726 break;
6727 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006728 Builder.defineMacro(MyriadArchValue, "1");
6729 Builder.defineMacro(MyriadArchValue+"__", "1");
6730 Builder.defineMacro("__myriad2__", Myriad2Value);
6731 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006732 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006733 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006734
6735 bool hasSjLjLowering() const override {
6736 return true;
6737 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006738};
6739
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006740// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6741class SparcV8elTargetInfo : public SparcV8TargetInfo {
6742 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006743 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6744 : SparcV8TargetInfo(Triple, Opts) {
6745 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006746 }
6747};
6748
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006749// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6750class SparcV9TargetInfo : public SparcTargetInfo {
6751public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006752 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6753 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006754 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006755 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006756 // This is an LP64 platform.
6757 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006758
6759 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006760 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006761 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006762 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006763 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006764 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006765
6766 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6767 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6768 LongDoubleWidth = 128;
6769 LongDoubleAlign = 128;
6770 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006771 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006772 }
6773
Craig Topper3164f332014-03-11 03:39:26 +00006774 void getTargetDefines(const LangOptions &Opts,
6775 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006776 SparcTargetInfo::getTargetDefines(Opts, Builder);
6777 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006778 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006779 // Solaris doesn't need these variants, but the BSDs do.
6780 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006781 Builder.defineMacro("__sparc64__");
6782 Builder.defineMacro("__sparc_v9__");
6783 Builder.defineMacro("__sparcv9__");
6784 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006785 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006786
Craig Topper3164f332014-03-11 03:39:26 +00006787 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006788 if (!SparcTargetInfo::setCPU(Name))
6789 return false;
6790 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006791 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006792};
6793
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006794class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006795 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006796 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006797 std::string CPU;
6798 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006799 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006800
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006801public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006802 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006803 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6804 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006805 IntMaxType = SignedLong;
6806 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006807 TLSSupported = true;
6808 IntWidth = IntAlign = 32;
6809 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6810 PointerWidth = PointerAlign = 64;
6811 LongDoubleWidth = 128;
6812 LongDoubleAlign = 64;
6813 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006814 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006815 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006816 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 +00006817 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6818 }
6819 void getTargetDefines(const LangOptions &Opts,
6820 MacroBuilder &Builder) const override {
6821 Builder.defineMacro("__s390__");
6822 Builder.defineMacro("__s390x__");
6823 Builder.defineMacro("__zarch__");
6824 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006825
6826 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6827 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6828 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6829 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6830
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006831 if (HasTransactionalExecution)
6832 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006833 if (Opts.ZVector)
6834 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006835 }
Craig Topper6c03a542015-10-19 04:51:35 +00006836 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6837 return llvm::makeArrayRef(BuiltinInfo,
6838 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006839 }
6840
Craig Topperf054e3a2015-10-19 03:52:27 +00006841 ArrayRef<const char *> getGCCRegNames() const override;
6842 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006843 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006844 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006845 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006846 bool validateAsmConstraint(const char *&Name,
6847 TargetInfo::ConstraintInfo &info) const override;
6848 const char *getClobbers() const override {
6849 // FIXME: Is this really right?
6850 return "";
6851 }
6852 BuiltinVaListKind getBuiltinVaListKind() const override {
6853 return TargetInfo::SystemZBuiltinVaList;
6854 }
6855 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006856 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006857 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6858 .Case("z10", true)
6859 .Case("z196", true)
6860 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006861 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006862 .Default(false);
6863
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006864 return CPUKnown;
6865 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006866 bool
6867 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6868 StringRef CPU,
6869 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006870 if (CPU == "zEC12")
6871 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006872 if (CPU == "z13") {
6873 Features["transactional-execution"] = true;
6874 Features["vector"] = true;
6875 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006876 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006877 }
6878
6879 bool handleTargetFeatures(std::vector<std::string> &Features,
6880 DiagnosticsEngine &Diags) override {
6881 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006882 for (const auto &Feature : Features) {
6883 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006884 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006885 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006886 HasVector = true;
6887 }
6888 // If we use the vector ABI, vector types are 64-bit aligned.
6889 if (HasVector) {
6890 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006891 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6892 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006893 }
6894 return true;
6895 }
6896
6897 bool hasFeature(StringRef Feature) const override {
6898 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006899 .Case("systemz", true)
6900 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006901 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006902 .Default(false);
6903 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006904
Bryan Chane3f1ed52016-04-28 13:56:43 +00006905 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6906 switch (CC) {
6907 case CC_C:
6908 case CC_Swift:
6909 return CCCR_OK;
6910 default:
6911 return CCCR_Warning;
6912 }
6913 }
6914
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006915 StringRef getABI() const override {
6916 if (HasVector)
6917 return "vector";
6918 return "";
6919 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006920
6921 bool useFloat128ManglingForLongDouble() const override {
6922 return true;
6923 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006924};
6925
6926const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6927#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006928 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006929#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6930 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006931#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006932};
6933
6934const char *const SystemZTargetInfo::GCCRegNames[] = {
6935 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6936 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6937 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6938 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6939};
6940
Craig Topperf054e3a2015-10-19 03:52:27 +00006941ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6942 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006943}
6944
6945bool SystemZTargetInfo::
6946validateAsmConstraint(const char *&Name,
6947 TargetInfo::ConstraintInfo &Info) const {
6948 switch (*Name) {
6949 default:
6950 return false;
6951
6952 case 'a': // Address register
6953 case 'd': // Data register (equivalent to 'r')
6954 case 'f': // Floating-point register
6955 Info.setAllowsRegister();
6956 return true;
6957
6958 case 'I': // Unsigned 8-bit constant
6959 case 'J': // Unsigned 12-bit constant
6960 case 'K': // Signed 16-bit constant
6961 case 'L': // Signed 20-bit displacement (on all targets we support)
6962 case 'M': // 0x7fffffff
6963 return true;
6964
6965 case 'Q': // Memory with base and unsigned 12-bit displacement
6966 case 'R': // Likewise, plus an index
6967 case 'S': // Memory with base and signed 20-bit displacement
6968 case 'T': // Likewise, plus an index
6969 Info.setAllowsMemory();
6970 return true;
6971 }
6972}
Ulrich Weigand47445072013-05-06 16:26:41 +00006973
Eric Christopherc48497a2015-09-18 21:26:24 +00006974class MSP430TargetInfo : public TargetInfo {
6975 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006976
Eric Christopherc48497a2015-09-18 21:26:24 +00006977public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006978 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6979 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006980 TLSSupported = false;
6981 IntWidth = 16;
6982 IntAlign = 16;
6983 LongWidth = 32;
6984 LongLongWidth = 64;
6985 LongAlign = LongLongAlign = 16;
6986 PointerWidth = 16;
6987 PointerAlign = 16;
6988 SuitableAlign = 16;
6989 SizeType = UnsignedInt;
6990 IntMaxType = SignedLongLong;
6991 IntPtrType = SignedInt;
6992 PtrDiffType = SignedInt;
6993 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006994 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006995 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006996 void getTargetDefines(const LangOptions &Opts,
6997 MacroBuilder &Builder) const override {
6998 Builder.defineMacro("MSP430");
6999 Builder.defineMacro("__MSP430__");
7000 // FIXME: defines for different 'flavours' of MCU
7001 }
Craig Topper6c03a542015-10-19 04:51:35 +00007002 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007003 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007004 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007005 }
7006 bool hasFeature(StringRef Feature) const override {
7007 return Feature == "msp430";
7008 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007009 ArrayRef<const char *> getGCCRegNames() const override;
7010 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007011 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007012 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007013 }
7014 bool validateAsmConstraint(const char *&Name,
7015 TargetInfo::ConstraintInfo &info) const override {
7016 // FIXME: implement
7017 switch (*Name) {
7018 case 'K': // the constant 1
7019 case 'L': // constant -1^20 .. 1^19
7020 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007021 return true;
7022 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007023 // No target constraints for now.
7024 return false;
7025 }
7026 const char *getClobbers() const override {
7027 // FIXME: Is this really right?
7028 return "";
7029 }
7030 BuiltinVaListKind getBuiltinVaListKind() const override {
7031 // FIXME: implement
7032 return TargetInfo::CharPtrBuiltinVaList;
7033 }
7034};
7035
7036const char *const MSP430TargetInfo::GCCRegNames[] = {
7037 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7038 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7039
Craig Topperf054e3a2015-10-19 03:52:27 +00007040ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7041 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007042}
7043
7044// LLVM and Clang cannot be used directly to output native binaries for
7045// target, but is used to compile C code to llvm bitcode with correct
7046// type and alignment information.
7047//
7048// TCE uses the llvm bitcode as input and uses it for generating customized
7049// target processor and program binary. TCE co-design environment is
7050// publicly available in http://tce.cs.tut.fi
7051
7052static const unsigned TCEOpenCLAddrSpaceMap[] = {
7053 3, // opencl_global
7054 4, // opencl_local
7055 5, // opencl_constant
7056 // FIXME: generic has to be added to the target
7057 0, // opencl_generic
7058 0, // cuda_device
7059 0, // cuda_constant
7060 0 // cuda_shared
7061};
7062
7063class TCETargetInfo : public TargetInfo {
7064public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007065 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7066 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007067 TLSSupported = false;
7068 IntWidth = 32;
7069 LongWidth = LongLongWidth = 32;
7070 PointerWidth = 32;
7071 IntAlign = 32;
7072 LongAlign = LongLongAlign = 32;
7073 PointerAlign = 32;
7074 SuitableAlign = 32;
7075 SizeType = UnsignedInt;
7076 IntMaxType = SignedLong;
7077 IntPtrType = SignedInt;
7078 PtrDiffType = SignedInt;
7079 FloatWidth = 32;
7080 FloatAlign = 32;
7081 DoubleWidth = 32;
7082 DoubleAlign = 32;
7083 LongDoubleWidth = 32;
7084 LongDoubleAlign = 32;
7085 FloatFormat = &llvm::APFloat::IEEEsingle;
7086 DoubleFormat = &llvm::APFloat::IEEEsingle;
7087 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007088 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7089 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007090 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7091 UseAddrSpaceMapMangling = true;
7092 }
7093
7094 void getTargetDefines(const LangOptions &Opts,
7095 MacroBuilder &Builder) const override {
7096 DefineStd(Builder, "tce", Opts);
7097 Builder.defineMacro("__TCE__");
7098 Builder.defineMacro("__TCE_V1__");
7099 }
7100 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7101
Craig Topper6c03a542015-10-19 04:51:35 +00007102 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007103 const char *getClobbers() const override { return ""; }
7104 BuiltinVaListKind getBuiltinVaListKind() const override {
7105 return TargetInfo::VoidPtrBuiltinVaList;
7106 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007107 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007108 bool validateAsmConstraint(const char *&Name,
7109 TargetInfo::ConstraintInfo &info) const override {
7110 return true;
7111 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007112 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7113 return None;
7114 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007115};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007116
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007117class BPFTargetInfo : public TargetInfo {
7118public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007119 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7120 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007121 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7122 SizeType = UnsignedLong;
7123 PtrDiffType = SignedLong;
7124 IntPtrType = SignedLong;
7125 IntMaxType = SignedLong;
7126 Int64Type = SignedLong;
7127 RegParmMax = 5;
7128 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007129 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007130 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007131 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007132 }
7133 MaxAtomicPromoteWidth = 64;
7134 MaxAtomicInlineWidth = 64;
7135 TLSSupported = false;
7136 }
7137 void getTargetDefines(const LangOptions &Opts,
7138 MacroBuilder &Builder) const override {
7139 DefineStd(Builder, "bpf", Opts);
7140 Builder.defineMacro("__BPF__");
7141 }
7142 bool hasFeature(StringRef Feature) const override {
7143 return Feature == "bpf";
7144 }
7145
Craig Topper6c03a542015-10-19 04:51:35 +00007146 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007147 const char *getClobbers() const override {
7148 return "";
7149 }
7150 BuiltinVaListKind getBuiltinVaListKind() const override {
7151 return TargetInfo::VoidPtrBuiltinVaList;
7152 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007153 ArrayRef<const char *> getGCCRegNames() const override {
7154 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007155 }
7156 bool validateAsmConstraint(const char *&Name,
7157 TargetInfo::ConstraintInfo &info) const override {
7158 return true;
7159 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007160 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7161 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007162 }
7163};
7164
Daniel Sanders4672af62016-05-27 11:51:02 +00007165class MipsTargetInfo : public TargetInfo {
7166 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007167 StringRef Layout;
7168
7169 if (ABI == "o32")
7170 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7171 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007172 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007173 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007174 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007175 else
7176 llvm_unreachable("Invalid ABI");
7177
7178 if (BigEndian)
7179 resetDataLayout(("E-" + Layout).str());
7180 else
7181 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007182 }
7183
Akira Hatanaka9064e362013-10-29 18:30:33 +00007184
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007185 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007186 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007187 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007188 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007189 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007190 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007191 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007192 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007193 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007194 enum DspRevEnum {
7195 NoDSP, DSP1, DSP2
7196 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007197 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007198
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007199protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007200 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007201 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007202
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007203public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007204 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007205 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7206 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7207 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007208 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007209
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007210 setABI((getTriple().getArch() == llvm::Triple::mips ||
7211 getTriple().getArch() == llvm::Triple::mipsel)
7212 ? "o32"
7213 : "n64");
7214
7215 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007216 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007217
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007218 bool isNaN2008Default() const {
7219 return CPU == "mips32r6" || CPU == "mips64r6";
7220 }
7221
7222 bool isFP64Default() const {
7223 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7224 }
7225
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007226 bool isNan2008() const override {
7227 return IsNan2008;
7228 }
7229
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007230 bool processorSupportsGPR64() const {
7231 return llvm::StringSwitch<bool>(CPU)
7232 .Case("mips3", true)
7233 .Case("mips4", true)
7234 .Case("mips5", true)
7235 .Case("mips64", true)
7236 .Case("mips64r2", true)
7237 .Case("mips64r3", true)
7238 .Case("mips64r5", true)
7239 .Case("mips64r6", true)
7240 .Case("octeon", true)
7241 .Default(false);
7242 return false;
7243 }
7244
Alp Toker4925ba72014-06-07 23:30:42 +00007245 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007246 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007247 if (Name == "o32") {
7248 setO32ABITypes();
7249 ABI = Name;
7250 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007251 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007252
7253 if (Name == "n32") {
7254 setN32ABITypes();
7255 ABI = Name;
7256 return true;
7257 }
7258 if (Name == "n64") {
7259 setN64ABITypes();
7260 ABI = Name;
7261 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007262 }
7263 return false;
7264 }
7265
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007266 void setO32ABITypes() {
7267 Int64Type = SignedLongLong;
7268 IntMaxType = Int64Type;
7269 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7270 LongDoubleWidth = LongDoubleAlign = 64;
7271 LongWidth = LongAlign = 32;
7272 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7273 PointerWidth = PointerAlign = 32;
7274 PtrDiffType = SignedInt;
7275 SizeType = UnsignedInt;
7276 SuitableAlign = 64;
7277 }
7278
7279 void setN32N64ABITypes() {
7280 LongDoubleWidth = LongDoubleAlign = 128;
7281 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7282 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7283 LongDoubleWidth = LongDoubleAlign = 64;
7284 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7285 }
7286 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7287 SuitableAlign = 128;
7288 }
7289
Daniel Sanders4672af62016-05-27 11:51:02 +00007290 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007291 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007292 Int64Type = SignedLong;
7293 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007294 LongWidth = LongAlign = 64;
7295 PointerWidth = PointerAlign = 64;
7296 PtrDiffType = SignedLong;
7297 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007298 }
7299
7300 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007301 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007302 Int64Type = SignedLongLong;
7303 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007304 LongWidth = LongAlign = 32;
7305 PointerWidth = PointerAlign = 32;
7306 PtrDiffType = SignedInt;
7307 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007308 }
7309
Craig Topper3164f332014-03-11 03:39:26 +00007310 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007311 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007312 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007313 .Case("mips1", true)
7314 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007315 .Case("mips3", true)
7316 .Case("mips4", true)
7317 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007318 .Case("mips32", true)
7319 .Case("mips32r2", true)
7320 .Case("mips32r3", true)
7321 .Case("mips32r5", true)
7322 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007323 .Case("mips64", true)
7324 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007325 .Case("mips64r3", true)
7326 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007327 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007328 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007329 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007330 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007331 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007332 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007333 bool
7334 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7335 StringRef CPU,
7336 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007337 if (CPU.empty())
7338 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007339 if (CPU == "octeon")
7340 Features["mips64r2"] = Features["cnmips"] = true;
7341 else
7342 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007343 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007344 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007345
Craig Topper3164f332014-03-11 03:39:26 +00007346 void getTargetDefines(const LangOptions &Opts,
7347 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007348 if (BigEndian) {
7349 DefineStd(Builder, "MIPSEB", Opts);
7350 Builder.defineMacro("_MIPSEB");
7351 } else {
7352 DefineStd(Builder, "MIPSEL", Opts);
7353 Builder.defineMacro("_MIPSEL");
7354 }
7355
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007356 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007357 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007358 if (Opts.GNUMode)
7359 Builder.defineMacro("mips");
7360
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007361 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007362 Builder.defineMacro("__mips", "32");
7363 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7364 } else {
7365 Builder.defineMacro("__mips", "64");
7366 Builder.defineMacro("__mips64");
7367 Builder.defineMacro("__mips64__");
7368 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7369 }
7370
7371 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7372 .Cases("mips32", "mips64", "1")
7373 .Cases("mips32r2", "mips64r2", "2")
7374 .Cases("mips32r3", "mips64r3", "3")
7375 .Cases("mips32r5", "mips64r5", "5")
7376 .Cases("mips32r6", "mips64r6", "6")
7377 .Default("");
7378 if (!ISARev.empty())
7379 Builder.defineMacro("__mips_isa_rev", ISARev);
7380
7381 if (ABI == "o32") {
7382 Builder.defineMacro("__mips_o32");
7383 Builder.defineMacro("_ABIO32", "1");
7384 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007385 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007386 Builder.defineMacro("__mips_n32");
7387 Builder.defineMacro("_ABIN32", "2");
7388 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7389 } else if (ABI == "n64") {
7390 Builder.defineMacro("__mips_n64");
7391 Builder.defineMacro("_ABI64", "3");
7392 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7393 } else
7394 llvm_unreachable("Invalid ABI.");
7395
Simon Atanasyan683535b2012-08-29 19:14:58 +00007396 Builder.defineMacro("__REGISTER_PREFIX__", "");
7397
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007398 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007399 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007400 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007401 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007402 case SoftFloat:
7403 Builder.defineMacro("__mips_soft_float", Twine(1));
7404 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007405 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007406
Simon Atanasyan16071912013-04-14 14:07:30 +00007407 if (IsSingleFloat)
7408 Builder.defineMacro("__mips_single_float", Twine(1));
7409
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007410 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7411 Builder.defineMacro("_MIPS_FPSET",
7412 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7413
Simon Atanasyan72244b62012-07-05 16:06:06 +00007414 if (IsMips16)
7415 Builder.defineMacro("__mips16", Twine(1));
7416
Simon Atanasyan60777612013-04-14 14:07:51 +00007417 if (IsMicromips)
7418 Builder.defineMacro("__mips_micromips", Twine(1));
7419
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007420 if (IsNan2008)
7421 Builder.defineMacro("__mips_nan2008", Twine(1));
7422
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007423 switch (DspRev) {
7424 default:
7425 break;
7426 case DSP1:
7427 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7428 Builder.defineMacro("__mips_dsp", Twine(1));
7429 break;
7430 case DSP2:
7431 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7432 Builder.defineMacro("__mips_dspr2", Twine(1));
7433 Builder.defineMacro("__mips_dsp", Twine(1));
7434 break;
7435 }
7436
Jack Carter44ff1e52013-08-12 17:20:29 +00007437 if (HasMSA)
7438 Builder.defineMacro("__mips_msa", Twine(1));
7439
Simon Atanasyan26f19672012-04-05 19:28:31 +00007440 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7441 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7442 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007443
7444 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7445 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007446
7447 // These shouldn't be defined for MIPS-I but there's no need to check
7448 // for that since MIPS-I isn't supported.
7449 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7450 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7451 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007452
7453 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7454 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7455 // the instructions exist but using them violates the ABI since they
7456 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7457 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007458 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007459 }
7460
Craig Topper6c03a542015-10-19 04:51:35 +00007461 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7462 return llvm::makeArrayRef(BuiltinInfo,
7463 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007464 }
Craig Topper3164f332014-03-11 03:39:26 +00007465 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007466 return llvm::StringSwitch<bool>(Feature)
7467 .Case("mips", true)
7468 .Case("fp64", HasFP64)
7469 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007470 }
Craig Topper3164f332014-03-11 03:39:26 +00007471 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007472 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007473 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007474 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007475 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007476 // CPU register names
7477 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007478 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7479 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7480 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007481 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7482 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007483 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7484 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7485 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7486 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007487 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007488 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007489 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7490 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007491 // MSA register names
7492 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7493 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7494 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7495 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7496 // MSA control register names
7497 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7498 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007499 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007500 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007501 }
Craig Topper3164f332014-03-11 03:39:26 +00007502 bool validateAsmConstraint(const char *&Name,
7503 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007504 switch (*Name) {
7505 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007506 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007507 case 'r': // CPU registers.
7508 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007509 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007510 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007511 case 'c': // $25 for indirect jumps
7512 case 'l': // lo register
7513 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007514 Info.setAllowsRegister();
7515 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007516 case 'I': // Signed 16-bit constant
7517 case 'J': // Integer 0
7518 case 'K': // Unsigned 16-bit constant
7519 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7520 case 'M': // Constants not loadable via lui, addiu, or ori
7521 case 'N': // Constant -1 to -65535
7522 case 'O': // A signed 15-bit constant
7523 case 'P': // A constant between 1 go 65535
7524 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007525 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007526 Info.setAllowsMemory();
7527 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007528 case 'Z':
7529 if (Name[1] == 'C') { // An address usable by ll, and sc.
7530 Info.setAllowsMemory();
7531 Name++; // Skip over 'Z'.
7532 return true;
7533 }
7534 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007535 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007536 }
7537
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007538 std::string convertConstraint(const char *&Constraint) const override {
7539 std::string R;
7540 switch (*Constraint) {
7541 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7542 if (Constraint[1] == 'C') {
7543 R = std::string("^") + std::string(Constraint, 2);
7544 Constraint++;
7545 return R;
7546 }
7547 break;
7548 }
7549 return TargetInfo::convertConstraint(Constraint);
7550 }
7551
Craig Topper3164f332014-03-11 03:39:26 +00007552 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007553 // In GCC, $1 is not widely used in generated code (it's used only in a few
7554 // specific situations), so there is no real need for users to add it to
7555 // the clobbers list if they want to use it in their inline assembly code.
7556 //
7557 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7558 // code generation, so using it in inline assembly without adding it to the
7559 // clobbers list can cause conflicts between the inline assembly code and
7560 // the surrounding generated code.
7561 //
7562 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7563 // operands, which will conflict with the ".set at" assembler option (which
7564 // we use only for inline assembly, in order to maintain compatibility with
7565 // GCC) and will also conflict with the user's usage of $1.
7566 //
7567 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7568 // register for generated code is to automatically clobber $1 for all inline
7569 // assembly code.
7570 //
7571 // FIXME: We should automatically clobber $1 only for inline assembly code
7572 // which actually uses it. This would allow LLVM to use $1 for inline
7573 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007574 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007575 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007576
Craig Topper3164f332014-03-11 03:39:26 +00007577 bool handleTargetFeatures(std::vector<std::string> &Features,
7578 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007579 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007580 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007581 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007582 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007583 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007584 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007585 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007586
Eric Christopher610fe112015-08-26 08:21:55 +00007587 for (const auto &Feature : Features) {
7588 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007589 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007590 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007591 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007592 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007593 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007594 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007595 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007596 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007597 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007598 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007599 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007600 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007601 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007602 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007603 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007604 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007605 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007606 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007607 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007608 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007609 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007610 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007611
James Y Knightb214cbc2016-03-04 19:00:41 +00007612 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007613
Rafael Espindolaeb265472013-08-21 21:59:03 +00007614 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007615 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007616
Craig Topper3164f332014-03-11 03:39:26 +00007617 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007618 if (RegNo == 0) return 4;
7619 if (RegNo == 1) return 5;
7620 return -1;
7621 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007622
7623 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007624
7625 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7626 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7627 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7628 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7629 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7630 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7631 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7632 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7633 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7634 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7635 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7636 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7637 {{"ra"}, "$31"}};
7638 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7639 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7640 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7641 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7642 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7643 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7644 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7645 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7646 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7647 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7648 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7649 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007650 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007651 return llvm::makeArrayRef(O32RegAliases);
7652 return llvm::makeArrayRef(NewABIRegAliases);
7653 }
7654
7655 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007656 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007657 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007658
7659 bool validateTarget(DiagnosticsEngine &Diags) const override {
7660 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7661 // this yet. It's better to fail here than on the backend assertion.
7662 if (processorSupportsGPR64() && ABI == "o32") {
7663 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7664 return false;
7665 }
7666
7667 // 64-bit ABI's require 64-bit CPU's.
7668 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7669 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7670 return false;
7671 }
7672
7673 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7674 // can't handle this yet. It's better to fail here than on the
7675 // backend assertion.
7676 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7677 getTriple().getArch() == llvm::Triple::mips64el) &&
7678 ABI == "o32") {
7679 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7680 << ABI << getTriple().str();
7681 return false;
7682 }
7683
7684 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7685 // can't handle this yet. It's better to fail here than on the
7686 // backend assertion.
7687 if ((getTriple().getArch() == llvm::Triple::mips ||
7688 getTriple().getArch() == llvm::Triple::mipsel) &&
7689 (ABI == "n32" || ABI == "n64")) {
7690 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7691 << ABI << getTriple().str();
7692 return false;
7693 }
7694
7695 return true;
7696 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007697};
7698
Daniel Sanders4672af62016-05-27 11:51:02 +00007699const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007700#define BUILTIN(ID, TYPE, ATTRS) \
7701 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7702#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7703 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007704#include "clang/Basic/BuiltinsMips.def"
7705};
7706
Ivan Krasindd7403e2011-08-24 20:22:22 +00007707class PNaClTargetInfo : public TargetInfo {
7708public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007709 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7710 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007711 this->LongAlign = 32;
7712 this->LongWidth = 32;
7713 this->PointerAlign = 32;
7714 this->PointerWidth = 32;
7715 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007716 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007717 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007718 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007719 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007720 this->SizeType = TargetInfo::UnsignedInt;
7721 this->PtrDiffType = TargetInfo::SignedInt;
7722 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007723 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007724 }
7725
Craig Toppere6f17d02014-03-11 04:07:52 +00007726 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007727 Builder.defineMacro("__le32__");
7728 Builder.defineMacro("__pnacl__");
7729 }
Craig Topper3164f332014-03-11 03:39:26 +00007730 void getTargetDefines(const LangOptions &Opts,
7731 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007732 getArchDefines(Opts, Builder);
7733 }
Craig Topper3164f332014-03-11 03:39:26 +00007734 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007735 return Feature == "pnacl";
7736 }
Craig Topper6c03a542015-10-19 04:51:35 +00007737 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007738 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007739 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007740 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007741 ArrayRef<const char *> getGCCRegNames() const override;
7742 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007743 bool validateAsmConstraint(const char *&Name,
7744 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007745 return false;
7746 }
7747
Craig Topper3164f332014-03-11 03:39:26 +00007748 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007749 return "";
7750 }
7751};
7752
Craig Topperf054e3a2015-10-19 03:52:27 +00007753ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7754 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007755}
7756
Craig Topperf054e3a2015-10-19 03:52:27 +00007757ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7758 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007759}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007760
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007761// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007762class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007763public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007764 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7765 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007766
7767 BuiltinVaListKind getBuiltinVaListKind() const override {
7768 return TargetInfo::PNaClABIBuiltinVaList;
7769 }
7770};
7771
JF Bastien643817d2014-09-12 17:52:47 +00007772class Le64TargetInfo : public TargetInfo {
7773 static const Builtin::Info BuiltinInfo[];
7774
7775public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007776 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7777 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007778 NoAsmVariants = true;
7779 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7780 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007781 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007782 }
7783
7784 void getTargetDefines(const LangOptions &Opts,
7785 MacroBuilder &Builder) const override {
7786 DefineStd(Builder, "unix", Opts);
7787 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7788 Builder.defineMacro("__ELF__");
7789 }
Craig Topper6c03a542015-10-19 04:51:35 +00007790 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7791 return llvm::makeArrayRef(BuiltinInfo,
7792 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007793 }
7794 BuiltinVaListKind getBuiltinVaListKind() const override {
7795 return TargetInfo::PNaClABIBuiltinVaList;
7796 }
7797 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007798 ArrayRef<const char *> getGCCRegNames() const override {
7799 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007800 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007801 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7802 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007803 }
7804 bool validateAsmConstraint(const char *&Name,
7805 TargetInfo::ConstraintInfo &Info) const override {
7806 return false;
7807 }
7808
7809 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007810};
Dan Gohmanc2853072015-09-03 22:51:53 +00007811
7812class WebAssemblyTargetInfo : public TargetInfo {
7813 static const Builtin::Info BuiltinInfo[];
7814
7815 enum SIMDEnum {
7816 NoSIMD,
7817 SIMD128,
7818 } SIMDLevel;
7819
7820public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007821 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007822 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007823 NoAsmVariants = true;
7824 SuitableAlign = 128;
7825 LargeArrayMinWidth = 128;
7826 LargeArrayAlign = 128;
7827 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007828 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007829 LongDoubleWidth = LongDoubleAlign = 128;
7830 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007831 SizeType = UnsignedInt;
7832 PtrDiffType = SignedInt;
7833 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007834 }
7835
7836protected:
7837 void getTargetDefines(const LangOptions &Opts,
7838 MacroBuilder &Builder) const override {
7839 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7840 if (SIMDLevel >= SIMD128)
7841 Builder.defineMacro("__wasm_simd128__");
7842 }
7843
7844private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007845 bool
7846 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7847 StringRef CPU,
7848 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007849 if (CPU == "bleeding-edge")
7850 Features["simd128"] = true;
7851 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7852 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007853 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007854 return llvm::StringSwitch<bool>(Feature)
7855 .Case("simd128", SIMDLevel >= SIMD128)
7856 .Default(false);
7857 }
7858 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007859 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007860 for (const auto &Feature : Features) {
7861 if (Feature == "+simd128") {
7862 SIMDLevel = std::max(SIMDLevel, SIMD128);
7863 continue;
7864 }
7865 if (Feature == "-simd128") {
7866 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7867 continue;
7868 }
7869
7870 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7871 << "-target-feature";
7872 return false;
7873 }
7874 return true;
7875 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007876 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007877 return llvm::StringSwitch<bool>(Name)
7878 .Case("mvp", true)
7879 .Case("bleeding-edge", true)
7880 .Case("generic", true)
7881 .Default(false);
7882 }
Craig Topper6c03a542015-10-19 04:51:35 +00007883 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7884 return llvm::makeArrayRef(BuiltinInfo,
7885 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007886 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007887 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007888 return VoidPtrBuiltinVaList;
7889 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007890 ArrayRef<const char *> getGCCRegNames() const final {
7891 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007892 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007893 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7894 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007895 }
7896 bool
7897 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007898 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007899 return false;
7900 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007901 const char *getClobbers() const final { return ""; }
7902 bool isCLZForZeroUndef() const final { return false; }
7903 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007904 IntType getIntTypeByWidth(unsigned BitWidth,
7905 bool IsSigned) const final {
7906 // WebAssembly prefers long long for explicitly 64-bit integers.
7907 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7908 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7909 }
7910 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7911 bool IsSigned) const final {
7912 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7913 return BitWidth == 64
7914 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7915 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7916 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007917};
7918
7919const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7920#define BUILTIN(ID, TYPE, ATTRS) \
7921 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7922#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7923 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7924#include "clang/Basic/BuiltinsWebAssembly.def"
7925};
7926
7927class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7928public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007929 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7930 const TargetOptions &Opts)
7931 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007932 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007933 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007934 }
7935
7936protected:
7937 void getTargetDefines(const LangOptions &Opts,
7938 MacroBuilder &Builder) const override {
7939 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7940 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7941 }
7942};
7943
7944class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7945public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007946 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7947 const TargetOptions &Opts)
7948 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007949 LongAlign = LongWidth = 64;
7950 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007951 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007952 SizeType = UnsignedLong;
7953 PtrDiffType = SignedLong;
7954 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007955 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007956 }
7957
7958protected:
7959 void getTargetDefines(const LangOptions &Opts,
7960 MacroBuilder &Builder) const override {
7961 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7962 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7963 }
7964};
7965
JF Bastien643817d2014-09-12 17:52:47 +00007966const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7967#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007968 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007969#include "clang/Basic/BuiltinsLe64.def"
7970};
7971
Eric Christopherc48497a2015-09-18 21:26:24 +00007972static const unsigned SPIRAddrSpaceMap[] = {
7973 1, // opencl_global
7974 3, // opencl_local
7975 2, // opencl_constant
7976 4, // opencl_generic
7977 0, // cuda_device
7978 0, // cuda_constant
7979 0 // cuda_shared
7980};
7981class SPIRTargetInfo : public TargetInfo {
7982public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007983 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7984 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007985 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7986 "SPIR target must use unknown OS");
7987 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7988 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00007989 TLSSupported = false;
7990 LongWidth = LongAlign = 64;
7991 AddrSpaceMap = &SPIRAddrSpaceMap;
7992 UseAddrSpaceMapMangling = true;
7993 // Define available target features
7994 // These must be defined in sorted order!
7995 NoAsmVariants = true;
7996 }
7997 void getTargetDefines(const LangOptions &Opts,
7998 MacroBuilder &Builder) const override {
7999 DefineStd(Builder, "SPIR", Opts);
8000 }
8001 bool hasFeature(StringRef Feature) const override {
8002 return Feature == "spir";
8003 }
Craig Topper3164f332014-03-11 03:39:26 +00008004
Craig Topper6c03a542015-10-19 04:51:35 +00008005 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008006 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008007 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008008 bool validateAsmConstraint(const char *&Name,
8009 TargetInfo::ConstraintInfo &info) const override {
8010 return true;
8011 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008012 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8013 return None;
8014 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008015 BuiltinVaListKind getBuiltinVaListKind() const override {
8016 return TargetInfo::VoidPtrBuiltinVaList;
8017 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008018
Eric Christopherc48497a2015-09-18 21:26:24 +00008019 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008020 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8021 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008022 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008023
Eric Christopherc48497a2015-09-18 21:26:24 +00008024 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8025 return CC_SpirFunction;
8026 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008027
8028 void setSupportedOpenCLOpts() override {
8029 // Assume all OpenCL extensions and optional core features are supported
8030 // for SPIR since it is a generic target.
8031 getSupportedOpenCLOpts().setAll();
8032 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008033};
Guy Benyeib798fc92012-12-11 21:38:14 +00008034
Eric Christopherc48497a2015-09-18 21:26:24 +00008035class SPIR32TargetInfo : public SPIRTargetInfo {
8036public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008037 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8038 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008039 PointerWidth = PointerAlign = 32;
8040 SizeType = TargetInfo::UnsignedInt;
8041 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008042 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8043 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008044 }
8045 void getTargetDefines(const LangOptions &Opts,
8046 MacroBuilder &Builder) const override {
8047 DefineStd(Builder, "SPIR32", Opts);
8048 }
8049};
Guy Benyeib798fc92012-12-11 21:38:14 +00008050
Eric Christopherc48497a2015-09-18 21:26:24 +00008051class SPIR64TargetInfo : public SPIRTargetInfo {
8052public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008053 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8054 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008055 PointerWidth = PointerAlign = 64;
8056 SizeType = TargetInfo::UnsignedLong;
8057 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008058 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8059 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008060 }
8061 void getTargetDefines(const LangOptions &Opts,
8062 MacroBuilder &Builder) const override {
8063 DefineStd(Builder, "SPIR64", Opts);
8064 }
8065};
Guy Benyeib798fc92012-12-11 21:38:14 +00008066
Robert Lytton0e076492013-08-13 09:43:10 +00008067class XCoreTargetInfo : public TargetInfo {
8068 static const Builtin::Info BuiltinInfo[];
8069public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008070 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8071 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008072 NoAsmVariants = true;
8073 LongLongAlign = 32;
8074 SuitableAlign = 32;
8075 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008076 SizeType = UnsignedInt;
8077 PtrDiffType = SignedInt;
8078 IntPtrType = SignedInt;
8079 WCharType = UnsignedChar;
8080 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008081 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008082 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8083 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008084 }
Craig Topper3164f332014-03-11 03:39:26 +00008085 void getTargetDefines(const LangOptions &Opts,
8086 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008087 Builder.defineMacro("__XS1B__");
8088 }
Craig Topper6c03a542015-10-19 04:51:35 +00008089 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8090 return llvm::makeArrayRef(BuiltinInfo,
8091 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008092 }
Craig Topper3164f332014-03-11 03:39:26 +00008093 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008094 return TargetInfo::VoidPtrBuiltinVaList;
8095 }
Craig Topper3164f332014-03-11 03:39:26 +00008096 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008097 return "";
8098 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008099 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008100 static const char * const GCCRegNames[] = {
8101 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8102 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8103 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008104 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008105 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008106 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8107 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008108 }
Craig Topper3164f332014-03-11 03:39:26 +00008109 bool validateAsmConstraint(const char *&Name,
8110 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008111 return false;
8112 }
Craig Topper3164f332014-03-11 03:39:26 +00008113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008114 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8115 return (RegNo < 2)? RegNo : -1;
8116 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008117 bool allowsLargerPreferedTypeAlignment() const override {
8118 return false;
8119 }
Robert Lytton0e076492013-08-13 09:43:10 +00008120};
8121
8122const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008123#define BUILTIN(ID, TYPE, ATTRS) \
8124 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8125#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8126 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008127#include "clang/Basic/BuiltinsXCore.def"
8128};
Robert Lytton0e076492013-08-13 09:43:10 +00008129
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008130// x86_32 Android target
8131class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8132public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008133 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8134 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008135 SuitableAlign = 32;
8136 LongDoubleWidth = 64;
8137 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8138 }
8139};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008140
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008141// x86_64 Android target
8142class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8143public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8145 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008146 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8147 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008148
8149 bool useFloat128ManglingForLongDouble() const override {
8150 return true;
8151 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008152};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008153
8154// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8155class RenderScript32TargetInfo : public ARMleTargetInfo {
8156public:
8157 RenderScript32TargetInfo(const llvm::Triple &Triple,
8158 const TargetOptions &Opts)
8159 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8160 Triple.getOSName(),
8161 Triple.getEnvironmentName()),
8162 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008163 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008164 LongWidth = LongAlign = 64;
8165 }
8166 void getTargetDefines(const LangOptions &Opts,
8167 MacroBuilder &Builder) const override {
8168 Builder.defineMacro("__RENDERSCRIPT__");
8169 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8170 }
8171};
8172
8173// 64-bit RenderScript is aarch64
8174class RenderScript64TargetInfo : public AArch64leTargetInfo {
8175public:
8176 RenderScript64TargetInfo(const llvm::Triple &Triple,
8177 const TargetOptions &Opts)
8178 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8179 Triple.getOSName(),
8180 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008181 Opts) {
8182 IsRenderScriptTarget = true;
8183 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008184
8185 void getTargetDefines(const LangOptions &Opts,
8186 MacroBuilder &Builder) const override {
8187 Builder.defineMacro("__RENDERSCRIPT__");
8188 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8189 }
8190};
8191
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008192} // end anonymous namespace
8193
Chris Lattner5ba61f02006-10-14 07:39:34 +00008194//===----------------------------------------------------------------------===//
8195// Driver code
8196//===----------------------------------------------------------------------===//
8197
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008198static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8199 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008200 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008201
Daniel Dunbar52322032009-08-18 05:47:58 +00008202 switch (Triple.getArch()) {
8203 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008204 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008205
Tim Northover2a0783d2014-05-30 14:14:07 +00008206 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008207 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008208
8209 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008210 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008211
Jacques Pienaard964cc22016-03-28 21:02:54 +00008212 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008213 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008214
Tim Northover2a0783d2014-05-30 14:14:07 +00008215 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008216 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008218
8219 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008220 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008222 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008224 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008226 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008228 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008230 }
8231
Christian Pirker9b019ae2014-02-25 13:51:00 +00008232 case llvm::Triple::aarch64_be:
8233 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008234 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008236 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008238 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008240 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008242 }
8243
Daniel Dunbar52322032009-08-18 05:47:58 +00008244 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008245 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008246 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008248
Daniel Dunbar52322032009-08-18 05:47:58 +00008249 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008250 case llvm::Triple::CloudABI:
8251 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008252 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008254 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008256 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008258 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008260 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008262 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008264 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008266 case llvm::Triple::Win32:
8267 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008268 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008270 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008272 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008274 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008275 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008276 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008277 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008278 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008280 }
8281
8282 case llvm::Triple::armeb:
8283 case llvm::Triple::thumbeb:
8284 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008286
8287 switch (os) {
8288 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008290 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008292 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008294 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008296 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008298 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008300 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008302 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008304 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008305
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008306 case llvm::Triple::bpfeb:
8307 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008308 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008309
Daniel Dunbar52322032009-08-18 05:47:58 +00008310 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008312
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008313 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008314 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008315 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008316 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008317 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008318 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008319 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008320 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008321 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008322 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008323 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008324 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008325 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008326
8327 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008328 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008329 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008330 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008331 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008332 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008333 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008334 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008335 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008336 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008337 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008338 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008339 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008340 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008341 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008342
Akira Hatanakabef17452011-09-20 19:21:49 +00008343 case llvm::Triple::mips64:
8344 switch (os) {
8345 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008346 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008347 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008348 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008349 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008350 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008351 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008352 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008353 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008354 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008355 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008356 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008357 }
8358
8359 case llvm::Triple::mips64el:
8360 switch (os) {
8361 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008362 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008363 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008364 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008365 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008366 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008367 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008369 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008371 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008372 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008373 }
8374
Ivan Krasindd7403e2011-08-24 20:22:22 +00008375 case llvm::Triple::le32:
8376 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008377 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008378 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008379 default:
8380 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008381 }
8382
JF Bastien643817d2014-09-12 17:52:47 +00008383 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008384 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008385
Daniel Dunbar52322032009-08-18 05:47:58 +00008386 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008387 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008388 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008389 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008390 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008392 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008394 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008396 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008398 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008400 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008402 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008403
8404 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008405 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008406 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008407 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008408 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008410 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008412 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008414 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008416 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008418 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008419
Bill Schmidt778d3872013-07-26 01:36:11 +00008420 case llvm::Triple::ppc64le:
8421 switch (os) {
8422 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008424 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008426 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008428 }
8429
Peter Collingbournec947aae2012-05-20 23:28:41 +00008430 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008431 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008432 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008434
Tom Stellardd8e38a32015-01-06 20:34:47 +00008435 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008436 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008438
Daniel Dunbar52322032009-08-18 05:47:58 +00008439 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008440 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008441 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008442 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008443 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008445 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008447 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008449 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008451 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008453 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008454
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008455 // The 'sparcel' architecture copies all the above cases except for Solaris.
8456 case llvm::Triple::sparcel:
8457 switch (os) {
8458 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008460 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008462 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008464 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008466 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008468 }
8469
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008470 case llvm::Triple::sparcv9:
8471 switch (os) {
8472 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008474 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008476 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008478 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008480 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008482 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008484 }
8485
Ulrich Weigand47445072013-05-06 16:26:41 +00008486 case llvm::Triple::systemz:
8487 switch (os) {
8488 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008490 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008492 }
8493
Eli Friedmana9c3d712009-08-19 20:47:07 +00008494 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008495 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008496
Daniel Dunbar52322032009-08-18 05:47:58 +00008497 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008498 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008499 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008500
Daniel Dunbar52322032009-08-18 05:47:58 +00008501 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008502 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008504 case llvm::Triple::Linux: {
8505 switch (Triple.getEnvironment()) {
8506 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008508 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008510 }
8511 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008512 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008514 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008516 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008518 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008520 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008522 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008524 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008526 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008528 case llvm::Triple::Win32: {
8529 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008530 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008532 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008534 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008535 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008536 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008538 }
8539 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008540 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008542 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008544 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008546 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008548 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008550 }
8551
8552 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008553 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008554 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008555
Daniel Dunbar52322032009-08-18 05:47:58 +00008556 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008557 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008559 case llvm::Triple::Linux: {
8560 switch (Triple.getEnvironment()) {
8561 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008563 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008564 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008565 }
8566 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008567 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008569 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008571 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008573 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008575 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008577 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008579 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008581 case llvm::Triple::Win32: {
8582 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008583 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008585 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008587 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008588 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008589 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008590 }
8591 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008592 case llvm::Triple::Haiku:
8593 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008594 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008596 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008597 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008598 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008599 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008600 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008601
Douglas Katzman78d7c542015-05-12 21:18:10 +00008602 case llvm::Triple::spir: {
8603 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8604 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8605 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008606 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008607 }
8608 case llvm::Triple::spir64: {
8609 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8610 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8611 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008612 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008613 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008614 case llvm::Triple::wasm32:
8615 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8616 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008617 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008618 case llvm::Triple::wasm64:
8619 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8620 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008621 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008622
8623 case llvm::Triple::renderscript32:
8624 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8625 case llvm::Triple::renderscript64:
8626 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008627 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008628}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008629
8630/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008631/// options.
Alp Toker80758082014-07-06 05:26:44 +00008632TargetInfo *
8633TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008634 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008635 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008636
8637 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008638 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008639 if (!Target) {
8640 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008641 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008642 }
Alp Toker80758082014-07-06 05:26:44 +00008643 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008644
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008645 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008646 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8647 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008648 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008649 }
8650
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008651 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008652 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8653 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008654 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008655 }
8656
Rafael Espindolaeb265472013-08-21 21:59:03 +00008657 // Set the fp math unit.
8658 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8659 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008660 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008661 }
8662
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008663 // Compute the default target features, we need the target to handle this
8664 // because features may have dependencies on one another.
8665 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008666 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8667 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008668 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008669
8670 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008671 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008672 for (const auto &F : Features)
8673 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8674
Eric Christopher3ff21b32013-10-16 21:26:26 +00008675 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008676 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008677
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008678 Target->setSupportedOpenCLOpts();
8679
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008680 if (!Target->validateTarget(Diags))
8681 return nullptr;
8682
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008683 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008684}