blob: e0c1fe483f232ffb1d9be05e7555b9635ba52a5f [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Petr Hosek62e1d232016-10-06 06:08:09 +0000826// Fuchsia Target
827template<typename Target>
828class FuchsiaTargetInfo : public OSTargetInfo<Target> {
829protected:
830 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
831 MacroBuilder &Builder) const override {
832 Builder.defineMacro("__Fuchsia__");
833 Builder.defineMacro("__ELF__");
834 if (Opts.POSIXThreads)
835 Builder.defineMacro("_REENTRANT");
836 // Required by the libc++ locale support.
837 if (Opts.CPlusPlus)
838 Builder.defineMacro("_GNU_SOURCE");
839 }
840public:
841 FuchsiaTargetInfo(const llvm::Triple &Triple,
842 const TargetOptions &Opts)
843 : OSTargetInfo<Target>(Triple, Opts) {
844 this->MCountName = "__mcount";
845 }
846};
847
Dan Gohmanc2853072015-09-03 22:51:53 +0000848// WebAssembly target
849template <typename Target>
850class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
851 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000852 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000853 // A common platform macro.
854 if (Opts.POSIXThreads)
855 Builder.defineMacro("_REENTRANT");
856 // Follow g++ convention and predefine _GNU_SOURCE for C++.
857 if (Opts.CPlusPlus)
858 Builder.defineMacro("_GNU_SOURCE");
859 }
860
861 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000862 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000863 return ".text.__startup";
864 }
865
866public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000867 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
868 const TargetOptions &Opts)
869 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000870 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000871 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
872 }
873};
Dan Gohmanc2853072015-09-03 22:51:53 +0000874
Chris Lattner09d98f52008-10-05 21:50:58 +0000875//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000876// Specific target implementations.
877//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000878
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000879// PPC abstract base class
880class PPCTargetInfo : public TargetInfo {
881 static const Builtin::Info BuiltinInfo[];
882 static const char * const GCCRegNames[];
883 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000884 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000885
886 // Target cpu features.
887 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000888 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000889 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000890 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000891 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000892 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000893 bool HasBPERMD;
894 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000895 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000896
Ulrich Weigand8afad612014-07-28 13:17:52 +0000897protected:
898 std::string ABI;
899
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000900public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000901 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000902 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
903 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000904 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000905 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000906 LongDoubleWidth = LongDoubleAlign = 128;
907 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
908 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000909
Hal Finkel6b984f02012-07-03 16:51:04 +0000910 /// \brief Flags for architecture specific defines.
911 typedef enum {
912 ArchDefineNone = 0,
913 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
914 ArchDefinePpcgr = 1 << 1,
915 ArchDefinePpcsq = 1 << 2,
916 ArchDefine440 = 1 << 3,
917 ArchDefine603 = 1 << 4,
918 ArchDefine604 = 1 << 5,
919 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000920 ArchDefinePwr5 = 1 << 7,
921 ArchDefinePwr5x = 1 << 8,
922 ArchDefinePwr6 = 1 << 9,
923 ArchDefinePwr6x = 1 << 10,
924 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000925 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000926 ArchDefinePwr9 = 1 << 13,
927 ArchDefineA2 = 1 << 14,
928 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000929 } ArchDefineTypes;
930
Bill Schmidt38378a02013-02-01 20:23:10 +0000931 // Note: GCC recognizes the following additional cpus:
932 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
933 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
934 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000935 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000936 bool CPUKnown = llvm::StringSwitch<bool>(Name)
937 .Case("generic", true)
938 .Case("440", true)
939 .Case("450", true)
940 .Case("601", true)
941 .Case("602", true)
942 .Case("603", true)
943 .Case("603e", true)
944 .Case("603ev", true)
945 .Case("604", true)
946 .Case("604e", true)
947 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000949 .Case("g3", true)
950 .Case("7400", true)
951 .Case("g4", true)
952 .Case("7450", true)
953 .Case("g4+", true)
954 .Case("750", true)
955 .Case("970", true)
956 .Case("g5", true)
957 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000958 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000959 .Case("e500mc", true)
960 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000961 .Case("power3", true)
962 .Case("pwr3", true)
963 .Case("power4", true)
964 .Case("pwr4", true)
965 .Case("power5", true)
966 .Case("pwr5", true)
967 .Case("power5x", true)
968 .Case("pwr5x", true)
969 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000970 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000971 .Case("power6x", true)
972 .Case("pwr6x", true)
973 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000974 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000975 .Case("power8", true)
976 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000977 .Case("power9", true)
978 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000979 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000980 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000983 .Case("powerpc64le", true)
984 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000985 .Default(false);
986
987 if (CPUKnown)
988 CPU = Name;
989
990 return CPUKnown;
991 }
992
Ulrich Weigand8afad612014-07-28 13:17:52 +0000993
994 StringRef getABI() const override { return ABI; }
995
Craig Topper6c03a542015-10-19 04:51:35 +0000996 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
997 return llvm::makeArrayRef(BuiltinInfo,
998 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000999 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001000
Craig Topper3164f332014-03-11 03:39:26 +00001001 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 void getTargetDefines(const LangOptions &Opts,
1004 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001005
Eric Christopher8c47b422015-10-09 18:39:55 +00001006 bool
1007 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1008 StringRef CPU,
1009 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001010
Craig Topper3164f332014-03-11 03:39:26 +00001011 bool handleTargetFeatures(std::vector<std::string> &Features,
1012 DiagnosticsEngine &Diags) override;
1013 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001014 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1015 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001016
Craig Topperf054e3a2015-10-19 03:52:27 +00001017 ArrayRef<const char *> getGCCRegNames() const override;
1018 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001019 bool validateAsmConstraint(const char *&Name,
1020 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001021 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001022 default: return false;
1023 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001024 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001025 case 'b': // Base register
1026 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001027 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001028 break;
1029 // FIXME: The following are added to allow parsing.
1030 // I just took a guess at what the actions should be.
1031 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001032 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001033 case 'v': // Altivec vector register
1034 Info.setAllowsRegister();
1035 break;
1036 case 'w':
1037 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 case 'd':// VSX vector register to hold vector double data
1039 case 'f':// VSX vector register to hold vector float data
1040 case 's':// VSX vector register to hold scalar float data
1041 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001042 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001043 break;
1044 default:
1045 return false;
1046 }
1047 Info.setAllowsRegister();
1048 Name++; // Skip over 'w'.
1049 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001050 case 'h': // `MQ', `CTR', or `LINK' register
1051 case 'q': // `MQ' register
1052 case 'c': // `CTR' register
1053 case 'l': // `LINK' register
1054 case 'x': // `CR' register (condition register) number 0
1055 case 'y': // `CR' register (condition register)
1056 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001057 Info.setAllowsRegister();
1058 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001059 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001060 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // (use `L' instead for SImode constants)
1062 case 'K': // Unsigned 16-bit constant
1063 case 'L': // Signed 16-bit constant shifted left 16 bits
1064 case 'M': // Constant larger than 31
1065 case 'N': // Exact power of 2
1066 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001067 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001068 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'm': // Memory operand. Note that on PowerPC targets, m can
1073 // include addresses that update the base register. It
1074 // is therefore only safe to use `m' in an asm statement
1075 // if that asm statement accesses the operand exactly once.
1076 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001077 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001078 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001079 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1082 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register to be updated.
1084 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001085 if (Name[1] != 's')
1086 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001087 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001088 // include any automodification of the base register. Unlike
1089 // `m', this constraint can be used in asm statements that
1090 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001091 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001092 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001093 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001094 break;
1095 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001096 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001097 case 'Z': // Memory operand that is an indexed or indirect from a
1098 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001099 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001100 Info.setAllowsMemory();
1101 Info.setAllowsRegister();
1102 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001103 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001104 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 // register (`p' is preferable for asm statements)
1106 case 'S': // Constant suitable as a 64-bit mask operand
1107 case 'T': // Constant suitable as a 32-bit mask operand
1108 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001109 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001110 // instructions
1111 case 'W': // Vector constant that does not require memory
1112 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001113 break;
1114 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001115 }
John Thompson07a61a42010-06-24 22:44:13 +00001116 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
Craig Topper3164f332014-03-11 03:39:26 +00001118 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001119 std::string R;
1120 switch (*Constraint) {
1121 case 'e':
1122 case 'w':
1123 // Two-character constraint; add "^" hint for later parsing.
1124 R = std::string("^") + std::string(Constraint, 2);
1125 Constraint++;
1126 break;
1127 default:
1128 return TargetInfo::convertConstraint(Constraint);
1129 }
1130 return R;
1131 }
Craig Topper3164f332014-03-11 03:39:26 +00001132 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001133 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001134 }
Craig Topper3164f332014-03-11 03:39:26 +00001135 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001136 if (RegNo == 0) return 3;
1137 if (RegNo == 1) return 4;
1138 return -1;
1139 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001140
1141 bool hasSjLjLowering() const override {
1142 return true;
1143 }
David Majnemer2617ea62015-06-09 18:05:33 +00001144
1145 bool useFloat128ManglingForLongDouble() const override {
1146 return LongDoubleWidth == 128 &&
1147 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1148 getTriple().isOSBinFormatELF();
1149 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001150};
Anders Carlssonf511f642007-11-27 04:11:28 +00001151
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001153#define BUILTIN(ID, TYPE, ATTRS) \
1154 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1155#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1156 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001157#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001158};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001159
Eric Christopher917e9522014-11-18 22:36:15 +00001160/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001162bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001164 for (const auto &Feature : Features) {
1165 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001166 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001167 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001168 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001172 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001174 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001176 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001178 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001180 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001181 } else if (Feature == "+float128") {
1182 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001183 } else if (Feature == "+power9-vector") {
1184 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001185 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001186 // TODO: Finish this list and add an assert that we've handled them
1187 // all.
1188 }
Eric Christopher02c33352015-08-25 00:59:11 +00001189
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001190 return true;
1191}
1192
Chris Lattnerecd49032009-03-02 22:27:17 +00001193/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1194/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001195void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001196 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001197 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001199 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001201 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001205 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001207 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001208 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001209
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001211 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1212 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 } else {
1214 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1215 getTriple().getOS() != llvm::Triple::OpenBSD)
1216 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001217 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001218
Ulrich Weigand8afad612014-07-28 13:17:52 +00001219 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001220 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 Builder.defineMacro("_CALL_ELF", "1");
1222 if (ABI == "elfv2")
1223 Builder.defineMacro("_CALL_ELF", "2");
1224
Chris Lattnerecd49032009-03-02 22:27:17 +00001225 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001226 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1227 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001228
Chris Lattnerecd49032009-03-02 22:27:17 +00001229 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001230 if (LongDoubleWidth == 128)
1231 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001232
John Thompsone467e192009-11-19 17:18:50 +00001233 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001234 Builder.defineMacro("__VEC__", "10206");
1235 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001236 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001237
1238 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001239 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1240 .Case("440", ArchDefineName)
1241 .Case("450", ArchDefineName | ArchDefine440)
1242 .Case("601", ArchDefineName)
1243 .Case("602", ArchDefineName | ArchDefinePpcgr)
1244 .Case("603", ArchDefineName | ArchDefinePpcgr)
1245 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1246 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1247 .Case("604", ArchDefineName | ArchDefinePpcgr)
1248 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1249 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001250 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001251 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1252 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1253 .Case("750", ArchDefineName | ArchDefinePpcgr)
1254 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1255 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001256 .Case("a2", ArchDefineA2)
1257 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001258 .Case("pwr3", ArchDefinePpcgr)
1259 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1261 | ArchDefinePpcsq)
1262 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1263 | ArchDefinePpcgr | ArchDefinePpcsq)
1264 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1265 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1267 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1268 | ArchDefinePpcsq)
1269 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1270 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001271 | ArchDefinePpcgr | ArchDefinePpcsq)
1272 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1273 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1274 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001275 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1276 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1277 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1278 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001279 .Case("power3", ArchDefinePpcgr)
1280 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1281 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1282 | ArchDefinePpcsq)
1283 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1284 | ArchDefinePpcgr | ArchDefinePpcsq)
1285 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1286 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1288 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1289 | ArchDefinePpcsq)
1290 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1291 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001292 | ArchDefinePpcgr | ArchDefinePpcsq)
1293 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1294 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1295 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001296 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1297 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1298 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1299 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001300 .Default(ArchDefineNone);
1301
1302 if (defs & ArchDefineName)
1303 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1304 if (defs & ArchDefinePpcgr)
1305 Builder.defineMacro("_ARCH_PPCGR");
1306 if (defs & ArchDefinePpcsq)
1307 Builder.defineMacro("_ARCH_PPCSQ");
1308 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001309 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001310 if (defs & ArchDefine603)
1311 Builder.defineMacro("_ARCH_603");
1312 if (defs & ArchDefine604)
1313 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001314 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001315 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5x)
1319 Builder.defineMacro("_ARCH_PWR5X");
1320 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001321 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001322 if (defs & ArchDefinePwr6x)
1323 Builder.defineMacro("_ARCH_PWR6X");
1324 if (defs & ArchDefinePwr7)
1325 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001326 if (defs & ArchDefinePwr8)
1327 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001328 if (defs & ArchDefinePwr9)
1329 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001330 if (defs & ArchDefineA2)
1331 Builder.defineMacro("_ARCH_A2");
1332 if (defs & ArchDefineA2q) {
1333 Builder.defineMacro("_ARCH_A2Q");
1334 Builder.defineMacro("_ARCH_QP");
1335 }
1336
1337 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1338 Builder.defineMacro("__bg__");
1339 Builder.defineMacro("__THW_BLUEGENE__");
1340 Builder.defineMacro("__bgq__");
1341 Builder.defineMacro("__TOS_BGQ__");
1342 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001343
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001344 if (HasVSX)
1345 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001346 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001347 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001348 if (HasP8Crypto)
1349 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001350 if (HasHTM)
1351 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001352 if (HasFloat128)
1353 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001354 if (HasP9Vector)
1355 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001356
1357 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1358 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1360 if (PointerWidth == 64)
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001362
Bill Schmidt38378a02013-02-01 20:23:10 +00001363 // FIXME: The following are not yet generated here by Clang, but are
1364 // generated by GCC:
1365 //
1366 // _SOFT_FLOAT_
1367 // __RECIP_PRECISION__
1368 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001369 // __RECIP__
1370 // __RECIPF__
1371 // __RSQRTE__
1372 // __RSQRTEF__
1373 // _SOFT_DOUBLE_
1374 // __NO_LWSYNC__
1375 // __HAVE_BSWAP__
1376 // __LONGDOUBLE128
1377 // __CMODEL_MEDIUM__
1378 // __CMODEL_LARGE__
1379 // _CALL_SYSV
1380 // _CALL_DARWIN
1381 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001382}
1383
Eric Christophera8a14c32015-08-31 18:39:16 +00001384// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001385// explicitly turned off vsx and turned on any of:
1386// - power8-vector
1387// - direct-move
1388// - float128
1389// - power9-vector
1390// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001391// set of options.
1392static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001393 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001394
1395 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1396 FeaturesVec.end()) {
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1398 FeaturesVec.end()) {
1399 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1400 << "-mno-vsx";
1401 return false;
1402 }
1403
1404 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1405 FeaturesVec.end()) {
1406 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1407 << "-mno-vsx";
1408 return false;
1409 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001410
1411 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1412 FeaturesVec.end()) {
1413 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1414 << "-mno-vsx";
1415 return false;
1416 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001417
1418 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1419 FeaturesVec.end()) {
1420 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1421 << "-mno-vsx";
1422 return false;
1423 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001424 }
1425
1426 return true;
1427}
1428
Eric Christopher8c47b422015-10-09 18:39:55 +00001429bool PPCTargetInfo::initFeatureMap(
1430 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1431 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001432 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("7400", true)
1434 .Case("g4", true)
1435 .Case("7450", true)
1436 .Case("g4+", true)
1437 .Case("970", true)
1438 .Case("g5", true)
1439 .Case("pwr6", true)
1440 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001441 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001442 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001443 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001444 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001446
1447 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001448 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001449 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001452 .Case("pwr8", true)
1453 .Default(false);
1454 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001457 .Case("pwr8", true)
1458 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1460 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001461 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001462 .Case("pwr8", true)
1463 .Case("pwr7", true)
1464 .Default(false);
1465 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1466 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001467 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001468 .Case("pwr8", true)
1469 .Case("pwr7", true)
1470 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001471 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1472 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001473 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001474 .Case("pwr8", true)
1475 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001476 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1477 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001478 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001479 .Case("pwr8", true)
1480 .Case("pwr7", true)
1481 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001482
Eric Christophera8a14c32015-08-31 18:39:16 +00001483 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1484 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001485
Eric Christopher007b0a02015-08-28 22:32:01 +00001486 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001487}
1488
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001489bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001490 return llvm::StringSwitch<bool>(Feature)
1491 .Case("powerpc", true)
1492 .Case("vsx", HasVSX)
1493 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001494 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001495 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001497 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001498 .Case("bpermd", HasBPERMD)
1499 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001500 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001501 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001502 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001503}
Chris Lattner17df24e2008-04-21 18:56:49 +00001504
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001505void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1506 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001507 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1508 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1509 // incompatible options.
1510 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001511 if (Name == "direct-move" ||
1512 Name == "power8-vector" ||
1513 Name == "float128" ||
1514 Name == "power9-vector") {
1515 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001516 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001517 if (Name == "power9-vector")
1518 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001519 } else {
1520 Features[Name] = true;
1521 }
1522 } else {
1523 if (Name == "vsx") {
1524 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001525 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001526 } else {
1527 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001528 }
1529 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530}
1531
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001532const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001533 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1534 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1535 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1536 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1537 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1538 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1539 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1540 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001541 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001542 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1545 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1546 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1547 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001548 "vrsave", "vscr",
1549 "spe_acc", "spefscr",
1550 "sfp"
1551};
Chris Lattner10a5b382007-01-29 05:24:35 +00001552
Craig Topperf054e3a2015-10-19 03:52:27 +00001553ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1554 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001555}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001556
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1558 // While some of these aliases do map to different registers
1559 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001560 { { "0" }, "r0" },
1561 { { "1"}, "r1" },
1562 { { "2" }, "r2" },
1563 { { "3" }, "r3" },
1564 { { "4" }, "r4" },
1565 { { "5" }, "r5" },
1566 { { "6" }, "r6" },
1567 { { "7" }, "r7" },
1568 { { "8" }, "r8" },
1569 { { "9" }, "r9" },
1570 { { "10" }, "r10" },
1571 { { "11" }, "r11" },
1572 { { "12" }, "r12" },
1573 { { "13" }, "r13" },
1574 { { "14" }, "r14" },
1575 { { "15" }, "r15" },
1576 { { "16" }, "r16" },
1577 { { "17" }, "r17" },
1578 { { "18" }, "r18" },
1579 { { "19" }, "r19" },
1580 { { "20" }, "r20" },
1581 { { "21" }, "r21" },
1582 { { "22" }, "r22" },
1583 { { "23" }, "r23" },
1584 { { "24" }, "r24" },
1585 { { "25" }, "r25" },
1586 { { "26" }, "r26" },
1587 { { "27" }, "r27" },
1588 { { "28" }, "r28" },
1589 { { "29" }, "r29" },
1590 { { "30" }, "r30" },
1591 { { "31" }, "r31" },
1592 { { "fr0" }, "f0" },
1593 { { "fr1" }, "f1" },
1594 { { "fr2" }, "f2" },
1595 { { "fr3" }, "f3" },
1596 { { "fr4" }, "f4" },
1597 { { "fr5" }, "f5" },
1598 { { "fr6" }, "f6" },
1599 { { "fr7" }, "f7" },
1600 { { "fr8" }, "f8" },
1601 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001602 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001603 { { "fr11" }, "f11" },
1604 { { "fr12" }, "f12" },
1605 { { "fr13" }, "f13" },
1606 { { "fr14" }, "f14" },
1607 { { "fr15" }, "f15" },
1608 { { "fr16" }, "f16" },
1609 { { "fr17" }, "f17" },
1610 { { "fr18" }, "f18" },
1611 { { "fr19" }, "f19" },
1612 { { "fr20" }, "f20" },
1613 { { "fr21" }, "f21" },
1614 { { "fr22" }, "f22" },
1615 { { "fr23" }, "f23" },
1616 { { "fr24" }, "f24" },
1617 { { "fr25" }, "f25" },
1618 { { "fr26" }, "f26" },
1619 { { "fr27" }, "f27" },
1620 { { "fr28" }, "f28" },
1621 { { "fr29" }, "f29" },
1622 { { "fr30" }, "f30" },
1623 { { "fr31" }, "f31" },
1624 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625};
1626
Craig Topperf054e3a2015-10-19 03:52:27 +00001627ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1628 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001629}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001630
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001632public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001633 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1634 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001635 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001636
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001637 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001638 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 case llvm::Triple::FreeBSD:
1640 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001641 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001642 PtrDiffType = SignedInt;
1643 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001644 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001645 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001647 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001648
Roman Divacky3ffe7462012-03-13 19:20:17 +00001649 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1650 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC32 supports atomics up to 4 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001656 }
1657
Craig Topper3164f332014-03-11 03:39:26 +00001658 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001660 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001661 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001662};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001663
Bill Schmidt778d3872013-07-26 01:36:11 +00001664// Note: ABI differences may eventually require us to have a separate
1665// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001666class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001668 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1669 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001670 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001671 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001672 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001673
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001674 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001675 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 ABI = "elfv2";
1677 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001679 ABI = "elfv1";
1680 }
1681
1682 switch (getTriple().getOS()) {
1683 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001684 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001685 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001686 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001687 case llvm::Triple::NetBSD:
1688 IntMaxType = SignedLongLong;
1689 Int64Type = SignedLongLong;
1690 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001691 default:
1692 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001693 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001694
1695 // PPC64 supports atomics up to 8 bytes.
1696 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001697 }
Craig Topper3164f332014-03-11 03:39:26 +00001698 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001699 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001700 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001701 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001702 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001703 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 ABI = Name;
1705 return true;
1706 }
1707 return false;
1708 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001709};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001710
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001711class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1714 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001715 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001716 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001717 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001718 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001719 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001720 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001721 }
Craig Topper3164f332014-03-11 03:39:26 +00001722 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001723 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001724 }
1725};
1726
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001727class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001728public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1730 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001731 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001732 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001733 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001734 }
1735};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736
Eric Christopherc48497a2015-09-18 21:26:24 +00001737static const unsigned NVPTXAddrSpaceMap[] = {
1738 1, // opencl_global
1739 3, // opencl_local
1740 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001741 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001742 0, // opencl_generic
1743 1, // cuda_device
1744 4, // cuda_constant
1745 3, // cuda_shared
1746};
1747
1748class NVPTXTargetInfo : public TargetInfo {
1749 static const char *const GCCRegNames[];
1750 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001751 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001752
Eric Christopherc48497a2015-09-18 21:26:24 +00001753public:
Justin Lebar76945b22016-04-29 23:05:19 +00001754 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001755 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001756 TLSSupported = false;
1757 LongWidth = LongAlign = 64;
1758 AddrSpaceMap = &NVPTXAddrSpaceMap;
1759 UseAddrSpaceMapMangling = true;
1760 // Define available target features
1761 // These must be defined in sorted order!
1762 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001763 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001764
1765 // If possible, get a TargetInfo for our host triple, so we can match its
1766 // types.
1767 llvm::Triple HostTriple(Opts.HostTriple);
1768 if (HostTriple.isNVPTX())
1769 return;
1770 std::unique_ptr<TargetInfo> HostTarget(
1771 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1772 if (!HostTarget) {
1773 return;
1774 }
1775
1776 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1777 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1778 BoolWidth = HostTarget->getBoolWidth();
1779 BoolAlign = HostTarget->getBoolAlign();
1780 IntWidth = HostTarget->getIntWidth();
1781 IntAlign = HostTarget->getIntAlign();
1782 HalfWidth = HostTarget->getHalfWidth();
1783 HalfAlign = HostTarget->getHalfAlign();
1784 FloatWidth = HostTarget->getFloatWidth();
1785 FloatAlign = HostTarget->getFloatAlign();
1786 DoubleWidth = HostTarget->getDoubleWidth();
1787 DoubleAlign = HostTarget->getDoubleAlign();
1788 LongWidth = HostTarget->getLongWidth();
1789 LongAlign = HostTarget->getLongAlign();
1790 LongLongWidth = HostTarget->getLongLongWidth();
1791 LongLongAlign = HostTarget->getLongLongAlign();
1792 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001793 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001794 DefaultAlignForAttributeAligned =
1795 HostTarget->getDefaultAlignForAttributeAligned();
1796 SizeType = HostTarget->getSizeType();
1797 IntMaxType = HostTarget->getIntMaxType();
1798 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1799 IntPtrType = HostTarget->getIntPtrType();
1800 WCharType = HostTarget->getWCharType();
1801 WIntType = HostTarget->getWIntType();
1802 Char16Type = HostTarget->getChar16Type();
1803 Char32Type = HostTarget->getChar32Type();
1804 Int64Type = HostTarget->getInt64Type();
1805 SigAtomicType = HostTarget->getSigAtomicType();
1806 ProcessIDType = HostTarget->getProcessIDType();
1807
1808 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1809 UseZeroLengthBitfieldAlignment =
1810 HostTarget->useZeroLengthBitfieldAlignment();
1811 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1812 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1813
Justin Lebar5057f172016-09-09 20:35:43 +00001814 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1815 // we need those macros to be identical on host and device, because (among
1816 // other things) they affect which standard library classes are defined, and
1817 // we need all classes to be defined on both the host and device.
1818 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1819
Justin Lebar76945b22016-04-29 23:05:19 +00001820 // Properties intentionally not copied from host:
1821 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1822 // host/device boundary.
1823 // - SuitableAlign: Not visible across the host/device boundary, and may
1824 // correctly be different on host/device, e.g. if host has wider vector
1825 // types than device.
1826 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1827 // as its double type, but that's not necessarily true on the host.
1828 // TODO: nvcc emits a warning when using long double on device; we should
1829 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001830 }
1831 void getTargetDefines(const LangOptions &Opts,
1832 MacroBuilder &Builder) const override {
1833 Builder.defineMacro("__PTX__");
1834 Builder.defineMacro("__NVPTX__");
1835 if (Opts.CUDAIsDevice) {
1836 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001837 std::string CUDAArchCode = [this] {
1838 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001839 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001840 assert(false && "No GPU arch when compiling CUDA device code.");
1841 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001842 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001843 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001844 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001846 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001847 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001848 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001849 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001850 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001851 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001852 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001853 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001854 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001855 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001856 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001857 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001858 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001859 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001860 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001861 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001862 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001863 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001864 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001865 return "620";
1866 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001867 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001868 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001869 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001870 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 }
Craig Topper6c03a542015-10-19 04:51:35 +00001872 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1873 return llvm::makeArrayRef(BuiltinInfo,
1874 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001875 }
Artem Belevichfda99052016-09-28 17:47:35 +00001876 bool
1877 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1878 StringRef CPU,
1879 const std::vector<std::string> &FeaturesVec) const override {
1880 Features["satom"] = GPU >= CudaArch::SM_60;
1881 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1882 }
1883
Eric Christopherc48497a2015-09-18 21:26:24 +00001884 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001885 return llvm::StringSwitch<bool>(Feature)
1886 .Cases("ptx", "nvptx", true)
1887 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1888 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001889 }
1890
Craig Topperf054e3a2015-10-19 03:52:27 +00001891 ArrayRef<const char *> getGCCRegNames() const override;
1892 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001893 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001894 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001895 }
1896 bool validateAsmConstraint(const char *&Name,
1897 TargetInfo::ConstraintInfo &Info) const override {
1898 switch (*Name) {
1899 default:
1900 return false;
1901 case 'c':
1902 case 'h':
1903 case 'r':
1904 case 'l':
1905 case 'f':
1906 case 'd':
1907 Info.setAllowsRegister();
1908 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001909 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001910 }
1911 const char *getClobbers() const override {
1912 // FIXME: Is this really right?
1913 return "";
1914 }
1915 BuiltinVaListKind getBuiltinVaListKind() const override {
1916 // FIXME: implement
1917 return TargetInfo::CharPtrBuiltinVaList;
1918 }
1919 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001920 GPU = StringToCudaArch(Name);
1921 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001923 void setSupportedOpenCLOpts() override {
1924 auto &Opts = getSupportedOpenCLOpts();
1925 Opts.cl_clang_storage_class_specifiers = 1;
1926 Opts.cl_khr_gl_sharing = 1;
1927 Opts.cl_khr_icd = 1;
1928
1929 Opts.cl_khr_fp64 = 1;
1930 Opts.cl_khr_byte_addressable_store = 1;
1931 Opts.cl_khr_global_int32_base_atomics = 1;
1932 Opts.cl_khr_global_int32_extended_atomics = 1;
1933 Opts.cl_khr_local_int32_base_atomics = 1;
1934 Opts.cl_khr_local_int32_extended_atomics = 1;
1935 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001936};
1937
1938const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1939#define BUILTIN(ID, TYPE, ATTRS) \
1940 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1941#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1942 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001943#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1944 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001945#include "clang/Basic/BuiltinsNVPTX.def"
1946};
1947
1948const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1949
Craig Topperf054e3a2015-10-19 03:52:27 +00001950ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1951 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001952}
1953
1954class NVPTX32TargetInfo : public NVPTXTargetInfo {
1955public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001956 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1957 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001958 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001959 PointerWidth = PointerAlign = 32;
1960 SizeType = TargetInfo::UnsignedInt;
1961 PtrDiffType = TargetInfo::SignedInt;
1962 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001963 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001964 }
1965};
1966
1967class NVPTX64TargetInfo : public NVPTXTargetInfo {
1968public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001969 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1970 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001971 PointerWidth = PointerAlign = 64;
1972 SizeType = TargetInfo::UnsignedLong;
1973 PtrDiffType = TargetInfo::SignedLong;
1974 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001975 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001976 }
1977};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001978
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001979static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001980 1, // opencl_global
1981 3, // opencl_local
1982 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001983 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 1, // cuda_device
1985 2, // cuda_constant
1986 3 // cuda_shared
1987};
1988
Tom Stellarda96344b2014-08-21 13:58:40 +00001989// If you edit the description strings, make sure you update
1990// getPointerWidthV().
1991
Craig Topper273dbc62015-10-18 05:29:26 +00001992static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001993 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1994 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001995
Craig Topper273dbc62015-10-18 05:29:26 +00001996static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001997 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001998 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1999 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002000
Matt Arsenault250024f2016-06-08 01:56:42 +00002001class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002002 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002003 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002004
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002005 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002006 enum GPUKind {
2007 GK_NONE,
2008 GK_R600,
2009 GK_R600_DOUBLE_OPS,
2010 GK_R700,
2011 GK_R700_DOUBLE_OPS,
2012 GK_EVERGREEN,
2013 GK_EVERGREEN_DOUBLE_OPS,
2014 GK_NORTHERN_ISLANDS,
2015 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002016 GK_GFX6,
2017 GK_GFX7,
2018 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002019 } GPU;
2020
Jan Veselyeebeaea2015-05-04 19:53:36 +00002021 bool hasFP64:1;
2022 bool hasFMAF:1;
2023 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002024 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002025
Matt Arsenault250024f2016-06-08 01:56:42 +00002026 static bool isAMDGCN(const llvm::Triple &TT) {
2027 return TT.getArch() == llvm::Triple::amdgcn;
2028 }
2029
Eli Friedmand13b41e2012-10-12 23:32:00 +00002030public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002031 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002032 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002033 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002034 hasFP64(false),
2035 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002036 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002037 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002038 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002040 hasFMAF = true;
2041 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002042 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002043
2044 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2045 DataLayoutStringSI : DataLayoutStringR600);
2046
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002047 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002048 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002049 }
2050
Tom Stellarda96344b2014-08-21 13:58:40 +00002051 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2052 if (GPU <= GK_CAYMAN)
2053 return 32;
2054
2055 switch(AddrSpace) {
2056 default:
2057 return 64;
2058 case 0:
2059 case 3:
2060 case 5:
2061 return 32;
2062 }
2063 }
2064
Yaxun Liu26f75662016-08-19 05:17:25 +00002065 uint64_t getMaxPointerWidth() const override {
2066 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2067 }
2068
Craig Topper3164f332014-03-11 03:39:26 +00002069 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002070 return "";
2071 }
2072
Craig Topperf054e3a2015-10-19 03:52:27 +00002073 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074
Craig Topperf054e3a2015-10-19 03:52:27 +00002075 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2076 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002077 }
2078
Craig Topper3164f332014-03-11 03:39:26 +00002079 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002080 TargetInfo::ConstraintInfo &Info) const override {
2081 switch (*Name) {
2082 default: break;
2083 case 'v': // vgpr
2084 case 's': // sgpr
2085 Info.setAllowsRegister();
2086 return true;
2087 }
2088 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002089 }
2090
Matt Arsenault250024f2016-06-08 01:56:42 +00002091 bool initFeatureMap(llvm::StringMap<bool> &Features,
2092 DiagnosticsEngine &Diags, StringRef CPU,
2093 const std::vector<std::string> &FeatureVec) const override;
2094
Yaxun Liu2c17e822016-08-09 19:43:38 +00002095 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2096 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002097 bool hasFP32Denormals = false;
2098 bool hasFP64Denormals = false;
2099 for (auto &I : TargetOpts.FeaturesAsWritten) {
2100 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2101 hasFP32Denormals = true;
2102 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2103 hasFP64Denormals = true;
2104 }
2105 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002106 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2107 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2108 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002110 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 }
2112
Craig Topper6c03a542015-10-19 04:51:35 +00002113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2114 return llvm::makeArrayRef(BuiltinInfo,
2115 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002116 }
2117
Craig Topper3164f332014-03-11 03:39:26 +00002118 void getTargetDefines(const LangOptions &Opts,
2119 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002120 if (getTriple().getArch() == llvm::Triple::amdgcn)
2121 Builder.defineMacro("__AMDGCN__");
2122 else
2123 Builder.defineMacro("__R600__");
2124
Jan Veselyeebeaea2015-05-04 19:53:36 +00002125 if (hasFMAF)
2126 Builder.defineMacro("__HAS_FMAF__");
2127 if (hasLDEXPF)
2128 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002129 if (hasFP64)
2130 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002131 }
2132
Craig Topper3164f332014-03-11 03:39:26 +00002133 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002134 return TargetInfo::CharPtrBuiltinVaList;
2135 }
2136
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 static GPUKind parseR600Name(StringRef Name) {
2138 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002139 .Case("r600" , GK_R600)
2140 .Case("rv610", GK_R600)
2141 .Case("rv620", GK_R600)
2142 .Case("rv630", GK_R600)
2143 .Case("rv635", GK_R600)
2144 .Case("rs780", GK_R600)
2145 .Case("rs880", GK_R600)
2146 .Case("rv670", GK_R600_DOUBLE_OPS)
2147 .Case("rv710", GK_R700)
2148 .Case("rv730", GK_R700)
2149 .Case("rv740", GK_R700_DOUBLE_OPS)
2150 .Case("rv770", GK_R700_DOUBLE_OPS)
2151 .Case("palm", GK_EVERGREEN)
2152 .Case("cedar", GK_EVERGREEN)
2153 .Case("sumo", GK_EVERGREEN)
2154 .Case("sumo2", GK_EVERGREEN)
2155 .Case("redwood", GK_EVERGREEN)
2156 .Case("juniper", GK_EVERGREEN)
2157 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2158 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2159 .Case("barts", GK_NORTHERN_ISLANDS)
2160 .Case("turks", GK_NORTHERN_ISLANDS)
2161 .Case("caicos", GK_NORTHERN_ISLANDS)
2162 .Case("cayman", GK_CAYMAN)
2163 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002164 .Default(GK_NONE);
2165 }
2166
2167 static GPUKind parseAMDGCNName(StringRef Name) {
2168 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002169 .Case("tahiti", GK_GFX6)
2170 .Case("pitcairn", GK_GFX6)
2171 .Case("verde", GK_GFX6)
2172 .Case("oland", GK_GFX6)
2173 .Case("hainan", GK_GFX6)
2174 .Case("bonaire", GK_GFX7)
2175 .Case("kabini", GK_GFX7)
2176 .Case("kaveri", GK_GFX7)
2177 .Case("hawaii", GK_GFX7)
2178 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002179 .Case("gfx700", GK_GFX7)
2180 .Case("gfx701", GK_GFX7)
2181 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002182 .Case("tonga", GK_GFX8)
2183 .Case("iceland", GK_GFX8)
2184 .Case("carrizo", GK_GFX8)
2185 .Case("fiji", GK_GFX8)
2186 .Case("stoney", GK_GFX8)
2187 .Case("polaris10", GK_GFX8)
2188 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002189 .Case("gfx800", GK_GFX8)
2190 .Case("gfx801", GK_GFX8)
2191 .Case("gfx802", GK_GFX8)
2192 .Case("gfx803", GK_GFX8)
2193 .Case("gfx804", GK_GFX8)
2194 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002195 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002196 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002197
Matt Arsenault250024f2016-06-08 01:56:42 +00002198 bool setCPU(const std::string &Name) override {
2199 if (getTriple().getArch() == llvm::Triple::amdgcn)
2200 GPU = parseAMDGCNName(Name);
2201 else
2202 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002203
Matt Arsenault250024f2016-06-08 01:56:42 +00002204 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002205 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002206
Jan Vesely211ba782016-06-17 02:25:03 +00002207 void setSupportedOpenCLOpts() override {
2208 auto &Opts = getSupportedOpenCLOpts();
2209 Opts.cl_clang_storage_class_specifiers = 1;
2210 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002211
Jan Vesely211ba782016-06-17 02:25:03 +00002212 if (hasFP64)
2213 Opts.cl_khr_fp64 = 1;
2214 if (GPU >= GK_EVERGREEN) {
2215 Opts.cl_khr_byte_addressable_store = 1;
2216 Opts.cl_khr_global_int32_base_atomics = 1;
2217 Opts.cl_khr_global_int32_extended_atomics = 1;
2218 Opts.cl_khr_local_int32_base_atomics = 1;
2219 Opts.cl_khr_local_int32_extended_atomics = 1;
2220 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002221 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002222 Opts.cl_khr_fp16 = 1;
2223 Opts.cl_khr_int64_base_atomics = 1;
2224 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002225 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002226 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002227 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002228 Opts.cl_amd_media_ops = 1;
2229 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002230 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002231 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002232
Yaxun Liu99444cb2016-08-03 20:38:06 +00002233 LangAS::ID getOpenCLImageAddrSpace() const override {
2234 return LangAS::opencl_constant;
2235 }
2236
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002237 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2238 switch (CC) {
2239 default:
2240 return CCCR_Warning;
2241 case CC_C:
2242 case CC_OpenCLKernel:
2243 return CCCR_OK;
2244 }
2245 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002246};
2247
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002248const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002249#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002250 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002251#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2252 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002253#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002254};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002255const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002256 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2257 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2258 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2259 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2260 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2261 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2262 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2263 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2264 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2265 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2266 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2267 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2268 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2269 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2270 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2271 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2272 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2273 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2274 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2275 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2276 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2277 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2278 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2279 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2280 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2281 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2282 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2283 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2284 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2285 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2286 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2287 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2288 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2289 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2290 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2291 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2292 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2293 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2294 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2295 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2296 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2297 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2298 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2299 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2300 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2301 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2302 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002303 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002304 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2305 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002306};
2307
Craig Topperf054e3a2015-10-19 03:52:27 +00002308ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2309 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002310}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002311
Matt Arsenault250024f2016-06-08 01:56:42 +00002312bool AMDGPUTargetInfo::initFeatureMap(
2313 llvm::StringMap<bool> &Features,
2314 DiagnosticsEngine &Diags, StringRef CPU,
2315 const std::vector<std::string> &FeatureVec) const {
2316
2317 // XXX - What does the member GPU mean if device name string passed here?
2318 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2319 if (CPU.empty())
2320 CPU = "tahiti";
2321
2322 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002323 case GK_GFX6:
2324 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002325 break;
2326
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002327 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002328 Features["s-memrealtime"] = true;
2329 Features["16-bit-insts"] = true;
2330 break;
2331
2332 case GK_NONE:
2333 return false;
2334 default:
2335 llvm_unreachable("unhandled subtarget");
2336 }
2337 } else {
2338 if (CPU.empty())
2339 CPU = "r600";
2340
2341 switch (parseR600Name(CPU)) {
2342 case GK_R600:
2343 case GK_R700:
2344 case GK_EVERGREEN:
2345 case GK_NORTHERN_ISLANDS:
2346 break;
2347 case GK_R600_DOUBLE_OPS:
2348 case GK_R700_DOUBLE_OPS:
2349 case GK_EVERGREEN_DOUBLE_OPS:
2350 case GK_CAYMAN:
2351 Features["fp64"] = true;
2352 break;
2353 case GK_NONE:
2354 return false;
2355 default:
2356 llvm_unreachable("unhandled subtarget");
2357 }
2358 }
2359
2360 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2361}
2362
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002363const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002364#define BUILTIN(ID, TYPE, ATTRS) \
2365 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002366#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002367 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002368#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2369 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002370#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002371
2372#define BUILTIN(ID, TYPE, ATTRS) \
2373 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002374#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2375 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002376#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2377 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2378#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002379};
Eli Friedmanb5366062008-05-20 14:21:01 +00002380
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002381
Nuno Lopescfca1f02009-12-23 17:49:57 +00002382static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002383 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2384 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002385 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002386 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2387 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2388 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002389 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002390 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2391 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002392 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2393 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2394 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2395 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2396 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2397 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2398 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2399 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002400};
2401
Eric Christophercdd36352011-06-21 00:05:20 +00002402const TargetInfo::AddlRegName AddlRegNames[] = {
2403 { { "al", "ah", "eax", "rax" }, 0 },
2404 { { "bl", "bh", "ebx", "rbx" }, 3 },
2405 { { "cl", "ch", "ecx", "rcx" }, 2 },
2406 { { "dl", "dh", "edx", "rdx" }, 1 },
2407 { { "esi", "rsi" }, 4 },
2408 { { "edi", "rdi" }, 5 },
2409 { { "esp", "rsp" }, 7 },
2410 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002411 { { "r8d", "r8w", "r8b" }, 38 },
2412 { { "r9d", "r9w", "r9b" }, 39 },
2413 { { "r10d", "r10w", "r10b" }, 40 },
2414 { { "r11d", "r11w", "r11b" }, 41 },
2415 { { "r12d", "r12w", "r12b" }, 42 },
2416 { { "r13d", "r13w", "r13b" }, 43 },
2417 { { "r14d", "r14w", "r14b" }, 44 },
2418 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002419};
2420
2421// X86 target abstract base class; x86-32 and x86-64 are very close, so
2422// most of the implementation can be shared.
2423class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002424 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002425 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002426 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002427 enum MMX3DNowEnum {
2428 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002429 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002430 enum XOPEnum {
2431 NoXOP,
2432 SSE4A,
2433 FMA4,
2434 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002435 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002436
Craig Topper543f3bd2015-10-14 23:47:57 +00002437 bool HasAES = false;
2438 bool HasPCLMUL = false;
2439 bool HasLZCNT = false;
2440 bool HasRDRND = false;
2441 bool HasFSGSBASE = false;
2442 bool HasBMI = false;
2443 bool HasBMI2 = false;
2444 bool HasPOPCNT = false;
2445 bool HasRTM = false;
2446 bool HasPRFCHW = false;
2447 bool HasRDSEED = false;
2448 bool HasADX = false;
2449 bool HasTBM = false;
2450 bool HasFMA = false;
2451 bool HasF16C = false;
2452 bool HasAVX512CD = false;
2453 bool HasAVX512ER = false;
2454 bool HasAVX512PF = false;
2455 bool HasAVX512DQ = false;
2456 bool HasAVX512BW = false;
2457 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002458 bool HasAVX512VBMI = false;
2459 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002460 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002461 bool HasMPX = false;
2462 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002463 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002464 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002465 bool HasXSAVE = false;
2466 bool HasXSAVEOPT = false;
2467 bool HasXSAVEC = false;
2468 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002469 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002470 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002471 bool HasCLFLUSHOPT = false;
2472 bool HasPCOMMIT = false;
2473 bool HasCLWB = false;
2474 bool HasUMIP = false;
2475 bool HasMOVBE = false;
2476 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002477
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002478 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2479 ///
2480 /// Each enumeration represents a particular CPU supported by Clang. These
2481 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2482 enum CPUKind {
2483 CK_Generic,
2484
2485 /// \name i386
2486 /// i386-generation processors.
2487 //@{
2488 CK_i386,
2489 //@}
2490
2491 /// \name i486
2492 /// i486-generation processors.
2493 //@{
2494 CK_i486,
2495 CK_WinChipC6,
2496 CK_WinChip2,
2497 CK_C3,
2498 //@}
2499
2500 /// \name i586
2501 /// i586-generation processors, P5 microarchitecture based.
2502 //@{
2503 CK_i586,
2504 CK_Pentium,
2505 CK_PentiumMMX,
2506 //@}
2507
2508 /// \name i686
2509 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2510 //@{
2511 CK_i686,
2512 CK_PentiumPro,
2513 CK_Pentium2,
2514 CK_Pentium3,
2515 CK_Pentium3M,
2516 CK_PentiumM,
2517 CK_C3_2,
2518
2519 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2520 /// Clang however has some logic to suport this.
2521 // FIXME: Warn, deprecate, and potentially remove this.
2522 CK_Yonah,
2523 //@}
2524
2525 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002526 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002527 //@{
2528 CK_Pentium4,
2529 CK_Pentium4M,
2530 CK_Prescott,
2531 CK_Nocona,
2532 //@}
2533
2534 /// \name Core
2535 /// Core microarchitecture based processors.
2536 //@{
2537 CK_Core2,
2538
2539 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2540 /// codename which GCC no longer accepts as an option to -march, but Clang
2541 /// has some logic for recognizing it.
2542 // FIXME: Warn, deprecate, and potentially remove this.
2543 CK_Penryn,
2544 //@}
2545
2546 /// \name Atom
2547 /// Atom processors
2548 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002549 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002550 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002551 //@}
2552
2553 /// \name Nehalem
2554 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002555 CK_Nehalem,
2556
2557 /// \name Westmere
2558 /// Westmere microarchitecture based processors.
2559 CK_Westmere,
2560
2561 /// \name Sandy Bridge
2562 /// Sandy Bridge microarchitecture based processors.
2563 CK_SandyBridge,
2564
2565 /// \name Ivy Bridge
2566 /// Ivy Bridge microarchitecture based processors.
2567 CK_IvyBridge,
2568
2569 /// \name Haswell
2570 /// Haswell microarchitecture based processors.
2571 CK_Haswell,
2572
2573 /// \name Broadwell
2574 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002575 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002576
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002577 /// \name Skylake Client
2578 /// Skylake client microarchitecture based processors.
2579 CK_SkylakeClient,
2580
2581 /// \name Skylake Server
2582 /// Skylake server microarchitecture based processors.
2583 CK_SkylakeServer,
2584
2585 /// \name Cannonlake Client
2586 /// Cannonlake client microarchitecture based processors.
2587 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002588
Craig Topper449314e2013-08-20 07:09:39 +00002589 /// \name Knights Landing
2590 /// Knights Landing processor.
2591 CK_KNL,
2592
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002593 /// \name Lakemont
2594 /// Lakemont microarchitecture based processors.
2595 CK_Lakemont,
2596
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002597 /// \name K6
2598 /// K6 architecture processors.
2599 //@{
2600 CK_K6,
2601 CK_K6_2,
2602 CK_K6_3,
2603 //@}
2604
2605 /// \name K7
2606 /// K7 architecture processors.
2607 //@{
2608 CK_Athlon,
2609 CK_AthlonThunderbird,
2610 CK_Athlon4,
2611 CK_AthlonXP,
2612 CK_AthlonMP,
2613 //@}
2614
2615 /// \name K8
2616 /// K8 architecture processors.
2617 //@{
2618 CK_Athlon64,
2619 CK_Athlon64SSE3,
2620 CK_AthlonFX,
2621 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002622 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002623 CK_Opteron,
2624 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002625 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002626 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002627
Benjamin Kramer569f2152012-01-10 11:50:18 +00002628 /// \name Bobcat
2629 /// Bobcat architecture processors.
2630 //@{
2631 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002632 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002633 //@}
2634
2635 /// \name Bulldozer
2636 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002637 //@{
2638 CK_BDVER1,
2639 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002640 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002641 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002642 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002643
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002644 /// This specification is deprecated and will be removed in the future.
2645 /// Users should prefer \see CK_K8.
2646 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002647 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002648 CK_x86_64,
2649 //@}
2650
2651 /// \name Geode
2652 /// Geode processors.
2653 //@{
2654 CK_Geode
2655 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002656 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002657
Eric Christopherc50738f2015-08-27 00:05:50 +00002658 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002659 return llvm::StringSwitch<CPUKind>(CPU)
2660 .Case("i386", CK_i386)
2661 .Case("i486", CK_i486)
2662 .Case("winchip-c6", CK_WinChipC6)
2663 .Case("winchip2", CK_WinChip2)
2664 .Case("c3", CK_C3)
2665 .Case("i586", CK_i586)
2666 .Case("pentium", CK_Pentium)
2667 .Case("pentium-mmx", CK_PentiumMMX)
2668 .Case("i686", CK_i686)
2669 .Case("pentiumpro", CK_PentiumPro)
2670 .Case("pentium2", CK_Pentium2)
2671 .Case("pentium3", CK_Pentium3)
2672 .Case("pentium3m", CK_Pentium3M)
2673 .Case("pentium-m", CK_PentiumM)
2674 .Case("c3-2", CK_C3_2)
2675 .Case("yonah", CK_Yonah)
2676 .Case("pentium4", CK_Pentium4)
2677 .Case("pentium4m", CK_Pentium4M)
2678 .Case("prescott", CK_Prescott)
2679 .Case("nocona", CK_Nocona)
2680 .Case("core2", CK_Core2)
2681 .Case("penryn", CK_Penryn)
2682 .Case("bonnell", CK_Bonnell)
2683 .Case("atom", CK_Bonnell) // Legacy name.
2684 .Case("silvermont", CK_Silvermont)
2685 .Case("slm", CK_Silvermont) // Legacy name.
2686 .Case("nehalem", CK_Nehalem)
2687 .Case("corei7", CK_Nehalem) // Legacy name.
2688 .Case("westmere", CK_Westmere)
2689 .Case("sandybridge", CK_SandyBridge)
2690 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2691 .Case("ivybridge", CK_IvyBridge)
2692 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2693 .Case("haswell", CK_Haswell)
2694 .Case("core-avx2", CK_Haswell) // Legacy name.
2695 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002696 .Case("skylake", CK_SkylakeClient)
2697 .Case("skylake-avx512", CK_SkylakeServer)
2698 .Case("skx", CK_SkylakeServer) // Legacy name.
2699 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002700 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002701 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002702 .Case("k6", CK_K6)
2703 .Case("k6-2", CK_K6_2)
2704 .Case("k6-3", CK_K6_3)
2705 .Case("athlon", CK_Athlon)
2706 .Case("athlon-tbird", CK_AthlonThunderbird)
2707 .Case("athlon-4", CK_Athlon4)
2708 .Case("athlon-xp", CK_AthlonXP)
2709 .Case("athlon-mp", CK_AthlonMP)
2710 .Case("athlon64", CK_Athlon64)
2711 .Case("athlon64-sse3", CK_Athlon64SSE3)
2712 .Case("athlon-fx", CK_AthlonFX)
2713 .Case("k8", CK_K8)
2714 .Case("k8-sse3", CK_K8SSE3)
2715 .Case("opteron", CK_Opteron)
2716 .Case("opteron-sse3", CK_OpteronSSE3)
2717 .Case("barcelona", CK_AMDFAM10)
2718 .Case("amdfam10", CK_AMDFAM10)
2719 .Case("btver1", CK_BTVER1)
2720 .Case("btver2", CK_BTVER2)
2721 .Case("bdver1", CK_BDVER1)
2722 .Case("bdver2", CK_BDVER2)
2723 .Case("bdver3", CK_BDVER3)
2724 .Case("bdver4", CK_BDVER4)
2725 .Case("x86-64", CK_x86_64)
2726 .Case("geode", CK_Geode)
2727 .Default(CK_Generic);
2728 }
2729
Rafael Espindolaeb265472013-08-21 21:59:03 +00002730 enum FPMathKind {
2731 FP_Default,
2732 FP_SSE,
2733 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002734 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002735
Eli Friedman3fd920a2008-08-20 02:34:37 +00002736public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002737 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2738 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002739 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002740 }
Craig Topper3164f332014-03-11 03:39:26 +00002741 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002742 // X87 evaluates with 80 bits "long double" precision.
2743 return SSELevel == NoSSE ? 2 : 0;
2744 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002745 ArrayRef<const char *> getGCCRegNames() const override {
2746 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002747 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002748 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2749 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002750 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002751 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2752 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002753 }
Eric Christopherd9832702015-06-29 21:00:05 +00002754 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002755 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002756 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002757
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002758 bool validateGlobalRegisterVariable(StringRef RegName,
2759 unsigned RegSize,
2760 bool &HasSizeMismatch) const override {
2761 // esp and ebp are the only 32-bit registers the x86 backend can currently
2762 // handle.
2763 if (RegName.equals("esp") || RegName.equals("ebp")) {
2764 // Check that the register size is 32-bit.
2765 HasSizeMismatch = RegSize != 32;
2766 return true;
2767 }
2768
2769 return false;
2770 }
2771
Akira Hatanaka974131e2014-09-18 18:17:18 +00002772 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2773
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002774 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2775
Akira Hatanaka974131e2014-09-18 18:17:18 +00002776 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2777
Craig Topper3164f332014-03-11 03:39:26 +00002778 std::string convertConstraint(const char *&Constraint) const override;
2779 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002780 return "~{dirflag},~{fpsr},~{flags}";
2781 }
Craig Topper3164f332014-03-11 03:39:26 +00002782 void getTargetDefines(const LangOptions &Opts,
2783 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002784 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2785 bool Enabled);
2786 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2787 bool Enabled);
2788 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2789 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002790 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2791 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002792 setFeatureEnabledImpl(Features, Name, Enabled);
2793 }
2794 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002795 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002796 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2797 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002798 bool
2799 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2800 StringRef CPU,
2801 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002802 bool hasFeature(StringRef Feature) const override;
2803 bool handleTargetFeatures(std::vector<std::string> &Features,
2804 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002805 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002806 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2807 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002808 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002809 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002810 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002811 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002812 return "no-mmx";
2813 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002814 }
Craig Topper3164f332014-03-11 03:39:26 +00002815 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002816 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002817
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002818 // Perform any per-CPU checks necessary to determine if this CPU is
2819 // acceptable.
2820 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2821 // invalid without explaining *why*.
2822 switch (CPU) {
2823 case CK_Generic:
2824 // No processor selected!
2825 return false;
2826
2827 case CK_i386:
2828 case CK_i486:
2829 case CK_WinChipC6:
2830 case CK_WinChip2:
2831 case CK_C3:
2832 case CK_i586:
2833 case CK_Pentium:
2834 case CK_PentiumMMX:
2835 case CK_i686:
2836 case CK_PentiumPro:
2837 case CK_Pentium2:
2838 case CK_Pentium3:
2839 case CK_Pentium3M:
2840 case CK_PentiumM:
2841 case CK_Yonah:
2842 case CK_C3_2:
2843 case CK_Pentium4:
2844 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002845 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002846 case CK_Prescott:
2847 case CK_K6:
2848 case CK_K6_2:
2849 case CK_K6_3:
2850 case CK_Athlon:
2851 case CK_AthlonThunderbird:
2852 case CK_Athlon4:
2853 case CK_AthlonXP:
2854 case CK_AthlonMP:
2855 case CK_Geode:
2856 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002857 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002858 return false;
2859
2860 // Fallthrough
2861 case CK_Nocona:
2862 case CK_Core2:
2863 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002864 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002865 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002866 case CK_Nehalem:
2867 case CK_Westmere:
2868 case CK_SandyBridge:
2869 case CK_IvyBridge:
2870 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002871 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002872 case CK_SkylakeClient:
2873 case CK_SkylakeServer:
2874 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002875 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002876 case CK_Athlon64:
2877 case CK_Athlon64SSE3:
2878 case CK_AthlonFX:
2879 case CK_K8:
2880 case CK_K8SSE3:
2881 case CK_Opteron:
2882 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002883 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002884 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002885 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002886 case CK_BDVER1:
2887 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002888 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002889 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002890 case CK_x86_64:
2891 return true;
2892 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002893 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002894 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002895
Craig Topper3164f332014-03-11 03:39:26 +00002896 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002897
Craig Topper3164f332014-03-11 03:39:26 +00002898 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002899 // Most of the non-ARM calling conventions are i386 conventions.
2900 switch (CC) {
2901 case CC_X86ThisCall:
2902 case CC_X86FastCall:
2903 case CC_X86StdCall:
2904 case CC_X86VectorCall:
2905 case CC_C:
2906 case CC_Swift:
2907 case CC_X86Pascal:
2908 case CC_IntelOclBicc:
2909 return CCCR_OK;
2910 default:
2911 return CCCR_Warning;
2912 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002913 }
2914
Craig Topper3164f332014-03-11 03:39:26 +00002915 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002916 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002917 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002918
2919 bool hasSjLjLowering() const override {
2920 return true;
2921 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002922
2923 void setSupportedOpenCLOpts() override {
2924 getSupportedOpenCLOpts().setAll();
2925 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002926};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002927
Rafael Espindolaeb265472013-08-21 21:59:03 +00002928bool X86TargetInfo::setFPMath(StringRef Name) {
2929 if (Name == "387") {
2930 FPMath = FP_387;
2931 return true;
2932 }
2933 if (Name == "sse") {
2934 FPMath = FP_SSE;
2935 return true;
2936 }
2937 return false;
2938}
2939
Eric Christopher007b0a02015-08-28 22:32:01 +00002940bool X86TargetInfo::initFeatureMap(
2941 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002942 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002943 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002944 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002945 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002946 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002947
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002948 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002949
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002950 // Enable X87 for all X86 processors but Lakemont.
2951 if (Kind != CK_Lakemont)
2952 setFeatureEnabledImpl(Features, "x87", true);
2953
2954 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002955 case CK_Generic:
2956 case CK_i386:
2957 case CK_i486:
2958 case CK_i586:
2959 case CK_Pentium:
2960 case CK_i686:
2961 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002962 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002963 break;
2964 case CK_PentiumMMX:
2965 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002966 case CK_K6:
2967 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002968 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002969 break;
2970 case CK_Pentium3:
2971 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002972 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002973 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002974 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002975 break;
2976 case CK_PentiumM:
2977 case CK_Pentium4:
2978 case CK_Pentium4M:
2979 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002980 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002981 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002982 break;
2983 case CK_Yonah:
2984 case CK_Prescott:
2985 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002986 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002987 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002988 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002989 break;
2990 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002991 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002992 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002993 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002994 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002995 break;
2996 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002997 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002998 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002999 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003000 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003001 case CK_Cannonlake:
3002 setFeatureEnabledImpl(Features, "avx512ifma", true);
3003 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3004 setFeatureEnabledImpl(Features, "sha", true);
3005 setFeatureEnabledImpl(Features, "umip", true);
3006 // FALLTHROUGH
3007 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003008 setFeatureEnabledImpl(Features, "avx512f", true);
3009 setFeatureEnabledImpl(Features, "avx512cd", true);
3010 setFeatureEnabledImpl(Features, "avx512dq", true);
3011 setFeatureEnabledImpl(Features, "avx512bw", true);
3012 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003013 setFeatureEnabledImpl(Features, "pku", true);
3014 setFeatureEnabledImpl(Features, "pcommit", true);
3015 setFeatureEnabledImpl(Features, "clwb", true);
3016 // FALLTHROUGH
3017 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003018 setFeatureEnabledImpl(Features, "xsavec", true);
3019 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003020 setFeatureEnabledImpl(Features, "mpx", true);
3021 setFeatureEnabledImpl(Features, "sgx", true);
3022 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003023 // FALLTHROUGH
3024 case CK_Broadwell:
3025 setFeatureEnabledImpl(Features, "rdseed", true);
3026 setFeatureEnabledImpl(Features, "adx", true);
3027 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003028 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003029 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003030 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003031 setFeatureEnabledImpl(Features, "bmi", true);
3032 setFeatureEnabledImpl(Features, "bmi2", true);
3033 setFeatureEnabledImpl(Features, "rtm", true);
3034 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003035 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003036 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003037 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003038 setFeatureEnabledImpl(Features, "rdrnd", true);
3039 setFeatureEnabledImpl(Features, "f16c", true);
3040 setFeatureEnabledImpl(Features, "fsgsbase", true);
3041 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003042 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003043 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003044 setFeatureEnabledImpl(Features, "xsave", true);
3045 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003046 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003047 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003048 case CK_Silvermont:
3049 setFeatureEnabledImpl(Features, "aes", true);
3050 setFeatureEnabledImpl(Features, "pclmul", true);
3051 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003052 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003053 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003054 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003055 setFeatureEnabledImpl(Features, "cx16", true);
3056 break;
3057 case CK_KNL:
3058 setFeatureEnabledImpl(Features, "avx512f", true);
3059 setFeatureEnabledImpl(Features, "avx512cd", true);
3060 setFeatureEnabledImpl(Features, "avx512er", true);
3061 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003062 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003063 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003064 setFeatureEnabledImpl(Features, "rdseed", true);
3065 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003066 setFeatureEnabledImpl(Features, "lzcnt", true);
3067 setFeatureEnabledImpl(Features, "bmi", true);
3068 setFeatureEnabledImpl(Features, "bmi2", true);
3069 setFeatureEnabledImpl(Features, "rtm", true);
3070 setFeatureEnabledImpl(Features, "fma", true);
3071 setFeatureEnabledImpl(Features, "rdrnd", true);
3072 setFeatureEnabledImpl(Features, "f16c", true);
3073 setFeatureEnabledImpl(Features, "fsgsbase", true);
3074 setFeatureEnabledImpl(Features, "aes", true);
3075 setFeatureEnabledImpl(Features, "pclmul", true);
3076 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003077 setFeatureEnabledImpl(Features, "xsaveopt", true);
3078 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003079 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003080 break;
3081 case CK_K6_2:
3082 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003083 case CK_WinChip2:
3084 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003085 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003086 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003087 case CK_Athlon:
3088 case CK_AthlonThunderbird:
3089 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003090 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003091 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003092 case CK_Athlon4:
3093 case CK_AthlonXP:
3094 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003095 setFeatureEnabledImpl(Features, "sse", true);
3096 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003097 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003098 break;
3099 case CK_K8:
3100 case CK_Opteron:
3101 case CK_Athlon64:
3102 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003103 setFeatureEnabledImpl(Features, "sse2", true);
3104 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003105 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003106 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003107 case CK_AMDFAM10:
3108 setFeatureEnabledImpl(Features, "sse4a", true);
3109 setFeatureEnabledImpl(Features, "lzcnt", true);
3110 setFeatureEnabledImpl(Features, "popcnt", true);
3111 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003112 case CK_K8SSE3:
3113 case CK_OpteronSSE3:
3114 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003115 setFeatureEnabledImpl(Features, "sse3", true);
3116 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003117 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003118 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003119 case CK_BTVER2:
3120 setFeatureEnabledImpl(Features, "avx", true);
3121 setFeatureEnabledImpl(Features, "aes", true);
3122 setFeatureEnabledImpl(Features, "pclmul", true);
3123 setFeatureEnabledImpl(Features, "bmi", true);
3124 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003125 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003126 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003127 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003128 setFeatureEnabledImpl(Features, "ssse3", true);
3129 setFeatureEnabledImpl(Features, "sse4a", true);
3130 setFeatureEnabledImpl(Features, "lzcnt", true);
3131 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003132 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003133 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003134 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003135 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003136 case CK_BDVER4:
3137 setFeatureEnabledImpl(Features, "avx2", true);
3138 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003139 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003140 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003141 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003142 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003143 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003144 // FALLTHROUGH
3145 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003146 setFeatureEnabledImpl(Features, "bmi", true);
3147 setFeatureEnabledImpl(Features, "fma", true);
3148 setFeatureEnabledImpl(Features, "f16c", true);
3149 setFeatureEnabledImpl(Features, "tbm", true);
3150 // FALLTHROUGH
3151 case CK_BDVER1:
3152 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003153 setFeatureEnabledImpl(Features, "xop", true);
3154 setFeatureEnabledImpl(Features, "lzcnt", true);
3155 setFeatureEnabledImpl(Features, "aes", true);
3156 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003157 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003158 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003159 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003160 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003161 break;
Eli Friedman33465822011-07-08 23:31:17 +00003162 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003163 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3164 return false;
3165
3166 // Can't do this earlier because we need to be able to explicitly enable
3167 // or disable these features and the things that they depend upon.
3168
3169 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3170 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003171 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003172 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3173 FeaturesVec.end())
3174 Features["popcnt"] = true;
3175
3176 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3177 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003178 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003179 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3180 FeaturesVec.end())
3181 Features["prfchw"] = true;
3182
Eric Christophera7260af2015-10-08 20:10:18 +00003183 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3184 // then enable MMX.
3185 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003186 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003187 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3188 FeaturesVec.end())
3189 Features["mmx"] = true;
3190
Eric Christopherbbd746d2015-10-08 20:10:14 +00003191 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003192}
3193
Rafael Espindolae62e2792013-08-20 13:44:29 +00003194void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003195 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 if (Enabled) {
3197 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003198 case AVX512F:
3199 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003200 case AVX2:
3201 Features["avx2"] = true;
3202 case AVX:
3203 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003204 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003205 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003206 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003207 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003208 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003209 case SSSE3:
3210 Features["ssse3"] = true;
3211 case SSE3:
3212 Features["sse3"] = true;
3213 case SSE2:
3214 Features["sse2"] = true;
3215 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003216 Features["sse"] = true;
3217 case NoSSE:
3218 break;
3219 }
3220 return;
3221 }
3222
3223 switch (Level) {
3224 case NoSSE:
3225 case SSE1:
3226 Features["sse"] = false;
3227 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003228 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3229 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003230 case SSE3:
3231 Features["sse3"] = false;
3232 setXOPLevel(Features, NoXOP, false);
3233 case SSSE3:
3234 Features["ssse3"] = false;
3235 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003236 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003237 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003238 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003239 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003240 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3241 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003242 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003243 case AVX2:
3244 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003245 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003246 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003247 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003248 Features["avx512vl"] = Features["avx512vbmi"] =
3249 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 }
3251}
3252
3253void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003254 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003255 if (Enabled) {
3256 switch (Level) {
3257 case AMD3DNowAthlon:
3258 Features["3dnowa"] = true;
3259 case AMD3DNow:
3260 Features["3dnow"] = true;
3261 case MMX:
3262 Features["mmx"] = true;
3263 case NoMMX3DNow:
3264 break;
3265 }
3266 return;
3267 }
3268
3269 switch (Level) {
3270 case NoMMX3DNow:
3271 case MMX:
3272 Features["mmx"] = false;
3273 case AMD3DNow:
3274 Features["3dnow"] = false;
3275 case AMD3DNowAthlon:
3276 Features["3dnowa"] = false;
3277 }
3278}
3279
3280void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003281 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003282 if (Enabled) {
3283 switch (Level) {
3284 case XOP:
3285 Features["xop"] = true;
3286 case FMA4:
3287 Features["fma4"] = true;
3288 setSSELevel(Features, AVX, true);
3289 case SSE4A:
3290 Features["sse4a"] = true;
3291 setSSELevel(Features, SSE3, true);
3292 case NoXOP:
3293 break;
3294 }
3295 return;
3296 }
3297
3298 switch (Level) {
3299 case NoXOP:
3300 case SSE4A:
3301 Features["sse4a"] = false;
3302 case FMA4:
3303 Features["fma4"] = false;
3304 case XOP:
3305 Features["xop"] = false;
3306 }
3307}
3308
Craig Topper86d79ef2013-09-17 04:51:29 +00003309void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3310 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003311 // This is a bit of a hack to deal with the sse4 target feature when used
3312 // as part of the target attribute. We handle sse4 correctly everywhere
3313 // else. See below for more information on how we handle the sse4 options.
3314 if (Name != "sse4")
3315 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003316
Craig Topper29561122013-09-19 01:13:07 +00003317 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003318 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003319 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003320 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003321 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003322 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003323 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003324 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003325 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003326 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003327 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003328 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003329 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003330 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003331 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003332 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003333 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003334 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003335 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003336 if (Enabled)
3337 setSSELevel(Features, SSE2, Enabled);
3338 } else if (Name == "pclmul") {
3339 if (Enabled)
3340 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003341 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003342 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003343 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003344 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003345 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003346 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003347 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3348 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3349 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003350 if (Enabled)
3351 setSSELevel(Features, AVX512F, Enabled);
3352 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003353 if (Enabled)
3354 setSSELevel(Features, AVX, Enabled);
3355 } else if (Name == "fma4") {
3356 setXOPLevel(Features, FMA4, Enabled);
3357 } else if (Name == "xop") {
3358 setXOPLevel(Features, XOP, Enabled);
3359 } else if (Name == "sse4a") {
3360 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003361 } else if (Name == "f16c") {
3362 if (Enabled)
3363 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003364 } else if (Name == "sha") {
3365 if (Enabled)
3366 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003367 } else if (Name == "sse4") {
3368 // We can get here via the __target__ attribute since that's not controlled
3369 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3370 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3371 // disabled.
3372 if (Enabled)
3373 setSSELevel(Features, SSE42, Enabled);
3374 else
3375 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003376 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003377 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003378 Features["xsaveopt"] = false;
3379 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003380 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003381 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003382 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003383}
3384
Eric Christopher3ff21b32013-10-16 21:26:26 +00003385/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003386/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003387bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003388 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003389 for (const auto &Feature : Features) {
3390 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003391 continue;
3392
Eric Christopher610fe112015-08-26 08:21:55 +00003393 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003394 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003395 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003396 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003397 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003398 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003399 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003400 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003401 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003402 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003403 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003404 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003405 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003406 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003407 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003408 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003409 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003410 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003411 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003412 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003413 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003414 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003415 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003416 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003417 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003418 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003419 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003420 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003421 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003422 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003423 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003424 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003425 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003426 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003427 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003428 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003429 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003430 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003431 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003432 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003433 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003434 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003435 } else if (Feature == "+avx512vbmi") {
3436 HasAVX512VBMI = true;
3437 } else if (Feature == "+avx512ifma") {
3438 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003439 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003440 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003441 } else if (Feature == "+mpx") {
3442 HasMPX = true;
3443 } else if (Feature == "+movbe") {
3444 HasMOVBE = true;
3445 } else if (Feature == "+sgx") {
3446 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003447 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003448 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003449 } else if (Feature == "+fxsr") {
3450 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003451 } else if (Feature == "+xsave") {
3452 HasXSAVE = true;
3453 } else if (Feature == "+xsaveopt") {
3454 HasXSAVEOPT = true;
3455 } else if (Feature == "+xsavec") {
3456 HasXSAVEC = true;
3457 } else if (Feature == "+xsaves") {
3458 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003459 } else if (Feature == "+mwaitx") {
3460 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003461 } else if (Feature == "+pku") {
3462 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003463 } else if (Feature == "+clflushopt") {
3464 HasCLFLUSHOPT = true;
3465 } else if (Feature == "+pcommit") {
3466 HasPCOMMIT = true;
3467 } else if (Feature == "+clwb") {
3468 HasCLWB = true;
3469 } else if (Feature == "+umip") {
3470 HasUMIP = true;
3471 } else if (Feature == "+prefetchwt1") {
3472 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003473 }
3474
Benjamin Kramer27402c62012-03-05 15:10:44 +00003475 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003476 .Case("+avx512f", AVX512F)
3477 .Case("+avx2", AVX2)
3478 .Case("+avx", AVX)
3479 .Case("+sse4.2", SSE42)
3480 .Case("+sse4.1", SSE41)
3481 .Case("+ssse3", SSSE3)
3482 .Case("+sse3", SSE3)
3483 .Case("+sse2", SSE2)
3484 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003485 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003486 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003487
Eli Friedman33465822011-07-08 23:31:17 +00003488 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003489 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003490 .Case("+3dnowa", AMD3DNowAthlon)
3491 .Case("+3dnow", AMD3DNow)
3492 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003493 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003494 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003495
3496 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003497 .Case("+xop", XOP)
3498 .Case("+fma4", FMA4)
3499 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003500 .Default(NoXOP);
3501 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003502 }
Eli Friedman33465822011-07-08 23:31:17 +00003503
Rafael Espindolaeb265472013-08-21 21:59:03 +00003504 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3505 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003506 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3507 (FPMath == FP_387 && SSELevel >= SSE1)) {
3508 Diags.Report(diag::err_target_unsupported_fpmath) <<
3509 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003510 return false;
3511 }
3512
Alexey Bataev00396512015-07-02 03:40:19 +00003513 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003514 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003515 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003516}
Chris Lattnerecd49032009-03-02 22:27:17 +00003517
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003518/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3519/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003520void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003521 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003522 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003523 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003524 Builder.defineMacro("__amd64__");
3525 Builder.defineMacro("__amd64");
3526 Builder.defineMacro("__x86_64");
3527 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003528 if (getTriple().getArchName() == "x86_64h") {
3529 Builder.defineMacro("__x86_64h");
3530 Builder.defineMacro("__x86_64h__");
3531 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003532 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003533 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003534 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003535
Chris Lattnerecd49032009-03-02 22:27:17 +00003536 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003537 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3538 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003539 switch (CPU) {
3540 case CK_Generic:
3541 break;
3542 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003543 // The rest are coming from the i386 define above.
3544 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003545 break;
3546 case CK_i486:
3547 case CK_WinChipC6:
3548 case CK_WinChip2:
3549 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003550 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003551 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003552 case CK_PentiumMMX:
3553 Builder.defineMacro("__pentium_mmx__");
3554 Builder.defineMacro("__tune_pentium_mmx__");
3555 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 case CK_i586:
3557 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003558 defineCPUMacros(Builder, "i586");
3559 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003560 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003561 case CK_Pentium3:
3562 case CK_Pentium3M:
3563 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003564 Builder.defineMacro("__tune_pentium3__");
3565 // Fallthrough
3566 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003567 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003568 Builder.defineMacro("__tune_pentium2__");
3569 // Fallthrough
3570 case CK_PentiumPro:
3571 Builder.defineMacro("__tune_i686__");
3572 Builder.defineMacro("__tune_pentiumpro__");
3573 // Fallthrough
3574 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003575 Builder.defineMacro("__i686");
3576 Builder.defineMacro("__i686__");
3577 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3578 Builder.defineMacro("__pentiumpro");
3579 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003580 break;
3581 case CK_Pentium4:
3582 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003583 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003584 break;
3585 case CK_Yonah:
3586 case CK_Prescott:
3587 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003588 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003589 break;
3590 case CK_Core2:
3591 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003592 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003593 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003594 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003595 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003596 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003597 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003598 defineCPUMacros(Builder, "slm");
3599 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003600 case CK_Nehalem:
3601 case CK_Westmere:
3602 case CK_SandyBridge:
3603 case CK_IvyBridge:
3604 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003605 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003606 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003607 // FIXME: Historically, we defined this legacy name, it would be nice to
3608 // remove it at some point. We've never exposed fine-grained names for
3609 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003610 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003611 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003612 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003613 defineCPUMacros(Builder, "skx");
3614 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003615 case CK_Cannonlake:
3616 break;
Craig Topper449314e2013-08-20 07:09:39 +00003617 case CK_KNL:
3618 defineCPUMacros(Builder, "knl");
3619 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003620 case CK_Lakemont:
3621 Builder.defineMacro("__tune_lakemont__");
3622 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003623 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003624 Builder.defineMacro("__k6_2__");
3625 Builder.defineMacro("__tune_k6_2__");
3626 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003627 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003628 if (CPU != CK_K6_2) { // In case of fallthrough
3629 // FIXME: GCC may be enabling these in cases where some other k6
3630 // architecture is specified but -m3dnow is explicitly provided. The
3631 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003632 Builder.defineMacro("__k6_3__");
3633 Builder.defineMacro("__tune_k6_3__");
3634 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003635 // Fallthrough
3636 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003637 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003638 break;
3639 case CK_Athlon:
3640 case CK_AthlonThunderbird:
3641 case CK_Athlon4:
3642 case CK_AthlonXP:
3643 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003644 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003645 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003646 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003647 Builder.defineMacro("__tune_athlon_sse__");
3648 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003649 break;
3650 case CK_K8:
3651 case CK_K8SSE3:
3652 case CK_x86_64:
3653 case CK_Opteron:
3654 case CK_OpteronSSE3:
3655 case CK_Athlon64:
3656 case CK_Athlon64SSE3:
3657 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003658 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003659 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003660 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003661 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003662 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003663 case CK_BTVER1:
3664 defineCPUMacros(Builder, "btver1");
3665 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003666 case CK_BTVER2:
3667 defineCPUMacros(Builder, "btver2");
3668 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003669 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003670 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003671 break;
3672 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003673 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003674 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003675 case CK_BDVER3:
3676 defineCPUMacros(Builder, "bdver3");
3677 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003678 case CK_BDVER4:
3679 defineCPUMacros(Builder, "bdver4");
3680 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003681 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003682 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003683 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003684 }
Chris Lattner96e43572009-03-02 22:40:39 +00003685
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003686 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003687 Builder.defineMacro("__REGISTER_PREFIX__", "");
3688
Chris Lattner6df41af2009-04-19 17:32:33 +00003689 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3690 // functions in glibc header files that use FP Stack inline asm which the
3691 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003692 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003693
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003694 if (HasAES)
3695 Builder.defineMacro("__AES__");
3696
Craig Topper3f122a72012-05-31 05:18:48 +00003697 if (HasPCLMUL)
3698 Builder.defineMacro("__PCLMUL__");
3699
Craig Topper22967d42011-12-25 05:06:45 +00003700 if (HasLZCNT)
3701 Builder.defineMacro("__LZCNT__");
3702
Benjamin Kramer1e250392012-07-07 09:39:18 +00003703 if (HasRDRND)
3704 Builder.defineMacro("__RDRND__");
3705
Craig Topper8c7f2512014-11-03 06:51:41 +00003706 if (HasFSGSBASE)
3707 Builder.defineMacro("__FSGSBASE__");
3708
Craig Topper22967d42011-12-25 05:06:45 +00003709 if (HasBMI)
3710 Builder.defineMacro("__BMI__");
3711
3712 if (HasBMI2)
3713 Builder.defineMacro("__BMI2__");
3714
Craig Topper1de83482011-12-29 16:10:46 +00003715 if (HasPOPCNT)
3716 Builder.defineMacro("__POPCNT__");
3717
Michael Liao625a8752012-11-10 05:17:46 +00003718 if (HasRTM)
3719 Builder.defineMacro("__RTM__");
3720
Michael Liao74f4eaf2013-03-26 17:52:08 +00003721 if (HasPRFCHW)
3722 Builder.defineMacro("__PRFCHW__");
3723
Michael Liaoffaae352013-03-29 05:17:55 +00003724 if (HasRDSEED)
3725 Builder.defineMacro("__RDSEED__");
3726
Robert Khasanov50e6f582014-09-19 09:53:48 +00003727 if (HasADX)
3728 Builder.defineMacro("__ADX__");
3729
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003730 if (HasTBM)
3731 Builder.defineMacro("__TBM__");
3732
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003733 if (HasMWAITX)
3734 Builder.defineMacro("__MWAITX__");
3735
Rafael Espindolae62e2792013-08-20 13:44:29 +00003736 switch (XOPLevel) {
3737 case XOP:
3738 Builder.defineMacro("__XOP__");
3739 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003740 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003741 case SSE4A:
3742 Builder.defineMacro("__SSE4A__");
3743 case NoXOP:
3744 break;
3745 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003746
Craig Topperbba778b2012-06-03 21:46:30 +00003747 if (HasFMA)
3748 Builder.defineMacro("__FMA__");
3749
Manman Rena45358c2012-10-11 00:59:55 +00003750 if (HasF16C)
3751 Builder.defineMacro("__F16C__");
3752
Craig Topper679b53a2013-08-21 05:29:10 +00003753 if (HasAVX512CD)
3754 Builder.defineMacro("__AVX512CD__");
3755 if (HasAVX512ER)
3756 Builder.defineMacro("__AVX512ER__");
3757 if (HasAVX512PF)
3758 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003759 if (HasAVX512DQ)
3760 Builder.defineMacro("__AVX512DQ__");
3761 if (HasAVX512BW)
3762 Builder.defineMacro("__AVX512BW__");
3763 if (HasAVX512VL)
3764 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003765 if (HasAVX512VBMI)
3766 Builder.defineMacro("__AVX512VBMI__");
3767 if (HasAVX512IFMA)
3768 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003769
Ben Langmuir58078d02013-09-19 13:22:04 +00003770 if (HasSHA)
3771 Builder.defineMacro("__SHA__");
3772
Craig Toppere33f51f2015-10-16 06:22:36 +00003773 if (HasFXSR)
3774 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003775 if (HasXSAVE)
3776 Builder.defineMacro("__XSAVE__");
3777 if (HasXSAVEOPT)
3778 Builder.defineMacro("__XSAVEOPT__");
3779 if (HasXSAVEC)
3780 Builder.defineMacro("__XSAVEC__");
3781 if (HasXSAVES)
3782 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003783 if (HasPKU)
3784 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003785 if (HasCX16)
3786 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3787
Chris Lattner96e43572009-03-02 22:40:39 +00003788 // Each case falls through to the previous one here.
3789 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003790 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003791 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003792 case AVX2:
3793 Builder.defineMacro("__AVX2__");
3794 case AVX:
3795 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003796 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003797 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003798 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003799 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003800 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003801 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003802 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003803 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003804 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003805 Builder.defineMacro("__SSE2__");
3806 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003807 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003808 Builder.defineMacro("__SSE__");
3809 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003810 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003811 break;
3812 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003813
Derek Schuffc7dd7222012-10-11 15:52:22 +00003814 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003815 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003816 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003817 case AVX2:
3818 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003819 case SSE42:
3820 case SSE41:
3821 case SSSE3:
3822 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003823 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003824 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003825 break;
3826 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003827 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003828 break;
3829 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003830 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003831 }
3832 }
3833
Anders Carlssone437c682010-01-27 03:47:49 +00003834 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003835 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003836 case AMD3DNowAthlon:
3837 Builder.defineMacro("__3dNOW_A__");
3838 case AMD3DNow:
3839 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003840 case MMX:
3841 Builder.defineMacro("__MMX__");
3842 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003843 break;
3844 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003845
3846 if (CPU >= CK_i486) {
3847 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3848 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3849 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3850 }
3851 if (CPU >= CK_i586)
3852 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003853}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003854
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003855bool X86TargetInfo::hasFeature(StringRef Feature) const {
3856 return llvm::StringSwitch<bool>(Feature)
3857 .Case("aes", HasAES)
3858 .Case("avx", SSELevel >= AVX)
3859 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003860 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003861 .Case("avx512cd", HasAVX512CD)
3862 .Case("avx512er", HasAVX512ER)
3863 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003864 .Case("avx512dq", HasAVX512DQ)
3865 .Case("avx512bw", HasAVX512BW)
3866 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003867 .Case("avx512vbmi", HasAVX512VBMI)
3868 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003869 .Case("bmi", HasBMI)
3870 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003871 .Case("clflushopt", HasCLFLUSHOPT)
3872 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003873 .Case("cx16", HasCX16)
3874 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003875 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003876 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003877 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003878 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003879 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003880 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3881 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3882 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003883 .Case("movbe", HasMOVBE)
3884 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003885 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003886 .Case("pcommit", HasPCOMMIT)
3887 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003888 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003889 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003890 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003891 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003892 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003893 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003894 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003895 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003896 .Case("sse", SSELevel >= SSE1)
3897 .Case("sse2", SSELevel >= SSE2)
3898 .Case("sse3", SSELevel >= SSE3)
3899 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003900 .Case("sse4.1", SSELevel >= SSE41)
3901 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003902 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003903 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003904 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003905 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003906 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3907 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003908 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003909 .Case("xsave", HasXSAVE)
3910 .Case("xsavec", HasXSAVEC)
3911 .Case("xsaves", HasXSAVES)
3912 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003913 .Default(false);
3914}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003915
Eric Christopherd9832702015-06-29 21:00:05 +00003916// We can't use a generic validation scheme for the features accepted here
3917// versus subtarget features accepted in the target attribute because the
3918// bitfield structure that's initialized in the runtime only supports the
3919// below currently rather than the full range of subtarget features. (See
3920// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3921bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3922 return llvm::StringSwitch<bool>(FeatureStr)
3923 .Case("cmov", true)
3924 .Case("mmx", true)
3925 .Case("popcnt", true)
3926 .Case("sse", true)
3927 .Case("sse2", true)
3928 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003929 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003930 .Case("sse4.1", true)
3931 .Case("sse4.2", true)
3932 .Case("avx", true)
3933 .Case("avx2", true)
3934 .Case("sse4a", true)
3935 .Case("fma4", true)
3936 .Case("xop", true)
3937 .Case("fma", true)
3938 .Case("avx512f", true)
3939 .Case("bmi", true)
3940 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003941 .Case("aes", true)
3942 .Case("pclmul", true)
3943 .Case("avx512vl", true)
3944 .Case("avx512bw", true)
3945 .Case("avx512dq", true)
3946 .Case("avx512cd", true)
3947 .Case("avx512er", true)
3948 .Case("avx512pf", true)
3949 .Case("avx512vbmi", true)
3950 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003951 .Default(false);
3952}
3953
Eli Friedman3fd920a2008-08-20 02:34:37 +00003954bool
Anders Carlsson58436352009-02-28 17:11:49 +00003955X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003956 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003957 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003958 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003959 // Constant constraints.
3960 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3961 // instructions.
3962 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3963 // x86_64 instructions.
3964 case 's':
3965 Info.setRequiresImmediate();
3966 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003967 case 'I':
3968 Info.setRequiresImmediate(0, 31);
3969 return true;
3970 case 'J':
3971 Info.setRequiresImmediate(0, 63);
3972 return true;
3973 case 'K':
3974 Info.setRequiresImmediate(-128, 127);
3975 return true;
3976 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003977 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003978 return true;
3979 case 'M':
3980 Info.setRequiresImmediate(0, 3);
3981 return true;
3982 case 'N':
3983 Info.setRequiresImmediate(0, 255);
3984 return true;
3985 case 'O':
3986 Info.setRequiresImmediate(0, 127);
3987 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003988 // Register constraints.
3989 case 'Y': // 'Y' is the first character for several 2-character constraints.
3990 // Shift the pointer to the second character of the constraint.
3991 Name++;
3992 switch (*Name) {
3993 default:
3994 return false;
3995 case '0': // First SSE register.
3996 case 't': // Any SSE register, when SSE2 is enabled.
3997 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3998 case 'm': // Any MMX register, when inter-unit moves enabled.
3999 Info.setAllowsRegister();
4000 return true;
4001 }
4002 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004003 // Constraint 'f' cannot be used for output operands.
4004 if (Info.ConstraintStr[0] == '=')
4005 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004006 Info.setAllowsRegister();
4007 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004008 case 'a': // eax.
4009 case 'b': // ebx.
4010 case 'c': // ecx.
4011 case 'd': // edx.
4012 case 'S': // esi.
4013 case 'D': // edi.
4014 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004015 case 't': // Top of floating point stack.
4016 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004017 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004018 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004019 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004020 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004021 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4022 case 'l': // "Index" registers: any general register that can be used as an
4023 // index in a base+index memory access.
4024 Info.setAllowsRegister();
4025 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004026 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004027 case 'C': // SSE floating point constant.
4028 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004029 return true;
4030 }
4031}
4032
Akira Hatanaka974131e2014-09-18 18:17:18 +00004033bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4034 unsigned Size) const {
4035 // Strip off constraint modifiers.
4036 while (Constraint[0] == '=' ||
4037 Constraint[0] == '+' ||
4038 Constraint[0] == '&')
4039 Constraint = Constraint.substr(1);
4040
4041 return validateOperandSize(Constraint, Size);
4042}
4043
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004044bool X86TargetInfo::validateInputSize(StringRef Constraint,
4045 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004046 return validateOperandSize(Constraint, Size);
4047}
4048
4049bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4050 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004051 switch (Constraint[0]) {
4052 default: break;
4053 case 'y':
4054 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004055 case 'f':
4056 case 't':
4057 case 'u':
4058 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004059 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004060 if (SSELevel >= AVX512F)
4061 // 512-bit zmm registers can be used if target supports AVX512F.
4062 return Size <= 512U;
4063 else if (SSELevel >= AVX)
4064 // 256-bit ymm registers can be used if target supports AVX.
4065 return Size <= 256U;
4066 return Size <= 128U;
4067 case 'Y':
4068 // 'Y' is the first character for several 2-character constraints.
4069 switch (Constraint[1]) {
4070 default: break;
4071 case 'm':
4072 // 'Ym' is synonymous with 'y'.
4073 return Size <= 64;
4074 case 'i':
4075 case 't':
4076 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4077 if (SSELevel >= AVX512F)
4078 return Size <= 512U;
4079 else if (SSELevel >= AVX)
4080 return Size <= 256U;
4081 return SSELevel >= SSE2 && Size <= 128U;
4082 }
4083
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004084 }
4085
4086 return true;
4087}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004088
Eli Friedman3fd920a2008-08-20 02:34:37 +00004089std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004090X86TargetInfo::convertConstraint(const char *&Constraint) const {
4091 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004092 case 'a': return std::string("{ax}");
4093 case 'b': return std::string("{bx}");
4094 case 'c': return std::string("{cx}");
4095 case 'd': return std::string("{dx}");
4096 case 'S': return std::string("{si}");
4097 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004098 case 'p': // address
4099 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004100 case 't': // top of floating point stack.
4101 return std::string("{st}");
4102 case 'u': // second from top of floating point stack.
4103 return std::string("{st(1)}"); // second from top of floating point stack.
4104 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004105 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004106 }
4107}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004108
Eli Friedman3fd920a2008-08-20 02:34:37 +00004109// X86-32 generic target
4110class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004112 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4113 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004114 DoubleAlign = LongLongAlign = 32;
4115 LongDoubleWidth = 96;
4116 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004117 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004118 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004119 SizeType = UnsignedInt;
4120 PtrDiffType = SignedInt;
4121 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004122 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004123
4124 // Use fpret for all types.
4125 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4126 (1 << TargetInfo::Double) |
4127 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004128
4129 // x86-32 has atomics up to 8 bytes
4130 // FIXME: Check that we actually have cmpxchg8b before setting
4131 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4132 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004133 }
Craig Topper3164f332014-03-11 03:39:26 +00004134 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004135 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004136 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004137
Craig Topper3164f332014-03-11 03:39:26 +00004138 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004139 if (RegNo == 0) return 0;
4140 if (RegNo == 1) return 2;
4141 return -1;
4142 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004143 bool validateOperandSize(StringRef Constraint,
4144 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004145 switch (Constraint[0]) {
4146 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004147 case 'R':
4148 case 'q':
4149 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004150 case 'a':
4151 case 'b':
4152 case 'c':
4153 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004154 case 'S':
4155 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004156 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004157 case 'A':
4158 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004159 }
4160
Akira Hatanaka974131e2014-09-18 18:17:18 +00004161 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004162 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004163 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4164 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4165 Builtin::FirstTSBuiltin + 1);
4166 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004167};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004168
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004169class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4170public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004171 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4172 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004173
Craig Topper3164f332014-03-11 03:39:26 +00004174 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004175 unsigned Major, Minor, Micro;
4176 getTriple().getOSVersion(Major, Minor, Micro);
4177 // New NetBSD uses the default rounding mode.
4178 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4179 return X86_32TargetInfo::getFloatEvalMethod();
4180 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004181 return 1;
4182 }
4183};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004184
Eli Friedmane3aa4542009-07-05 18:47:56 +00004185class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4186public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004187 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4188 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004189 SizeType = UnsignedLong;
4190 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004191 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004192 }
4193};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004194
Eli Friedman9fa28852012-08-08 23:57:20 +00004195class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4196public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004197 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4198 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004199 SizeType = UnsignedLong;
4200 IntPtrType = SignedLong;
4201 PtrDiffType = SignedLong;
4202 }
4203};
Eli Friedman9fa28852012-08-08 23:57:20 +00004204
Torok Edwinb2b37c62009-06-30 17:10:35 +00004205class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004206public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004207 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4208 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004209 LongDoubleWidth = 128;
4210 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004211 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004212 MaxVectorAlign = 256;
4213 // The watchOS simulator uses the builtin bool type for Objective-C.
4214 llvm::Triple T = llvm::Triple(Triple);
4215 if (T.isWatchOS())
4216 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004217 SizeType = UnsignedLong;
4218 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004219 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004220 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004221 }
4222
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004223 bool handleTargetFeatures(std::vector<std::string> &Features,
4224 DiagnosticsEngine &Diags) override {
4225 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4226 Diags))
4227 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004228 // We now know the features we have: we can decide how to align vectors.
4229 MaxVectorAlign =
4230 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004231 return true;
4232 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004233};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004234
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004235// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004236class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004237public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004238 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4239 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004240 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004241 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004242 bool IsWinCOFF =
4243 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004244 resetDataLayout(IsWinCOFF
4245 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4246 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004247 }
Craig Topper3164f332014-03-11 03:39:26 +00004248 void getTargetDefines(const LangOptions &Opts,
4249 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004250 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4251 }
4252};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004253
4254// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004255class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004256public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004257 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4258 const TargetOptions &Opts)
4259 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004260 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004261 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4262 }
Craig Topper3164f332014-03-11 03:39:26 +00004263 void getTargetDefines(const LangOptions &Opts,
4264 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004265 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4266 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4267 // The value of the following reflects processor type.
4268 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4269 // We lost the original triple, so we use the default.
4270 Builder.defineMacro("_M_IX86", "600");
4271 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004272};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004273
David Majnemerae1ed0e2015-05-28 04:36:18 +00004274static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004275 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4276 // supports __declspec natively under -fms-extensions, but we define a no-op
4277 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004278 if (Opts.MicrosoftExt)
4279 Builder.defineMacro("__declspec", "__declspec");
4280 else
4281 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4282
4283 if (!Opts.MicrosoftExt) {
4284 // Provide macros for all the calling convention keywords. Provide both
4285 // single and double underscore prefixed variants. These are available on
4286 // x64 as well as x86, even though they have no effect.
4287 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4288 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004289 std::string GCCSpelling = "__attribute__((__";
4290 GCCSpelling += CC;
4291 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004292 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4293 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4294 }
4295 }
4296}
4297
David Majnemerae1ed0e2015-05-28 04:36:18 +00004298static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4299 Builder.defineMacro("__MSVCRT__");
4300 Builder.defineMacro("__MINGW32__");
4301 addCygMingDefines(Opts, Builder);
4302}
4303
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004304// x86-32 MinGW target
4305class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4306public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004307 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4308 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004309 void getTargetDefines(const LangOptions &Opts,
4310 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004311 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004312 DefineStd(Builder, "WIN32", Opts);
4313 DefineStd(Builder, "WINNT", Opts);
4314 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004315 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004316 }
4317};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004318
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004319// x86-32 Cygwin target
4320class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4321public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004322 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4323 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004324 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004325 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004326 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 +00004327 }
Craig Topper3164f332014-03-11 03:39:26 +00004328 void getTargetDefines(const LangOptions &Opts,
4329 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004330 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004331 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004332 Builder.defineMacro("__CYGWIN__");
4333 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004334 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004335 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004336 if (Opts.CPlusPlus)
4337 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004338 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004339};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004340
Chris Lattnerb986aba2010-04-11 19:29:39 +00004341// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004342class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004343public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004344 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004345 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004346 }
Craig Topper3164f332014-03-11 03:39:26 +00004347 void getTargetDefines(const LangOptions &Opts,
4348 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004349 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004350 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004351 }
4352};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004353
Alexey Bataevc99b0492015-11-25 09:24:26 +00004354// X86-32 MCU target
4355class MCUX86_32TargetInfo : public X86_32TargetInfo {
4356public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004357 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4358 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004359 LongDoubleWidth = 64;
4360 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004361 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 +00004362 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004363 }
4364
4365 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4366 // On MCU we support only C calling convention.
4367 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4368 }
4369
4370 void getTargetDefines(const LangOptions &Opts,
4371 MacroBuilder &Builder) const override {
4372 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4373 Builder.defineMacro("__iamcu");
4374 Builder.defineMacro("__iamcu__");
4375 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004376
4377 bool allowsLargerPreferedTypeAlignment() const override {
4378 return false;
4379 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004380};
4381
Douglas Gregor9fabd852011-07-01 22:41:14 +00004382// RTEMS Target
4383template<typename Target>
4384class RTEMSTargetInfo : public OSTargetInfo<Target> {
4385protected:
Craig Topper3164f332014-03-11 03:39:26 +00004386 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4387 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004388 // RTEMS defines; list based off of gcc output
4389
Douglas Gregor9fabd852011-07-01 22:41:14 +00004390 Builder.defineMacro("__rtems__");
4391 Builder.defineMacro("__ELF__");
4392 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004393
Douglas Gregor9fabd852011-07-01 22:41:14 +00004394public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004395 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4396 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004397 switch (Triple.getArch()) {
4398 default:
4399 case llvm::Triple::x86:
4400 // this->MCountName = ".mcount";
4401 break;
4402 case llvm::Triple::mips:
4403 case llvm::Triple::mipsel:
4404 case llvm::Triple::ppc:
4405 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004406 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004407 // this->MCountName = "_mcount";
4408 break;
4409 case llvm::Triple::arm:
4410 // this->MCountName = "__mcount";
4411 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004412 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004413 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004414};
4415
Douglas Gregor9fabd852011-07-01 22:41:14 +00004416// x86-32 RTEMS target
4417class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4418public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004419 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4420 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004421 SizeType = UnsignedLong;
4422 IntPtrType = SignedLong;
4423 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004424 }
Craig Topper3164f332014-03-11 03:39:26 +00004425 void getTargetDefines(const LangOptions &Opts,
4426 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004427 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4428 Builder.defineMacro("__INTEL__");
4429 Builder.defineMacro("__rtems__");
4430 }
4431};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004432
Eli Friedman3fd920a2008-08-20 02:34:37 +00004433// x86-64 generic target
4434class X86_64TargetInfo : public X86TargetInfo {
4435public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004436 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4437 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004438 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004439 bool IsWinCOFF =
4440 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004441 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004442 LongDoubleWidth = 128;
4443 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004444 LargeArrayMinWidth = 128;
4445 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004446 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004447 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4448 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4449 IntPtrType = IsX32 ? SignedInt : SignedLong;
4450 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004451 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004452 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004453
Eric Christopher917e9522014-11-18 22:36:15 +00004454 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004455 resetDataLayout(IsX32
4456 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4457 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4458 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004459
4460 // Use fpret only for long double.
4461 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004462
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004463 // Use fp2ret for _Complex long double.
4464 ComplexLongDoubleUsesFP2Ret = true;
4465
Charles Davisc7d5c942015-09-17 20:55:33 +00004466 // Make __builtin_ms_va_list available.
4467 HasBuiltinMSVaList = true;
4468
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004469 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004470 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004471 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004472 }
Craig Topper3164f332014-03-11 03:39:26 +00004473 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004474 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004475 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004476
Craig Topper3164f332014-03-11 03:39:26 +00004477 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004478 if (RegNo == 0) return 0;
4479 if (RegNo == 1) return 1;
4480 return -1;
4481 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004482
Craig Topper3164f332014-03-11 03:39:26 +00004483 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004484 switch (CC) {
4485 case CC_C:
4486 case CC_Swift:
4487 case CC_X86VectorCall:
4488 case CC_IntelOclBicc:
4489 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004490 case CC_PreserveMost:
4491 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004492 return CCCR_OK;
4493 default:
4494 return CCCR_Warning;
4495 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004496 }
4497
Craig Topper3164f332014-03-11 03:39:26 +00004498 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004499 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004500 }
4501
Pavel Chupinfd223e12014-08-04 12:39:43 +00004502 // for x32 we need it here explicitly
4503 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004504 unsigned getUnwindWordWidth() const override { return 64; }
4505 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004506
4507 bool validateGlobalRegisterVariable(StringRef RegName,
4508 unsigned RegSize,
4509 bool &HasSizeMismatch) const override {
4510 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4511 // handle.
4512 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4513 // Check that the register size is 64-bit.
4514 HasSizeMismatch = RegSize != 64;
4515 return true;
4516 }
4517
4518 // Check if the register is a 32-bit register the backend can handle.
4519 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4520 HasSizeMismatch);
4521 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004522 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4523 return llvm::makeArrayRef(BuiltinInfoX86,
4524 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4525 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004526};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004527
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004528// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004529class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004530public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004531 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4532 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004533 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004534 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004535 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004536 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004537 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004538 SizeType = UnsignedLongLong;
4539 PtrDiffType = SignedLongLong;
4540 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004541 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004542
Craig Topper3164f332014-03-11 03:39:26 +00004543 void getTargetDefines(const LangOptions &Opts,
4544 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004545 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004546 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004547 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004548
Craig Topper3164f332014-03-11 03:39:26 +00004549 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004550 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004551 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004552
Craig Topper3164f332014-03-11 03:39:26 +00004553 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004554 switch (CC) {
4555 case CC_X86StdCall:
4556 case CC_X86ThisCall:
4557 case CC_X86FastCall:
4558 return CCCR_Ignore;
4559 case CC_C:
4560 case CC_X86VectorCall:
4561 case CC_IntelOclBicc:
4562 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004563 case CC_Swift:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004564 return CCCR_OK;
4565 default:
4566 return CCCR_Warning;
4567 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004568 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004569};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004570
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004571// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004572class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004573public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004574 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4575 const TargetOptions &Opts)
4576 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004577 LongDoubleWidth = LongDoubleAlign = 64;
4578 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004579 }
Craig Topper3164f332014-03-11 03:39:26 +00004580 void getTargetDefines(const LangOptions &Opts,
4581 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004582 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4583 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004584 Builder.defineMacro("_M_X64", "100");
4585 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004586 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004587};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004588
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004589// x86-64 MinGW target
4590class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004592 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4593 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004594 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4595 // with x86 FP ops. Weird.
4596 LongDoubleWidth = LongDoubleAlign = 128;
4597 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4598 }
4599
Craig Topper3164f332014-03-11 03:39:26 +00004600 void getTargetDefines(const LangOptions &Opts,
4601 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004602 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004603 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004604 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004605 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004606
4607 // GCC defines this macro when it is using __gxx_personality_seh0.
4608 if (!Opts.SjLjExceptions)
4609 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004610 }
4611};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004612
Yaron Kerend030d112015-07-22 17:38:19 +00004613// x86-64 Cygwin target
4614class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4615public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004616 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4617 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004618 TLSSupported = false;
4619 WCharType = UnsignedShort;
4620 }
4621 void getTargetDefines(const LangOptions &Opts,
4622 MacroBuilder &Builder) const override {
4623 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4624 Builder.defineMacro("__x86_64__");
4625 Builder.defineMacro("__CYGWIN__");
4626 Builder.defineMacro("__CYGWIN64__");
4627 addCygMingDefines(Opts, Builder);
4628 DefineStd(Builder, "unix", Opts);
4629 if (Opts.CPlusPlus)
4630 Builder.defineMacro("_GNU_SOURCE");
4631
4632 // GCC defines this macro when it is using __gxx_personality_seh0.
4633 if (!Opts.SjLjExceptions)
4634 Builder.defineMacro("__SEH__");
4635 }
4636};
4637
Eli Friedman2857ccb2009-07-01 03:36:11 +00004638class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4639public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004640 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4641 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004642 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004643 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4644 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004645 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004646 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004647 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004648 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004649
4650 bool handleTargetFeatures(std::vector<std::string> &Features,
4651 DiagnosticsEngine &Diags) override {
4652 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4653 Diags))
4654 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004655 // We now know the features we have: we can decide how to align vectors.
4656 MaxVectorAlign =
4657 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004658 return true;
4659 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004660};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004661
Eli Friedman245f2292009-07-05 22:31:18 +00004662class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4663public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004664 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4665 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004666 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004667 Int64Type = SignedLongLong;
4668 }
4669};
Eli Friedman245f2292009-07-05 22:31:18 +00004670
Eli Friedman9fa28852012-08-08 23:57:20 +00004671class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4672public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004673 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4674 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004675 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004676 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004677 }
4678};
Tim Northover9bb857a2013-01-31 12:13:10 +00004679
Eli Friedmanf05b7722008-08-20 07:44:10 +00004680class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004681 // Possible FPU choices.
4682 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004683 VFP2FPU = (1 << 0),
4684 VFP3FPU = (1 << 1),
4685 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004686 NeonFPU = (1 << 3),
4687 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004688 };
4689
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004690 // Possible HWDiv features.
4691 enum HWDivMode {
4692 HWDivThumb = (1 << 0),
4693 HWDivARM = (1 << 1)
4694 };
4695
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004696 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004697 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004698 }
4699
4700 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4701 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004702
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004703 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004704
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004705 StringRef CPUProfile;
4706 StringRef CPUAttr;
4707
Rafael Espindolaeb265472013-08-21 21:59:03 +00004708 enum {
4709 FP_Default,
4710 FP_VFP,
4711 FP_Neon
4712 } FPMath;
4713
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004714 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004715 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004716 unsigned ArchProfile;
4717 unsigned ArchVersion;
4718
Bernard Ogdenda13af32013-10-24 18:32:51 +00004719 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004720
Logan Chien57086ce2012-10-10 06:56:20 +00004721 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004722 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004723
4724 // Initialized via features.
4725 unsigned SoftFloat : 1;
4726 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004727
Bernard Ogden18b57012013-10-29 09:47:51 +00004728 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004729 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004730 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004731 unsigned Unaligned : 1;
4732
4733 enum {
4734 LDREX_B = (1 << 0), /// byte (8-bit)
4735 LDREX_H = (1 << 1), /// half (16-bit)
4736 LDREX_W = (1 << 2), /// word (32-bit)
4737 LDREX_D = (1 << 3), /// double (64-bit)
4738 };
4739
4740 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004741
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004742 // ACLE 6.5.1 Hardware floating point
4743 enum {
4744 HW_FP_HP = (1 << 1), /// half (16-bit)
4745 HW_FP_SP = (1 << 2), /// single (32-bit)
4746 HW_FP_DP = (1 << 3), /// double (64-bit)
4747 };
4748 uint32_t HW_FP;
4749
Chris Lattner5cc15e02010-03-03 19:03:45 +00004750 static const Builtin::Info BuiltinInfo[];
4751
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004752 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004753 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004754
4755 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004756 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004757
Renato Golin0201a9e2016-09-22 19:28:20 +00004758 // size_t is unsigned long on MachO-derived environments, NetBSD,
4759 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004760 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004761 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004762 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004763 SizeType = UnsignedLong;
4764 else
4765 SizeType = UnsignedInt;
4766
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004767 switch (T.getOS()) {
4768 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004769 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004770 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004771 break;
4772 case llvm::Triple::Win32:
4773 WCharType = UnsignedShort;
4774 break;
4775 case llvm::Triple::Linux:
4776 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004777 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4778 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004779 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004780 }
4781
4782 UseBitFieldTypeAlignment = true;
4783
4784 ZeroLengthBitfieldBoundary = 0;
4785
Tim Northover147cd2f2014-10-14 22:12:21 +00004786 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4787 // so set preferred for small types to 32.
4788 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004789 resetDataLayout(BigEndian
4790 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4791 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004792 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004793 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004794 resetDataLayout("e"
4795 "-m:w"
4796 "-p:32:32"
4797 "-i64:64"
4798 "-v128:64:128"
4799 "-a:0:32"
4800 "-n32"
4801 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004802 } else if (T.isOSNaCl()) {
4803 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004804 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004805 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004806 resetDataLayout(BigEndian
4807 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4808 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004809 }
4810
4811 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004812 }
4813
Tim Northover5627d392015-10-30 16:30:45 +00004814 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004815 const llvm::Triple &T = getTriple();
4816
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004817 IsAAPCS = false;
4818
Tim Northover5627d392015-10-30 16:30:45 +00004819 if (IsAAPCS16)
4820 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4821 else
4822 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004823
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004824 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004825 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004826 SizeType = UnsignedInt;
4827 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004828 SizeType = UnsignedLong;
4829
4830 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4831 WCharType = SignedInt;
4832
4833 // Do not respect the alignment of bit-field types when laying out
4834 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4835 UseBitFieldTypeAlignment = false;
4836
4837 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4838 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4839 /// gcc.
4840 ZeroLengthBitfieldBoundary = 32;
4841
Tim Northover5627d392015-10-30 16:30:45 +00004842 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4843 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004844 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004845 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004846 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004847 BigEndian
4848 ? "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 +00004849 : "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 +00004850 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004851 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004852 BigEndian
4853 ? "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 +00004854 : "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 +00004855
4856 // FIXME: Override "preferred align" for double and long long.
4857 }
4858
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004859 void setArchInfo() {
4860 StringRef ArchName = getTriple().getArchName();
4861
Renato Goline84b0002015-10-08 16:43:26 +00004862 ArchISA = llvm::ARM::parseArchISA(ArchName);
4863 CPU = llvm::ARM::getDefaultCPU(ArchName);
4864 unsigned AK = llvm::ARM::parseArch(ArchName);
4865 if (AK != llvm::ARM::AK_INVALID)
4866 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004867 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004868 }
4869
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004870 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004871 StringRef SubArch;
4872
4873 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004874 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004875 SubArch = llvm::ARM::getSubArch(ArchKind);
4876 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4877 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004878
4879 // cache CPU related strings
4880 CPUAttr = getCPUAttr();
4881 CPUProfile = getCPUProfile();
4882 }
4883
4884 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004885 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004886 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004887 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004888 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4889 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004890 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004891 if (ArchProfile == llvm::ARM::PK_M) {
4892 MaxAtomicPromoteWidth = 32;
4893 if (ShouldUseInlineAtomic)
4894 MaxAtomicInlineWidth = 32;
4895 }
4896 else {
4897 MaxAtomicPromoteWidth = 64;
4898 if (ShouldUseInlineAtomic)
4899 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004900 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004901 }
4902
4903 bool isThumb() const {
4904 return (ArchISA == llvm::ARM::IK_THUMB);
4905 }
4906
4907 bool supportsThumb() const {
4908 return CPUAttr.count('T') || ArchVersion >= 6;
4909 }
4910
4911 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004912 return CPUAttr.equals("6T2") ||
4913 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004914 }
4915
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004916 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004917 // For most sub-arches, the build attribute CPU name is enough.
4918 // For Cortex variants, it's slightly different.
4919 switch(ArchKind) {
4920 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004921 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004922 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004923 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004924 case llvm::ARM::AK_ARMV7S:
4925 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004926 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004927 return "7A";
4928 case llvm::ARM::AK_ARMV7R:
4929 return "7R";
4930 case llvm::ARM::AK_ARMV7M:
4931 return "7M";
4932 case llvm::ARM::AK_ARMV7EM:
4933 return "7EM";
4934 case llvm::ARM::AK_ARMV8A:
4935 return "8A";
4936 case llvm::ARM::AK_ARMV8_1A:
4937 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004938 case llvm::ARM::AK_ARMV8_2A:
4939 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004940 case llvm::ARM::AK_ARMV8MBaseline:
4941 return "8M_BASE";
4942 case llvm::ARM::AK_ARMV8MMainline:
4943 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00004944 case llvm::ARM::AK_ARMV8R:
4945 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004946 }
4947 }
4948
4949 StringRef getCPUProfile() const {
4950 switch(ArchProfile) {
4951 case llvm::ARM::PK_A:
4952 return "A";
4953 case llvm::ARM::PK_R:
4954 return "R";
4955 case llvm::ARM::PK_M:
4956 return "M";
4957 default:
4958 return "";
4959 }
4960 }
4961
Chris Lattner17df24e2008-04-21 18:56:49 +00004962public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004963 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004964 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4965 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004966
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004967 switch (getTriple().getOS()) {
4968 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004969 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004970 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004971 break;
4972 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004973 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004974 break;
4975 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004976
Renato Goline84b0002015-10-08 16:43:26 +00004977 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004978 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004979
Chris Lattner1a8f3942010-04-23 16:29:58 +00004980 // {} in inline assembly are neon specifiers, not assembly variant
4981 // specifiers.
4982 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004983
Eric Christopher0e261882014-12-05 01:06:59 +00004984 // FIXME: This duplicates code from the driver that sets the -target-abi
4985 // option - this code is used if -target-abi isn't passed and should
4986 // be unified in some way.
4987 if (Triple.isOSBinFormatMachO()) {
4988 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4989 // the frontend matches that.
4990 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4991 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004992 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004993 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004994 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004995 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004996 } else {
4997 setABI("apcs-gnu");
4998 }
4999 } else if (Triple.isOSWindows()) {
5000 // FIXME: this is invalid for WindowsCE
5001 setABI("aapcs");
5002 } else {
5003 // Select the default based on the platform.
5004 switch (Triple.getEnvironment()) {
5005 case llvm::Triple::Android:
5006 case llvm::Triple::GNUEABI:
5007 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005008 case llvm::Triple::MuslEABI:
5009 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005010 setABI("aapcs-linux");
5011 break;
5012 case llvm::Triple::EABIHF:
5013 case llvm::Triple::EABI:
5014 setABI("aapcs");
5015 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005016 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005017 setABI("apcs-gnu");
5018 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005019 default:
5020 if (Triple.getOS() == llvm::Triple::NetBSD)
5021 setABI("apcs-gnu");
5022 else
5023 setABI("aapcs");
5024 break;
5025 }
5026 }
John McCall86353412010-08-21 22:46:04 +00005027
5028 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005029 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005030
Renato Golin15b86152015-07-03 16:41:13 +00005031 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005032 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005033
James Molloya7139222012-03-12 09:14:10 +00005034 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005035 // the alignment of the zero-length bitfield is greater than the member
5036 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005037 // zero length bitfield.
5038 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005039
5040 if (Triple.getOS() == llvm::Triple::Linux ||
5041 Triple.getOS() == llvm::Triple::UnknownOS)
5042 this->MCountName =
5043 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005044 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005045
Alp Toker4925ba72014-06-07 23:30:42 +00005046 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005047
Craig Topper3164f332014-03-11 03:39:26 +00005048 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005049 ABI = Name;
5050
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005051 // The defaults (above) are for AAPCS, check if we need to change them.
5052 //
5053 // FIXME: We need support for -meabi... we could just mangle it into the
5054 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005055 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005056 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005057 return true;
5058 }
5059 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5060 setABIAAPCS();
5061 return true;
5062 }
5063 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005064 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005065
Renato Golinf5c4dec2015-05-27 13:33:00 +00005066 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005067 bool
5068 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5069 StringRef CPU,
5070 const std::vector<std::string> &FeaturesVec) const override {
5071
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005072 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005073 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005074
5075 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005076 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005077 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5078
5079 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005080 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005081 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5082
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005083 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005084 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005085 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005086
Eric Christopher007b0a02015-08-28 22:32:01 +00005087 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005088 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005089
Craig Topper3164f332014-03-11 03:39:26 +00005090 bool handleTargetFeatures(std::vector<std::string> &Features,
5091 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005092 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005093 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005094 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005095 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005096 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005097 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005098 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005099
Ranjeet Singhac08e532015-06-24 23:39:25 +00005100 // This does not diagnose illegal cases like having both
5101 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5102 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005103 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005104 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005105 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005106 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005107 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005108 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005109 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005110 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005111 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005112 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005113 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005114 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005115 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005116 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005117 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005118 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005119 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005120 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005121 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005122 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005123 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005124 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005125 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005126 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005127 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005128 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005129 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005130 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005131 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005132 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005133 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005134 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005135 } else if (Feature == "+strict-align") {
5136 Unaligned = 0;
5137 } else if (Feature == "+fp16") {
5138 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005139 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005140 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005141 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005142
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005143 switch (ArchVersion) {
5144 case 6:
5145 if (ArchProfile == llvm::ARM::PK_M)
5146 LDREX = 0;
5147 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5148 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5149 else
5150 LDREX = LDREX_W;
5151 break;
5152 case 7:
5153 if (ArchProfile == llvm::ARM::PK_M)
5154 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5155 else
5156 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5157 break;
5158 case 8:
5159 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5160 }
5161
Rafael Espindolaeb265472013-08-21 21:59:03 +00005162 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5163 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5164 return false;
5165 }
5166
5167 if (FPMath == FP_Neon)
5168 Features.push_back("+neonfp");
5169 else if (FPMath == FP_VFP)
5170 Features.push_back("-neonfp");
5171
Daniel Dunbar893d4752009-12-19 04:15:38 +00005172 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005173 auto Feature =
5174 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5175 if (Feature != Features.end())
5176 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005177
Rafael Espindolaeb265472013-08-21 21:59:03 +00005178 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005179 }
5180
Craig Topper3164f332014-03-11 03:39:26 +00005181 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005182 return llvm::StringSwitch<bool>(Feature)
5183 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005184 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005185 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005186 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005187 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005188 .Case("hwdiv", HWDiv & HWDivThumb)
5189 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005190 .Default(false);
5191 }
Renato Golin15b86152015-07-03 16:41:13 +00005192
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005193 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005194 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005195 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005196
Renato Golin15b86152015-07-03 16:41:13 +00005197 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005198 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005199 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005200 CPU = Name;
5201 return true;
5202 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005203
Craig Topper3164f332014-03-11 03:39:26 +00005204 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005205
Craig Topper3164f332014-03-11 03:39:26 +00005206 void getTargetDefines(const LangOptions &Opts,
5207 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005208 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005209 Builder.defineMacro("__arm");
5210 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005211 // For bare-metal none-eabi.
5212 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5213 getTriple().getEnvironment() == llvm::Triple::EABI)
5214 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005215
Chris Lattnerecd49032009-03-02 22:27:17 +00005216 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005217 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005218
5219 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5220 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005221 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005222 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5223
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005224 if (!CPUAttr.empty())
5225 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005226
5227 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005228 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005229 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005230
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005231 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005232 // ACLE 6.5.7 Crypto Extension
5233 if (Crypto)
5234 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5235 // ACLE 6.5.8 CRC32 Extension
5236 if (CRC)
5237 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5238 // ACLE 6.5.10 Numeric Maximum and Minimum
5239 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5240 // ACLE 6.5.9 Directed Rounding
5241 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005242 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005243
5244 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5245 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005246 // NOTE that the default profile is assumed to be 'A'
5247 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005248 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5249
Bradley Smithf4affc12016-03-03 13:52:22 +00005250 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5251 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5252 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5253 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005254 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005255 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005256 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005257 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5258
5259 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5260 // instruction set such as ARM or Thumb.
5261 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5262
5263 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5264
5265 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005266 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005267 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005268
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005269 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005270 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005271 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005272
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005273 // ACLE 6.4.4 LDREX/STREX
5274 if (LDREX)
5275 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5276
5277 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005278 if (ArchVersion == 5 ||
5279 (ArchVersion == 6 && CPUProfile != "M") ||
5280 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005281 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5282
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005283 // ACLE 6.5.1 Hardware Floating Point
5284 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005285 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005286
Yi Konga44c4d72014-06-27 21:25:42 +00005287 // ACLE predefines.
5288 Builder.defineMacro("__ARM_ACLE", "200");
5289
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005290 // FP16 support (we currently only support IEEE format).
5291 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5292 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5293
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005294 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005295 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005296 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5297
Mike Stump9d54bd72009-04-08 02:07:04 +00005298 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005299
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005300 // FIXME: It's more complicated than this and we don't really support
5301 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005302 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005303 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005304 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005305
David Tweed8f676532012-10-25 13:33:01 +00005306 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005307 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005308 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005309 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005310 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005311 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005312 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005313
Tim Northover28fc0e12016-04-28 13:59:55 +00005314 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5315 ABI == "aapcs16")
5316 Builder.defineMacro("__ARM_PCS_VFP", "1");
5317
Daniel Dunbar893d4752009-12-19 04:15:38 +00005318 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005319 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005320
Zijiao Ma56a83722016-08-17 02:13:33 +00005321 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005322 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005323
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005324 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005325 Builder.defineMacro("__THUMBEL__");
5326 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005327 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005328 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005329 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005330
5331 // ACLE 6.4.9 32-bit SIMD instructions
5332 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5333 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5334
5335 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005336 if (((HWDiv & HWDivThumb) && isThumb()) ||
5337 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005338 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005339 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005340 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005341
5342 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005343 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005344
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005345 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005346 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005347 if (FPU & VFP2FPU)
5348 Builder.defineMacro("__ARM_VFPV2__");
5349 if (FPU & VFP3FPU)
5350 Builder.defineMacro("__ARM_VFPV3__");
5351 if (FPU & VFP4FPU)
5352 Builder.defineMacro("__ARM_VFPV4__");
5353 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005354
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005355 // This only gets set when Neon instructions are actually available, unlike
5356 // the VFP define, hence the soft float and arch check. This is subtly
5357 // different from gcc, we follow the intent which was that it should be set
5358 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005359 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005360 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005361 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005362 // current AArch32 NEON implementations do not support double-precision
5363 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005364 Builder.defineMacro("__ARM_NEON_FP",
5365 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005366 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005367
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005368 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5369 Opts.ShortWChar ? "2" : "4");
5370
5371 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5372 Opts.ShortEnums ? "1" : "4");
5373
Bradley Smithf4affc12016-03-03 13:52:22 +00005374 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005375 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5376 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5377 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5378 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5379 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005380
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005381 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005382 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005383 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005384 }
5385
5386 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005387 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005388 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5389 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005390 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005391 }
5392
5393 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005394 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005395 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005396
5397 if (Opts.UnsafeFPMath)
5398 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005399
5400 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5401 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005402 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005403
Craig Topper6c03a542015-10-19 04:51:35 +00005404 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5405 return llvm::makeArrayRef(BuiltinInfo,
5406 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005407 }
Craig Topper3164f332014-03-11 03:39:26 +00005408 bool isCLZForZeroUndef() const override { return false; }
5409 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005410 return IsAAPCS
5411 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005412 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5413 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005414 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005415 ArrayRef<const char *> getGCCRegNames() const override;
5416 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005417 bool validateAsmConstraint(const char *&Name,
5418 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005419 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005420 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005421 case 'l': // r0-r7
5422 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005423 case 't': // VFP Floating point register single precision
5424 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005425 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005426 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005427 case 'I':
5428 case 'J':
5429 case 'K':
5430 case 'L':
5431 case 'M':
5432 // FIXME
5433 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005434 case 'Q': // A memory address that is a single base register.
5435 Info.setAllowsMemory();
5436 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005437 case 'U': // a memory reference...
5438 switch (Name[1]) {
5439 case 'q': // ...ARMV4 ldrsb
5440 case 'v': // ...VFP load/store (reg+constant offset)
5441 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005442 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005443 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005444 case 'n': // valid address for Neon doubleword vector load/store
5445 case 'm': // valid address for Neon element and structure load/store
5446 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005447 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005448 Info.setAllowsMemory();
5449 Name++;
5450 return true;
5451 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005452 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005453 return false;
5454 }
Craig Topper3164f332014-03-11 03:39:26 +00005455 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005456 std::string R;
5457 switch (*Constraint) {
5458 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005459 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005460 Constraint++;
5461 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005462 case 'p': // 'p' should be translated to 'r' by default.
5463 R = std::string("r");
5464 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005465 default:
5466 return std::string(1, *Constraint);
5467 }
5468 return R;
5469 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005470 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005471 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005472 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005473 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005474 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005475
Bill Wendling9d1ee112012-10-25 23:28:48 +00005476 // Strip off constraint modifiers.
5477 while (Constraint[0] == '=' ||
5478 Constraint[0] == '+' ||
5479 Constraint[0] == '&')
5480 Constraint = Constraint.substr(1);
5481
5482 switch (Constraint[0]) {
5483 default: break;
5484 case 'r': {
5485 switch (Modifier) {
5486 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005487 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005488 case 'q':
5489 // A register of size 32 cannot fit a vector type.
5490 return false;
5491 }
5492 }
5493 }
5494
5495 return true;
5496 }
Craig Topper3164f332014-03-11 03:39:26 +00005497 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005498 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005499 return "";
5500 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005501
Craig Topper3164f332014-03-11 03:39:26 +00005502 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005503 switch (CC) {
5504 case CC_AAPCS:
5505 case CC_AAPCS_VFP:
5506 case CC_Swift:
5507 return CCCR_OK;
5508 default:
5509 return CCCR_Warning;
5510 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005511 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005512
Craig Topper3164f332014-03-11 03:39:26 +00005513 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005514 if (RegNo == 0) return 0;
5515 if (RegNo == 1) return 1;
5516 return -1;
5517 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005518
5519 bool hasSjLjLowering() const override {
5520 return true;
5521 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005522};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005523
Rafael Espindolaeb265472013-08-21 21:59:03 +00005524bool ARMTargetInfo::setFPMath(StringRef Name) {
5525 if (Name == "neon") {
5526 FPMath = FP_Neon;
5527 return true;
5528 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5529 Name == "vfp4") {
5530 FPMath = FP_VFP;
5531 return true;
5532 }
5533 return false;
5534}
5535
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005536const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005537 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005538 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005539 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5540
5541 // Float registers
5542 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5543 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5544 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005545 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005546
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005547 // Double registers
5548 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5549 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005550 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5551 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005552
5553 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005554 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5555 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005556};
5557
Craig Topperf054e3a2015-10-19 03:52:27 +00005558ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5559 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005560}
5561
5562const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005563 { { "a1" }, "r0" },
5564 { { "a2" }, "r1" },
5565 { { "a3" }, "r2" },
5566 { { "a4" }, "r3" },
5567 { { "v1" }, "r4" },
5568 { { "v2" }, "r5" },
5569 { { "v3" }, "r6" },
5570 { { "v4" }, "r7" },
5571 { { "v5" }, "r8" },
5572 { { "v6", "rfp" }, "r9" },
5573 { { "sl" }, "r10" },
5574 { { "fp" }, "r11" },
5575 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005576 { { "r13" }, "sp" },
5577 { { "r14" }, "lr" },
5578 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005579 // The S, D and Q registers overlap, but aren't really aliases; we
5580 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005581};
5582
Craig Topperf054e3a2015-10-19 03:52:27 +00005583ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5584 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005585}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005586
5587const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005588#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005589 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005590#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5591 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005592#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005593
Craig Topper07d3b622015-08-07 05:14:44 +00005594#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005595 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005596#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005597 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005598#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5599 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005600#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5601 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005602#include "clang/Basic/BuiltinsARM.def"
5603};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005604
5605class ARMleTargetInfo : public ARMTargetInfo {
5606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005607 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005608 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005609 void getTargetDefines(const LangOptions &Opts,
5610 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005611 Builder.defineMacro("__ARMEL__");
5612 ARMTargetInfo::getTargetDefines(Opts, Builder);
5613 }
5614};
5615
5616class ARMbeTargetInfo : public ARMTargetInfo {
5617public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005618 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005619 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005620 void getTargetDefines(const LangOptions &Opts,
5621 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005622 Builder.defineMacro("__ARMEB__");
5623 Builder.defineMacro("__ARM_BIG_ENDIAN");
5624 ARMTargetInfo::getTargetDefines(Opts, Builder);
5625 }
5626};
Chris Lattner17df24e2008-04-21 18:56:49 +00005627
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005628class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5629 const llvm::Triple Triple;
5630public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005631 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5632 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005633 WCharType = UnsignedShort;
5634 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005635 }
5636 void getVisualStudioDefines(const LangOptions &Opts,
5637 MacroBuilder &Builder) const {
5638 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5639
5640 // FIXME: this is invalid for WindowsCE
5641 Builder.defineMacro("_M_ARM_NT", "1");
5642 Builder.defineMacro("_M_ARMT", "_M_ARM");
5643 Builder.defineMacro("_M_THUMB", "_M_ARM");
5644
5645 assert((Triple.getArch() == llvm::Triple::arm ||
5646 Triple.getArch() == llvm::Triple::thumb) &&
5647 "invalid architecture for Windows ARM target info");
5648 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5649 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5650
5651 // TODO map the complete set of values
5652 // 31: VFPv3 40: VFPv4
5653 Builder.defineMacro("_M_ARM_FP", "31");
5654 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005655 BuiltinVaListKind getBuiltinVaListKind() const override {
5656 return TargetInfo::CharPtrBuiltinVaList;
5657 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005658 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5659 switch (CC) {
5660 case CC_X86StdCall:
5661 case CC_X86ThisCall:
5662 case CC_X86FastCall:
5663 case CC_X86VectorCall:
5664 return CCCR_Ignore;
5665 case CC_C:
5666 return CCCR_OK;
5667 default:
5668 return CCCR_Warning;
5669 }
5670 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005671};
5672
5673// Windows ARM + Itanium C++ ABI Target
5674class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5675public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005676 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5677 const TargetOptions &Opts)
5678 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005679 TheCXXABI.set(TargetCXXABI::GenericARM);
5680 }
5681
5682 void getTargetDefines(const LangOptions &Opts,
5683 MacroBuilder &Builder) const override {
5684 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5685
5686 if (Opts.MSVCCompat)
5687 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5688 }
5689};
5690
5691// Windows ARM, MS (C++) ABI
5692class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5693public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005694 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5695 const TargetOptions &Opts)
5696 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005697 TheCXXABI.set(TargetCXXABI::Microsoft);
5698 }
5699
5700 void getTargetDefines(const LangOptions &Opts,
5701 MacroBuilder &Builder) const override {
5702 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5703 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5704 }
5705};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005706
Yaron Keren321249c2015-07-15 13:32:23 +00005707// ARM MinGW target
5708class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5709public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005710 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5711 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005712 TheCXXABI.set(TargetCXXABI::GenericARM);
5713 }
5714
5715 void getTargetDefines(const LangOptions &Opts,
5716 MacroBuilder &Builder) const override {
5717 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5718 DefineStd(Builder, "WIN32", Opts);
5719 DefineStd(Builder, "WINNT", Opts);
5720 Builder.defineMacro("_ARM_");
5721 addMinGWDefines(Opts, Builder);
5722 }
5723};
5724
5725// ARM Cygwin target
5726class CygwinARMTargetInfo : public ARMleTargetInfo {
5727public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005728 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5729 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005730 TLSSupported = false;
5731 WCharType = UnsignedShort;
5732 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005733 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005734 }
5735 void getTargetDefines(const LangOptions &Opts,
5736 MacroBuilder &Builder) const override {
5737 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5738 Builder.defineMacro("_ARM_");
5739 Builder.defineMacro("__CYGWIN__");
5740 Builder.defineMacro("__CYGWIN32__");
5741 DefineStd(Builder, "unix", Opts);
5742 if (Opts.CPlusPlus)
5743 Builder.defineMacro("_GNU_SOURCE");
5744 }
5745};
5746
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005747class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005748protected:
Craig Topper3164f332014-03-11 03:39:26 +00005749 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5750 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005751 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005752 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005753
Torok Edwinb2b37c62009-06-30 17:10:35 +00005754public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005755 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5756 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005757 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005758 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005759 // FIXME: This should be based off of the target features in
5760 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005761 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005762
Tim Northoverd88ecb32016-01-27 19:32:40 +00005763 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005764 // Darwin on iOS uses a variant of the ARM C++ ABI.
5765 TheCXXABI.set(TargetCXXABI::WatchOS);
5766
5767 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5768 // size_t is long, it's a bit weird for it to be int.
5769 PtrDiffType = SignedLong;
5770
5771 // BOOL should be a real boolean on the new ABI
5772 UseSignedCharForObjCBool = false;
5773 } else
5774 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005775 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005776};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005777
Tim Northover573cbee2014-05-24 12:52:07 +00005778class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005779 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005780 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5781 static const char *const GCCRegNames[];
5782
James Molloy75f5f9e2014-04-16 15:33:48 +00005783 enum FPUModeEnum {
5784 FPUMode,
5785 NeonMode
5786 };
5787
5788 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005789 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005790 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005791 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005792 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005793
Tim Northovera2ee4332014-03-29 15:09:45 +00005794 static const Builtin::Info BuiltinInfo[];
5795
5796 std::string ABI;
5797
5798public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005799 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005800 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005801 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5802 WCharType = SignedInt;
5803
5804 // NetBSD apparently prefers consistency across ARM targets to consistency
5805 // across 64-bit targets.
5806 Int64Type = SignedLongLong;
5807 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005808 } else {
5809 WCharType = UnsignedInt;
5810 Int64Type = SignedLong;
5811 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005812 }
5813
Tim Northovera2ee4332014-03-29 15:09:45 +00005814 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005815 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005816 MaxAtomicInlineWidth = 128;
5817 MaxAtomicPromoteWidth = 128;
5818
Tim Northovera6a19f12015-02-06 01:25:07 +00005819 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005820 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5821
Tim Northovera2ee4332014-03-29 15:09:45 +00005822 // {} in inline assembly are neon specifiers, not assembly variant
5823 // specifiers.
5824 NoAsmVariants = true;
5825
Tim Northover7ad87af2015-01-16 18:44:04 +00005826 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5827 // contributes to the alignment of the containing aggregate in the same way
5828 // a plain (non bit-field) member of that type would, without exception for
5829 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005830 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005831 UseZeroLengthBitfieldAlignment = true;
5832
Tim Northover573cbee2014-05-24 12:52:07 +00005833 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005834 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005835
5836 if (Triple.getOS() == llvm::Triple::Linux ||
5837 Triple.getOS() == llvm::Triple::UnknownOS)
5838 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005839 }
5840
Alp Toker4925ba72014-06-07 23:30:42 +00005841 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005842 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005843 if (Name != "aapcs" && Name != "darwinpcs")
5844 return false;
5845
5846 ABI = Name;
5847 return true;
5848 }
5849
David Blaikie1cbb9712014-11-14 19:09:44 +00005850 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005851 return Name == "generic" ||
5852 llvm::AArch64::parseCPUArch(Name) !=
5853 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005854 }
5855
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005856 void getTargetDefines(const LangOptions &Opts,
5857 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005858 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005859 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005860
5861 // Target properties.
5862 Builder.defineMacro("_LP64");
5863 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005864
5865 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5866 Builder.defineMacro("__ARM_ACLE", "200");
5867 Builder.defineMacro("__ARM_ARCH", "8");
5868 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5869
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005870 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005871 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005872 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005873
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005874 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5875 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5876 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5877 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005878 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005879 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5880 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005881
5882 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5883
5884 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005885 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005886
5887 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5888 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005889 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5890 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005891
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005892 if (Opts.UnsafeFPMath)
5893 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005894
5895 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5896
5897 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5898 Opts.ShortEnums ? "1" : "4");
5899
James Molloy75f5f9e2014-04-16 15:33:48 +00005900 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005901 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005902 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005903 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005904 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005905
Bradley Smith418c5932014-05-02 15:17:51 +00005906 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005907 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005908
James Molloy75f5f9e2014-04-16 15:33:48 +00005909 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005910 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5911
5912 if (Unaligned)
5913 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005914
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005915 if (V8_1A)
5916 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5917
Reid Klecknerd167d422015-05-06 15:31:46 +00005918 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5919 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5920 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5921 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5922 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005923 }
5924
Craig Topper6c03a542015-10-19 04:51:35 +00005925 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5926 return llvm::makeArrayRef(BuiltinInfo,
5927 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005928 }
5929
David Blaikie1cbb9712014-11-14 19:09:44 +00005930 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005931 return Feature == "aarch64" ||
5932 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005933 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005934 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005935 }
5936
James Molloy5e73df52014-04-16 15:06:20 +00005937 bool handleTargetFeatures(std::vector<std::string> &Features,
5938 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005939 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005940 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005941 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005942 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005943 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005944
Eric Christopher610fe112015-08-26 08:21:55 +00005945 for (const auto &Feature : Features) {
5946 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005947 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005948 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005949 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005950 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005951 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005952 if (Feature == "+strict-align")
5953 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005954 if (Feature == "+v8.1a")
5955 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005956 }
5957
James Y Knightb214cbc2016-03-04 19:00:41 +00005958 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005959
5960 return true;
5961 }
5962
John McCall477f2bb2016-03-03 06:39:32 +00005963 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5964 switch (CC) {
5965 case CC_C:
5966 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005967 case CC_PreserveMost:
5968 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005969 return CCCR_OK;
5970 default:
5971 return CCCR_Warning;
5972 }
5973 }
5974
David Blaikie1cbb9712014-11-14 19:09:44 +00005975 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005976
David Blaikie1cbb9712014-11-14 19:09:44 +00005977 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005978 return TargetInfo::AArch64ABIBuiltinVaList;
5979 }
5980
Craig Topperf054e3a2015-10-19 03:52:27 +00005981 ArrayRef<const char *> getGCCRegNames() const override;
5982 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005983
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005984 bool validateAsmConstraint(const char *&Name,
5985 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005986 switch (*Name) {
5987 default:
5988 return false;
5989 case 'w': // Floating point and SIMD registers (V0-V31)
5990 Info.setAllowsRegister();
5991 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005992 case 'I': // Constant that can be used with an ADD instruction
5993 case 'J': // Constant that can be used with a SUB instruction
5994 case 'K': // Constant that can be used with a 32-bit logical instruction
5995 case 'L': // Constant that can be used with a 64-bit logical instruction
5996 case 'M': // Constant that can be used as a 32-bit MOV immediate
5997 case 'N': // Constant that can be used as a 64-bit MOV immediate
5998 case 'Y': // Floating point constant zero
5999 case 'Z': // Integer constant zero
6000 return true;
6001 case 'Q': // A memory reference with base register and no offset
6002 Info.setAllowsMemory();
6003 return true;
6004 case 'S': // A symbolic address
6005 Info.setAllowsRegister();
6006 return true;
6007 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006008 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6009 // Utf: A memory address suitable for ldp/stp in TF mode.
6010 // Usa: An absolute symbolic address.
6011 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6012 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006013 case 'z': // Zero register, wzr or xzr
6014 Info.setAllowsRegister();
6015 return true;
6016 case 'x': // Floating point and SIMD registers (V0-V15)
6017 Info.setAllowsRegister();
6018 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006019 }
6020 return false;
6021 }
6022
Akira Hatanaka987f1862014-08-22 06:05:21 +00006023 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006024 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006025 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006026 // Strip off constraint modifiers.
6027 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6028 Constraint = Constraint.substr(1);
6029
6030 switch (Constraint[0]) {
6031 default:
6032 return true;
6033 case 'z':
6034 case 'r': {
6035 switch (Modifier) {
6036 case 'x':
6037 case 'w':
6038 // For now assume that the person knows what they're
6039 // doing with the modifier.
6040 return true;
6041 default:
6042 // By default an 'r' constraint will be in the 'x'
6043 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006044 if (Size == 64)
6045 return true;
6046
6047 SuggestedModifier = "w";
6048 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006049 }
6050 }
6051 }
6052 }
6053
David Blaikie1cbb9712014-11-14 19:09:44 +00006054 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006055
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006056 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006057 if (RegNo == 0)
6058 return 0;
6059 if (RegNo == 1)
6060 return 1;
6061 return -1;
6062 }
6063};
6064
Tim Northover573cbee2014-05-24 12:52:07 +00006065const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006066 // 32-bit Integer registers
6067 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6068 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6069 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6070
6071 // 64-bit Integer registers
6072 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6073 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6074 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6075
6076 // 32-bit floating point regsisters
6077 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6078 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6079 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6080
6081 // 64-bit floating point regsisters
6082 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6083 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6084 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6085
6086 // Vector registers
6087 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6088 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6089 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6090};
6091
Craig Topperf054e3a2015-10-19 03:52:27 +00006092ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6093 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006094}
6095
Tim Northover573cbee2014-05-24 12:52:07 +00006096const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006097 { { "w31" }, "wsp" },
6098 { { "x29" }, "fp" },
6099 { { "x30" }, "lr" },
6100 { { "x31" }, "sp" },
6101 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6102 // don't want to substitute one of these for a different-sized one.
6103};
6104
Craig Topperf054e3a2015-10-19 03:52:27 +00006105ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6106 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006107}
6108
Tim Northover573cbee2014-05-24 12:52:07 +00006109const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006110#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006111 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006112#include "clang/Basic/BuiltinsNEON.def"
6113
6114#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006115 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006116#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006117};
James Molloy5e73df52014-04-16 15:06:20 +00006118
Tim Northover573cbee2014-05-24 12:52:07 +00006119class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006120 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006121 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006122 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006123 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006124 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006125 }
6126
6127public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006128 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6129 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006130 }
James Molloy5e73df52014-04-16 15:06:20 +00006131 void getTargetDefines(const LangOptions &Opts,
6132 MacroBuilder &Builder) const override {
6133 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006134 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006135 }
6136};
6137
Tim Northover573cbee2014-05-24 12:52:07 +00006138class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006139 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006140 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006141 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006142 }
6143
6144public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006145 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6146 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006147 void getTargetDefines(const LangOptions &Opts,
6148 MacroBuilder &Builder) const override {
6149 Builder.defineMacro("__AARCH64EB__");
6150 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6151 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006152 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006153 }
6154};
Tim Northovera2ee4332014-03-29 15:09:45 +00006155
Tim Northover573cbee2014-05-24 12:52:07 +00006156class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006157protected:
6158 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6159 MacroBuilder &Builder) const override {
6160 Builder.defineMacro("__AARCH64_SIMD__");
6161 Builder.defineMacro("__ARM64_ARCH_8__");
6162 Builder.defineMacro("__ARM_NEON__");
6163 Builder.defineMacro("__LITTLE_ENDIAN__");
6164 Builder.defineMacro("__REGISTER_PREFIX__", "");
6165 Builder.defineMacro("__arm64", "1");
6166 Builder.defineMacro("__arm64__", "1");
6167
6168 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6169 }
6170
Tim Northovera2ee4332014-03-29 15:09:45 +00006171public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006172 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6173 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006174 Int64Type = SignedLongLong;
6175 WCharType = SignedInt;
6176 UseSignedCharForObjCBool = false;
6177
Tim Northovera6a19f12015-02-06 01:25:07 +00006178 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006179 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6180
6181 TheCXXABI.set(TargetCXXABI::iOS64);
6182 }
6183
David Blaikie1cbb9712014-11-14 19:09:44 +00006184 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006185 return TargetInfo::CharPtrBuiltinVaList;
6186 }
6187};
Tim Northovera2ee4332014-03-29 15:09:45 +00006188
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189// Hexagon abstract base class
6190class HexagonTargetInfo : public TargetInfo {
6191 static const Builtin::Info BuiltinInfo[];
6192 static const char * const GCCRegNames[];
6193 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6194 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006195 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006196 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006197
Tony Linthicum76329bf2011-12-12 21:14:55 +00006198public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006199 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6200 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006201 // Specify the vector alignment explicitly. For v512x1, the calculated
6202 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6203 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006204 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006205 "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 +00006206 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006207 SizeType = UnsignedInt;
6208 PtrDiffType = SignedInt;
6209 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006210
6211 // {} in inline assembly are packet specifiers, not assembly variant
6212 // specifiers.
6213 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006214
6215 LargeArrayMinWidth = 64;
6216 LargeArrayAlign = 64;
6217 UseBitFieldTypeAlignment = true;
6218 ZeroLengthBitfieldBoundary = 32;
6219 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006220 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006221 }
6222
Craig Topper6c03a542015-10-19 04:51:35 +00006223 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6224 return llvm::makeArrayRef(BuiltinInfo,
6225 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006226 }
6227
Craig Topper3164f332014-03-11 03:39:26 +00006228 bool validateAsmConstraint(const char *&Name,
6229 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006230 switch (*Name) {
6231 case 'v':
6232 case 'q':
6233 if (HasHVX) {
6234 Info.setAllowsRegister();
6235 return true;
6236 }
6237 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006238 case 's':
6239 // Relocatable constant.
6240 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006241 }
6242 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006243 }
6244
Craig Topper3164f332014-03-11 03:39:26 +00006245 void getTargetDefines(const LangOptions &Opts,
6246 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006247
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006248 bool isCLZForZeroUndef() const override { return false; }
6249
Craig Topper3164f332014-03-11 03:39:26 +00006250 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006251 return llvm::StringSwitch<bool>(Feature)
6252 .Case("hexagon", true)
6253 .Case("hvx", HasHVX)
6254 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006255 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006256 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006257 }
Craig Topper3164f332014-03-11 03:39:26 +00006258
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006259 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6260 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6261 const override;
6262
6263 bool handleTargetFeatures(std::vector<std::string> &Features,
6264 DiagnosticsEngine &Diags) override;
6265
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006266 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6267 bool Enabled) const override;
6268
Craig Topper3164f332014-03-11 03:39:26 +00006269 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006270 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006271 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006272 ArrayRef<const char *> getGCCRegNames() const override;
6273 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006274 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006275 return "";
6276 }
Sebastian Pop86500282012-01-13 20:37:10 +00006277
6278 static const char *getHexagonCPUSuffix(StringRef Name) {
6279 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006280 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006281 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006282 .Case("hexagonv55", "55")
6283 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006284 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006285 }
6286
Craig Topper3164f332014-03-11 03:39:26 +00006287 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006288 if (!getHexagonCPUSuffix(Name))
6289 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006290 CPU = Name;
6291 return true;
6292 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006293
6294 int getEHDataRegisterNumber(unsigned RegNo) const override {
6295 return RegNo < 2 ? RegNo : -1;
6296 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006297};
6298
6299void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006300 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006301 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006302 Builder.defineMacro("__hexagon__", "1");
6303
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006304 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006305 Builder.defineMacro("__HEXAGON_V4__");
6306 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006307 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006308 Builder.defineMacro("__QDSP6_V4__");
6309 Builder.defineMacro("__QDSP6_ARCH__", "4");
6310 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006311 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006312 Builder.defineMacro("__HEXAGON_V5__");
6313 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6314 if(Opts.HexagonQdsp6Compat) {
6315 Builder.defineMacro("__QDSP6_V5__");
6316 Builder.defineMacro("__QDSP6_ARCH__", "5");
6317 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006318 } else if (CPU == "hexagonv55") {
6319 Builder.defineMacro("__HEXAGON_V55__");
6320 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6321 Builder.defineMacro("__QDSP6_V55__");
6322 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006323 } else if (CPU == "hexagonv60") {
6324 Builder.defineMacro("__HEXAGON_V60__");
6325 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6326 Builder.defineMacro("__QDSP6_V60__");
6327 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006328 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006329
6330 if (hasFeature("hvx")) {
6331 Builder.defineMacro("__HVX__");
6332 if (hasFeature("hvx-double"))
6333 Builder.defineMacro("__HVXDBL__");
6334 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006335}
6336
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006337bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6338 DiagnosticsEngine &Diags, StringRef CPU,
6339 const std::vector<std::string> &FeaturesVec) const {
6340 // Default for v60: -hvx, -hvx-double.
6341 Features["hvx"] = false;
6342 Features["hvx-double"] = false;
6343 Features["long-calls"] = false;
6344
6345 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6346}
6347
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006348bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6349 DiagnosticsEngine &Diags) {
6350 for (auto &F : Features) {
6351 if (F == "+hvx")
6352 HasHVX = true;
6353 else if (F == "-hvx")
6354 HasHVX = HasHVXDouble = false;
6355 else if (F == "+hvx-double")
6356 HasHVX = HasHVXDouble = true;
6357 else if (F == "-hvx-double")
6358 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006359
6360 if (F == "+long-calls")
6361 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006362 else if (F == "-long-calls")
6363 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006364 }
6365 return true;
6366}
6367
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006368void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6369 StringRef Name, bool Enabled) const {
6370 if (Enabled) {
6371 if (Name == "hvx-double")
6372 Features["hvx"] = true;
6373 } else {
6374 if (Name == "hvx")
6375 Features["hvx-double"] = false;
6376 }
6377 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006378}
6379
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006380const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006381 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6382 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6383 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6384 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6385 "p0", "p1", "p2", "p3",
6386 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6387};
6388
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006389ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006390 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006391}
6392
Tony Linthicum76329bf2011-12-12 21:14:55 +00006393const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6394 { { "sp" }, "r29" },
6395 { { "fp" }, "r30" },
6396 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006397};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398
Craig Topperf054e3a2015-10-19 03:52:27 +00006399ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6400 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006401}
6402
6403
6404const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006405#define BUILTIN(ID, TYPE, ATTRS) \
6406 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6407#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6408 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006409#include "clang/Basic/BuiltinsHexagon.def"
6410};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006411
Jacques Pienaard964cc22016-03-28 21:02:54 +00006412class LanaiTargetInfo : public TargetInfo {
6413 // Class for Lanai (32-bit).
6414 // The CPU profiles supported by the Lanai backend
6415 enum CPUKind {
6416 CK_NONE,
6417 CK_V11,
6418 } CPU;
6419
6420 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6421 static const char *const GCCRegNames[];
6422
6423public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006424 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6425 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006426 // Description string has to be kept in sync with backend.
6427 resetDataLayout("E" // Big endian
6428 "-m:e" // ELF name manging
6429 "-p:32:32" // 32 bit pointers, 32 bit aligned
6430 "-i64:64" // 64 bit integers, 64 bit aligned
6431 "-a:0:32" // 32 bit alignment of objects of aggregate type
6432 "-n32" // 32 bit native integer width
6433 "-S64" // 64 bit natural stack alignment
6434 );
6435
6436 // Setting RegParmMax equal to what mregparm was set to in the old
6437 // toolchain
6438 RegParmMax = 4;
6439
6440 // Set the default CPU to V11
6441 CPU = CK_V11;
6442
6443 // Temporary approach to make everything at least word-aligned and allow for
6444 // safely casting between pointers with different alignment requirements.
6445 // TODO: Remove this when there are no more cast align warnings on the
6446 // firmware.
6447 MinGlobalAlign = 32;
6448 }
6449
6450 void getTargetDefines(const LangOptions &Opts,
6451 MacroBuilder &Builder) const override {
6452 // Define __lanai__ when building for target lanai.
6453 Builder.defineMacro("__lanai__");
6454
6455 // Set define for the CPU specified.
6456 switch (CPU) {
6457 case CK_V11:
6458 Builder.defineMacro("__LANAI_V11__");
6459 break;
6460 case CK_NONE:
6461 llvm_unreachable("Unhandled target CPU");
6462 }
6463 }
6464
6465 bool setCPU(const std::string &Name) override {
6466 CPU = llvm::StringSwitch<CPUKind>(Name)
6467 .Case("v11", CK_V11)
6468 .Default(CK_NONE);
6469
6470 return CPU != CK_NONE;
6471 }
6472
6473 bool hasFeature(StringRef Feature) const override {
6474 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6475 }
6476
6477 ArrayRef<const char *> getGCCRegNames() const override;
6478
6479 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6480
6481 BuiltinVaListKind getBuiltinVaListKind() const override {
6482 return TargetInfo::VoidPtrBuiltinVaList;
6483 }
6484
6485 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6486
6487 bool validateAsmConstraint(const char *&Name,
6488 TargetInfo::ConstraintInfo &info) const override {
6489 return false;
6490 }
6491
6492 const char *getClobbers() const override { return ""; }
6493};
6494
6495const char *const LanaiTargetInfo::GCCRegNames[] = {
6496 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6497 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6498 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6499
6500ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6501 return llvm::makeArrayRef(GCCRegNames);
6502}
6503
6504const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6505 {{"pc"}, "r2"},
6506 {{"sp"}, "r4"},
6507 {{"fp"}, "r5"},
6508 {{"rv"}, "r8"},
6509 {{"rr1"}, "r10"},
6510 {{"rr2"}, "r11"},
6511 {{"rca"}, "r15"},
6512};
6513
6514ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6515 return llvm::makeArrayRef(GCCRegAliases);
6516}
6517
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006518// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6519class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006520 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6521 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006522 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006523public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006524 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006525 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006526
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006527 int getEHDataRegisterNumber(unsigned RegNo) const override {
6528 if (RegNo == 0) return 24;
6529 if (RegNo == 1) return 25;
6530 return -1;
6531 }
6532
Craig Topper3164f332014-03-11 03:39:26 +00006533 bool handleTargetFeatures(std::vector<std::string> &Features,
6534 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006535 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006536 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6537 if (Feature != Features.end()) {
6538 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006539 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006540 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006541 }
Craig Topper3164f332014-03-11 03:39:26 +00006542 void getTargetDefines(const LangOptions &Opts,
6543 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006544 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006545 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006546
6547 if (SoftFloat)
6548 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006549 }
Craig Topper3164f332014-03-11 03:39:26 +00006550
6551 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006552 return llvm::StringSwitch<bool>(Feature)
6553 .Case("softfloat", SoftFloat)
6554 .Case("sparc", true)
6555 .Default(false);
6556 }
Craig Topper3164f332014-03-11 03:39:26 +00006557
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006558 bool hasSjLjLowering() const override {
6559 return true;
6560 }
6561
Craig Topper6c03a542015-10-19 04:51:35 +00006562 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006563 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006564 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006565 }
Craig Topper3164f332014-03-11 03:39:26 +00006566 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006567 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006568 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006569 ArrayRef<const char *> getGCCRegNames() const override;
6570 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006571 bool validateAsmConstraint(const char *&Name,
6572 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006573 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006574 switch (*Name) {
6575 case 'I': // Signed 13-bit constant
6576 case 'J': // Zero
6577 case 'K': // 32-bit constant with the low 12 bits clear
6578 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6579 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6580 case 'N': // Same as 'K' but zext (required for SIMode)
6581 case 'O': // The constant 4096
6582 return true;
6583 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006584 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006585 }
Craig Topper3164f332014-03-11 03:39:26 +00006586 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006587 // FIXME: Implement!
6588 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006589 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006590
6591 // No Sparc V7 for now, the backend doesn't support it anyway.
6592 enum CPUKind {
6593 CK_GENERIC,
6594 CK_V8,
6595 CK_SUPERSPARC,
6596 CK_SPARCLITE,
6597 CK_F934,
6598 CK_HYPERSPARC,
6599 CK_SPARCLITE86X,
6600 CK_SPARCLET,
6601 CK_TSC701,
6602 CK_V9,
6603 CK_ULTRASPARC,
6604 CK_ULTRASPARC3,
6605 CK_NIAGARA,
6606 CK_NIAGARA2,
6607 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006608 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006609 CK_MYRIAD2100,
6610 CK_MYRIAD2150,
6611 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006612 CK_LEON2,
6613 CK_LEON2_AT697E,
6614 CK_LEON2_AT697F,
6615 CK_LEON3,
6616 CK_LEON3_UT699,
6617 CK_LEON3_GR712RC,
6618 CK_LEON4,
6619 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006620 } CPU = CK_GENERIC;
6621
6622 enum CPUGeneration {
6623 CG_V8,
6624 CG_V9,
6625 };
6626
6627 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6628 switch (Kind) {
6629 case CK_GENERIC:
6630 case CK_V8:
6631 case CK_SUPERSPARC:
6632 case CK_SPARCLITE:
6633 case CK_F934:
6634 case CK_HYPERSPARC:
6635 case CK_SPARCLITE86X:
6636 case CK_SPARCLET:
6637 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006638 case CK_MYRIAD2100:
6639 case CK_MYRIAD2150:
6640 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006641 case CK_LEON2:
6642 case CK_LEON2_AT697E:
6643 case CK_LEON2_AT697F:
6644 case CK_LEON3:
6645 case CK_LEON3_UT699:
6646 case CK_LEON3_GR712RC:
6647 case CK_LEON4:
6648 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006649 return CG_V8;
6650 case CK_V9:
6651 case CK_ULTRASPARC:
6652 case CK_ULTRASPARC3:
6653 case CK_NIAGARA:
6654 case CK_NIAGARA2:
6655 case CK_NIAGARA3:
6656 case CK_NIAGARA4:
6657 return CG_V9;
6658 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006659 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006660 }
6661
6662 CPUKind getCPUKind(StringRef Name) const {
6663 return llvm::StringSwitch<CPUKind>(Name)
6664 .Case("v8", CK_V8)
6665 .Case("supersparc", CK_SUPERSPARC)
6666 .Case("sparclite", CK_SPARCLITE)
6667 .Case("f934", CK_F934)
6668 .Case("hypersparc", CK_HYPERSPARC)
6669 .Case("sparclite86x", CK_SPARCLITE86X)
6670 .Case("sparclet", CK_SPARCLET)
6671 .Case("tsc701", CK_TSC701)
6672 .Case("v9", CK_V9)
6673 .Case("ultrasparc", CK_ULTRASPARC)
6674 .Case("ultrasparc3", CK_ULTRASPARC3)
6675 .Case("niagara", CK_NIAGARA)
6676 .Case("niagara2", CK_NIAGARA2)
6677 .Case("niagara3", CK_NIAGARA3)
6678 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006679 .Case("ma2100", CK_MYRIAD2100)
6680 .Case("ma2150", CK_MYRIAD2150)
6681 .Case("ma2450", CK_MYRIAD2450)
6682 // FIXME: the myriad2[.n] spellings are obsolete,
6683 // but a grace period is needed to allow updating dependent builds.
6684 .Case("myriad2", CK_MYRIAD2100)
6685 .Case("myriad2.1", CK_MYRIAD2100)
6686 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006687 .Case("leon2", CK_LEON2)
6688 .Case("at697e", CK_LEON2_AT697E)
6689 .Case("at697f", CK_LEON2_AT697F)
6690 .Case("leon3", CK_LEON3)
6691 .Case("ut699", CK_LEON3_UT699)
6692 .Case("gr712rc", CK_LEON3_GR712RC)
6693 .Case("leon4", CK_LEON4)
6694 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006695 .Default(CK_GENERIC);
6696 }
6697
6698 bool setCPU(const std::string &Name) override {
6699 CPU = getCPUKind(Name);
6700 return CPU != CK_GENERIC;
6701 }
Gabor Greif49991682008-02-21 16:29:08 +00006702};
6703
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006704const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006705 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6706 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6707 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6708 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6709};
6710
Craig Topperf054e3a2015-10-19 03:52:27 +00006711ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6712 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006713}
6714
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006715const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006716 { { "g0" }, "r0" },
6717 { { "g1" }, "r1" },
6718 { { "g2" }, "r2" },
6719 { { "g3" }, "r3" },
6720 { { "g4" }, "r4" },
6721 { { "g5" }, "r5" },
6722 { { "g6" }, "r6" },
6723 { { "g7" }, "r7" },
6724 { { "o0" }, "r8" },
6725 { { "o1" }, "r9" },
6726 { { "o2" }, "r10" },
6727 { { "o3" }, "r11" },
6728 { { "o4" }, "r12" },
6729 { { "o5" }, "r13" },
6730 { { "o6", "sp" }, "r14" },
6731 { { "o7" }, "r15" },
6732 { { "l0" }, "r16" },
6733 { { "l1" }, "r17" },
6734 { { "l2" }, "r18" },
6735 { { "l3" }, "r19" },
6736 { { "l4" }, "r20" },
6737 { { "l5" }, "r21" },
6738 { { "l6" }, "r22" },
6739 { { "l7" }, "r23" },
6740 { { "i0" }, "r24" },
6741 { { "i1" }, "r25" },
6742 { { "i2" }, "r26" },
6743 { { "i3" }, "r27" },
6744 { { "i4" }, "r28" },
6745 { { "i5" }, "r29" },
6746 { { "i6", "fp" }, "r30" },
6747 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006748};
6749
Craig Topperf054e3a2015-10-19 03:52:27 +00006750ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6751 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006752}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006753
6754// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6755class SparcV8TargetInfo : public SparcTargetInfo {
6756public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006757 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6758 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006759 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006760 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6761 switch (getTriple().getOS()) {
6762 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006763 SizeType = UnsignedInt;
6764 IntPtrType = SignedInt;
6765 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006766 break;
6767 case llvm::Triple::NetBSD:
6768 case llvm::Triple::OpenBSD:
6769 SizeType = UnsignedLong;
6770 IntPtrType = SignedLong;
6771 PtrDiffType = SignedLong;
6772 break;
Brad Smith56495d52015-08-13 22:00:53 +00006773 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006774 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006775 }
6776
Craig Topper3164f332014-03-11 03:39:26 +00006777 void getTargetDefines(const LangOptions &Opts,
6778 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006779 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006780 switch (getCPUGeneration(CPU)) {
6781 case CG_V8:
6782 Builder.defineMacro("__sparcv8");
6783 if (getTriple().getOS() != llvm::Triple::Solaris)
6784 Builder.defineMacro("__sparcv8__");
6785 break;
6786 case CG_V9:
6787 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006788 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006789 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006790 Builder.defineMacro("__sparc_v9__");
6791 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006792 break;
6793 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006794 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006795 std::string MyriadArchValue, Myriad2Value;
6796 Builder.defineMacro("__sparc_v8__");
6797 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006798 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006799 case CK_MYRIAD2150:
6800 MyriadArchValue = "__ma2150";
6801 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006802 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006803 case CK_MYRIAD2450:
6804 MyriadArchValue = "__ma2450";
6805 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006806 break;
6807 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006808 MyriadArchValue = "__ma2100";
6809 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006810 break;
6811 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006812 Builder.defineMacro(MyriadArchValue, "1");
6813 Builder.defineMacro(MyriadArchValue+"__", "1");
6814 Builder.defineMacro("__myriad2__", Myriad2Value);
6815 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006816 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006817 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006818
6819 bool hasSjLjLowering() const override {
6820 return true;
6821 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006822};
6823
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006824// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6825class SparcV8elTargetInfo : public SparcV8TargetInfo {
6826 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006827 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6828 : SparcV8TargetInfo(Triple, Opts) {
6829 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006830 }
6831};
6832
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006833// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6834class SparcV9TargetInfo : public SparcTargetInfo {
6835public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006836 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6837 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006838 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006839 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006840 // This is an LP64 platform.
6841 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006842
6843 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006844 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006845 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006846 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006847 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006848 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006849
6850 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6851 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6852 LongDoubleWidth = 128;
6853 LongDoubleAlign = 128;
6854 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006855 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006856 }
6857
Craig Topper3164f332014-03-11 03:39:26 +00006858 void getTargetDefines(const LangOptions &Opts,
6859 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006860 SparcTargetInfo::getTargetDefines(Opts, Builder);
6861 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006862 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006863 // Solaris doesn't need these variants, but the BSDs do.
6864 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006865 Builder.defineMacro("__sparc64__");
6866 Builder.defineMacro("__sparc_v9__");
6867 Builder.defineMacro("__sparcv9__");
6868 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006869 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006870
Craig Topper3164f332014-03-11 03:39:26 +00006871 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006872 if (!SparcTargetInfo::setCPU(Name))
6873 return false;
6874 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006875 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006876};
6877
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006878class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006879 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006880 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006881 std::string CPU;
6882 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006883 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006884
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006885public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006886 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006887 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6888 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006889 IntMaxType = SignedLong;
6890 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006891 TLSSupported = true;
6892 IntWidth = IntAlign = 32;
6893 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6894 PointerWidth = PointerAlign = 64;
6895 LongDoubleWidth = 128;
6896 LongDoubleAlign = 64;
6897 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006898 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006899 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006900 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 +00006901 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6902 }
6903 void getTargetDefines(const LangOptions &Opts,
6904 MacroBuilder &Builder) const override {
6905 Builder.defineMacro("__s390__");
6906 Builder.defineMacro("__s390x__");
6907 Builder.defineMacro("__zarch__");
6908 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006909
6910 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6911 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6912 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6913 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6914
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006915 if (HasTransactionalExecution)
6916 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006917 if (Opts.ZVector)
6918 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006919 }
Craig Topper6c03a542015-10-19 04:51:35 +00006920 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6921 return llvm::makeArrayRef(BuiltinInfo,
6922 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006923 }
6924
Craig Topperf054e3a2015-10-19 03:52:27 +00006925 ArrayRef<const char *> getGCCRegNames() const override;
6926 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006927 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006928 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006929 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006930 bool validateAsmConstraint(const char *&Name,
6931 TargetInfo::ConstraintInfo &info) const override;
6932 const char *getClobbers() const override {
6933 // FIXME: Is this really right?
6934 return "";
6935 }
6936 BuiltinVaListKind getBuiltinVaListKind() const override {
6937 return TargetInfo::SystemZBuiltinVaList;
6938 }
6939 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006940 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006941 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6942 .Case("z10", true)
6943 .Case("z196", true)
6944 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006945 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006946 .Default(false);
6947
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006948 return CPUKnown;
6949 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006950 bool
6951 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6952 StringRef CPU,
6953 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006954 if (CPU == "zEC12")
6955 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006956 if (CPU == "z13") {
6957 Features["transactional-execution"] = true;
6958 Features["vector"] = true;
6959 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006960 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006961 }
6962
6963 bool handleTargetFeatures(std::vector<std::string> &Features,
6964 DiagnosticsEngine &Diags) override {
6965 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006966 for (const auto &Feature : Features) {
6967 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006968 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006969 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006970 HasVector = true;
6971 }
6972 // If we use the vector ABI, vector types are 64-bit aligned.
6973 if (HasVector) {
6974 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006975 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6976 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006977 }
6978 return true;
6979 }
6980
6981 bool hasFeature(StringRef Feature) const override {
6982 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006983 .Case("systemz", true)
6984 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006985 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006986 .Default(false);
6987 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006988
Bryan Chane3f1ed52016-04-28 13:56:43 +00006989 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6990 switch (CC) {
6991 case CC_C:
6992 case CC_Swift:
6993 return CCCR_OK;
6994 default:
6995 return CCCR_Warning;
6996 }
6997 }
6998
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006999 StringRef getABI() const override {
7000 if (HasVector)
7001 return "vector";
7002 return "";
7003 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007004
7005 bool useFloat128ManglingForLongDouble() const override {
7006 return true;
7007 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007008};
7009
7010const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7011#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007012 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007013#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7014 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007015#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007016};
7017
7018const char *const SystemZTargetInfo::GCCRegNames[] = {
7019 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7020 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7021 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7022 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7023};
7024
Craig Topperf054e3a2015-10-19 03:52:27 +00007025ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7026 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007027}
7028
7029bool SystemZTargetInfo::
7030validateAsmConstraint(const char *&Name,
7031 TargetInfo::ConstraintInfo &Info) const {
7032 switch (*Name) {
7033 default:
7034 return false;
7035
7036 case 'a': // Address register
7037 case 'd': // Data register (equivalent to 'r')
7038 case 'f': // Floating-point register
7039 Info.setAllowsRegister();
7040 return true;
7041
7042 case 'I': // Unsigned 8-bit constant
7043 case 'J': // Unsigned 12-bit constant
7044 case 'K': // Signed 16-bit constant
7045 case 'L': // Signed 20-bit displacement (on all targets we support)
7046 case 'M': // 0x7fffffff
7047 return true;
7048
7049 case 'Q': // Memory with base and unsigned 12-bit displacement
7050 case 'R': // Likewise, plus an index
7051 case 'S': // Memory with base and signed 20-bit displacement
7052 case 'T': // Likewise, plus an index
7053 Info.setAllowsMemory();
7054 return true;
7055 }
7056}
Ulrich Weigand47445072013-05-06 16:26:41 +00007057
Eric Christopherc48497a2015-09-18 21:26:24 +00007058class MSP430TargetInfo : public TargetInfo {
7059 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007060
Eric Christopherc48497a2015-09-18 21:26:24 +00007061public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007062 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7063 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007064 TLSSupported = false;
7065 IntWidth = 16;
7066 IntAlign = 16;
7067 LongWidth = 32;
7068 LongLongWidth = 64;
7069 LongAlign = LongLongAlign = 16;
7070 PointerWidth = 16;
7071 PointerAlign = 16;
7072 SuitableAlign = 16;
7073 SizeType = UnsignedInt;
7074 IntMaxType = SignedLongLong;
7075 IntPtrType = SignedInt;
7076 PtrDiffType = SignedInt;
7077 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007078 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007079 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007080 void getTargetDefines(const LangOptions &Opts,
7081 MacroBuilder &Builder) const override {
7082 Builder.defineMacro("MSP430");
7083 Builder.defineMacro("__MSP430__");
7084 // FIXME: defines for different 'flavours' of MCU
7085 }
Craig Topper6c03a542015-10-19 04:51:35 +00007086 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007087 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007088 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007089 }
7090 bool hasFeature(StringRef Feature) const override {
7091 return Feature == "msp430";
7092 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007093 ArrayRef<const char *> getGCCRegNames() const override;
7094 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007095 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007096 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007097 }
7098 bool validateAsmConstraint(const char *&Name,
7099 TargetInfo::ConstraintInfo &info) const override {
7100 // FIXME: implement
7101 switch (*Name) {
7102 case 'K': // the constant 1
7103 case 'L': // constant -1^20 .. 1^19
7104 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007105 return true;
7106 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007107 // No target constraints for now.
7108 return false;
7109 }
7110 const char *getClobbers() const override {
7111 // FIXME: Is this really right?
7112 return "";
7113 }
7114 BuiltinVaListKind getBuiltinVaListKind() const override {
7115 // FIXME: implement
7116 return TargetInfo::CharPtrBuiltinVaList;
7117 }
7118};
7119
7120const char *const MSP430TargetInfo::GCCRegNames[] = {
7121 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7122 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7123
Craig Topperf054e3a2015-10-19 03:52:27 +00007124ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7125 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007126}
7127
7128// LLVM and Clang cannot be used directly to output native binaries for
7129// target, but is used to compile C code to llvm bitcode with correct
7130// type and alignment information.
7131//
7132// TCE uses the llvm bitcode as input and uses it for generating customized
7133// target processor and program binary. TCE co-design environment is
7134// publicly available in http://tce.cs.tut.fi
7135
7136static const unsigned TCEOpenCLAddrSpaceMap[] = {
7137 3, // opencl_global
7138 4, // opencl_local
7139 5, // opencl_constant
7140 // FIXME: generic has to be added to the target
7141 0, // opencl_generic
7142 0, // cuda_device
7143 0, // cuda_constant
7144 0 // cuda_shared
7145};
7146
7147class TCETargetInfo : public TargetInfo {
7148public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007149 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7150 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007151 TLSSupported = false;
7152 IntWidth = 32;
7153 LongWidth = LongLongWidth = 32;
7154 PointerWidth = 32;
7155 IntAlign = 32;
7156 LongAlign = LongLongAlign = 32;
7157 PointerAlign = 32;
7158 SuitableAlign = 32;
7159 SizeType = UnsignedInt;
7160 IntMaxType = SignedLong;
7161 IntPtrType = SignedInt;
7162 PtrDiffType = SignedInt;
7163 FloatWidth = 32;
7164 FloatAlign = 32;
7165 DoubleWidth = 32;
7166 DoubleAlign = 32;
7167 LongDoubleWidth = 32;
7168 LongDoubleAlign = 32;
7169 FloatFormat = &llvm::APFloat::IEEEsingle;
7170 DoubleFormat = &llvm::APFloat::IEEEsingle;
7171 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007172 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7173 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007174 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7175 UseAddrSpaceMapMangling = true;
7176 }
7177
7178 void getTargetDefines(const LangOptions &Opts,
7179 MacroBuilder &Builder) const override {
7180 DefineStd(Builder, "tce", Opts);
7181 Builder.defineMacro("__TCE__");
7182 Builder.defineMacro("__TCE_V1__");
7183 }
7184 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7185
Craig Topper6c03a542015-10-19 04:51:35 +00007186 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007187 const char *getClobbers() const override { return ""; }
7188 BuiltinVaListKind getBuiltinVaListKind() const override {
7189 return TargetInfo::VoidPtrBuiltinVaList;
7190 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007191 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007192 bool validateAsmConstraint(const char *&Name,
7193 TargetInfo::ConstraintInfo &info) const override {
7194 return true;
7195 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007196 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7197 return None;
7198 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007199};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007200
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007201class BPFTargetInfo : public TargetInfo {
7202public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007203 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7204 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007205 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7206 SizeType = UnsignedLong;
7207 PtrDiffType = SignedLong;
7208 IntPtrType = SignedLong;
7209 IntMaxType = SignedLong;
7210 Int64Type = SignedLong;
7211 RegParmMax = 5;
7212 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007213 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007214 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007215 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007216 }
7217 MaxAtomicPromoteWidth = 64;
7218 MaxAtomicInlineWidth = 64;
7219 TLSSupported = false;
7220 }
7221 void getTargetDefines(const LangOptions &Opts,
7222 MacroBuilder &Builder) const override {
7223 DefineStd(Builder, "bpf", Opts);
7224 Builder.defineMacro("__BPF__");
7225 }
7226 bool hasFeature(StringRef Feature) const override {
7227 return Feature == "bpf";
7228 }
7229
Craig Topper6c03a542015-10-19 04:51:35 +00007230 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007231 const char *getClobbers() const override {
7232 return "";
7233 }
7234 BuiltinVaListKind getBuiltinVaListKind() const override {
7235 return TargetInfo::VoidPtrBuiltinVaList;
7236 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007237 ArrayRef<const char *> getGCCRegNames() const override {
7238 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007239 }
7240 bool validateAsmConstraint(const char *&Name,
7241 TargetInfo::ConstraintInfo &info) const override {
7242 return true;
7243 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007244 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7245 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007246 }
7247};
7248
Daniel Sanders4672af62016-05-27 11:51:02 +00007249class MipsTargetInfo : public TargetInfo {
7250 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007251 StringRef Layout;
7252
7253 if (ABI == "o32")
7254 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7255 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007256 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007257 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007258 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007259 else
7260 llvm_unreachable("Invalid ABI");
7261
7262 if (BigEndian)
7263 resetDataLayout(("E-" + Layout).str());
7264 else
7265 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007266 }
7267
Akira Hatanaka9064e362013-10-29 18:30:33 +00007268
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007269 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007270 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007271 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007272 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007273 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007274 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007275 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007276 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007277 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007278 enum DspRevEnum {
7279 NoDSP, DSP1, DSP2
7280 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007281 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007282
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007283protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007284 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007285 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007286
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007287public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007288 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007289 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7290 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7291 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007292 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007293
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007294 setABI((getTriple().getArch() == llvm::Triple::mips ||
7295 getTriple().getArch() == llvm::Triple::mipsel)
7296 ? "o32"
7297 : "n64");
7298
7299 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007300 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007301
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007302 bool isNaN2008Default() const {
7303 return CPU == "mips32r6" || CPU == "mips64r6";
7304 }
7305
7306 bool isFP64Default() const {
7307 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7308 }
7309
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007310 bool isNan2008() const override {
7311 return IsNan2008;
7312 }
7313
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007314 bool processorSupportsGPR64() const {
7315 return llvm::StringSwitch<bool>(CPU)
7316 .Case("mips3", true)
7317 .Case("mips4", true)
7318 .Case("mips5", true)
7319 .Case("mips64", true)
7320 .Case("mips64r2", true)
7321 .Case("mips64r3", true)
7322 .Case("mips64r5", true)
7323 .Case("mips64r6", true)
7324 .Case("octeon", true)
7325 .Default(false);
7326 return false;
7327 }
7328
Alp Toker4925ba72014-06-07 23:30:42 +00007329 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007330 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007331 if (Name == "o32") {
7332 setO32ABITypes();
7333 ABI = Name;
7334 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007335 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007336
7337 if (Name == "n32") {
7338 setN32ABITypes();
7339 ABI = Name;
7340 return true;
7341 }
7342 if (Name == "n64") {
7343 setN64ABITypes();
7344 ABI = Name;
7345 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007346 }
7347 return false;
7348 }
7349
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007350 void setO32ABITypes() {
7351 Int64Type = SignedLongLong;
7352 IntMaxType = Int64Type;
7353 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7354 LongDoubleWidth = LongDoubleAlign = 64;
7355 LongWidth = LongAlign = 32;
7356 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7357 PointerWidth = PointerAlign = 32;
7358 PtrDiffType = SignedInt;
7359 SizeType = UnsignedInt;
7360 SuitableAlign = 64;
7361 }
7362
7363 void setN32N64ABITypes() {
7364 LongDoubleWidth = LongDoubleAlign = 128;
7365 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7366 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7367 LongDoubleWidth = LongDoubleAlign = 64;
7368 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7369 }
7370 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7371 SuitableAlign = 128;
7372 }
7373
Daniel Sanders4672af62016-05-27 11:51:02 +00007374 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007375 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007376 Int64Type = SignedLong;
7377 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007378 LongWidth = LongAlign = 64;
7379 PointerWidth = PointerAlign = 64;
7380 PtrDiffType = SignedLong;
7381 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007382 }
7383
7384 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007385 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007386 Int64Type = SignedLongLong;
7387 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007388 LongWidth = LongAlign = 32;
7389 PointerWidth = PointerAlign = 32;
7390 PtrDiffType = SignedInt;
7391 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007392 }
7393
Craig Topper3164f332014-03-11 03:39:26 +00007394 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007395 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007396 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007397 .Case("mips1", true)
7398 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007399 .Case("mips3", true)
7400 .Case("mips4", true)
7401 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007402 .Case("mips32", true)
7403 .Case("mips32r2", true)
7404 .Case("mips32r3", true)
7405 .Case("mips32r5", true)
7406 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007407 .Case("mips64", true)
7408 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007409 .Case("mips64r3", true)
7410 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007411 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007412 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007413 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007414 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007415 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007416 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007417 bool
7418 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7419 StringRef CPU,
7420 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007421 if (CPU.empty())
7422 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007423 if (CPU == "octeon")
7424 Features["mips64r2"] = Features["cnmips"] = true;
7425 else
7426 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007427 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007428 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007429
Craig Topper3164f332014-03-11 03:39:26 +00007430 void getTargetDefines(const LangOptions &Opts,
7431 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007432 if (BigEndian) {
7433 DefineStd(Builder, "MIPSEB", Opts);
7434 Builder.defineMacro("_MIPSEB");
7435 } else {
7436 DefineStd(Builder, "MIPSEL", Opts);
7437 Builder.defineMacro("_MIPSEL");
7438 }
7439
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007440 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007441 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007442 if (Opts.GNUMode)
7443 Builder.defineMacro("mips");
7444
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007445 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007446 Builder.defineMacro("__mips", "32");
7447 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7448 } else {
7449 Builder.defineMacro("__mips", "64");
7450 Builder.defineMacro("__mips64");
7451 Builder.defineMacro("__mips64__");
7452 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7453 }
7454
7455 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7456 .Cases("mips32", "mips64", "1")
7457 .Cases("mips32r2", "mips64r2", "2")
7458 .Cases("mips32r3", "mips64r3", "3")
7459 .Cases("mips32r5", "mips64r5", "5")
7460 .Cases("mips32r6", "mips64r6", "6")
7461 .Default("");
7462 if (!ISARev.empty())
7463 Builder.defineMacro("__mips_isa_rev", ISARev);
7464
7465 if (ABI == "o32") {
7466 Builder.defineMacro("__mips_o32");
7467 Builder.defineMacro("_ABIO32", "1");
7468 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007469 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007470 Builder.defineMacro("__mips_n32");
7471 Builder.defineMacro("_ABIN32", "2");
7472 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7473 } else if (ABI == "n64") {
7474 Builder.defineMacro("__mips_n64");
7475 Builder.defineMacro("_ABI64", "3");
7476 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7477 } else
7478 llvm_unreachable("Invalid ABI.");
7479
Simon Atanasyan683535b2012-08-29 19:14:58 +00007480 Builder.defineMacro("__REGISTER_PREFIX__", "");
7481
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007482 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007483 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007484 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007485 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007486 case SoftFloat:
7487 Builder.defineMacro("__mips_soft_float", Twine(1));
7488 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007489 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007490
Simon Atanasyan16071912013-04-14 14:07:30 +00007491 if (IsSingleFloat)
7492 Builder.defineMacro("__mips_single_float", Twine(1));
7493
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007494 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7495 Builder.defineMacro("_MIPS_FPSET",
7496 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7497
Simon Atanasyan72244b62012-07-05 16:06:06 +00007498 if (IsMips16)
7499 Builder.defineMacro("__mips16", Twine(1));
7500
Simon Atanasyan60777612013-04-14 14:07:51 +00007501 if (IsMicromips)
7502 Builder.defineMacro("__mips_micromips", Twine(1));
7503
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007504 if (IsNan2008)
7505 Builder.defineMacro("__mips_nan2008", Twine(1));
7506
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007507 switch (DspRev) {
7508 default:
7509 break;
7510 case DSP1:
7511 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7512 Builder.defineMacro("__mips_dsp", Twine(1));
7513 break;
7514 case DSP2:
7515 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7516 Builder.defineMacro("__mips_dspr2", Twine(1));
7517 Builder.defineMacro("__mips_dsp", Twine(1));
7518 break;
7519 }
7520
Jack Carter44ff1e52013-08-12 17:20:29 +00007521 if (HasMSA)
7522 Builder.defineMacro("__mips_msa", Twine(1));
7523
Simon Atanasyan26f19672012-04-05 19:28:31 +00007524 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7525 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7526 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007527
7528 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7529 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007530
7531 // These shouldn't be defined for MIPS-I but there's no need to check
7532 // for that since MIPS-I isn't supported.
7533 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7534 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7535 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007536
7537 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7538 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7539 // the instructions exist but using them violates the ABI since they
7540 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7541 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007542 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007543 }
7544
Craig Topper6c03a542015-10-19 04:51:35 +00007545 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7546 return llvm::makeArrayRef(BuiltinInfo,
7547 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007548 }
Craig Topper3164f332014-03-11 03:39:26 +00007549 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007550 return llvm::StringSwitch<bool>(Feature)
7551 .Case("mips", true)
7552 .Case("fp64", HasFP64)
7553 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007554 }
Craig Topper3164f332014-03-11 03:39:26 +00007555 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007556 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007557 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007558 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007559 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007560 // CPU register names
7561 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007562 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7563 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7564 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007565 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7566 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007567 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7568 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7569 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7570 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007571 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007572 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007573 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7574 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007575 // MSA register names
7576 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7577 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7578 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7579 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7580 // MSA control register names
7581 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7582 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007583 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007584 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007585 }
Craig Topper3164f332014-03-11 03:39:26 +00007586 bool validateAsmConstraint(const char *&Name,
7587 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007588 switch (*Name) {
7589 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007590 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007591 case 'r': // CPU registers.
7592 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007593 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007594 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007595 case 'c': // $25 for indirect jumps
7596 case 'l': // lo register
7597 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007598 Info.setAllowsRegister();
7599 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007600 case 'I': // Signed 16-bit constant
7601 case 'J': // Integer 0
7602 case 'K': // Unsigned 16-bit constant
7603 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7604 case 'M': // Constants not loadable via lui, addiu, or ori
7605 case 'N': // Constant -1 to -65535
7606 case 'O': // A signed 15-bit constant
7607 case 'P': // A constant between 1 go 65535
7608 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007609 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007610 Info.setAllowsMemory();
7611 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007612 case 'Z':
7613 if (Name[1] == 'C') { // An address usable by ll, and sc.
7614 Info.setAllowsMemory();
7615 Name++; // Skip over 'Z'.
7616 return true;
7617 }
7618 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007619 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007620 }
7621
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007622 std::string convertConstraint(const char *&Constraint) const override {
7623 std::string R;
7624 switch (*Constraint) {
7625 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7626 if (Constraint[1] == 'C') {
7627 R = std::string("^") + std::string(Constraint, 2);
7628 Constraint++;
7629 return R;
7630 }
7631 break;
7632 }
7633 return TargetInfo::convertConstraint(Constraint);
7634 }
7635
Craig Topper3164f332014-03-11 03:39:26 +00007636 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007637 // In GCC, $1 is not widely used in generated code (it's used only in a few
7638 // specific situations), so there is no real need for users to add it to
7639 // the clobbers list if they want to use it in their inline assembly code.
7640 //
7641 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7642 // code generation, so using it in inline assembly without adding it to the
7643 // clobbers list can cause conflicts between the inline assembly code and
7644 // the surrounding generated code.
7645 //
7646 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7647 // operands, which will conflict with the ".set at" assembler option (which
7648 // we use only for inline assembly, in order to maintain compatibility with
7649 // GCC) and will also conflict with the user's usage of $1.
7650 //
7651 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7652 // register for generated code is to automatically clobber $1 for all inline
7653 // assembly code.
7654 //
7655 // FIXME: We should automatically clobber $1 only for inline assembly code
7656 // which actually uses it. This would allow LLVM to use $1 for inline
7657 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007658 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007659 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007660
Craig Topper3164f332014-03-11 03:39:26 +00007661 bool handleTargetFeatures(std::vector<std::string> &Features,
7662 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007663 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007664 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007665 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007666 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007667 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007668 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007669 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007670
Eric Christopher610fe112015-08-26 08:21:55 +00007671 for (const auto &Feature : Features) {
7672 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007673 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007674 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007675 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007676 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007677 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007678 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007679 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007680 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007681 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007682 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007683 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007684 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007685 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007686 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007687 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007688 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007689 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007690 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007691 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007692 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007693 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007694 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007695
James Y Knightb214cbc2016-03-04 19:00:41 +00007696 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007697
Rafael Espindolaeb265472013-08-21 21:59:03 +00007698 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007699 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007700
Craig Topper3164f332014-03-11 03:39:26 +00007701 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007702 if (RegNo == 0) return 4;
7703 if (RegNo == 1) return 5;
7704 return -1;
7705 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007706
7707 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007708
7709 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7710 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7711 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7712 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7713 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7714 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7715 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7716 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7717 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7718 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7719 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7720 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7721 {{"ra"}, "$31"}};
7722 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7723 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7724 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7725 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7726 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7727 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7728 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7729 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7730 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7731 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7732 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7733 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007734 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007735 return llvm::makeArrayRef(O32RegAliases);
7736 return llvm::makeArrayRef(NewABIRegAliases);
7737 }
7738
7739 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007740 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007741 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007742
7743 bool validateTarget(DiagnosticsEngine &Diags) const override {
7744 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7745 // this yet. It's better to fail here than on the backend assertion.
7746 if (processorSupportsGPR64() && ABI == "o32") {
7747 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7748 return false;
7749 }
7750
7751 // 64-bit ABI's require 64-bit CPU's.
7752 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7753 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7754 return false;
7755 }
7756
7757 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7758 // can't handle this yet. It's better to fail here than on the
7759 // backend assertion.
7760 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7761 getTriple().getArch() == llvm::Triple::mips64el) &&
7762 ABI == "o32") {
7763 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7764 << ABI << getTriple().str();
7765 return false;
7766 }
7767
7768 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7769 // can't handle this yet. It's better to fail here than on the
7770 // backend assertion.
7771 if ((getTriple().getArch() == llvm::Triple::mips ||
7772 getTriple().getArch() == llvm::Triple::mipsel) &&
7773 (ABI == "n32" || ABI == "n64")) {
7774 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7775 << ABI << getTriple().str();
7776 return false;
7777 }
7778
7779 return true;
7780 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007781};
7782
Daniel Sanders4672af62016-05-27 11:51:02 +00007783const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007784#define BUILTIN(ID, TYPE, ATTRS) \
7785 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7786#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7787 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007788#include "clang/Basic/BuiltinsMips.def"
7789};
7790
Ivan Krasindd7403e2011-08-24 20:22:22 +00007791class PNaClTargetInfo : public TargetInfo {
7792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007793 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7794 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007795 this->LongAlign = 32;
7796 this->LongWidth = 32;
7797 this->PointerAlign = 32;
7798 this->PointerWidth = 32;
7799 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007800 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007801 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007802 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007803 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007804 this->SizeType = TargetInfo::UnsignedInt;
7805 this->PtrDiffType = TargetInfo::SignedInt;
7806 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007807 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007808 }
7809
Craig Toppere6f17d02014-03-11 04:07:52 +00007810 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007811 Builder.defineMacro("__le32__");
7812 Builder.defineMacro("__pnacl__");
7813 }
Craig Topper3164f332014-03-11 03:39:26 +00007814 void getTargetDefines(const LangOptions &Opts,
7815 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007816 getArchDefines(Opts, Builder);
7817 }
Craig Topper3164f332014-03-11 03:39:26 +00007818 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007819 return Feature == "pnacl";
7820 }
Craig Topper6c03a542015-10-19 04:51:35 +00007821 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007822 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007823 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007824 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007825 ArrayRef<const char *> getGCCRegNames() const override;
7826 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007827 bool validateAsmConstraint(const char *&Name,
7828 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007829 return false;
7830 }
7831
Craig Topper3164f332014-03-11 03:39:26 +00007832 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007833 return "";
7834 }
7835};
7836
Craig Topperf054e3a2015-10-19 03:52:27 +00007837ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7838 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007839}
7840
Craig Topperf054e3a2015-10-19 03:52:27 +00007841ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7842 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007843}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007844
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007845// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007846class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007847public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007848 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7849 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007850
7851 BuiltinVaListKind getBuiltinVaListKind() const override {
7852 return TargetInfo::PNaClABIBuiltinVaList;
7853 }
7854};
7855
JF Bastien643817d2014-09-12 17:52:47 +00007856class Le64TargetInfo : public TargetInfo {
7857 static const Builtin::Info BuiltinInfo[];
7858
7859public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007860 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7861 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007862 NoAsmVariants = true;
7863 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7864 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007865 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007866 }
7867
7868 void getTargetDefines(const LangOptions &Opts,
7869 MacroBuilder &Builder) const override {
7870 DefineStd(Builder, "unix", Opts);
7871 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7872 Builder.defineMacro("__ELF__");
7873 }
Craig Topper6c03a542015-10-19 04:51:35 +00007874 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7875 return llvm::makeArrayRef(BuiltinInfo,
7876 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007877 }
7878 BuiltinVaListKind getBuiltinVaListKind() const override {
7879 return TargetInfo::PNaClABIBuiltinVaList;
7880 }
7881 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007882 ArrayRef<const char *> getGCCRegNames() const override {
7883 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007884 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007885 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7886 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007887 }
7888 bool validateAsmConstraint(const char *&Name,
7889 TargetInfo::ConstraintInfo &Info) const override {
7890 return false;
7891 }
7892
7893 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007894};
Dan Gohmanc2853072015-09-03 22:51:53 +00007895
7896class WebAssemblyTargetInfo : public TargetInfo {
7897 static const Builtin::Info BuiltinInfo[];
7898
7899 enum SIMDEnum {
7900 NoSIMD,
7901 SIMD128,
7902 } SIMDLevel;
7903
7904public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007905 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007906 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007907 NoAsmVariants = true;
7908 SuitableAlign = 128;
7909 LargeArrayMinWidth = 128;
7910 LargeArrayAlign = 128;
7911 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007912 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007913 LongDoubleWidth = LongDoubleAlign = 128;
7914 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007915 SizeType = UnsignedInt;
7916 PtrDiffType = SignedInt;
7917 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007918 }
7919
7920protected:
7921 void getTargetDefines(const LangOptions &Opts,
7922 MacroBuilder &Builder) const override {
7923 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7924 if (SIMDLevel >= SIMD128)
7925 Builder.defineMacro("__wasm_simd128__");
7926 }
7927
7928private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007929 bool
7930 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7931 StringRef CPU,
7932 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007933 if (CPU == "bleeding-edge")
7934 Features["simd128"] = true;
7935 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7936 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007937 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007938 return llvm::StringSwitch<bool>(Feature)
7939 .Case("simd128", SIMDLevel >= SIMD128)
7940 .Default(false);
7941 }
7942 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007943 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007944 for (const auto &Feature : Features) {
7945 if (Feature == "+simd128") {
7946 SIMDLevel = std::max(SIMDLevel, SIMD128);
7947 continue;
7948 }
7949 if (Feature == "-simd128") {
7950 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7951 continue;
7952 }
7953
7954 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7955 << "-target-feature";
7956 return false;
7957 }
7958 return true;
7959 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007960 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007961 return llvm::StringSwitch<bool>(Name)
7962 .Case("mvp", true)
7963 .Case("bleeding-edge", true)
7964 .Case("generic", true)
7965 .Default(false);
7966 }
Craig Topper6c03a542015-10-19 04:51:35 +00007967 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7968 return llvm::makeArrayRef(BuiltinInfo,
7969 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007970 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007971 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007972 return VoidPtrBuiltinVaList;
7973 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007974 ArrayRef<const char *> getGCCRegNames() const final {
7975 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007976 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007977 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7978 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007979 }
7980 bool
7981 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007982 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007983 return false;
7984 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007985 const char *getClobbers() const final { return ""; }
7986 bool isCLZForZeroUndef() const final { return false; }
7987 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007988 IntType getIntTypeByWidth(unsigned BitWidth,
7989 bool IsSigned) const final {
7990 // WebAssembly prefers long long for explicitly 64-bit integers.
7991 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7992 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7993 }
7994 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7995 bool IsSigned) const final {
7996 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7997 return BitWidth == 64
7998 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7999 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8000 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008001};
8002
8003const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8004#define BUILTIN(ID, TYPE, ATTRS) \
8005 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8006#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8007 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8008#include "clang/Basic/BuiltinsWebAssembly.def"
8009};
8010
8011class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8012public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008013 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8014 const TargetOptions &Opts)
8015 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008016 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008017 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008018 }
8019
8020protected:
8021 void getTargetDefines(const LangOptions &Opts,
8022 MacroBuilder &Builder) const override {
8023 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8024 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8025 }
8026};
8027
8028class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8029public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008030 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8031 const TargetOptions &Opts)
8032 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008033 LongAlign = LongWidth = 64;
8034 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008035 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008036 SizeType = UnsignedLong;
8037 PtrDiffType = SignedLong;
8038 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008039 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008040 }
8041
8042protected:
8043 void getTargetDefines(const LangOptions &Opts,
8044 MacroBuilder &Builder) const override {
8045 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8046 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8047 }
8048};
8049
JF Bastien643817d2014-09-12 17:52:47 +00008050const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8051#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008052 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008053#include "clang/Basic/BuiltinsLe64.def"
8054};
8055
Eric Christopherc48497a2015-09-18 21:26:24 +00008056static const unsigned SPIRAddrSpaceMap[] = {
8057 1, // opencl_global
8058 3, // opencl_local
8059 2, // opencl_constant
8060 4, // opencl_generic
8061 0, // cuda_device
8062 0, // cuda_constant
8063 0 // cuda_shared
8064};
8065class SPIRTargetInfo : public TargetInfo {
8066public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008067 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8068 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008069 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8070 "SPIR target must use unknown OS");
8071 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8072 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008073 TLSSupported = false;
8074 LongWidth = LongAlign = 64;
8075 AddrSpaceMap = &SPIRAddrSpaceMap;
8076 UseAddrSpaceMapMangling = true;
8077 // Define available target features
8078 // These must be defined in sorted order!
8079 NoAsmVariants = true;
8080 }
8081 void getTargetDefines(const LangOptions &Opts,
8082 MacroBuilder &Builder) const override {
8083 DefineStd(Builder, "SPIR", Opts);
8084 }
8085 bool hasFeature(StringRef Feature) const override {
8086 return Feature == "spir";
8087 }
Craig Topper3164f332014-03-11 03:39:26 +00008088
Craig Topper6c03a542015-10-19 04:51:35 +00008089 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008090 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008091 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008092 bool validateAsmConstraint(const char *&Name,
8093 TargetInfo::ConstraintInfo &info) const override {
8094 return true;
8095 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008096 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8097 return None;
8098 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008099 BuiltinVaListKind getBuiltinVaListKind() const override {
8100 return TargetInfo::VoidPtrBuiltinVaList;
8101 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008102
Eric Christopherc48497a2015-09-18 21:26:24 +00008103 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008104 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8105 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008106 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008107
Eric Christopherc48497a2015-09-18 21:26:24 +00008108 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8109 return CC_SpirFunction;
8110 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008111
8112 void setSupportedOpenCLOpts() override {
8113 // Assume all OpenCL extensions and optional core features are supported
8114 // for SPIR since it is a generic target.
8115 getSupportedOpenCLOpts().setAll();
8116 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008117};
Guy Benyeib798fc92012-12-11 21:38:14 +00008118
Eric Christopherc48497a2015-09-18 21:26:24 +00008119class SPIR32TargetInfo : public SPIRTargetInfo {
8120public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008121 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8122 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008123 PointerWidth = PointerAlign = 32;
8124 SizeType = TargetInfo::UnsignedInt;
8125 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008126 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8127 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008128 }
8129 void getTargetDefines(const LangOptions &Opts,
8130 MacroBuilder &Builder) const override {
8131 DefineStd(Builder, "SPIR32", Opts);
8132 }
8133};
Guy Benyeib798fc92012-12-11 21:38:14 +00008134
Eric Christopherc48497a2015-09-18 21:26:24 +00008135class SPIR64TargetInfo : public SPIRTargetInfo {
8136public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008137 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8138 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008139 PointerWidth = PointerAlign = 64;
8140 SizeType = TargetInfo::UnsignedLong;
8141 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008142 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8143 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008144 }
8145 void getTargetDefines(const LangOptions &Opts,
8146 MacroBuilder &Builder) const override {
8147 DefineStd(Builder, "SPIR64", Opts);
8148 }
8149};
Guy Benyeib798fc92012-12-11 21:38:14 +00008150
Robert Lytton0e076492013-08-13 09:43:10 +00008151class XCoreTargetInfo : public TargetInfo {
8152 static const Builtin::Info BuiltinInfo[];
8153public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008154 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8155 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008156 NoAsmVariants = true;
8157 LongLongAlign = 32;
8158 SuitableAlign = 32;
8159 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008160 SizeType = UnsignedInt;
8161 PtrDiffType = SignedInt;
8162 IntPtrType = SignedInt;
8163 WCharType = UnsignedChar;
8164 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008165 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008166 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8167 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008168 }
Craig Topper3164f332014-03-11 03:39:26 +00008169 void getTargetDefines(const LangOptions &Opts,
8170 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008171 Builder.defineMacro("__XS1B__");
8172 }
Craig Topper6c03a542015-10-19 04:51:35 +00008173 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8174 return llvm::makeArrayRef(BuiltinInfo,
8175 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008176 }
Craig Topper3164f332014-03-11 03:39:26 +00008177 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008178 return TargetInfo::VoidPtrBuiltinVaList;
8179 }
Craig Topper3164f332014-03-11 03:39:26 +00008180 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008181 return "";
8182 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008183 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008184 static const char * const GCCRegNames[] = {
8185 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8186 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8187 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008188 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008189 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008190 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8191 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008192 }
Craig Topper3164f332014-03-11 03:39:26 +00008193 bool validateAsmConstraint(const char *&Name,
8194 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008195 return false;
8196 }
Craig Topper3164f332014-03-11 03:39:26 +00008197 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008198 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8199 return (RegNo < 2)? RegNo : -1;
8200 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008201 bool allowsLargerPreferedTypeAlignment() const override {
8202 return false;
8203 }
Robert Lytton0e076492013-08-13 09:43:10 +00008204};
8205
8206const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008207#define BUILTIN(ID, TYPE, ATTRS) \
8208 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8209#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8210 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008211#include "clang/Basic/BuiltinsXCore.def"
8212};
Robert Lytton0e076492013-08-13 09:43:10 +00008213
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008214// x86_32 Android target
8215class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8216public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008217 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8218 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008219 SuitableAlign = 32;
8220 LongDoubleWidth = 64;
8221 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8222 }
8223};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008224
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008225// x86_64 Android target
8226class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8227public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008228 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8229 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008230 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8231 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008232
8233 bool useFloat128ManglingForLongDouble() const override {
8234 return true;
8235 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008236};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008237
8238// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8239class RenderScript32TargetInfo : public ARMleTargetInfo {
8240public:
8241 RenderScript32TargetInfo(const llvm::Triple &Triple,
8242 const TargetOptions &Opts)
8243 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8244 Triple.getOSName(),
8245 Triple.getEnvironmentName()),
8246 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008247 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008248 LongWidth = LongAlign = 64;
8249 }
8250 void getTargetDefines(const LangOptions &Opts,
8251 MacroBuilder &Builder) const override {
8252 Builder.defineMacro("__RENDERSCRIPT__");
8253 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8254 }
8255};
8256
8257// 64-bit RenderScript is aarch64
8258class RenderScript64TargetInfo : public AArch64leTargetInfo {
8259public:
8260 RenderScript64TargetInfo(const llvm::Triple &Triple,
8261 const TargetOptions &Opts)
8262 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8263 Triple.getOSName(),
8264 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008265 Opts) {
8266 IsRenderScriptTarget = true;
8267 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008268
8269 void getTargetDefines(const LangOptions &Opts,
8270 MacroBuilder &Builder) const override {
8271 Builder.defineMacro("__RENDERSCRIPT__");
8272 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8273 }
8274};
8275
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008276} // end anonymous namespace
8277
Chris Lattner5ba61f02006-10-14 07:39:34 +00008278//===----------------------------------------------------------------------===//
8279// Driver code
8280//===----------------------------------------------------------------------===//
8281
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008282static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8283 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008284 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008285
Daniel Dunbar52322032009-08-18 05:47:58 +00008286 switch (Triple.getArch()) {
8287 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008288 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008289
Tim Northover2a0783d2014-05-30 14:14:07 +00008290 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008292
8293 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008295
Jacques Pienaard964cc22016-03-28 21:02:54 +00008296 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008298
Tim Northover2a0783d2014-05-30 14:14:07 +00008299 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008300 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008302
8303 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008304 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008306 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008308 case llvm::Triple::Fuchsia:
8309 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008310 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008312 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008314 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008316 }
8317
Christian Pirker9b019ae2014-02-25 13:51:00 +00008318 case llvm::Triple::aarch64_be:
8319 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008320 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008322 case llvm::Triple::Fuchsia:
8323 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008324 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008326 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008328 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008329 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008330 }
8331
Daniel Dunbar52322032009-08-18 05:47:58 +00008332 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008333 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008334 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008336
Daniel Dunbar52322032009-08-18 05:47:58 +00008337 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008338 case llvm::Triple::CloudABI:
8339 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008340 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008342 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008344 case llvm::Triple::Fuchsia:
8345 return new FuchsiaTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008346 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008348 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008350 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008351 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008352 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008353 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008354 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008355 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008356 case llvm::Triple::Win32:
8357 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008358 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008359 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008360 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008361 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008362 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008363 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008364 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008365 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008366 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008367 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008368 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008369 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008370 }
8371
8372 case llvm::Triple::armeb:
8373 case llvm::Triple::thumbeb:
8374 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008375 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008376
8377 switch (os) {
8378 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008379 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008380 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008381 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008382 case llvm::Triple::Fuchsia:
8383 return new FuchsiaTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008384 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008385 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008386 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008387 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008388 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008389 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008390 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008391 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008392 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008394 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008396 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008397
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008398 case llvm::Triple::bpfeb:
8399 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008401
Daniel Dunbar52322032009-08-18 05:47:58 +00008402 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008404
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008405 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008406 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008407 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008408 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008409 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008410 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008411 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008412 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008413 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008414 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008415 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008416 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008417 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008418
8419 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008420 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008421 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008422 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008423 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008424 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008425 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008426 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008427 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008428 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008429 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008430 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008431 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008432 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008433 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008434
Akira Hatanakabef17452011-09-20 19:21:49 +00008435 case llvm::Triple::mips64:
8436 switch (os) {
8437 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008438 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008439 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008440 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008441 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008442 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008443 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008444 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008445 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008446 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008447 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008448 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008449 }
8450
8451 case llvm::Triple::mips64el:
8452 switch (os) {
8453 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008454 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008455 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008456 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008457 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008458 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008459 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008460 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008461 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008462 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008463 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008464 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008465 }
8466
Ivan Krasindd7403e2011-08-24 20:22:22 +00008467 case llvm::Triple::le32:
8468 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008469 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008470 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008471 default:
8472 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008473 }
8474
JF Bastien643817d2014-09-12 17:52:47 +00008475 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008477
Daniel Dunbar52322032009-08-18 05:47:58 +00008478 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008479 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008480 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008481 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008482 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008484 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008486 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008488 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008490 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008492 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008494 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008495
8496 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008497 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008499 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008500 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008502 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008504 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008506 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008508 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008510 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008511
Bill Schmidt778d3872013-07-26 01:36:11 +00008512 case llvm::Triple::ppc64le:
8513 switch (os) {
8514 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008516 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008518 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008520 }
8521
Peter Collingbournec947aae2012-05-20 23:28:41 +00008522 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008524 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008526
Tom Stellardd8e38a32015-01-06 20:34:47 +00008527 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008528 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008530
Daniel Dunbar52322032009-08-18 05:47:58 +00008531 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008532 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008533 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008534 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008535 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008536 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008537 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008538 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008539 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008540 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008541 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008542 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008543 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008545 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008546
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008547 // The 'sparcel' architecture copies all the above cases except for Solaris.
8548 case llvm::Triple::sparcel:
8549 switch (os) {
8550 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008552 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008554 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008556 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008558 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008560 }
8561
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008562 case llvm::Triple::sparcv9:
8563 switch (os) {
8564 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008566 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008568 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008569 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008570 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008571 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008572 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008573 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008574 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008575 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008576 }
8577
Ulrich Weigand47445072013-05-06 16:26:41 +00008578 case llvm::Triple::systemz:
8579 switch (os) {
8580 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008581 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008582 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008584 }
8585
Eli Friedmana9c3d712009-08-19 20:47:07 +00008586 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008588
Daniel Dunbar52322032009-08-18 05:47:58 +00008589 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008590 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008591 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008592
Daniel Dunbar52322032009-08-18 05:47:58 +00008593 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008594 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008596 case llvm::Triple::Linux: {
8597 switch (Triple.getEnvironment()) {
8598 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008599 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008600 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008602 }
8603 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008604 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008605 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008606 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008607 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008608 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008609 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008610 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008611 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008612 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008613 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008614 case llvm::Triple::Fuchsia:
8615 return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008616 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008617 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008618 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008619 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008620 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008621 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008622 case llvm::Triple::Win32: {
8623 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008624 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008625 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008626 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008627 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008628 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008629 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008630 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008631 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008632 }
8633 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008634 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008635 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008636 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008637 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008638 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008639 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008640 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008641 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008642 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008643 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008644 }
8645
8646 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008647 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008648 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008649
Daniel Dunbar52322032009-08-18 05:47:58 +00008650 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008651 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008652 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008653 case llvm::Triple::Linux: {
8654 switch (Triple.getEnvironment()) {
8655 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008656 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008657 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008658 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008659 }
8660 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008661 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008662 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008663 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008664 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008665 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008666 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008667 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008668 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008669 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008670 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008671 case llvm::Triple::Fuchsia:
8672 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008673 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008674 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008675 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008676 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008677 case llvm::Triple::Win32: {
8678 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008679 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008680 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008681 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008682 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008683 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008684 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008685 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008686 }
8687 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008688 case llvm::Triple::Haiku:
8689 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008690 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008691 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008692 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008693 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008694 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008695 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008696 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008697
Douglas Katzman78d7c542015-05-12 21:18:10 +00008698 case llvm::Triple::spir: {
8699 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8700 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8701 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008702 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008703 }
8704 case llvm::Triple::spir64: {
8705 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8706 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8707 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008708 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008709 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008710 case llvm::Triple::wasm32:
8711 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8712 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008713 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008714 case llvm::Triple::wasm64:
8715 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8716 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008717 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008718
8719 case llvm::Triple::renderscript32:
8720 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8721 case llvm::Triple::renderscript64:
8722 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008723 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008724}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008725
8726/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008727/// options.
Alp Toker80758082014-07-06 05:26:44 +00008728TargetInfo *
8729TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008730 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008731 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008732
8733 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008734 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008735 if (!Target) {
8736 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008737 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008738 }
Alp Toker80758082014-07-06 05:26:44 +00008739 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008740
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008741 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008742 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8743 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008744 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008745 }
8746
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008747 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008748 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8749 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008750 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008751 }
8752
Rafael Espindolaeb265472013-08-21 21:59:03 +00008753 // Set the fp math unit.
8754 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8755 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008756 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008757 }
8758
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008759 // Compute the default target features, we need the target to handle this
8760 // because features may have dependencies on one another.
8761 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008762 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8763 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008764 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008765
8766 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008767 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008768 for (const auto &F : Features)
8769 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8770
Eric Christopher3ff21b32013-10-16 21:26:26 +00008771 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008772 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008773
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008774 Target->setSupportedOpenCLOpts();
8775
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008776 if (!Target->validateTarget(Diags))
8777 return nullptr;
8778
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008779 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008780}