blob: 4716b5e9b1c387be9fcb5d830008d47c1bb25e65 [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);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000515 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
544 DefineStd(Builder, "unix", Opts);
545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 }
549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000550 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
551 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000552 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000553
Eli Friedman3715d1f2011-12-15 02:15:56 +0000554 switch (Triple.getArch()) {
555 default:
556 case llvm::Triple::x86:
557 case llvm::Triple::x86_64:
558 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000559 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000560 this->MCountName = "__mcount";
561 break;
562 case llvm::Triple::mips64:
563 case llvm::Triple::mips64el:
564 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000565 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000566 this->MCountName = "_mcount";
567 break;
568 }
569 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000570};
571
Eli Friedman9fa28852012-08-08 23:57:20 +0000572// Bitrig Target
573template<typename Target>
574class BitrigTargetInfo : public OSTargetInfo<Target> {
575protected:
Craig Topper3164f332014-03-11 03:39:26 +0000576 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
577 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000578 // Bitrig defines; list based off of gcc output
579
580 Builder.defineMacro("__Bitrig__");
581 DefineStd(Builder, "unix", Opts);
582 Builder.defineMacro("__ELF__");
583 if (Opts.POSIXThreads)
584 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000585
586 switch (Triple.getArch()) {
587 default:
588 break;
589 case llvm::Triple::arm:
590 case llvm::Triple::armeb:
591 case llvm::Triple::thumb:
592 case llvm::Triple::thumbeb:
593 Builder.defineMacro("__ARM_DWARF_EH__");
594 break;
595 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000596 }
597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000598 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
599 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000600 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000601 }
602};
603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000604// PSP Target
605template<typename Target>
606class PSPTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000610 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000611 Builder.defineMacro("PSP");
612 Builder.defineMacro("_PSP");
613 Builder.defineMacro("__psp__");
614 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000615 }
616public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000617 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000618};
619
John Thompsone467e192009-11-19 17:18:50 +0000620// PS3 PPU Target
621template<typename Target>
622class PS3PPUTargetInfo : public OSTargetInfo<Target> {
623protected:
Craig Topper3164f332014-03-11 03:39:26 +0000624 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
625 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000626 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000627 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("__PPU__");
629 Builder.defineMacro("__CELLOS_LV2__");
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000632 Builder.defineMacro("_ARCH_PPC64");
633 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000634 }
635public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000636 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
637 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000638 this->LongWidth = this->LongAlign = 32;
639 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000640 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000641 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000642 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000643 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000644 }
645};
646
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647template <typename Target>
648class PS4OSTargetInfo : public OSTargetInfo<Target> {
649protected:
650 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
651 MacroBuilder &Builder) const override {
652 Builder.defineMacro("__FreeBSD__", "9");
653 Builder.defineMacro("__FreeBSD_cc_version", "900001");
654 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
655 DefineStd(Builder, "unix", Opts);
656 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000657 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 }
659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000660 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
661 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000662 this->WCharType = this->UnsignedShort;
663
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000664 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
665 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000666
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000667 // On PS4, do not honor explicit bit field alignment,
668 // as in "__attribute__((aligned(2))) int b : 1;".
669 this->UseExplicitBitFieldAlignment = false;
670
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000671 switch (Triple.getArch()) {
672 default:
673 case llvm::Triple::x86_64:
674 this->MCountName = ".mcount";
675 break;
676 }
677 }
678};
679
Torok Edwinb2b37c62009-06-30 17:10:35 +0000680// Solaris target
681template<typename Target>
682class SolarisTargetInfo : public OSTargetInfo<Target> {
683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000686 DefineStd(Builder, "sun", Opts);
687 DefineStd(Builder, "unix", Opts);
688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__svr4__");
690 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000691 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
692 // newer, but to 500 for everything else. feature_test.h has a check to
693 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000694 // with a new version.
695 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000696 Builder.defineMacro("_XOPEN_SOURCE", "600");
697 else
698 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000699 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000700 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000701 Builder.defineMacro("_LARGEFILE_SOURCE");
702 Builder.defineMacro("_LARGEFILE64_SOURCE");
703 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000704 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000705 }
706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000707 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
708 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000709 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000710 // FIXME: WIntType should be SignedLong
711 }
712};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713
714// Windows target
715template<typename Target>
716class WindowsTargetInfo : public OSTargetInfo<Target> {
717protected:
Craig Topper3164f332014-03-11 03:39:26 +0000718 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
719 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720 Builder.defineMacro("_WIN32");
721 }
722 void getVisualStudioDefines(const LangOptions &Opts,
723 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000725 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 Builder.defineMacro("_CPPRTTI");
727
Reid Kleckner16514352015-01-30 21:42:55 +0000728 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000729 Builder.defineMacro("_CPPUNWIND");
730 }
731
David Majnemer6a658902015-07-22 22:36:26 +0000732 if (Opts.Bool)
733 Builder.defineMacro("__BOOL_DEFINED");
734
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000735 if (!Opts.CharIsSigned)
736 Builder.defineMacro("_CHAR_UNSIGNED");
737
738 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
739 // but it works for now.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000742
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000743 if (Opts.MSCompatibilityVersion) {
744 Builder.defineMacro("_MSC_VER",
745 Twine(Opts.MSCompatibilityVersion / 100000));
746 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000747 // FIXME We cannot encode the revision information into 32-bits
748 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000749
David Majnemerb710a932015-05-11 03:57:49 +0000750 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000751 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000752
753 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
754 if (Opts.CPlusPlus1z)
755 Builder.defineMacro("_MSVC_LANG", "201403L");
756 else if (Opts.CPlusPlus14)
757 Builder.defineMacro("_MSVC_LANG", "201402L");
758 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000759 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000760
761 if (Opts.MicrosoftExt) {
762 Builder.defineMacro("_MSC_EXTENSIONS");
763
764 if (Opts.CPlusPlus11) {
765 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
766 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
767 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
768 }
769 }
770
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000771 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772 }
773
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000775 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
776 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000777};
778
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779template <typename Target>
780class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000781protected:
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
783 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000784 if (Opts.POSIXThreads)
785 Builder.defineMacro("_REENTRANT");
786 if (Opts.CPlusPlus)
787 Builder.defineMacro("_GNU_SOURCE");
788
789 DefineStd(Builder, "unix", Opts);
790 Builder.defineMacro("__ELF__");
791 Builder.defineMacro("__native_client__");
792 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000793
794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000795 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
796 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongAlign = 32;
798 this->LongWidth = 32;
799 this->PointerAlign = 32;
800 this->PointerWidth = 32;
801 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000802 this->Int64Type = TargetInfo::SignedLongLong;
803 this->DoubleAlign = 64;
804 this->LongDoubleWidth = 64;
805 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000806 this->LongLongWidth = 64;
807 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000808 this->SizeType = TargetInfo::UnsignedInt;
809 this->PtrDiffType = TargetInfo::SignedInt;
810 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000811 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000812 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000814 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else {
822 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000823 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000824 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000825 }
826};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000827
Petr Hosek62e1d232016-10-06 06:08:09 +0000828// Fuchsia Target
829template<typename Target>
830class FuchsiaTargetInfo : public OSTargetInfo<Target> {
831protected:
832 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
833 MacroBuilder &Builder) const override {
834 Builder.defineMacro("__Fuchsia__");
835 Builder.defineMacro("__ELF__");
836 if (Opts.POSIXThreads)
837 Builder.defineMacro("_REENTRANT");
838 // Required by the libc++ locale support.
839 if (Opts.CPlusPlus)
840 Builder.defineMacro("_GNU_SOURCE");
841 }
842public:
843 FuchsiaTargetInfo(const llvm::Triple &Triple,
844 const TargetOptions &Opts)
845 : OSTargetInfo<Target>(Triple, Opts) {
846 this->MCountName = "__mcount";
847 }
848};
849
Dan Gohmanc2853072015-09-03 22:51:53 +0000850// WebAssembly target
851template <typename Target>
852class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
853 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000854 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000855 // A common platform macro.
856 if (Opts.POSIXThreads)
857 Builder.defineMacro("_REENTRANT");
858 // Follow g++ convention and predefine _GNU_SOURCE for C++.
859 if (Opts.CPlusPlus)
860 Builder.defineMacro("_GNU_SOURCE");
861 }
862
863 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000864 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000865 return ".text.__startup";
866 }
867
868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000869 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
870 const TargetOptions &Opts)
871 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000872 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000873 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
874 }
875};
Dan Gohmanc2853072015-09-03 22:51:53 +0000876
Chris Lattner09d98f52008-10-05 21:50:58 +0000877//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878// Specific target implementations.
879//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000880
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881// PPC abstract base class
882class PPCTargetInfo : public TargetInfo {
883 static const Builtin::Info BuiltinInfo[];
884 static const char * const GCCRegNames[];
885 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000886 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887
888 // Target cpu features.
889 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000890 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000891 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000892 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000893 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000894 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000895 bool HasBPERMD;
896 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000897 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000898
Ulrich Weigand8afad612014-07-28 13:17:52 +0000899protected:
900 std::string ABI;
901
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000903 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000904 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
905 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000906 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000907 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000908 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000909 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000910 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000911
Hal Finkel6b984f02012-07-03 16:51:04 +0000912 /// \brief Flags for architecture specific defines.
913 typedef enum {
914 ArchDefineNone = 0,
915 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
916 ArchDefinePpcgr = 1 << 1,
917 ArchDefinePpcsq = 1 << 2,
918 ArchDefine440 = 1 << 3,
919 ArchDefine603 = 1 << 4,
920 ArchDefine604 = 1 << 5,
921 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 ArchDefinePwr5 = 1 << 7,
923 ArchDefinePwr5x = 1 << 8,
924 ArchDefinePwr6 = 1 << 9,
925 ArchDefinePwr6x = 1 << 10,
926 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000927 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 ArchDefinePwr9 = 1 << 13,
929 ArchDefineA2 = 1 << 14,
930 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000931 } ArchDefineTypes;
932
Bill Schmidt38378a02013-02-01 20:23:10 +0000933 // Note: GCC recognizes the following additional cpus:
934 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
935 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
936 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000937 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 bool CPUKnown = llvm::StringSwitch<bool>(Name)
939 .Case("generic", true)
940 .Case("440", true)
941 .Case("450", true)
942 .Case("601", true)
943 .Case("602", true)
944 .Case("603", true)
945 .Case("603e", true)
946 .Case("603ev", true)
947 .Case("604", true)
948 .Case("604e", true)
949 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000950 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("g3", true)
952 .Case("7400", true)
953 .Case("g4", true)
954 .Case("7450", true)
955 .Case("g4+", true)
956 .Case("750", true)
957 .Case("970", true)
958 .Case("g5", true)
959 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000960 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000961 .Case("e500mc", true)
962 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000963 .Case("power3", true)
964 .Case("pwr3", true)
965 .Case("power4", true)
966 .Case("pwr4", true)
967 .Case("power5", true)
968 .Case("pwr5", true)
969 .Case("power5x", true)
970 .Case("pwr5x", true)
971 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000972 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("power6x", true)
974 .Case("pwr6x", true)
975 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000976 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000977 .Case("power8", true)
978 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000979 .Case("power9", true)
980 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000985 .Case("powerpc64le", true)
986 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Default(false);
988
989 if (CPUKnown)
990 CPU = Name;
991
992 return CPUKnown;
993 }
994
Ulrich Weigand8afad612014-07-28 13:17:52 +0000995
996 StringRef getABI() const override { return ABI; }
997
Craig Topper6c03a542015-10-19 04:51:35 +0000998 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
999 return llvm::makeArrayRef(BuiltinInfo,
1000 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 void getTargetDefines(const LangOptions &Opts,
1006 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001007
Eric Christopher8c47b422015-10-09 18:39:55 +00001008 bool
1009 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1010 StringRef CPU,
1011 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001012
Craig Topper3164f332014-03-11 03:39:26 +00001013 bool handleTargetFeatures(std::vector<std::string> &Features,
1014 DiagnosticsEngine &Diags) override;
1015 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001016 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1017 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001018
Craig Topperf054e3a2015-10-19 03:52:27 +00001019 ArrayRef<const char *> getGCCRegNames() const override;
1020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001021 bool validateAsmConstraint(const char *&Name,
1022 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001023 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001024 default: return false;
1025 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001026 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 case 'b': // Base register
1028 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001029 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001030 break;
1031 // FIXME: The following are added to allow parsing.
1032 // I just took a guess at what the actions should be.
1033 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001035 case 'v': // Altivec vector register
1036 Info.setAllowsRegister();
1037 break;
1038 case 'w':
1039 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001040 case 'd':// VSX vector register to hold vector double data
1041 case 'f':// VSX vector register to hold vector float data
1042 case 's':// VSX vector register to hold scalar float data
1043 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001044 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 default:
1047 return false;
1048 }
1049 Info.setAllowsRegister();
1050 Name++; // Skip over 'w'.
1051 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001052 case 'h': // `MQ', `CTR', or `LINK' register
1053 case 'q': // `MQ' register
1054 case 'c': // `CTR' register
1055 case 'l': // `LINK' register
1056 case 'x': // `CR' register (condition register) number 0
1057 case 'y': // `CR' register (condition register)
1058 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // (use `L' instead for SImode constants)
1064 case 'K': // Unsigned 16-bit constant
1065 case 'L': // Signed 16-bit constant shifted left 16 bits
1066 case 'M': // Constant larger than 31
1067 case 'N': // Exact power of 2
1068 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001073 break;
1074 case 'm': // Memory operand. Note that on PowerPC targets, m can
1075 // include addresses that update the base register. It
1076 // is therefore only safe to use `m' in an asm statement
1077 // if that asm statement accesses the operand exactly once.
1078 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001079 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1084 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001085 // register to be updated.
1086 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001087 if (Name[1] != 's')
1088 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001089 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001090 // include any automodification of the base register. Unlike
1091 // `m', this constraint can be used in asm statements that
1092 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001093 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001094 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001095 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001096 break;
1097 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001098 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001099 case 'Z': // Memory operand that is an indexed or indirect from a
1100 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001101 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001102 Info.setAllowsMemory();
1103 Info.setAllowsRegister();
1104 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001106 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 // register (`p' is preferable for asm statements)
1108 case 'S': // Constant suitable as a 64-bit mask operand
1109 case 'T': // Constant suitable as a 32-bit mask operand
1110 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001111 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // instructions
1113 case 'W': // Vector constant that does not require memory
1114 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001115 break;
1116 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
John Thompson07a61a42010-06-24 22:44:13 +00001118 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
Craig Topper3164f332014-03-11 03:39:26 +00001120 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001121 std::string R;
1122 switch (*Constraint) {
1123 case 'e':
1124 case 'w':
1125 // Two-character constraint; add "^" hint for later parsing.
1126 R = std::string("^") + std::string(Constraint, 2);
1127 Constraint++;
1128 break;
1129 default:
1130 return TargetInfo::convertConstraint(Constraint);
1131 }
1132 return R;
1133 }
Craig Topper3164f332014-03-11 03:39:26 +00001134 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001136 }
Craig Topper3164f332014-03-11 03:39:26 +00001137 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001138 if (RegNo == 0) return 3;
1139 if (RegNo == 1) return 4;
1140 return -1;
1141 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001142
1143 bool hasSjLjLowering() const override {
1144 return true;
1145 }
David Majnemer2617ea62015-06-09 18:05:33 +00001146
1147 bool useFloat128ManglingForLongDouble() const override {
1148 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001149 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001150 getTriple().isOSBinFormatELF();
1151 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152};
Anders Carlssonf511f642007-11-27 04:11:28 +00001153
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001155#define BUILTIN(ID, TYPE, ATTRS) \
1156 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1157#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1158 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001159#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001161
Eric Christopher917e9522014-11-18 22:36:15 +00001162/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001164bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001166 for (const auto &Feature : Features) {
1167 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001168 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001174 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001176 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001178 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001180 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001182 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001183 } else if (Feature == "+float128") {
1184 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001185 } else if (Feature == "+power9-vector") {
1186 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001187 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001188 // TODO: Finish this list and add an assert that we've handled them
1189 // all.
1190 }
Eric Christopher02c33352015-08-25 00:59:11 +00001191
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001192 return true;
1193}
1194
Chris Lattnerecd49032009-03-02 22:27:17 +00001195/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1196/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001197void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001199 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001201 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001203 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001207 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001209 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001211
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1214 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 } else {
1216 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1217 getTriple().getOS() != llvm::Triple::OpenBSD)
1218 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001219 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001220
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001222 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 Builder.defineMacro("_CALL_ELF", "1");
1224 if (ABI == "elfv2")
1225 Builder.defineMacro("_CALL_ELF", "2");
1226
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001228 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1229 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001230
Chris Lattnerecd49032009-03-02 22:27:17 +00001231 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001232 if (LongDoubleWidth == 128)
1233 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001234
John Thompsone467e192009-11-19 17:18:50 +00001235 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 Builder.defineMacro("__VEC__", "10206");
1237 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001238 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001239
1240 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001241 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1242 .Case("440", ArchDefineName)
1243 .Case("450", ArchDefineName | ArchDefine440)
1244 .Case("601", ArchDefineName)
1245 .Case("602", ArchDefineName | ArchDefinePpcgr)
1246 .Case("603", ArchDefineName | ArchDefinePpcgr)
1247 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1248 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1249 .Case("604", ArchDefineName | ArchDefinePpcgr)
1250 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1251 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001252 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001253 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1254 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1255 .Case("750", ArchDefineName | ArchDefinePpcgr)
1256 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001258 .Case("a2", ArchDefineA2)
1259 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("pwr3", ArchDefinePpcgr)
1261 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1263 | ArchDefinePpcsq)
1264 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1265 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1267 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1269 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1272 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001273 | ArchDefinePpcgr | ArchDefinePpcsq)
1274 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1275 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1276 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1278 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1279 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1280 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 .Case("power3", ArchDefinePpcgr)
1282 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1283 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1284 | ArchDefinePpcsq)
1285 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1286 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1289 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1290 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1293 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001294 | ArchDefinePpcgr | ArchDefinePpcsq)
1295 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1296 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1297 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001298 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1299 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1300 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1301 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001302 .Default(ArchDefineNone);
1303
1304 if (defs & ArchDefineName)
1305 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1306 if (defs & ArchDefinePpcgr)
1307 Builder.defineMacro("_ARCH_PPCGR");
1308 if (defs & ArchDefinePpcsq)
1309 Builder.defineMacro("_ARCH_PPCSQ");
1310 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001311 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001312 if (defs & ArchDefine603)
1313 Builder.defineMacro("_ARCH_603");
1314 if (defs & ArchDefine604)
1315 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001320 if (defs & ArchDefinePwr5x)
1321 Builder.defineMacro("_ARCH_PWR5X");
1322 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 if (defs & ArchDefinePwr6x)
1325 Builder.defineMacro("_ARCH_PWR6X");
1326 if (defs & ArchDefinePwr7)
1327 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001328 if (defs & ArchDefinePwr8)
1329 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001330 if (defs & ArchDefinePwr9)
1331 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001332 if (defs & ArchDefineA2)
1333 Builder.defineMacro("_ARCH_A2");
1334 if (defs & ArchDefineA2q) {
1335 Builder.defineMacro("_ARCH_A2Q");
1336 Builder.defineMacro("_ARCH_QP");
1337 }
1338
1339 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1340 Builder.defineMacro("__bg__");
1341 Builder.defineMacro("__THW_BLUEGENE__");
1342 Builder.defineMacro("__bgq__");
1343 Builder.defineMacro("__TOS_BGQ__");
1344 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001345
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001346 if (HasVSX)
1347 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001348 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001349 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001350 if (HasP8Crypto)
1351 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001352 if (HasHTM)
1353 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001354 if (HasFloat128)
1355 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001356 if (HasP9Vector)
1357 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001358
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1362 if (PointerWidth == 64)
1363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001364
Bill Schmidt38378a02013-02-01 20:23:10 +00001365 // FIXME: The following are not yet generated here by Clang, but are
1366 // generated by GCC:
1367 //
1368 // _SOFT_FLOAT_
1369 // __RECIP_PRECISION__
1370 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001371 // __RECIP__
1372 // __RECIPF__
1373 // __RSQRTE__
1374 // __RSQRTEF__
1375 // _SOFT_DOUBLE_
1376 // __NO_LWSYNC__
1377 // __HAVE_BSWAP__
1378 // __LONGDOUBLE128
1379 // __CMODEL_MEDIUM__
1380 // __CMODEL_LARGE__
1381 // _CALL_SYSV
1382 // _CALL_DARWIN
1383 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001384}
1385
Eric Christophera8a14c32015-08-31 18:39:16 +00001386// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001387// explicitly turned off vsx and turned on any of:
1388// - power8-vector
1389// - direct-move
1390// - float128
1391// - power9-vector
1392// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// set of options.
1394static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001395 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001396
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1398 FeaturesVec.end()) {
1399 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1400 FeaturesVec.end()) {
1401 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1402 << "-mno-vsx";
1403 return false;
1404 }
1405
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1409 << "-mno-vsx";
1410 return false;
1411 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1423 << "-mno-vsx";
1424 return false;
1425 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001426 }
1427
1428 return true;
1429}
1430
Eric Christopher8c47b422015-10-09 18:39:55 +00001431bool PPCTargetInfo::initFeatureMap(
1432 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1433 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001434 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1435 .Case("7400", true)
1436 .Case("g4", true)
1437 .Case("7450", true)
1438 .Case("g4+", true)
1439 .Case("970", true)
1440 .Case("g5", true)
1441 .Case("pwr6", true)
1442 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001443 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001444 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001446 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001447 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001448
1449 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001450 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001451 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1452 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001453 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001454 .Case("pwr8", true)
1455 .Default(false);
1456 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1457 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001458 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001459 .Case("pwr8", true)
1460 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001461 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1462 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001463 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001464 .Case("pwr8", true)
1465 .Case("pwr7", true)
1466 .Default(false);
1467 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001469 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001470 .Case("pwr8", true)
1471 .Case("pwr7", true)
1472 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1474 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001475 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001476 .Case("pwr8", true)
1477 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001478 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1479 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001480 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001481 .Case("pwr8", true)
1482 .Case("pwr7", true)
1483 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001484
Eric Christophera8a14c32015-08-31 18:39:16 +00001485 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1486 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001487
Eric Christopher007b0a02015-08-28 22:32:01 +00001488 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001489}
1490
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001491bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001492 return llvm::StringSwitch<bool>(Feature)
1493 .Case("powerpc", true)
1494 .Case("vsx", HasVSX)
1495 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001497 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001498 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001499 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001500 .Case("bpermd", HasBPERMD)
1501 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001502 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001504 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001505}
Chris Lattner17df24e2008-04-21 18:56:49 +00001506
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001507void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1508 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001509 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1510 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1511 // incompatible options.
1512 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001513 if (Name == "direct-move" ||
1514 Name == "power8-vector" ||
1515 Name == "float128" ||
1516 Name == "power9-vector") {
1517 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001518 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001519 if (Name == "power9-vector")
1520 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001521 } else {
1522 Features[Name] = true;
1523 }
1524 } else {
1525 if (Name == "vsx") {
1526 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001527 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530 }
1531 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001532}
1533
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001535 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1537 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1538 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1539 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1540 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1541 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1542 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001545 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001546 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1547 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1548 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1549 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "vrsave", "vscr",
1551 "spe_acc", "spefscr",
1552 "sfp"
1553};
Chris Lattner10a5b382007-01-29 05:24:35 +00001554
Craig Topperf054e3a2015-10-19 03:52:27 +00001555ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1556 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001558
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001559const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1560 // While some of these aliases do map to different registers
1561 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "0" }, "r0" },
1563 { { "1"}, "r1" },
1564 { { "2" }, "r2" },
1565 { { "3" }, "r3" },
1566 { { "4" }, "r4" },
1567 { { "5" }, "r5" },
1568 { { "6" }, "r6" },
1569 { { "7" }, "r7" },
1570 { { "8" }, "r8" },
1571 { { "9" }, "r9" },
1572 { { "10" }, "r10" },
1573 { { "11" }, "r11" },
1574 { { "12" }, "r12" },
1575 { { "13" }, "r13" },
1576 { { "14" }, "r14" },
1577 { { "15" }, "r15" },
1578 { { "16" }, "r16" },
1579 { { "17" }, "r17" },
1580 { { "18" }, "r18" },
1581 { { "19" }, "r19" },
1582 { { "20" }, "r20" },
1583 { { "21" }, "r21" },
1584 { { "22" }, "r22" },
1585 { { "23" }, "r23" },
1586 { { "24" }, "r24" },
1587 { { "25" }, "r25" },
1588 { { "26" }, "r26" },
1589 { { "27" }, "r27" },
1590 { { "28" }, "r28" },
1591 { { "29" }, "r29" },
1592 { { "30" }, "r30" },
1593 { { "31" }, "r31" },
1594 { { "fr0" }, "f0" },
1595 { { "fr1" }, "f1" },
1596 { { "fr2" }, "f2" },
1597 { { "fr3" }, "f3" },
1598 { { "fr4" }, "f4" },
1599 { { "fr5" }, "f5" },
1600 { { "fr6" }, "f6" },
1601 { { "fr7" }, "f7" },
1602 { { "fr8" }, "f8" },
1603 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001604 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001605 { { "fr11" }, "f11" },
1606 { { "fr12" }, "f12" },
1607 { { "fr13" }, "f13" },
1608 { { "fr14" }, "f14" },
1609 { { "fr15" }, "f15" },
1610 { { "fr16" }, "f16" },
1611 { { "fr17" }, "f17" },
1612 { { "fr18" }, "f18" },
1613 { { "fr19" }, "f19" },
1614 { { "fr20" }, "f20" },
1615 { { "fr21" }, "f21" },
1616 { { "fr22" }, "f22" },
1617 { { "fr23" }, "f23" },
1618 { { "fr24" }, "f24" },
1619 { { "fr25" }, "f25" },
1620 { { "fr26" }, "f26" },
1621 { { "fr27" }, "f27" },
1622 { { "fr28" }, "f28" },
1623 { { "fr29" }, "f29" },
1624 { { "fr30" }, "f30" },
1625 { { "fr31" }, "f31" },
1626 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001627};
1628
Craig Topperf054e3a2015-10-19 03:52:27 +00001629ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1630 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001632
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001633class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001635 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1636 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001638
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001640 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001641 case llvm::Triple::FreeBSD:
1642 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001643 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001644 PtrDiffType = SignedInt;
1645 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001647 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001648 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001649 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001650
Roman Divacky3ffe7462012-03-13 19:20:17 +00001651 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1652 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001653 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001654 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001655
1656 // PPC32 supports atomics up to 4 bytes.
1657 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
1659
Craig Topper3164f332014-03-11 03:39:26 +00001660 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001661 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001663 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001664};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001665
Bill Schmidt778d3872013-07-26 01:36:11 +00001666// Note: ABI differences may eventually require us to have a separate
1667// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1671 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001672 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001673 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001674 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001675
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001677 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001678 ABI = "elfv2";
1679 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001680 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001681 ABI = "elfv1";
1682 }
1683
1684 switch (getTriple().getOS()) {
1685 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001686 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001687 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001688 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001689 case llvm::Triple::NetBSD:
1690 IntMaxType = SignedLongLong;
1691 Int64Type = SignedLongLong;
1692 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001693 default:
1694 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001695 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001696
1697 // PPC64 supports atomics up to 8 bytes.
1698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001703 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001705 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001706 ABI = Name;
1707 return true;
1708 }
1709 return false;
1710 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001711};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001712
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001715 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001717 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001718 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001719 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001720 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001721 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001722 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001723 }
Craig Topper3164f332014-03-11 03:39:26 +00001724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001725 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001726 }
1727};
1728
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001730public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001731 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1732 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001734 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001735 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736 }
1737};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001738
Eric Christopherc48497a2015-09-18 21:26:24 +00001739static const unsigned NVPTXAddrSpaceMap[] = {
1740 1, // opencl_global
1741 3, // opencl_local
1742 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001743 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001744 0, // opencl_generic
1745 1, // cuda_device
1746 4, // cuda_constant
1747 3, // cuda_shared
1748};
1749
1750class NVPTXTargetInfo : public TargetInfo {
1751 static const char *const GCCRegNames[];
1752 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001753 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001754 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001755
Eric Christopherc48497a2015-09-18 21:26:24 +00001756public:
Justin Lebarb6626592017-01-05 16:53:21 +00001757 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1758 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001759 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001760 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1761 "NVPTX only supports 32- and 64-bit modes.");
1762
Eric Christopherc48497a2015-09-18 21:26:24 +00001763 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001764 AddrSpaceMap = &NVPTXAddrSpaceMap;
1765 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001766
Eric Christopherc48497a2015-09-18 21:26:24 +00001767 // Define available target features
1768 // These must be defined in sorted order!
1769 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001770 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001771
Justin Lebarb6626592017-01-05 16:53:21 +00001772 if (TargetPointerWidth == 32)
1773 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1774 else
1775 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // If possible, get a TargetInfo for our host triple, so we can match its
1778 // types.
1779 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001780 if (!HostTriple.isNVPTX())
1781 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1782
1783 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001784 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001785 LongWidth = LongAlign = TargetPointerWidth;
1786 PointerWidth = PointerAlign = TargetPointerWidth;
1787 switch (TargetPointerWidth) {
1788 case 32:
1789 SizeType = TargetInfo::UnsignedInt;
1790 PtrDiffType = TargetInfo::SignedInt;
1791 IntPtrType = TargetInfo::SignedInt;
1792 break;
1793 case 64:
1794 SizeType = TargetInfo::UnsignedLong;
1795 PtrDiffType = TargetInfo::SignedLong;
1796 IntPtrType = TargetInfo::SignedLong;
1797 break;
1798 default:
1799 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1800 }
Justin Lebar76945b22016-04-29 23:05:19 +00001801 return;
1802 }
1803
Justin Lebarb6626592017-01-05 16:53:21 +00001804 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001805 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1806 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1807 BoolWidth = HostTarget->getBoolWidth();
1808 BoolAlign = HostTarget->getBoolAlign();
1809 IntWidth = HostTarget->getIntWidth();
1810 IntAlign = HostTarget->getIntAlign();
1811 HalfWidth = HostTarget->getHalfWidth();
1812 HalfAlign = HostTarget->getHalfAlign();
1813 FloatWidth = HostTarget->getFloatWidth();
1814 FloatAlign = HostTarget->getFloatAlign();
1815 DoubleWidth = HostTarget->getDoubleWidth();
1816 DoubleAlign = HostTarget->getDoubleAlign();
1817 LongWidth = HostTarget->getLongWidth();
1818 LongAlign = HostTarget->getLongAlign();
1819 LongLongWidth = HostTarget->getLongLongWidth();
1820 LongLongAlign = HostTarget->getLongLongAlign();
1821 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001822 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001823 DefaultAlignForAttributeAligned =
1824 HostTarget->getDefaultAlignForAttributeAligned();
1825 SizeType = HostTarget->getSizeType();
1826 IntMaxType = HostTarget->getIntMaxType();
1827 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1828 IntPtrType = HostTarget->getIntPtrType();
1829 WCharType = HostTarget->getWCharType();
1830 WIntType = HostTarget->getWIntType();
1831 Char16Type = HostTarget->getChar16Type();
1832 Char32Type = HostTarget->getChar32Type();
1833 Int64Type = HostTarget->getInt64Type();
1834 SigAtomicType = HostTarget->getSigAtomicType();
1835 ProcessIDType = HostTarget->getProcessIDType();
1836
1837 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1838 UseZeroLengthBitfieldAlignment =
1839 HostTarget->useZeroLengthBitfieldAlignment();
1840 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1841 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1842
Justin Lebar5057f172016-09-09 20:35:43 +00001843 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1844 // we need those macros to be identical on host and device, because (among
1845 // other things) they affect which standard library classes are defined, and
1846 // we need all classes to be defined on both the host and device.
1847 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1848
Justin Lebar76945b22016-04-29 23:05:19 +00001849 // Properties intentionally not copied from host:
1850 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1851 // host/device boundary.
1852 // - SuitableAlign: Not visible across the host/device boundary, and may
1853 // correctly be different on host/device, e.g. if host has wider vector
1854 // types than device.
1855 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1856 // as its double type, but that's not necessarily true on the host.
1857 // TODO: nvcc emits a warning when using long double on device; we should
1858 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001859 }
1860 void getTargetDefines(const LangOptions &Opts,
1861 MacroBuilder &Builder) const override {
1862 Builder.defineMacro("__PTX__");
1863 Builder.defineMacro("__NVPTX__");
1864 if (Opts.CUDAIsDevice) {
1865 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001866 std::string CUDAArchCode = [this] {
1867 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001868 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001869 assert(false && "No GPU arch when compiling CUDA device code.");
1870 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001871 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001872 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001873 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001874 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001875 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001876 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001877 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001878 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001879 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001880 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001881 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001882 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001883 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001884 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001885 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001886 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001887 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001888 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001889 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001890 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001891 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001892 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001893 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001894 return "620";
1895 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001896 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001899 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
Craig Topper6c03a542015-10-19 04:51:35 +00001901 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1902 return llvm::makeArrayRef(BuiltinInfo,
1903 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
Artem Belevichfda99052016-09-28 17:47:35 +00001905 bool
1906 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1907 StringRef CPU,
1908 const std::vector<std::string> &FeaturesVec) const override {
1909 Features["satom"] = GPU >= CudaArch::SM_60;
1910 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1911 }
1912
Eric Christopherc48497a2015-09-18 21:26:24 +00001913 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001914 return llvm::StringSwitch<bool>(Feature)
1915 .Cases("ptx", "nvptx", true)
1916 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1917 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001918 }
1919
Craig Topperf054e3a2015-10-19 03:52:27 +00001920 ArrayRef<const char *> getGCCRegNames() const override;
1921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001923 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001924 }
1925 bool validateAsmConstraint(const char *&Name,
1926 TargetInfo::ConstraintInfo &Info) const override {
1927 switch (*Name) {
1928 default:
1929 return false;
1930 case 'c':
1931 case 'h':
1932 case 'r':
1933 case 'l':
1934 case 'f':
1935 case 'd':
1936 Info.setAllowsRegister();
1937 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001938 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 }
1940 const char *getClobbers() const override {
1941 // FIXME: Is this really right?
1942 return "";
1943 }
1944 BuiltinVaListKind getBuiltinVaListKind() const override {
1945 // FIXME: implement
1946 return TargetInfo::CharPtrBuiltinVaList;
1947 }
1948 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001949 GPU = StringToCudaArch(Name);
1950 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001951 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001952 void setSupportedOpenCLOpts() override {
1953 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001954 Opts.support("cl_clang_storage_class_specifiers");
1955 Opts.support("cl_khr_gl_sharing");
1956 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001957
Yaxun Liu5b746652016-12-18 05:18:55 +00001958 Opts.support("cl_khr_fp64");
1959 Opts.support("cl_khr_byte_addressable_store");
1960 Opts.support("cl_khr_global_int32_base_atomics");
1961 Opts.support("cl_khr_global_int32_extended_atomics");
1962 Opts.support("cl_khr_local_int32_base_atomics");
1963 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001964 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001965};
1966
1967const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1968#define BUILTIN(ID, TYPE, ATTRS) \
1969 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1970#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1971 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001972#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1973 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001974#include "clang/Basic/BuiltinsNVPTX.def"
1975};
1976
1977const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1978
Craig Topperf054e3a2015-10-19 03:52:27 +00001979ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1980 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001981}
1982
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001983static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001984 1, // opencl_global
1985 3, // opencl_local
1986 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001987 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001988 1, // cuda_device
1989 2, // cuda_constant
1990 3 // cuda_shared
1991};
1992
Tom Stellarda96344b2014-08-21 13:58:40 +00001993// If you edit the description strings, make sure you update
1994// getPointerWidthV().
1995
Craig Topper273dbc62015-10-18 05:29:26 +00001996static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001997 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1998 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001999
Craig Topper273dbc62015-10-18 05:29:26 +00002000static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002001 "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 +00002002 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2003 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002004
Matt Arsenault250024f2016-06-08 01:56:42 +00002005class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002006 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002007 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002008
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002009 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002010 enum GPUKind {
2011 GK_NONE,
2012 GK_R600,
2013 GK_R600_DOUBLE_OPS,
2014 GK_R700,
2015 GK_R700_DOUBLE_OPS,
2016 GK_EVERGREEN,
2017 GK_EVERGREEN_DOUBLE_OPS,
2018 GK_NORTHERN_ISLANDS,
2019 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002020 GK_GFX6,
2021 GK_GFX7,
2022 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002023 } GPU;
2024
Jan Veselyeebeaea2015-05-04 19:53:36 +00002025 bool hasFP64:1;
2026 bool hasFMAF:1;
2027 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002028 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002029
Matt Arsenault250024f2016-06-08 01:56:42 +00002030 static bool isAMDGCN(const llvm::Triple &TT) {
2031 return TT.getArch() == llvm::Triple::amdgcn;
2032 }
2033
Eli Friedmand13b41e2012-10-12 23:32:00 +00002034public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002035 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002036 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002037 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002038 hasFP64(false),
2039 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002040 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002041 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002042 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002043 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002044 hasFMAF = true;
2045 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002046 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002047
2048 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2049 DataLayoutStringSI : DataLayoutStringR600);
2050
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002051 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002052 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002053 }
2054
Tom Stellarda96344b2014-08-21 13:58:40 +00002055 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2056 if (GPU <= GK_CAYMAN)
2057 return 32;
2058
2059 switch(AddrSpace) {
2060 default:
2061 return 64;
2062 case 0:
2063 case 3:
2064 case 5:
2065 return 32;
2066 }
2067 }
2068
Yaxun Liu26f75662016-08-19 05:17:25 +00002069 uint64_t getMaxPointerWidth() const override {
2070 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2071 }
2072
Craig Topper3164f332014-03-11 03:39:26 +00002073 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002074 return "";
2075 }
2076
Craig Topperf054e3a2015-10-19 03:52:27 +00002077 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002078
Craig Topperf054e3a2015-10-19 03:52:27 +00002079 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2080 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002081 }
2082
Craig Topper3164f332014-03-11 03:39:26 +00002083 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002084 TargetInfo::ConstraintInfo &Info) const override {
2085 switch (*Name) {
2086 default: break;
2087 case 'v': // vgpr
2088 case 's': // sgpr
2089 Info.setAllowsRegister();
2090 return true;
2091 }
2092 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002093 }
2094
Matt Arsenault250024f2016-06-08 01:56:42 +00002095 bool initFeatureMap(llvm::StringMap<bool> &Features,
2096 DiagnosticsEngine &Diags, StringRef CPU,
2097 const std::vector<std::string> &FeatureVec) const override;
2098
Yaxun Liu2c17e822016-08-09 19:43:38 +00002099 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2100 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002101 bool hasFP32Denormals = false;
2102 bool hasFP64Denormals = false;
2103 for (auto &I : TargetOpts.FeaturesAsWritten) {
2104 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2105 hasFP32Denormals = true;
2106 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2107 hasFP64Denormals = true;
2108 }
2109 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002110 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2111 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2112 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002113 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002114 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002115 }
2116
Craig Topper6c03a542015-10-19 04:51:35 +00002117 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2118 return llvm::makeArrayRef(BuiltinInfo,
2119 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002120 }
2121
Craig Topper3164f332014-03-11 03:39:26 +00002122 void getTargetDefines(const LangOptions &Opts,
2123 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002124 if (getTriple().getArch() == llvm::Triple::amdgcn)
2125 Builder.defineMacro("__AMDGCN__");
2126 else
2127 Builder.defineMacro("__R600__");
2128
Jan Veselyeebeaea2015-05-04 19:53:36 +00002129 if (hasFMAF)
2130 Builder.defineMacro("__HAS_FMAF__");
2131 if (hasLDEXPF)
2132 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002133 if (hasFP64)
2134 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002135 }
2136
Craig Topper3164f332014-03-11 03:39:26 +00002137 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002138 return TargetInfo::CharPtrBuiltinVaList;
2139 }
2140
Matt Arsenault250024f2016-06-08 01:56:42 +00002141 static GPUKind parseR600Name(StringRef Name) {
2142 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002143 .Case("r600" , GK_R600)
2144 .Case("rv610", GK_R600)
2145 .Case("rv620", GK_R600)
2146 .Case("rv630", GK_R600)
2147 .Case("rv635", GK_R600)
2148 .Case("rs780", GK_R600)
2149 .Case("rs880", GK_R600)
2150 .Case("rv670", GK_R600_DOUBLE_OPS)
2151 .Case("rv710", GK_R700)
2152 .Case("rv730", GK_R700)
2153 .Case("rv740", GK_R700_DOUBLE_OPS)
2154 .Case("rv770", GK_R700_DOUBLE_OPS)
2155 .Case("palm", GK_EVERGREEN)
2156 .Case("cedar", GK_EVERGREEN)
2157 .Case("sumo", GK_EVERGREEN)
2158 .Case("sumo2", GK_EVERGREEN)
2159 .Case("redwood", GK_EVERGREEN)
2160 .Case("juniper", GK_EVERGREEN)
2161 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2162 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2163 .Case("barts", GK_NORTHERN_ISLANDS)
2164 .Case("turks", GK_NORTHERN_ISLANDS)
2165 .Case("caicos", GK_NORTHERN_ISLANDS)
2166 .Case("cayman", GK_CAYMAN)
2167 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002168 .Default(GK_NONE);
2169 }
2170
2171 static GPUKind parseAMDGCNName(StringRef Name) {
2172 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002173 .Case("tahiti", GK_GFX6)
2174 .Case("pitcairn", GK_GFX6)
2175 .Case("verde", GK_GFX6)
2176 .Case("oland", GK_GFX6)
2177 .Case("hainan", GK_GFX6)
2178 .Case("bonaire", GK_GFX7)
2179 .Case("kabini", GK_GFX7)
2180 .Case("kaveri", GK_GFX7)
2181 .Case("hawaii", GK_GFX7)
2182 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002183 .Case("gfx700", GK_GFX7)
2184 .Case("gfx701", GK_GFX7)
2185 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002186 .Case("tonga", GK_GFX8)
2187 .Case("iceland", GK_GFX8)
2188 .Case("carrizo", GK_GFX8)
2189 .Case("fiji", GK_GFX8)
2190 .Case("stoney", GK_GFX8)
2191 .Case("polaris10", GK_GFX8)
2192 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002193 .Case("gfx800", GK_GFX8)
2194 .Case("gfx801", GK_GFX8)
2195 .Case("gfx802", GK_GFX8)
2196 .Case("gfx803", GK_GFX8)
2197 .Case("gfx804", GK_GFX8)
2198 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002199 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002200 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002201
Matt Arsenault250024f2016-06-08 01:56:42 +00002202 bool setCPU(const std::string &Name) override {
2203 if (getTriple().getArch() == llvm::Triple::amdgcn)
2204 GPU = parseAMDGCNName(Name);
2205 else
2206 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002207
Matt Arsenault250024f2016-06-08 01:56:42 +00002208 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002209 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002210
Jan Vesely211ba782016-06-17 02:25:03 +00002211 void setSupportedOpenCLOpts() override {
2212 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002213 Opts.support("cl_clang_storage_class_specifiers");
2214 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002215
Jan Vesely211ba782016-06-17 02:25:03 +00002216 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002217 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002218 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002219 Opts.support("cl_khr_byte_addressable_store");
2220 Opts.support("cl_khr_global_int32_base_atomics");
2221 Opts.support("cl_khr_global_int32_extended_atomics");
2222 Opts.support("cl_khr_local_int32_base_atomics");
2223 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002224 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002225 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002226 Opts.support("cl_khr_fp16");
2227 Opts.support("cl_khr_int64_base_atomics");
2228 Opts.support("cl_khr_int64_extended_atomics");
2229 Opts.support("cl_khr_mipmap_image");
2230 Opts.support("cl_khr_subgroups");
2231 Opts.support("cl_khr_3d_image_writes");
2232 Opts.support("cl_amd_media_ops");
2233 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002234 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002235 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002236
Yaxun Liu99444cb2016-08-03 20:38:06 +00002237 LangAS::ID getOpenCLImageAddrSpace() const override {
2238 return LangAS::opencl_constant;
2239 }
2240
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002241 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2242 switch (CC) {
2243 default:
2244 return CCCR_Warning;
2245 case CC_C:
2246 case CC_OpenCLKernel:
2247 return CCCR_OK;
2248 }
2249 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002250
2251 // In amdgcn target the null pointer in global, constant, and generic
2252 // address space has value 0 but in private and local address space has
2253 // value ~0.
2254 uint64_t getNullPointerValue(unsigned AS) const override {
2255 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2256 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002257};
2258
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002259const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002260#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002261 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002262#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2263 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002264#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002265};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002266const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002267 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2268 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2269 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2270 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2271 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2272 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2273 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2274 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2275 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2276 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2277 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2278 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2279 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2280 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2281 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2282 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2283 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2284 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2285 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2286 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2287 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2288 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2289 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2290 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2291 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2292 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2293 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2294 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2295 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2296 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2297 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2298 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2299 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2300 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2301 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2302 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2303 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2304 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2305 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2306 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2307 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2308 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2309 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2310 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2311 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2312 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2313 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002314 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002315 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2316 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002317};
2318
Craig Topperf054e3a2015-10-19 03:52:27 +00002319ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2320 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002321}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002322
Matt Arsenault250024f2016-06-08 01:56:42 +00002323bool AMDGPUTargetInfo::initFeatureMap(
2324 llvm::StringMap<bool> &Features,
2325 DiagnosticsEngine &Diags, StringRef CPU,
2326 const std::vector<std::string> &FeatureVec) const {
2327
2328 // XXX - What does the member GPU mean if device name string passed here?
2329 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2330 if (CPU.empty())
2331 CPU = "tahiti";
2332
2333 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002334 case GK_GFX6:
2335 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002336 break;
2337
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002338 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002339 Features["s-memrealtime"] = true;
2340 Features["16-bit-insts"] = true;
2341 break;
2342
2343 case GK_NONE:
2344 return false;
2345 default:
2346 llvm_unreachable("unhandled subtarget");
2347 }
2348 } else {
2349 if (CPU.empty())
2350 CPU = "r600";
2351
2352 switch (parseR600Name(CPU)) {
2353 case GK_R600:
2354 case GK_R700:
2355 case GK_EVERGREEN:
2356 case GK_NORTHERN_ISLANDS:
2357 break;
2358 case GK_R600_DOUBLE_OPS:
2359 case GK_R700_DOUBLE_OPS:
2360 case GK_EVERGREEN_DOUBLE_OPS:
2361 case GK_CAYMAN:
2362 Features["fp64"] = true;
2363 break;
2364 case GK_NONE:
2365 return false;
2366 default:
2367 llvm_unreachable("unhandled subtarget");
2368 }
2369 }
2370
2371 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2372}
2373
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002374const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002375#define BUILTIN(ID, TYPE, ATTRS) \
2376 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002377#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002378 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002379#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2380 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002381#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002382
2383#define BUILTIN(ID, TYPE, ATTRS) \
2384 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002385#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2386 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002387#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2388 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2389#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002390};
Eli Friedmanb5366062008-05-20 14:21:01 +00002391
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002392
Nuno Lopescfca1f02009-12-23 17:49:57 +00002393static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002394 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2395 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002396 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002397 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2398 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2399 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002400 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002401 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2402 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002403 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2404 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2405 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2406 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2407 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2408 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2409 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2410 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002411 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002412};
2413
Eric Christophercdd36352011-06-21 00:05:20 +00002414const TargetInfo::AddlRegName AddlRegNames[] = {
2415 { { "al", "ah", "eax", "rax" }, 0 },
2416 { { "bl", "bh", "ebx", "rbx" }, 3 },
2417 { { "cl", "ch", "ecx", "rcx" }, 2 },
2418 { { "dl", "dh", "edx", "rdx" }, 1 },
2419 { { "esi", "rsi" }, 4 },
2420 { { "edi", "rdi" }, 5 },
2421 { { "esp", "rsp" }, 7 },
2422 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002423 { { "r8d", "r8w", "r8b" }, 38 },
2424 { { "r9d", "r9w", "r9b" }, 39 },
2425 { { "r10d", "r10w", "r10b" }, 40 },
2426 { { "r11d", "r11w", "r11b" }, 41 },
2427 { { "r12d", "r12w", "r12b" }, 42 },
2428 { { "r13d", "r13w", "r13b" }, 43 },
2429 { { "r14d", "r14w", "r14b" }, 44 },
2430 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002431};
2432
2433// X86 target abstract base class; x86-32 and x86-64 are very close, so
2434// most of the implementation can be shared.
2435class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002436 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002437 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002438 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002439 enum MMX3DNowEnum {
2440 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002441 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002442 enum XOPEnum {
2443 NoXOP,
2444 SSE4A,
2445 FMA4,
2446 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002447 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002448
Craig Topper543f3bd2015-10-14 23:47:57 +00002449 bool HasAES = false;
2450 bool HasPCLMUL = false;
2451 bool HasLZCNT = false;
2452 bool HasRDRND = false;
2453 bool HasFSGSBASE = false;
2454 bool HasBMI = false;
2455 bool HasBMI2 = false;
2456 bool HasPOPCNT = false;
2457 bool HasRTM = false;
2458 bool HasPRFCHW = false;
2459 bool HasRDSEED = false;
2460 bool HasADX = false;
2461 bool HasTBM = false;
2462 bool HasFMA = false;
2463 bool HasF16C = false;
2464 bool HasAVX512CD = false;
2465 bool HasAVX512ER = false;
2466 bool HasAVX512PF = false;
2467 bool HasAVX512DQ = false;
2468 bool HasAVX512BW = false;
2469 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002470 bool HasAVX512VBMI = false;
2471 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002472 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002473 bool HasMPX = false;
2474 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002475 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002476 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002477 bool HasXSAVE = false;
2478 bool HasXSAVEOPT = false;
2479 bool HasXSAVEC = false;
2480 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002481 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002482 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002483 bool HasCLFLUSHOPT = false;
2484 bool HasPCOMMIT = false;
2485 bool HasCLWB = false;
2486 bool HasUMIP = false;
2487 bool HasMOVBE = false;
2488 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002489
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002490 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2491 ///
2492 /// Each enumeration represents a particular CPU supported by Clang. These
2493 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2494 enum CPUKind {
2495 CK_Generic,
2496
2497 /// \name i386
2498 /// i386-generation processors.
2499 //@{
2500 CK_i386,
2501 //@}
2502
2503 /// \name i486
2504 /// i486-generation processors.
2505 //@{
2506 CK_i486,
2507 CK_WinChipC6,
2508 CK_WinChip2,
2509 CK_C3,
2510 //@}
2511
2512 /// \name i586
2513 /// i586-generation processors, P5 microarchitecture based.
2514 //@{
2515 CK_i586,
2516 CK_Pentium,
2517 CK_PentiumMMX,
2518 //@}
2519
2520 /// \name i686
2521 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2522 //@{
2523 CK_i686,
2524 CK_PentiumPro,
2525 CK_Pentium2,
2526 CK_Pentium3,
2527 CK_Pentium3M,
2528 CK_PentiumM,
2529 CK_C3_2,
2530
2531 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2532 /// Clang however has some logic to suport this.
2533 // FIXME: Warn, deprecate, and potentially remove this.
2534 CK_Yonah,
2535 //@}
2536
2537 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002538 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002539 //@{
2540 CK_Pentium4,
2541 CK_Pentium4M,
2542 CK_Prescott,
2543 CK_Nocona,
2544 //@}
2545
2546 /// \name Core
2547 /// Core microarchitecture based processors.
2548 //@{
2549 CK_Core2,
2550
2551 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2552 /// codename which GCC no longer accepts as an option to -march, but Clang
2553 /// has some logic for recognizing it.
2554 // FIXME: Warn, deprecate, and potentially remove this.
2555 CK_Penryn,
2556 //@}
2557
2558 /// \name Atom
2559 /// Atom processors
2560 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002561 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002562 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002563 //@}
2564
2565 /// \name Nehalem
2566 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002567 CK_Nehalem,
2568
2569 /// \name Westmere
2570 /// Westmere microarchitecture based processors.
2571 CK_Westmere,
2572
2573 /// \name Sandy Bridge
2574 /// Sandy Bridge microarchitecture based processors.
2575 CK_SandyBridge,
2576
2577 /// \name Ivy Bridge
2578 /// Ivy Bridge microarchitecture based processors.
2579 CK_IvyBridge,
2580
2581 /// \name Haswell
2582 /// Haswell microarchitecture based processors.
2583 CK_Haswell,
2584
2585 /// \name Broadwell
2586 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002587 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002588
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002589 /// \name Skylake Client
2590 /// Skylake client microarchitecture based processors.
2591 CK_SkylakeClient,
2592
2593 /// \name Skylake Server
2594 /// Skylake server microarchitecture based processors.
2595 CK_SkylakeServer,
2596
2597 /// \name Cannonlake Client
2598 /// Cannonlake client microarchitecture based processors.
2599 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002600
Craig Topper449314e2013-08-20 07:09:39 +00002601 /// \name Knights Landing
2602 /// Knights Landing processor.
2603 CK_KNL,
2604
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002605 /// \name Lakemont
2606 /// Lakemont microarchitecture based processors.
2607 CK_Lakemont,
2608
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002609 /// \name K6
2610 /// K6 architecture processors.
2611 //@{
2612 CK_K6,
2613 CK_K6_2,
2614 CK_K6_3,
2615 //@}
2616
2617 /// \name K7
2618 /// K7 architecture processors.
2619 //@{
2620 CK_Athlon,
2621 CK_AthlonThunderbird,
2622 CK_Athlon4,
2623 CK_AthlonXP,
2624 CK_AthlonMP,
2625 //@}
2626
2627 /// \name K8
2628 /// K8 architecture processors.
2629 //@{
2630 CK_Athlon64,
2631 CK_Athlon64SSE3,
2632 CK_AthlonFX,
2633 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002634 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002635 CK_Opteron,
2636 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002637 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002638 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002639
Benjamin Kramer569f2152012-01-10 11:50:18 +00002640 /// \name Bobcat
2641 /// Bobcat architecture processors.
2642 //@{
2643 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002644 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002645 //@}
2646
2647 /// \name Bulldozer
2648 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002649 //@{
2650 CK_BDVER1,
2651 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002652 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002653 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002654 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002655
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002656 /// This specification is deprecated and will be removed in the future.
2657 /// Users should prefer \see CK_K8.
2658 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002659 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002660 CK_x86_64,
2661 //@}
2662
2663 /// \name Geode
2664 /// Geode processors.
2665 //@{
2666 CK_Geode
2667 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002668 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002669
Eric Christopherc50738f2015-08-27 00:05:50 +00002670 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002671 return llvm::StringSwitch<CPUKind>(CPU)
2672 .Case("i386", CK_i386)
2673 .Case("i486", CK_i486)
2674 .Case("winchip-c6", CK_WinChipC6)
2675 .Case("winchip2", CK_WinChip2)
2676 .Case("c3", CK_C3)
2677 .Case("i586", CK_i586)
2678 .Case("pentium", CK_Pentium)
2679 .Case("pentium-mmx", CK_PentiumMMX)
2680 .Case("i686", CK_i686)
2681 .Case("pentiumpro", CK_PentiumPro)
2682 .Case("pentium2", CK_Pentium2)
2683 .Case("pentium3", CK_Pentium3)
2684 .Case("pentium3m", CK_Pentium3M)
2685 .Case("pentium-m", CK_PentiumM)
2686 .Case("c3-2", CK_C3_2)
2687 .Case("yonah", CK_Yonah)
2688 .Case("pentium4", CK_Pentium4)
2689 .Case("pentium4m", CK_Pentium4M)
2690 .Case("prescott", CK_Prescott)
2691 .Case("nocona", CK_Nocona)
2692 .Case("core2", CK_Core2)
2693 .Case("penryn", CK_Penryn)
2694 .Case("bonnell", CK_Bonnell)
2695 .Case("atom", CK_Bonnell) // Legacy name.
2696 .Case("silvermont", CK_Silvermont)
2697 .Case("slm", CK_Silvermont) // Legacy name.
2698 .Case("nehalem", CK_Nehalem)
2699 .Case("corei7", CK_Nehalem) // Legacy name.
2700 .Case("westmere", CK_Westmere)
2701 .Case("sandybridge", CK_SandyBridge)
2702 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2703 .Case("ivybridge", CK_IvyBridge)
2704 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2705 .Case("haswell", CK_Haswell)
2706 .Case("core-avx2", CK_Haswell) // Legacy name.
2707 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002708 .Case("skylake", CK_SkylakeClient)
2709 .Case("skylake-avx512", CK_SkylakeServer)
2710 .Case("skx", CK_SkylakeServer) // Legacy name.
2711 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002712 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002713 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002714 .Case("k6", CK_K6)
2715 .Case("k6-2", CK_K6_2)
2716 .Case("k6-3", CK_K6_3)
2717 .Case("athlon", CK_Athlon)
2718 .Case("athlon-tbird", CK_AthlonThunderbird)
2719 .Case("athlon-4", CK_Athlon4)
2720 .Case("athlon-xp", CK_AthlonXP)
2721 .Case("athlon-mp", CK_AthlonMP)
2722 .Case("athlon64", CK_Athlon64)
2723 .Case("athlon64-sse3", CK_Athlon64SSE3)
2724 .Case("athlon-fx", CK_AthlonFX)
2725 .Case("k8", CK_K8)
2726 .Case("k8-sse3", CK_K8SSE3)
2727 .Case("opteron", CK_Opteron)
2728 .Case("opteron-sse3", CK_OpteronSSE3)
2729 .Case("barcelona", CK_AMDFAM10)
2730 .Case("amdfam10", CK_AMDFAM10)
2731 .Case("btver1", CK_BTVER1)
2732 .Case("btver2", CK_BTVER2)
2733 .Case("bdver1", CK_BDVER1)
2734 .Case("bdver2", CK_BDVER2)
2735 .Case("bdver3", CK_BDVER3)
2736 .Case("bdver4", CK_BDVER4)
2737 .Case("x86-64", CK_x86_64)
2738 .Case("geode", CK_Geode)
2739 .Default(CK_Generic);
2740 }
2741
Rafael Espindolaeb265472013-08-21 21:59:03 +00002742 enum FPMathKind {
2743 FP_Default,
2744 FP_SSE,
2745 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002746 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002747
Eli Friedman3fd920a2008-08-20 02:34:37 +00002748public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002749 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2750 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002751 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002752 }
Craig Topper3164f332014-03-11 03:39:26 +00002753 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002754 // X87 evaluates with 80 bits "long double" precision.
2755 return SSELevel == NoSSE ? 2 : 0;
2756 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002757 ArrayRef<const char *> getGCCRegNames() const override {
2758 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002759 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002760 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2761 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002762 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002763 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2764 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002765 }
Eric Christopherd9832702015-06-29 21:00:05 +00002766 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002767 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002768 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002769
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002770 bool validateGlobalRegisterVariable(StringRef RegName,
2771 unsigned RegSize,
2772 bool &HasSizeMismatch) const override {
2773 // esp and ebp are the only 32-bit registers the x86 backend can currently
2774 // handle.
2775 if (RegName.equals("esp") || RegName.equals("ebp")) {
2776 // Check that the register size is 32-bit.
2777 HasSizeMismatch = RegSize != 32;
2778 return true;
2779 }
2780
2781 return false;
2782 }
2783
Akira Hatanaka974131e2014-09-18 18:17:18 +00002784 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2785
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002786 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2787
Akira Hatanaka974131e2014-09-18 18:17:18 +00002788 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2789
Craig Topper3164f332014-03-11 03:39:26 +00002790 std::string convertConstraint(const char *&Constraint) const override;
2791 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002792 return "~{dirflag},~{fpsr},~{flags}";
2793 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002794
2795 StringRef getConstraintRegister(const StringRef &Constraint,
2796 const StringRef &Expression) const override {
2797 StringRef::iterator I, E;
2798 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2799 if (isalpha(*I))
2800 break;
2801 }
2802 if (I == E)
2803 return "";
2804 switch (*I) {
2805 // For the register constraints, return the matching register name
2806 case 'a':
2807 return "ax";
2808 case 'b':
2809 return "bx";
2810 case 'c':
2811 return "cx";
2812 case 'd':
2813 return "dx";
2814 case 'S':
2815 return "si";
2816 case 'D':
2817 return "di";
2818 // In case the constraint is 'r' we need to return Expression
2819 case 'r':
2820 return Expression;
2821 default:
2822 // Default value if there is no constraint for the register
2823 return "";
2824 }
2825 return "";
2826 }
2827
Craig Topper3164f332014-03-11 03:39:26 +00002828 void getTargetDefines(const LangOptions &Opts,
2829 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002830 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2831 bool Enabled);
2832 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2833 bool Enabled);
2834 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2835 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002836 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2837 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002838 setFeatureEnabledImpl(Features, Name, Enabled);
2839 }
2840 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002841 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002842 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2843 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002844 bool
2845 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2846 StringRef CPU,
2847 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002848 bool hasFeature(StringRef Feature) const override;
2849 bool handleTargetFeatures(std::vector<std::string> &Features,
2850 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002851 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002852 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2853 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002854 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002855 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002856 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002857 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002858 return "no-mmx";
2859 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002860 }
Craig Topper3164f332014-03-11 03:39:26 +00002861 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002862 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002863
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002864 // Perform any per-CPU checks necessary to determine if this CPU is
2865 // acceptable.
2866 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2867 // invalid without explaining *why*.
2868 switch (CPU) {
2869 case CK_Generic:
2870 // No processor selected!
2871 return false;
2872
2873 case CK_i386:
2874 case CK_i486:
2875 case CK_WinChipC6:
2876 case CK_WinChip2:
2877 case CK_C3:
2878 case CK_i586:
2879 case CK_Pentium:
2880 case CK_PentiumMMX:
2881 case CK_i686:
2882 case CK_PentiumPro:
2883 case CK_Pentium2:
2884 case CK_Pentium3:
2885 case CK_Pentium3M:
2886 case CK_PentiumM:
2887 case CK_Yonah:
2888 case CK_C3_2:
2889 case CK_Pentium4:
2890 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002891 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002892 case CK_Prescott:
2893 case CK_K6:
2894 case CK_K6_2:
2895 case CK_K6_3:
2896 case CK_Athlon:
2897 case CK_AthlonThunderbird:
2898 case CK_Athlon4:
2899 case CK_AthlonXP:
2900 case CK_AthlonMP:
2901 case CK_Geode:
2902 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002903 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002904 return false;
2905
2906 // Fallthrough
2907 case CK_Nocona:
2908 case CK_Core2:
2909 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002910 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002911 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002912 case CK_Nehalem:
2913 case CK_Westmere:
2914 case CK_SandyBridge:
2915 case CK_IvyBridge:
2916 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002917 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002918 case CK_SkylakeClient:
2919 case CK_SkylakeServer:
2920 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002921 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002922 case CK_Athlon64:
2923 case CK_Athlon64SSE3:
2924 case CK_AthlonFX:
2925 case CK_K8:
2926 case CK_K8SSE3:
2927 case CK_Opteron:
2928 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002929 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002930 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002931 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002932 case CK_BDVER1:
2933 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002934 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002935 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002936 case CK_x86_64:
2937 return true;
2938 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002939 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002940 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002941
Craig Topper3164f332014-03-11 03:39:26 +00002942 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002943
Craig Topper3164f332014-03-11 03:39:26 +00002944 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002945 // Most of the non-ARM calling conventions are i386 conventions.
2946 switch (CC) {
2947 case CC_X86ThisCall:
2948 case CC_X86FastCall:
2949 case CC_X86StdCall:
2950 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002951 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002952 case CC_C:
2953 case CC_Swift:
2954 case CC_X86Pascal:
2955 case CC_IntelOclBicc:
2956 return CCCR_OK;
2957 default:
2958 return CCCR_Warning;
2959 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002960 }
2961
Craig Topper3164f332014-03-11 03:39:26 +00002962 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002963 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002964 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002965
2966 bool hasSjLjLowering() const override {
2967 return true;
2968 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002969
2970 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00002971 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002972 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002973};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002974
Rafael Espindolaeb265472013-08-21 21:59:03 +00002975bool X86TargetInfo::setFPMath(StringRef Name) {
2976 if (Name == "387") {
2977 FPMath = FP_387;
2978 return true;
2979 }
2980 if (Name == "sse") {
2981 FPMath = FP_SSE;
2982 return true;
2983 }
2984 return false;
2985}
2986
Eric Christopher007b0a02015-08-28 22:32:01 +00002987bool X86TargetInfo::initFeatureMap(
2988 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002989 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002990 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002991 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002992 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002993 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002994
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002995 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002996
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002997 // Enable X87 for all X86 processors but Lakemont.
2998 if (Kind != CK_Lakemont)
2999 setFeatureEnabledImpl(Features, "x87", true);
3000
3001 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003002 case CK_Generic:
3003 case CK_i386:
3004 case CK_i486:
3005 case CK_i586:
3006 case CK_Pentium:
3007 case CK_i686:
3008 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003009 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003010 break;
3011 case CK_PentiumMMX:
3012 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003013 case CK_K6:
3014 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003015 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003016 break;
3017 case CK_Pentium3:
3018 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003019 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003020 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003021 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003022 break;
3023 case CK_PentiumM:
3024 case CK_Pentium4:
3025 case CK_Pentium4M:
3026 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003027 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003028 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003029 break;
3030 case CK_Yonah:
3031 case CK_Prescott:
3032 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003033 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003034 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003035 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003036 break;
3037 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003038 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003039 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003040 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003041 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003042 break;
3043 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003044 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003045 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003046 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003048 case CK_Cannonlake:
3049 setFeatureEnabledImpl(Features, "avx512ifma", true);
3050 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3051 setFeatureEnabledImpl(Features, "sha", true);
3052 setFeatureEnabledImpl(Features, "umip", true);
3053 // FALLTHROUGH
3054 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003055 setFeatureEnabledImpl(Features, "avx512f", true);
3056 setFeatureEnabledImpl(Features, "avx512cd", true);
3057 setFeatureEnabledImpl(Features, "avx512dq", true);
3058 setFeatureEnabledImpl(Features, "avx512bw", true);
3059 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003060 setFeatureEnabledImpl(Features, "pku", true);
3061 setFeatureEnabledImpl(Features, "pcommit", true);
3062 setFeatureEnabledImpl(Features, "clwb", true);
3063 // FALLTHROUGH
3064 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003065 setFeatureEnabledImpl(Features, "xsavec", true);
3066 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003067 setFeatureEnabledImpl(Features, "mpx", true);
3068 setFeatureEnabledImpl(Features, "sgx", true);
3069 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003070 // FALLTHROUGH
3071 case CK_Broadwell:
3072 setFeatureEnabledImpl(Features, "rdseed", true);
3073 setFeatureEnabledImpl(Features, "adx", true);
3074 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003075 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003076 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003077 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003078 setFeatureEnabledImpl(Features, "bmi", true);
3079 setFeatureEnabledImpl(Features, "bmi2", true);
3080 setFeatureEnabledImpl(Features, "rtm", true);
3081 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003082 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003083 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003084 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003085 setFeatureEnabledImpl(Features, "rdrnd", true);
3086 setFeatureEnabledImpl(Features, "f16c", true);
3087 setFeatureEnabledImpl(Features, "fsgsbase", true);
3088 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003089 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003090 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003091 setFeatureEnabledImpl(Features, "xsave", true);
3092 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003093 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003094 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003095 case CK_Silvermont:
3096 setFeatureEnabledImpl(Features, "aes", true);
3097 setFeatureEnabledImpl(Features, "pclmul", true);
3098 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003099 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003100 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003101 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003102 setFeatureEnabledImpl(Features, "cx16", true);
3103 break;
3104 case CK_KNL:
3105 setFeatureEnabledImpl(Features, "avx512f", true);
3106 setFeatureEnabledImpl(Features, "avx512cd", true);
3107 setFeatureEnabledImpl(Features, "avx512er", true);
3108 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003109 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003110 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003111 setFeatureEnabledImpl(Features, "rdseed", true);
3112 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003113 setFeatureEnabledImpl(Features, "lzcnt", true);
3114 setFeatureEnabledImpl(Features, "bmi", true);
3115 setFeatureEnabledImpl(Features, "bmi2", true);
3116 setFeatureEnabledImpl(Features, "rtm", true);
3117 setFeatureEnabledImpl(Features, "fma", true);
3118 setFeatureEnabledImpl(Features, "rdrnd", true);
3119 setFeatureEnabledImpl(Features, "f16c", true);
3120 setFeatureEnabledImpl(Features, "fsgsbase", true);
3121 setFeatureEnabledImpl(Features, "aes", true);
3122 setFeatureEnabledImpl(Features, "pclmul", true);
3123 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003124 setFeatureEnabledImpl(Features, "xsaveopt", true);
3125 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003126 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003127 break;
3128 case CK_K6_2:
3129 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003130 case CK_WinChip2:
3131 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003132 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003133 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003134 case CK_Athlon:
3135 case CK_AthlonThunderbird:
3136 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003137 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003138 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003139 case CK_Athlon4:
3140 case CK_AthlonXP:
3141 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003142 setFeatureEnabledImpl(Features, "sse", true);
3143 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003144 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 break;
3146 case CK_K8:
3147 case CK_Opteron:
3148 case CK_Athlon64:
3149 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003150 setFeatureEnabledImpl(Features, "sse2", true);
3151 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003152 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003153 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003154 case CK_AMDFAM10:
3155 setFeatureEnabledImpl(Features, "sse4a", true);
3156 setFeatureEnabledImpl(Features, "lzcnt", true);
3157 setFeatureEnabledImpl(Features, "popcnt", true);
3158 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003159 case CK_K8SSE3:
3160 case CK_OpteronSSE3:
3161 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003162 setFeatureEnabledImpl(Features, "sse3", true);
3163 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003164 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003165 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003166 case CK_BTVER2:
3167 setFeatureEnabledImpl(Features, "avx", true);
3168 setFeatureEnabledImpl(Features, "aes", true);
3169 setFeatureEnabledImpl(Features, "pclmul", true);
3170 setFeatureEnabledImpl(Features, "bmi", true);
3171 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003172 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003173 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003174 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003175 setFeatureEnabledImpl(Features, "ssse3", true);
3176 setFeatureEnabledImpl(Features, "sse4a", true);
3177 setFeatureEnabledImpl(Features, "lzcnt", true);
3178 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003179 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003180 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003181 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003182 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003183 case CK_BDVER4:
3184 setFeatureEnabledImpl(Features, "avx2", true);
3185 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003186 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003187 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003188 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003189 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003190 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003191 // FALLTHROUGH
3192 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003193 setFeatureEnabledImpl(Features, "bmi", true);
3194 setFeatureEnabledImpl(Features, "fma", true);
3195 setFeatureEnabledImpl(Features, "f16c", true);
3196 setFeatureEnabledImpl(Features, "tbm", true);
3197 // FALLTHROUGH
3198 case CK_BDVER1:
3199 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003200 setFeatureEnabledImpl(Features, "xop", true);
3201 setFeatureEnabledImpl(Features, "lzcnt", true);
3202 setFeatureEnabledImpl(Features, "aes", true);
3203 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003204 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003205 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003206 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003207 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003208 break;
Eli Friedman33465822011-07-08 23:31:17 +00003209 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003210 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3211 return false;
3212
3213 // Can't do this earlier because we need to be able to explicitly enable
3214 // or disable these features and the things that they depend upon.
3215
3216 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3217 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003218 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003219 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3220 FeaturesVec.end())
3221 Features["popcnt"] = true;
3222
3223 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3224 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003225 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003226 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3227 FeaturesVec.end())
3228 Features["prfchw"] = true;
3229
Eric Christophera7260af2015-10-08 20:10:18 +00003230 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3231 // then enable MMX.
3232 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003233 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003234 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3235 FeaturesVec.end())
3236 Features["mmx"] = true;
3237
Eric Christopherbbd746d2015-10-08 20:10:14 +00003238 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003239}
3240
Rafael Espindolae62e2792013-08-20 13:44:29 +00003241void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003242 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003243 if (Enabled) {
3244 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003245 case AVX512F:
3246 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003247 case AVX2:
3248 Features["avx2"] = true;
3249 case AVX:
3250 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003251 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003252 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003253 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003255 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003256 case SSSE3:
3257 Features["ssse3"] = true;
3258 case SSE3:
3259 Features["sse3"] = true;
3260 case SSE2:
3261 Features["sse2"] = true;
3262 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003263 Features["sse"] = true;
3264 case NoSSE:
3265 break;
3266 }
3267 return;
3268 }
3269
3270 switch (Level) {
3271 case NoSSE:
3272 case SSE1:
3273 Features["sse"] = false;
3274 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003275 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3276 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003277 case SSE3:
3278 Features["sse3"] = false;
3279 setXOPLevel(Features, NoXOP, false);
3280 case SSSE3:
3281 Features["ssse3"] = false;
3282 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003283 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003284 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003285 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003287 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3288 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003289 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003290 case AVX2:
3291 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003292 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003293 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003294 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003295 Features["avx512vl"] = Features["avx512vbmi"] =
3296 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 }
3298}
3299
3300void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003301 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003302 if (Enabled) {
3303 switch (Level) {
3304 case AMD3DNowAthlon:
3305 Features["3dnowa"] = true;
3306 case AMD3DNow:
3307 Features["3dnow"] = true;
3308 case MMX:
3309 Features["mmx"] = true;
3310 case NoMMX3DNow:
3311 break;
3312 }
3313 return;
3314 }
3315
3316 switch (Level) {
3317 case NoMMX3DNow:
3318 case MMX:
3319 Features["mmx"] = false;
3320 case AMD3DNow:
3321 Features["3dnow"] = false;
3322 case AMD3DNowAthlon:
3323 Features["3dnowa"] = false;
3324 }
3325}
3326
3327void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003328 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003329 if (Enabled) {
3330 switch (Level) {
3331 case XOP:
3332 Features["xop"] = true;
3333 case FMA4:
3334 Features["fma4"] = true;
3335 setSSELevel(Features, AVX, true);
3336 case SSE4A:
3337 Features["sse4a"] = true;
3338 setSSELevel(Features, SSE3, true);
3339 case NoXOP:
3340 break;
3341 }
3342 return;
3343 }
3344
3345 switch (Level) {
3346 case NoXOP:
3347 case SSE4A:
3348 Features["sse4a"] = false;
3349 case FMA4:
3350 Features["fma4"] = false;
3351 case XOP:
3352 Features["xop"] = false;
3353 }
3354}
3355
Craig Topper86d79ef2013-09-17 04:51:29 +00003356void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3357 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003358 // This is a bit of a hack to deal with the sse4 target feature when used
3359 // as part of the target attribute. We handle sse4 correctly everywhere
3360 // else. See below for more information on how we handle the sse4 options.
3361 if (Name != "sse4")
3362 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003363
Craig Topper29561122013-09-19 01:13:07 +00003364 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003365 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003366 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003367 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003368 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003369 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003370 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003371 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003372 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003373 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003374 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003375 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003376 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003377 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003378 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003379 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003380 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003381 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003382 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003383 if (Enabled)
3384 setSSELevel(Features, SSE2, Enabled);
3385 } else if (Name == "pclmul") {
3386 if (Enabled)
3387 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003388 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003389 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003390 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003391 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003392 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003393 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003394 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3395 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3396 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003397 if (Enabled)
3398 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003399 // Enable BWI instruction if VBMI is being enabled.
3400 if (Name == "avx512vbmi" && Enabled)
3401 Features["avx512bw"] = true;
3402 // Also disable VBMI if BWI is being disabled.
3403 if (Name == "avx512bw" && !Enabled)
3404 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003405 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003406 if (Enabled)
3407 setSSELevel(Features, AVX, Enabled);
3408 } else if (Name == "fma4") {
3409 setXOPLevel(Features, FMA4, Enabled);
3410 } else if (Name == "xop") {
3411 setXOPLevel(Features, XOP, Enabled);
3412 } else if (Name == "sse4a") {
3413 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003414 } else if (Name == "f16c") {
3415 if (Enabled)
3416 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003417 } else if (Name == "sha") {
3418 if (Enabled)
3419 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003420 } else if (Name == "sse4") {
3421 // We can get here via the __target__ attribute since that's not controlled
3422 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3423 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3424 // disabled.
3425 if (Enabled)
3426 setSSELevel(Features, SSE42, Enabled);
3427 else
3428 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003429 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003430 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003431 Features["xsaveopt"] = false;
3432 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003433 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003434 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003435 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003436}
3437
Eric Christopher3ff21b32013-10-16 21:26:26 +00003438/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003439/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003440bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003441 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003442 for (const auto &Feature : Features) {
3443 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003444 continue;
3445
Eric Christopher610fe112015-08-26 08:21:55 +00003446 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003447 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003448 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003449 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003450 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003451 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003452 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003453 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003454 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003455 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003456 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003457 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003458 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003459 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003460 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003461 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003462 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003463 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003464 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003465 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003466 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003467 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003468 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003469 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003470 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003471 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003472 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003473 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003474 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003475 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003476 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003477 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003478 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003479 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003480 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003481 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003482 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003483 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003484 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003485 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003486 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003487 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003488 } else if (Feature == "+avx512vbmi") {
3489 HasAVX512VBMI = true;
3490 } else if (Feature == "+avx512ifma") {
3491 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003492 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003493 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003494 } else if (Feature == "+mpx") {
3495 HasMPX = true;
3496 } else if (Feature == "+movbe") {
3497 HasMOVBE = true;
3498 } else if (Feature == "+sgx") {
3499 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003500 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003501 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003502 } else if (Feature == "+fxsr") {
3503 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003504 } else if (Feature == "+xsave") {
3505 HasXSAVE = true;
3506 } else if (Feature == "+xsaveopt") {
3507 HasXSAVEOPT = true;
3508 } else if (Feature == "+xsavec") {
3509 HasXSAVEC = true;
3510 } else if (Feature == "+xsaves") {
3511 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003512 } else if (Feature == "+mwaitx") {
3513 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003514 } else if (Feature == "+pku") {
3515 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003516 } else if (Feature == "+clflushopt") {
3517 HasCLFLUSHOPT = true;
3518 } else if (Feature == "+pcommit") {
3519 HasPCOMMIT = true;
3520 } else if (Feature == "+clwb") {
3521 HasCLWB = true;
3522 } else if (Feature == "+umip") {
3523 HasUMIP = true;
3524 } else if (Feature == "+prefetchwt1") {
3525 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003526 }
3527
Benjamin Kramer27402c62012-03-05 15:10:44 +00003528 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003529 .Case("+avx512f", AVX512F)
3530 .Case("+avx2", AVX2)
3531 .Case("+avx", AVX)
3532 .Case("+sse4.2", SSE42)
3533 .Case("+sse4.1", SSE41)
3534 .Case("+ssse3", SSSE3)
3535 .Case("+sse3", SSE3)
3536 .Case("+sse2", SSE2)
3537 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003538 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003539 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003540
Eli Friedman33465822011-07-08 23:31:17 +00003541 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003542 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003543 .Case("+3dnowa", AMD3DNowAthlon)
3544 .Case("+3dnow", AMD3DNow)
3545 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003546 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003547 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003548
3549 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003550 .Case("+xop", XOP)
3551 .Case("+fma4", FMA4)
3552 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003553 .Default(NoXOP);
3554 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003555 }
Eli Friedman33465822011-07-08 23:31:17 +00003556
Rafael Espindolaeb265472013-08-21 21:59:03 +00003557 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3558 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003559 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3560 (FPMath == FP_387 && SSELevel >= SSE1)) {
3561 Diags.Report(diag::err_target_unsupported_fpmath) <<
3562 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003563 return false;
3564 }
3565
Alexey Bataev00396512015-07-02 03:40:19 +00003566 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003567 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003568 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003569}
Chris Lattnerecd49032009-03-02 22:27:17 +00003570
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003571/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3572/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003573void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003574 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003575 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003576 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003577 Builder.defineMacro("__amd64__");
3578 Builder.defineMacro("__amd64");
3579 Builder.defineMacro("__x86_64");
3580 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003581 if (getTriple().getArchName() == "x86_64h") {
3582 Builder.defineMacro("__x86_64h");
3583 Builder.defineMacro("__x86_64h__");
3584 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003585 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003586 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003587 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003588
Chris Lattnerecd49032009-03-02 22:27:17 +00003589 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003590 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3591 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003592 switch (CPU) {
3593 case CK_Generic:
3594 break;
3595 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003596 // The rest are coming from the i386 define above.
3597 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003598 break;
3599 case CK_i486:
3600 case CK_WinChipC6:
3601 case CK_WinChip2:
3602 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003603 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003604 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003605 case CK_PentiumMMX:
3606 Builder.defineMacro("__pentium_mmx__");
3607 Builder.defineMacro("__tune_pentium_mmx__");
3608 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003609 case CK_i586:
3610 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003611 defineCPUMacros(Builder, "i586");
3612 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003613 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003614 case CK_Pentium3:
3615 case CK_Pentium3M:
3616 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003617 Builder.defineMacro("__tune_pentium3__");
3618 // Fallthrough
3619 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003620 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003621 Builder.defineMacro("__tune_pentium2__");
3622 // Fallthrough
3623 case CK_PentiumPro:
3624 Builder.defineMacro("__tune_i686__");
3625 Builder.defineMacro("__tune_pentiumpro__");
3626 // Fallthrough
3627 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003628 Builder.defineMacro("__i686");
3629 Builder.defineMacro("__i686__");
3630 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3631 Builder.defineMacro("__pentiumpro");
3632 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003633 break;
3634 case CK_Pentium4:
3635 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003636 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003637 break;
3638 case CK_Yonah:
3639 case CK_Prescott:
3640 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003641 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003642 break;
3643 case CK_Core2:
3644 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003645 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003646 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003647 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003648 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003649 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003650 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003651 defineCPUMacros(Builder, "slm");
3652 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003653 case CK_Nehalem:
3654 case CK_Westmere:
3655 case CK_SandyBridge:
3656 case CK_IvyBridge:
3657 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003658 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003659 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003660 // FIXME: Historically, we defined this legacy name, it would be nice to
3661 // remove it at some point. We've never exposed fine-grained names for
3662 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003663 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003664 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003665 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003666 defineCPUMacros(Builder, "skx");
3667 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003668 case CK_Cannonlake:
3669 break;
Craig Topper449314e2013-08-20 07:09:39 +00003670 case CK_KNL:
3671 defineCPUMacros(Builder, "knl");
3672 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003673 case CK_Lakemont:
3674 Builder.defineMacro("__tune_lakemont__");
3675 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003676 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003677 Builder.defineMacro("__k6_2__");
3678 Builder.defineMacro("__tune_k6_2__");
3679 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003680 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003681 if (CPU != CK_K6_2) { // In case of fallthrough
3682 // FIXME: GCC may be enabling these in cases where some other k6
3683 // architecture is specified but -m3dnow is explicitly provided. The
3684 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003685 Builder.defineMacro("__k6_3__");
3686 Builder.defineMacro("__tune_k6_3__");
3687 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003688 // Fallthrough
3689 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003690 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003691 break;
3692 case CK_Athlon:
3693 case CK_AthlonThunderbird:
3694 case CK_Athlon4:
3695 case CK_AthlonXP:
3696 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003697 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003698 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003699 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003700 Builder.defineMacro("__tune_athlon_sse__");
3701 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003702 break;
3703 case CK_K8:
3704 case CK_K8SSE3:
3705 case CK_x86_64:
3706 case CK_Opteron:
3707 case CK_OpteronSSE3:
3708 case CK_Athlon64:
3709 case CK_Athlon64SSE3:
3710 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003711 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003712 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003713 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003714 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003715 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003716 case CK_BTVER1:
3717 defineCPUMacros(Builder, "btver1");
3718 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003719 case CK_BTVER2:
3720 defineCPUMacros(Builder, "btver2");
3721 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003722 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003723 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003724 break;
3725 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003726 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003727 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003728 case CK_BDVER3:
3729 defineCPUMacros(Builder, "bdver3");
3730 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003731 case CK_BDVER4:
3732 defineCPUMacros(Builder, "bdver4");
3733 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003734 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003735 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003736 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003737 }
Chris Lattner96e43572009-03-02 22:40:39 +00003738
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003739 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003740 Builder.defineMacro("__REGISTER_PREFIX__", "");
3741
Chris Lattner6df41af2009-04-19 17:32:33 +00003742 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3743 // functions in glibc header files that use FP Stack inline asm which the
3744 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003745 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003746
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003747 if (HasAES)
3748 Builder.defineMacro("__AES__");
3749
Craig Topper3f122a72012-05-31 05:18:48 +00003750 if (HasPCLMUL)
3751 Builder.defineMacro("__PCLMUL__");
3752
Craig Topper22967d42011-12-25 05:06:45 +00003753 if (HasLZCNT)
3754 Builder.defineMacro("__LZCNT__");
3755
Benjamin Kramer1e250392012-07-07 09:39:18 +00003756 if (HasRDRND)
3757 Builder.defineMacro("__RDRND__");
3758
Craig Topper8c7f2512014-11-03 06:51:41 +00003759 if (HasFSGSBASE)
3760 Builder.defineMacro("__FSGSBASE__");
3761
Craig Topper22967d42011-12-25 05:06:45 +00003762 if (HasBMI)
3763 Builder.defineMacro("__BMI__");
3764
3765 if (HasBMI2)
3766 Builder.defineMacro("__BMI2__");
3767
Craig Topper1de83482011-12-29 16:10:46 +00003768 if (HasPOPCNT)
3769 Builder.defineMacro("__POPCNT__");
3770
Michael Liao625a8752012-11-10 05:17:46 +00003771 if (HasRTM)
3772 Builder.defineMacro("__RTM__");
3773
Michael Liao74f4eaf2013-03-26 17:52:08 +00003774 if (HasPRFCHW)
3775 Builder.defineMacro("__PRFCHW__");
3776
Michael Liaoffaae352013-03-29 05:17:55 +00003777 if (HasRDSEED)
3778 Builder.defineMacro("__RDSEED__");
3779
Robert Khasanov50e6f582014-09-19 09:53:48 +00003780 if (HasADX)
3781 Builder.defineMacro("__ADX__");
3782
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003783 if (HasTBM)
3784 Builder.defineMacro("__TBM__");
3785
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003786 if (HasMWAITX)
3787 Builder.defineMacro("__MWAITX__");
3788
Rafael Espindolae62e2792013-08-20 13:44:29 +00003789 switch (XOPLevel) {
3790 case XOP:
3791 Builder.defineMacro("__XOP__");
3792 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003793 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003794 case SSE4A:
3795 Builder.defineMacro("__SSE4A__");
3796 case NoXOP:
3797 break;
3798 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003799
Craig Topperbba778b2012-06-03 21:46:30 +00003800 if (HasFMA)
3801 Builder.defineMacro("__FMA__");
3802
Manman Rena45358c2012-10-11 00:59:55 +00003803 if (HasF16C)
3804 Builder.defineMacro("__F16C__");
3805
Craig Topper679b53a2013-08-21 05:29:10 +00003806 if (HasAVX512CD)
3807 Builder.defineMacro("__AVX512CD__");
3808 if (HasAVX512ER)
3809 Builder.defineMacro("__AVX512ER__");
3810 if (HasAVX512PF)
3811 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003812 if (HasAVX512DQ)
3813 Builder.defineMacro("__AVX512DQ__");
3814 if (HasAVX512BW)
3815 Builder.defineMacro("__AVX512BW__");
3816 if (HasAVX512VL)
3817 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003818 if (HasAVX512VBMI)
3819 Builder.defineMacro("__AVX512VBMI__");
3820 if (HasAVX512IFMA)
3821 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003822
Ben Langmuir58078d02013-09-19 13:22:04 +00003823 if (HasSHA)
3824 Builder.defineMacro("__SHA__");
3825
Craig Toppere33f51f2015-10-16 06:22:36 +00003826 if (HasFXSR)
3827 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003828 if (HasXSAVE)
3829 Builder.defineMacro("__XSAVE__");
3830 if (HasXSAVEOPT)
3831 Builder.defineMacro("__XSAVEOPT__");
3832 if (HasXSAVEC)
3833 Builder.defineMacro("__XSAVEC__");
3834 if (HasXSAVES)
3835 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003836 if (HasPKU)
3837 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003838 if (HasCX16)
3839 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3840
Chris Lattner96e43572009-03-02 22:40:39 +00003841 // Each case falls through to the previous one here.
3842 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003843 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003844 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003845 case AVX2:
3846 Builder.defineMacro("__AVX2__");
3847 case AVX:
3848 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003849 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003850 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003851 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003852 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003853 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003854 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003855 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003856 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003857 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003858 Builder.defineMacro("__SSE2__");
3859 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003860 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003861 Builder.defineMacro("__SSE__");
3862 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003863 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003864 break;
3865 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003866
Derek Schuffc7dd7222012-10-11 15:52:22 +00003867 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003868 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003869 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003870 case AVX2:
3871 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003872 case SSE42:
3873 case SSE41:
3874 case SSSE3:
3875 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003876 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003877 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003878 break;
3879 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003880 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003881 break;
3882 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003883 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003884 }
3885 }
3886
Anders Carlssone437c682010-01-27 03:47:49 +00003887 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003888 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003889 case AMD3DNowAthlon:
3890 Builder.defineMacro("__3dNOW_A__");
3891 case AMD3DNow:
3892 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003893 case MMX:
3894 Builder.defineMacro("__MMX__");
3895 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003896 break;
3897 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003898
3899 if (CPU >= CK_i486) {
3900 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3901 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3902 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3903 }
3904 if (CPU >= CK_i586)
3905 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003906}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003907
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003908bool X86TargetInfo::hasFeature(StringRef Feature) const {
3909 return llvm::StringSwitch<bool>(Feature)
3910 .Case("aes", HasAES)
3911 .Case("avx", SSELevel >= AVX)
3912 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003913 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003914 .Case("avx512cd", HasAVX512CD)
3915 .Case("avx512er", HasAVX512ER)
3916 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003917 .Case("avx512dq", HasAVX512DQ)
3918 .Case("avx512bw", HasAVX512BW)
3919 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003920 .Case("avx512vbmi", HasAVX512VBMI)
3921 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003922 .Case("bmi", HasBMI)
3923 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003924 .Case("clflushopt", HasCLFLUSHOPT)
3925 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003926 .Case("cx16", HasCX16)
3927 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003928 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003929 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003930 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003931 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003932 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003933 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3934 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3935 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003936 .Case("movbe", HasMOVBE)
3937 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003938 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003939 .Case("pcommit", HasPCOMMIT)
3940 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003941 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003942 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003943 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003944 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003945 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003946 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003947 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003948 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003949 .Case("sse", SSELevel >= SSE1)
3950 .Case("sse2", SSELevel >= SSE2)
3951 .Case("sse3", SSELevel >= SSE3)
3952 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003953 .Case("sse4.1", SSELevel >= SSE41)
3954 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003955 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003956 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003957 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003958 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003959 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3960 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003961 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003962 .Case("xsave", HasXSAVE)
3963 .Case("xsavec", HasXSAVEC)
3964 .Case("xsaves", HasXSAVES)
3965 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003966 .Default(false);
3967}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003968
Eric Christopherd9832702015-06-29 21:00:05 +00003969// We can't use a generic validation scheme for the features accepted here
3970// versus subtarget features accepted in the target attribute because the
3971// bitfield structure that's initialized in the runtime only supports the
3972// below currently rather than the full range of subtarget features. (See
3973// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3974bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3975 return llvm::StringSwitch<bool>(FeatureStr)
3976 .Case("cmov", true)
3977 .Case("mmx", true)
3978 .Case("popcnt", true)
3979 .Case("sse", true)
3980 .Case("sse2", true)
3981 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003982 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003983 .Case("sse4.1", true)
3984 .Case("sse4.2", true)
3985 .Case("avx", true)
3986 .Case("avx2", true)
3987 .Case("sse4a", true)
3988 .Case("fma4", true)
3989 .Case("xop", true)
3990 .Case("fma", true)
3991 .Case("avx512f", true)
3992 .Case("bmi", true)
3993 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003994 .Case("aes", true)
3995 .Case("pclmul", true)
3996 .Case("avx512vl", true)
3997 .Case("avx512bw", true)
3998 .Case("avx512dq", true)
3999 .Case("avx512cd", true)
4000 .Case("avx512er", true)
4001 .Case("avx512pf", true)
4002 .Case("avx512vbmi", true)
4003 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004004 .Default(false);
4005}
4006
Eli Friedman3fd920a2008-08-20 02:34:37 +00004007bool
Anders Carlsson58436352009-02-28 17:11:49 +00004008X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004009 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004010 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004011 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004012 // Constant constraints.
4013 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4014 // instructions.
4015 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4016 // x86_64 instructions.
4017 case 's':
4018 Info.setRequiresImmediate();
4019 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004020 case 'I':
4021 Info.setRequiresImmediate(0, 31);
4022 return true;
4023 case 'J':
4024 Info.setRequiresImmediate(0, 63);
4025 return true;
4026 case 'K':
4027 Info.setRequiresImmediate(-128, 127);
4028 return true;
4029 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004030 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004031 return true;
4032 case 'M':
4033 Info.setRequiresImmediate(0, 3);
4034 return true;
4035 case 'N':
4036 Info.setRequiresImmediate(0, 255);
4037 return true;
4038 case 'O':
4039 Info.setRequiresImmediate(0, 127);
4040 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004041 // Register constraints.
4042 case 'Y': // 'Y' is the first character for several 2-character constraints.
4043 // Shift the pointer to the second character of the constraint.
4044 Name++;
4045 switch (*Name) {
4046 default:
4047 return false;
4048 case '0': // First SSE register.
4049 case 't': // Any SSE register, when SSE2 is enabled.
4050 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4051 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004052 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004053 Info.setAllowsRegister();
4054 return true;
4055 }
4056 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004057 // Constraint 'f' cannot be used for output operands.
4058 if (Info.ConstraintStr[0] == '=')
4059 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004060 Info.setAllowsRegister();
4061 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004062 case 'a': // eax.
4063 case 'b': // ebx.
4064 case 'c': // ecx.
4065 case 'd': // edx.
4066 case 'S': // esi.
4067 case 'D': // edi.
4068 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004069 case 't': // Top of floating point stack.
4070 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004071 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004072 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004073 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004074 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004075 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4076 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004077 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004078 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4079 case 'l': // "Index" registers: any general register that can be used as an
4080 // index in a base+index memory access.
4081 Info.setAllowsRegister();
4082 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004083 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004084 case 'C': // SSE floating point constant.
4085 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004086 return true;
4087 }
4088}
4089
Akira Hatanaka974131e2014-09-18 18:17:18 +00004090bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4091 unsigned Size) const {
4092 // Strip off constraint modifiers.
4093 while (Constraint[0] == '=' ||
4094 Constraint[0] == '+' ||
4095 Constraint[0] == '&')
4096 Constraint = Constraint.substr(1);
4097
4098 return validateOperandSize(Constraint, Size);
4099}
4100
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004101bool X86TargetInfo::validateInputSize(StringRef Constraint,
4102 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004103 return validateOperandSize(Constraint, Size);
4104}
4105
4106bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4107 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004108 switch (Constraint[0]) {
4109 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004110 case 'k':
4111 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004112 case 'y':
4113 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004114 case 'f':
4115 case 't':
4116 case 'u':
4117 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004118 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004119 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004120 if (SSELevel >= AVX512F)
4121 // 512-bit zmm registers can be used if target supports AVX512F.
4122 return Size <= 512U;
4123 else if (SSELevel >= AVX)
4124 // 256-bit ymm registers can be used if target supports AVX.
4125 return Size <= 256U;
4126 return Size <= 128U;
4127 case 'Y':
4128 // 'Y' is the first character for several 2-character constraints.
4129 switch (Constraint[1]) {
4130 default: break;
4131 case 'm':
4132 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004133 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004134 return Size <= 64;
4135 case 'i':
4136 case 't':
4137 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4138 if (SSELevel >= AVX512F)
4139 return Size <= 512U;
4140 else if (SSELevel >= AVX)
4141 return Size <= 256U;
4142 return SSELevel >= SSE2 && Size <= 128U;
4143 }
4144
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004145 }
4146
4147 return true;
4148}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004149
Eli Friedman3fd920a2008-08-20 02:34:37 +00004150std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004151X86TargetInfo::convertConstraint(const char *&Constraint) const {
4152 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004153 case 'a': return std::string("{ax}");
4154 case 'b': return std::string("{bx}");
4155 case 'c': return std::string("{cx}");
4156 case 'd': return std::string("{dx}");
4157 case 'S': return std::string("{si}");
4158 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004159 case 'p': // address
4160 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004161 case 't': // top of floating point stack.
4162 return std::string("{st}");
4163 case 'u': // second from top of floating point stack.
4164 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004165 case 'Y':
4166 switch (Constraint[1]) {
4167 default:
4168 // Break from inner switch and fall through (copy single char),
4169 // continue parsing after copying the current constraint into
4170 // the return string.
4171 break;
4172 case 'k':
4173 // "^" hints llvm that this is a 2 letter constraint.
4174 // "Constraint++" is used to promote the string iterator
4175 // to the next constraint.
4176 return std::string("^") + std::string(Constraint++, 2);
4177 }
4178 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004179 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004180 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004181 }
4182}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004183
Eli Friedman3fd920a2008-08-20 02:34:37 +00004184// X86-32 generic target
4185class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004186public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004187 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4188 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004189 DoubleAlign = LongLongAlign = 32;
4190 LongDoubleWidth = 96;
4191 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004192 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004193 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004194 SizeType = UnsignedInt;
4195 PtrDiffType = SignedInt;
4196 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004197 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004198
4199 // Use fpret for all types.
4200 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4201 (1 << TargetInfo::Double) |
4202 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004203
4204 // x86-32 has atomics up to 8 bytes
4205 // FIXME: Check that we actually have cmpxchg8b before setting
4206 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4207 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004208 }
Craig Topper3164f332014-03-11 03:39:26 +00004209 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004210 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004211 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004212
Craig Topper3164f332014-03-11 03:39:26 +00004213 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004214 if (RegNo == 0) return 0;
4215 if (RegNo == 1) return 2;
4216 return -1;
4217 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004218 bool validateOperandSize(StringRef Constraint,
4219 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004220 switch (Constraint[0]) {
4221 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004222 case 'R':
4223 case 'q':
4224 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004225 case 'a':
4226 case 'b':
4227 case 'c':
4228 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004229 case 'S':
4230 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004231 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004232 case 'A':
4233 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004234 }
4235
Akira Hatanaka974131e2014-09-18 18:17:18 +00004236 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004237 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004238 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4239 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4240 Builtin::FirstTSBuiltin + 1);
4241 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004242};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004243
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004244class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4245public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004246 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4247 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004248
Craig Topper3164f332014-03-11 03:39:26 +00004249 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004250 unsigned Major, Minor, Micro;
4251 getTriple().getOSVersion(Major, Minor, Micro);
4252 // New NetBSD uses the default rounding mode.
4253 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4254 return X86_32TargetInfo::getFloatEvalMethod();
4255 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004256 return 1;
4257 }
4258};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004259
Eli Friedmane3aa4542009-07-05 18:47:56 +00004260class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4261public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004262 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4263 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004264 SizeType = UnsignedLong;
4265 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004266 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004267 }
4268};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004269
Eli Friedman9fa28852012-08-08 23:57:20 +00004270class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004272 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4273 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004274 SizeType = UnsignedLong;
4275 IntPtrType = SignedLong;
4276 PtrDiffType = SignedLong;
4277 }
4278};
Eli Friedman9fa28852012-08-08 23:57:20 +00004279
Torok Edwinb2b37c62009-06-30 17:10:35 +00004280class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004281public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004282 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4283 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004284 LongDoubleWidth = 128;
4285 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004286 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004287 MaxVectorAlign = 256;
4288 // The watchOS simulator uses the builtin bool type for Objective-C.
4289 llvm::Triple T = llvm::Triple(Triple);
4290 if (T.isWatchOS())
4291 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004292 SizeType = UnsignedLong;
4293 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004294 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004295 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004296 }
4297
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004298 bool handleTargetFeatures(std::vector<std::string> &Features,
4299 DiagnosticsEngine &Diags) override {
4300 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4301 Diags))
4302 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004303 // We now know the features we have: we can decide how to align vectors.
4304 MaxVectorAlign =
4305 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004306 return true;
4307 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004308};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004309
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004310// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004311class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004312public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004313 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4314 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004315 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004316 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004317 bool IsWinCOFF =
4318 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004319 resetDataLayout(IsWinCOFF
4320 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4321 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004322 }
Craig Topper3164f332014-03-11 03:39:26 +00004323 void getTargetDefines(const LangOptions &Opts,
4324 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004325 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4326 }
4327};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004328
4329// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004330class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004331public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004332 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4333 const TargetOptions &Opts)
4334 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004335 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004336 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004337 }
Craig Topper3164f332014-03-11 03:39:26 +00004338 void getTargetDefines(const LangOptions &Opts,
4339 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004340 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4341 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4342 // The value of the following reflects processor type.
4343 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4344 // We lost the original triple, so we use the default.
4345 Builder.defineMacro("_M_IX86", "600");
4346 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004347};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004348
David Majnemerae1ed0e2015-05-28 04:36:18 +00004349static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004350 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4351 // supports __declspec natively under -fms-extensions, but we define a no-op
4352 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004353 if (Opts.MicrosoftExt)
4354 Builder.defineMacro("__declspec", "__declspec");
4355 else
4356 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4357
4358 if (!Opts.MicrosoftExt) {
4359 // Provide macros for all the calling convention keywords. Provide both
4360 // single and double underscore prefixed variants. These are available on
4361 // x64 as well as x86, even though they have no effect.
4362 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4363 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004364 std::string GCCSpelling = "__attribute__((__";
4365 GCCSpelling += CC;
4366 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004367 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4368 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4369 }
4370 }
4371}
4372
David Majnemerae1ed0e2015-05-28 04:36:18 +00004373static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4374 Builder.defineMacro("__MSVCRT__");
4375 Builder.defineMacro("__MINGW32__");
4376 addCygMingDefines(Opts, Builder);
4377}
4378
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004379// x86-32 MinGW target
4380class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4381public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004382 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4383 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004384 void getTargetDefines(const LangOptions &Opts,
4385 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004386 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004387 DefineStd(Builder, "WIN32", Opts);
4388 DefineStd(Builder, "WINNT", Opts);
4389 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004390 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004391 }
4392};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004393
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004394// x86-32 Cygwin target
4395class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4396public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004397 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4398 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004399 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004400 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004401 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 +00004402 }
Craig Topper3164f332014-03-11 03:39:26 +00004403 void getTargetDefines(const LangOptions &Opts,
4404 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004405 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004406 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004407 Builder.defineMacro("__CYGWIN__");
4408 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004409 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004410 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004411 if (Opts.CPlusPlus)
4412 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004413 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004414};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004415
Chris Lattnerb986aba2010-04-11 19:29:39 +00004416// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004417class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004418public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004419 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004420 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004421 }
Craig Topper3164f332014-03-11 03:39:26 +00004422 void getTargetDefines(const LangOptions &Opts,
4423 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004424 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004425 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004426 }
4427};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004428
Alexey Bataevc99b0492015-11-25 09:24:26 +00004429// X86-32 MCU target
4430class MCUX86_32TargetInfo : public X86_32TargetInfo {
4431public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004432 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4433 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004434 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004435 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004436 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 +00004437 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004438 }
4439
4440 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4441 // On MCU we support only C calling convention.
4442 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4443 }
4444
4445 void getTargetDefines(const LangOptions &Opts,
4446 MacroBuilder &Builder) const override {
4447 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4448 Builder.defineMacro("__iamcu");
4449 Builder.defineMacro("__iamcu__");
4450 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004451
4452 bool allowsLargerPreferedTypeAlignment() const override {
4453 return false;
4454 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004455};
4456
Douglas Gregor9fabd852011-07-01 22:41:14 +00004457// RTEMS Target
4458template<typename Target>
4459class RTEMSTargetInfo : public OSTargetInfo<Target> {
4460protected:
Craig Topper3164f332014-03-11 03:39:26 +00004461 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4462 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004463 // RTEMS defines; list based off of gcc output
4464
Douglas Gregor9fabd852011-07-01 22:41:14 +00004465 Builder.defineMacro("__rtems__");
4466 Builder.defineMacro("__ELF__");
4467 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004468
Douglas Gregor9fabd852011-07-01 22:41:14 +00004469public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004470 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4471 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004472 switch (Triple.getArch()) {
4473 default:
4474 case llvm::Triple::x86:
4475 // this->MCountName = ".mcount";
4476 break;
4477 case llvm::Triple::mips:
4478 case llvm::Triple::mipsel:
4479 case llvm::Triple::ppc:
4480 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004481 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004482 // this->MCountName = "_mcount";
4483 break;
4484 case llvm::Triple::arm:
4485 // this->MCountName = "__mcount";
4486 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004487 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004488 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004489};
4490
Douglas Gregor9fabd852011-07-01 22:41:14 +00004491// x86-32 RTEMS target
4492class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4493public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004494 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4495 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004496 SizeType = UnsignedLong;
4497 IntPtrType = SignedLong;
4498 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004499 }
Craig Topper3164f332014-03-11 03:39:26 +00004500 void getTargetDefines(const LangOptions &Opts,
4501 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004502 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4503 Builder.defineMacro("__INTEL__");
4504 Builder.defineMacro("__rtems__");
4505 }
4506};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004507
Eli Friedman3fd920a2008-08-20 02:34:37 +00004508// x86-64 generic target
4509class X86_64TargetInfo : public X86TargetInfo {
4510public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004511 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4512 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004513 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004514 bool IsWinCOFF =
4515 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004516 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004517 LongDoubleWidth = 128;
4518 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004519 LargeArrayMinWidth = 128;
4520 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004521 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004522 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4523 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4524 IntPtrType = IsX32 ? SignedInt : SignedLong;
4525 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004526 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004527 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004528
Eric Christopher917e9522014-11-18 22:36:15 +00004529 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004530 resetDataLayout(IsX32
4531 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4532 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4533 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004534
4535 // Use fpret only for long double.
4536 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004537
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004538 // Use fp2ret for _Complex long double.
4539 ComplexLongDoubleUsesFP2Ret = true;
4540
Charles Davisc7d5c942015-09-17 20:55:33 +00004541 // Make __builtin_ms_va_list available.
4542 HasBuiltinMSVaList = true;
4543
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004544 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004545 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004546 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004547 }
Craig Topper3164f332014-03-11 03:39:26 +00004548 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004549 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004550 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004551
Craig Topper3164f332014-03-11 03:39:26 +00004552 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004553 if (RegNo == 0) return 0;
4554 if (RegNo == 1) return 1;
4555 return -1;
4556 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004557
Craig Topper3164f332014-03-11 03:39:26 +00004558 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004559 switch (CC) {
4560 case CC_C:
4561 case CC_Swift:
4562 case CC_X86VectorCall:
4563 case CC_IntelOclBicc:
4564 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004565 case CC_PreserveMost:
4566 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004567 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004568 return CCCR_OK;
4569 default:
4570 return CCCR_Warning;
4571 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004572 }
4573
Craig Topper3164f332014-03-11 03:39:26 +00004574 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004575 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004576 }
4577
Pavel Chupinfd223e12014-08-04 12:39:43 +00004578 // for x32 we need it here explicitly
4579 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004580 unsigned getUnwindWordWidth() const override { return 64; }
4581 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004582
4583 bool validateGlobalRegisterVariable(StringRef RegName,
4584 unsigned RegSize,
4585 bool &HasSizeMismatch) const override {
4586 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4587 // handle.
4588 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4589 // Check that the register size is 64-bit.
4590 HasSizeMismatch = RegSize != 64;
4591 return true;
4592 }
4593
4594 // Check if the register is a 32-bit register the backend can handle.
4595 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4596 HasSizeMismatch);
4597 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004598 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4599 return llvm::makeArrayRef(BuiltinInfoX86,
4600 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4601 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004602};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004603
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004604// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004605class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004606public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004607 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4608 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004609 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004610 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004611 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004612 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004613 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004614 SizeType = UnsignedLongLong;
4615 PtrDiffType = SignedLongLong;
4616 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004617 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004618
Craig Topper3164f332014-03-11 03:39:26 +00004619 void getTargetDefines(const LangOptions &Opts,
4620 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004621 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004622 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004623 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004624
Craig Topper3164f332014-03-11 03:39:26 +00004625 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004626 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004627 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004628
Craig Topper3164f332014-03-11 03:39:26 +00004629 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004630 switch (CC) {
4631 case CC_X86StdCall:
4632 case CC_X86ThisCall:
4633 case CC_X86FastCall:
4634 return CCCR_Ignore;
4635 case CC_C:
4636 case CC_X86VectorCall:
4637 case CC_IntelOclBicc:
4638 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004639 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004640 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004641 return CCCR_OK;
4642 default:
4643 return CCCR_Warning;
4644 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004645 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004646};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004647
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004648// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004649class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004650public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004651 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4652 const TargetOptions &Opts)
4653 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004654 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004655 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004656 }
Craig Topper3164f332014-03-11 03:39:26 +00004657 void getTargetDefines(const LangOptions &Opts,
4658 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004659 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4660 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004661 Builder.defineMacro("_M_X64", "100");
4662 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004663 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004664};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004665
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004666// x86-64 MinGW target
4667class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4668public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004669 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4670 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004671 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4672 // with x86 FP ops. Weird.
4673 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004674 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004675 }
4676
Craig Topper3164f332014-03-11 03:39:26 +00004677 void getTargetDefines(const LangOptions &Opts,
4678 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004679 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004680 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004681 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004682 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004683
4684 // GCC defines this macro when it is using __gxx_personality_seh0.
4685 if (!Opts.SjLjExceptions)
4686 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004687 }
4688};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004689
Yaron Kerend030d112015-07-22 17:38:19 +00004690// x86-64 Cygwin target
4691class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4692public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004693 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4694 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004695 TLSSupported = false;
4696 WCharType = UnsignedShort;
4697 }
4698 void getTargetDefines(const LangOptions &Opts,
4699 MacroBuilder &Builder) const override {
4700 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4701 Builder.defineMacro("__x86_64__");
4702 Builder.defineMacro("__CYGWIN__");
4703 Builder.defineMacro("__CYGWIN64__");
4704 addCygMingDefines(Opts, Builder);
4705 DefineStd(Builder, "unix", Opts);
4706 if (Opts.CPlusPlus)
4707 Builder.defineMacro("_GNU_SOURCE");
4708
4709 // GCC defines this macro when it is using __gxx_personality_seh0.
4710 if (!Opts.SjLjExceptions)
4711 Builder.defineMacro("__SEH__");
4712 }
4713};
4714
Eli Friedman2857ccb2009-07-01 03:36:11 +00004715class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004717 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4718 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004719 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004720 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4721 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004722 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004723 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004724 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004725 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004726
4727 bool handleTargetFeatures(std::vector<std::string> &Features,
4728 DiagnosticsEngine &Diags) override {
4729 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4730 Diags))
4731 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004732 // We now know the features we have: we can decide how to align vectors.
4733 MaxVectorAlign =
4734 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004735 return true;
4736 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004737};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004738
Eli Friedman245f2292009-07-05 22:31:18 +00004739class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4740public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004741 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4742 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004743 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004744 Int64Type = SignedLongLong;
4745 }
4746};
Eli Friedman245f2292009-07-05 22:31:18 +00004747
Eli Friedman9fa28852012-08-08 23:57:20 +00004748class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4749public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004750 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4751 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004752 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004753 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004754 }
4755};
Tim Northover9bb857a2013-01-31 12:13:10 +00004756
Eli Friedmanf05b7722008-08-20 07:44:10 +00004757class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004758 // Possible FPU choices.
4759 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004760 VFP2FPU = (1 << 0),
4761 VFP3FPU = (1 << 1),
4762 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004763 NeonFPU = (1 << 3),
4764 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004765 };
4766
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004767 // Possible HWDiv features.
4768 enum HWDivMode {
4769 HWDivThumb = (1 << 0),
4770 HWDivARM = (1 << 1)
4771 };
4772
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004773 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004774 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004775 }
4776
4777 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4778 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004779
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004780 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004781
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 StringRef CPUProfile;
4783 StringRef CPUAttr;
4784
Rafael Espindolaeb265472013-08-21 21:59:03 +00004785 enum {
4786 FP_Default,
4787 FP_VFP,
4788 FP_Neon
4789 } FPMath;
4790
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004792 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004793 unsigned ArchProfile;
4794 unsigned ArchVersion;
4795
Bernard Ogdenda13af32013-10-24 18:32:51 +00004796 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004797
Logan Chien57086ce2012-10-10 06:56:20 +00004798 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004799 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004800
4801 // Initialized via features.
4802 unsigned SoftFloat : 1;
4803 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004804
Bernard Ogden18b57012013-10-29 09:47:51 +00004805 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004806 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004807 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004808 unsigned Unaligned : 1;
4809
4810 enum {
4811 LDREX_B = (1 << 0), /// byte (8-bit)
4812 LDREX_H = (1 << 1), /// half (16-bit)
4813 LDREX_W = (1 << 2), /// word (32-bit)
4814 LDREX_D = (1 << 3), /// double (64-bit)
4815 };
4816
4817 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004818
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004819 // ACLE 6.5.1 Hardware floating point
4820 enum {
4821 HW_FP_HP = (1 << 1), /// half (16-bit)
4822 HW_FP_SP = (1 << 2), /// single (32-bit)
4823 HW_FP_DP = (1 << 3), /// double (64-bit)
4824 };
4825 uint32_t HW_FP;
4826
Chris Lattner5cc15e02010-03-03 19:03:45 +00004827 static const Builtin::Info BuiltinInfo[];
4828
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004829 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004830 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004831
4832 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004833 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004834
Renato Golin0201a9e2016-09-22 19:28:20 +00004835 // size_t is unsigned long on MachO-derived environments, NetBSD,
4836 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004837 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004838 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004839 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004840 SizeType = UnsignedLong;
4841 else
4842 SizeType = UnsignedInt;
4843
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004844 switch (T.getOS()) {
4845 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004846 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004847 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004848 break;
4849 case llvm::Triple::Win32:
4850 WCharType = UnsignedShort;
4851 break;
4852 case llvm::Triple::Linux:
4853 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004854 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4855 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004856 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004857 }
4858
4859 UseBitFieldTypeAlignment = true;
4860
4861 ZeroLengthBitfieldBoundary = 0;
4862
Tim Northover147cd2f2014-10-14 22:12:21 +00004863 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4864 // so set preferred for small types to 32.
4865 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004866 resetDataLayout(BigEndian
4867 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4868 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004869 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004870 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004871 resetDataLayout("e"
4872 "-m:w"
4873 "-p:32:32"
4874 "-i64:64"
4875 "-v128:64:128"
4876 "-a:0:32"
4877 "-n32"
4878 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004879 } else if (T.isOSNaCl()) {
4880 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004881 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004882 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004883 resetDataLayout(BigEndian
4884 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4885 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004886 }
4887
4888 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004889 }
4890
Tim Northover5627d392015-10-30 16:30:45 +00004891 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004892 const llvm::Triple &T = getTriple();
4893
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004894 IsAAPCS = false;
4895
Tim Northover5627d392015-10-30 16:30:45 +00004896 if (IsAAPCS16)
4897 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4898 else
4899 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004900
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004901 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004902 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004903 SizeType = UnsignedInt;
4904 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004905 SizeType = UnsignedLong;
4906
4907 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4908 WCharType = SignedInt;
4909
4910 // Do not respect the alignment of bit-field types when laying out
4911 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4912 UseBitFieldTypeAlignment = false;
4913
4914 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4915 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4916 /// gcc.
4917 ZeroLengthBitfieldBoundary = 32;
4918
Tim Northover5627d392015-10-30 16:30:45 +00004919 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4920 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004921 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004922 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004923 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004924 BigEndian
4925 ? "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 +00004926 : "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 +00004927 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004928 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004929 BigEndian
4930 ? "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 +00004931 : "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 +00004932
4933 // FIXME: Override "preferred align" for double and long long.
4934 }
4935
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004936 void setArchInfo() {
4937 StringRef ArchName = getTriple().getArchName();
4938
Renato Goline84b0002015-10-08 16:43:26 +00004939 ArchISA = llvm::ARM::parseArchISA(ArchName);
4940 CPU = llvm::ARM::getDefaultCPU(ArchName);
4941 unsigned AK = llvm::ARM::parseArch(ArchName);
4942 if (AK != llvm::ARM::AK_INVALID)
4943 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004944 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004945 }
4946
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004947 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004948 StringRef SubArch;
4949
4950 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004951 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004952 SubArch = llvm::ARM::getSubArch(ArchKind);
4953 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4954 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004955
4956 // cache CPU related strings
4957 CPUAttr = getCPUAttr();
4958 CPUProfile = getCPUProfile();
4959 }
4960
4961 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004962 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004963 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004964 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004965 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4966 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004967 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004968 if (ArchProfile == llvm::ARM::PK_M) {
4969 MaxAtomicPromoteWidth = 32;
4970 if (ShouldUseInlineAtomic)
4971 MaxAtomicInlineWidth = 32;
4972 }
4973 else {
4974 MaxAtomicPromoteWidth = 64;
4975 if (ShouldUseInlineAtomic)
4976 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004977 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004978 }
4979
4980 bool isThumb() const {
4981 return (ArchISA == llvm::ARM::IK_THUMB);
4982 }
4983
4984 bool supportsThumb() const {
4985 return CPUAttr.count('T') || ArchVersion >= 6;
4986 }
4987
4988 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004989 return CPUAttr.equals("6T2") ||
4990 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004991 }
4992
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004993 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004994 // For most sub-arches, the build attribute CPU name is enough.
4995 // For Cortex variants, it's slightly different.
4996 switch(ArchKind) {
4997 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004998 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004999 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005000 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005001 case llvm::ARM::AK_ARMV7S:
5002 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005003 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005004 return "7A";
5005 case llvm::ARM::AK_ARMV7R:
5006 return "7R";
5007 case llvm::ARM::AK_ARMV7M:
5008 return "7M";
5009 case llvm::ARM::AK_ARMV7EM:
5010 return "7EM";
5011 case llvm::ARM::AK_ARMV8A:
5012 return "8A";
5013 case llvm::ARM::AK_ARMV8_1A:
5014 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005015 case llvm::ARM::AK_ARMV8_2A:
5016 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005017 case llvm::ARM::AK_ARMV8MBaseline:
5018 return "8M_BASE";
5019 case llvm::ARM::AK_ARMV8MMainline:
5020 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005021 case llvm::ARM::AK_ARMV8R:
5022 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005023 }
5024 }
5025
5026 StringRef getCPUProfile() const {
5027 switch(ArchProfile) {
5028 case llvm::ARM::PK_A:
5029 return "A";
5030 case llvm::ARM::PK_R:
5031 return "R";
5032 case llvm::ARM::PK_M:
5033 return "M";
5034 default:
5035 return "";
5036 }
5037 }
5038
Chris Lattner17df24e2008-04-21 18:56:49 +00005039public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005040 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005041 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5042 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005043
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005044 switch (getTriple().getOS()) {
5045 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005046 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005047 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005048 break;
5049 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005050 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005051 break;
5052 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005053
Renato Goline84b0002015-10-08 16:43:26 +00005054 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005055 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005056
Chris Lattner1a8f3942010-04-23 16:29:58 +00005057 // {} in inline assembly are neon specifiers, not assembly variant
5058 // specifiers.
5059 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005060
Eric Christopher0e261882014-12-05 01:06:59 +00005061 // FIXME: This duplicates code from the driver that sets the -target-abi
5062 // option - this code is used if -target-abi isn't passed and should
5063 // be unified in some way.
5064 if (Triple.isOSBinFormatMachO()) {
5065 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5066 // the frontend matches that.
5067 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5068 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005069 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005070 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005071 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005072 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005073 } else {
5074 setABI("apcs-gnu");
5075 }
5076 } else if (Triple.isOSWindows()) {
5077 // FIXME: this is invalid for WindowsCE
5078 setABI("aapcs");
5079 } else {
5080 // Select the default based on the platform.
5081 switch (Triple.getEnvironment()) {
5082 case llvm::Triple::Android:
5083 case llvm::Triple::GNUEABI:
5084 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005085 case llvm::Triple::MuslEABI:
5086 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005087 setABI("aapcs-linux");
5088 break;
5089 case llvm::Triple::EABIHF:
5090 case llvm::Triple::EABI:
5091 setABI("aapcs");
5092 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005093 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005094 setABI("apcs-gnu");
5095 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005096 default:
5097 if (Triple.getOS() == llvm::Triple::NetBSD)
5098 setABI("apcs-gnu");
5099 else
5100 setABI("aapcs");
5101 break;
5102 }
5103 }
John McCall86353412010-08-21 22:46:04 +00005104
5105 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005106 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005107
Renato Golin15b86152015-07-03 16:41:13 +00005108 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005109 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005110
James Molloya7139222012-03-12 09:14:10 +00005111 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005112 // the alignment of the zero-length bitfield is greater than the member
5113 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005114 // zero length bitfield.
5115 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005116
5117 if (Triple.getOS() == llvm::Triple::Linux ||
5118 Triple.getOS() == llvm::Triple::UnknownOS)
5119 this->MCountName =
5120 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005121 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005122
Alp Toker4925ba72014-06-07 23:30:42 +00005123 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005124
Craig Topper3164f332014-03-11 03:39:26 +00005125 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005126 ABI = Name;
5127
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005128 // The defaults (above) are for AAPCS, check if we need to change them.
5129 //
5130 // FIXME: We need support for -meabi... we could just mangle it into the
5131 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005132 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005133 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005134 return true;
5135 }
5136 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5137 setABIAAPCS();
5138 return true;
5139 }
5140 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005141 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005142
Renato Golinf5c4dec2015-05-27 13:33:00 +00005143 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005144 bool
5145 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5146 StringRef CPU,
5147 const std::vector<std::string> &FeaturesVec) const override {
5148
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005149 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005150 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005151
5152 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005153 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005154 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5155
5156 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005157 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005158 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5159
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005160 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005161 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005162 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005163
Eric Christopher007b0a02015-08-28 22:32:01 +00005164 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005165 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005166
Craig Topper3164f332014-03-11 03:39:26 +00005167 bool handleTargetFeatures(std::vector<std::string> &Features,
5168 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005169 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005170 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005171 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005172 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005173 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005174 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005175 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005176
Ranjeet Singhac08e532015-06-24 23:39:25 +00005177 // This does not diagnose illegal cases like having both
5178 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5179 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005180 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005181 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005182 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005183 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005184 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005185 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005186 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005187 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005188 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005189 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005190 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005191 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005192 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005193 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005194 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005195 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005196 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005197 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005198 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005199 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005200 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005201 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005202 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005203 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005204 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005205 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005206 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005207 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005208 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005209 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005210 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005211 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005212 } else if (Feature == "+strict-align") {
5213 Unaligned = 0;
5214 } else if (Feature == "+fp16") {
5215 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005216 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005217 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005218 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005219
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005220 switch (ArchVersion) {
5221 case 6:
5222 if (ArchProfile == llvm::ARM::PK_M)
5223 LDREX = 0;
5224 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5225 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5226 else
5227 LDREX = LDREX_W;
5228 break;
5229 case 7:
5230 if (ArchProfile == llvm::ARM::PK_M)
5231 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5232 else
5233 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5234 break;
5235 case 8:
5236 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5237 }
5238
Rafael Espindolaeb265472013-08-21 21:59:03 +00005239 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5240 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5241 return false;
5242 }
5243
5244 if (FPMath == FP_Neon)
5245 Features.push_back("+neonfp");
5246 else if (FPMath == FP_VFP)
5247 Features.push_back("-neonfp");
5248
Daniel Dunbar893d4752009-12-19 04:15:38 +00005249 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005250 auto Feature =
5251 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5252 if (Feature != Features.end())
5253 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005254
Rafael Espindolaeb265472013-08-21 21:59:03 +00005255 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005256 }
5257
Craig Topper3164f332014-03-11 03:39:26 +00005258 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005259 return llvm::StringSwitch<bool>(Feature)
5260 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005261 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005262 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005263 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005264 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005265 .Case("hwdiv", HWDiv & HWDivThumb)
5266 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005267 .Default(false);
5268 }
Renato Golin15b86152015-07-03 16:41:13 +00005269
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005270 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005271 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005272 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005273
Renato Golin15b86152015-07-03 16:41:13 +00005274 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005275 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005276 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005277 CPU = Name;
5278 return true;
5279 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005280
Craig Topper3164f332014-03-11 03:39:26 +00005281 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005282
Craig Topper3164f332014-03-11 03:39:26 +00005283 void getTargetDefines(const LangOptions &Opts,
5284 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005285 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005286 Builder.defineMacro("__arm");
5287 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005288 // For bare-metal none-eabi.
5289 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5290 getTriple().getEnvironment() == llvm::Triple::EABI)
5291 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005292
Chris Lattnerecd49032009-03-02 22:27:17 +00005293 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005294 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005295
5296 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5297 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005298 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005299 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5300
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005301 if (!CPUAttr.empty())
5302 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005303
5304 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005305 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005306 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005307
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005308 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005309 // ACLE 6.5.7 Crypto Extension
5310 if (Crypto)
5311 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5312 // ACLE 6.5.8 CRC32 Extension
5313 if (CRC)
5314 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5315 // ACLE 6.5.10 Numeric Maximum and Minimum
5316 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5317 // ACLE 6.5.9 Directed Rounding
5318 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005319 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005320
5321 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5322 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005323 // NOTE that the default profile is assumed to be 'A'
5324 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005325 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5326
Bradley Smithf4affc12016-03-03 13:52:22 +00005327 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5328 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5329 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5330 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005331 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005332 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005333 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005334 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5335
5336 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5337 // instruction set such as ARM or Thumb.
5338 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5339
5340 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5341
5342 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005343 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005344 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005345
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005346 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005347 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005348 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005349
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005350 // ACLE 6.4.4 LDREX/STREX
5351 if (LDREX)
5352 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5353
5354 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005355 if (ArchVersion == 5 ||
5356 (ArchVersion == 6 && CPUProfile != "M") ||
5357 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005358 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5359
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005360 // ACLE 6.5.1 Hardware Floating Point
5361 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005362 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005363
Yi Konga44c4d72014-06-27 21:25:42 +00005364 // ACLE predefines.
5365 Builder.defineMacro("__ARM_ACLE", "200");
5366
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005367 // FP16 support (we currently only support IEEE format).
5368 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5369 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5370
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005371 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005372 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005373 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5374
Mike Stump9d54bd72009-04-08 02:07:04 +00005375 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005376
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005377 // FIXME: It's more complicated than this and we don't really support
5378 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005379 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005380 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005381 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005382
David Tweed8f676532012-10-25 13:33:01 +00005383 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005384 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005385 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005386 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005387 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005388 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005389 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005390
Tim Northover28fc0e12016-04-28 13:59:55 +00005391 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5392 ABI == "aapcs16")
5393 Builder.defineMacro("__ARM_PCS_VFP", "1");
5394
Daniel Dunbar893d4752009-12-19 04:15:38 +00005395 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005396 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005397
Zijiao Ma56a83722016-08-17 02:13:33 +00005398 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005399 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005400
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005401 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005402 Builder.defineMacro("__THUMBEL__");
5403 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005404 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005405 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005406 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005407
5408 // ACLE 6.4.9 32-bit SIMD instructions
5409 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5410 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5411
5412 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005413 if (((HWDiv & HWDivThumb) && isThumb()) ||
5414 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005415 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005416 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005417 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005418
5419 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005420 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005421
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005422 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005423 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005424 if (FPU & VFP2FPU)
5425 Builder.defineMacro("__ARM_VFPV2__");
5426 if (FPU & VFP3FPU)
5427 Builder.defineMacro("__ARM_VFPV3__");
5428 if (FPU & VFP4FPU)
5429 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005430 if (FPU & FPARMV8)
5431 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005432 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005433
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005434 // This only gets set when Neon instructions are actually available, unlike
5435 // the VFP define, hence the soft float and arch check. This is subtly
5436 // different from gcc, we follow the intent which was that it should be set
5437 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005438 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005439 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005440 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005441 // current AArch32 NEON implementations do not support double-precision
5442 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005443 Builder.defineMacro("__ARM_NEON_FP",
5444 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005445 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005446
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005447 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5448 Opts.ShortWChar ? "2" : "4");
5449
5450 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5451 Opts.ShortEnums ? "1" : "4");
5452
Bradley Smithf4affc12016-03-03 13:52:22 +00005453 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005454 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5455 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5456 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5457 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5458 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005459
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005460 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005461 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005462 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005463 }
5464
5465 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005466 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005467 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5468 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005469 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005470 }
5471
5472 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005473 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005474 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005475
5476 if (Opts.UnsafeFPMath)
5477 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005478
5479 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5480 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005481 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005482
Craig Topper6c03a542015-10-19 04:51:35 +00005483 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5484 return llvm::makeArrayRef(BuiltinInfo,
5485 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005486 }
Craig Topper3164f332014-03-11 03:39:26 +00005487 bool isCLZForZeroUndef() const override { return false; }
5488 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005489 return IsAAPCS
5490 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005491 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5492 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005493 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005494 ArrayRef<const char *> getGCCRegNames() const override;
5495 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005496 bool validateAsmConstraint(const char *&Name,
5497 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005498 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005499 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005500 case 'l': // r0-r7
5501 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005502 case 't': // VFP Floating point register single precision
5503 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005504 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005505 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005506 case 'I':
5507 case 'J':
5508 case 'K':
5509 case 'L':
5510 case 'M':
5511 // FIXME
5512 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005513 case 'Q': // A memory address that is a single base register.
5514 Info.setAllowsMemory();
5515 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005516 case 'U': // a memory reference...
5517 switch (Name[1]) {
5518 case 'q': // ...ARMV4 ldrsb
5519 case 'v': // ...VFP load/store (reg+constant offset)
5520 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005521 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005522 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005523 case 'n': // valid address for Neon doubleword vector load/store
5524 case 'm': // valid address for Neon element and structure load/store
5525 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005526 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005527 Info.setAllowsMemory();
5528 Name++;
5529 return true;
5530 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005531 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005532 return false;
5533 }
Craig Topper3164f332014-03-11 03:39:26 +00005534 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005535 std::string R;
5536 switch (*Constraint) {
5537 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005538 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005539 Constraint++;
5540 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005541 case 'p': // 'p' should be translated to 'r' by default.
5542 R = std::string("r");
5543 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005544 default:
5545 return std::string(1, *Constraint);
5546 }
5547 return R;
5548 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005549 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005550 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005551 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005552 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005553 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005554
Bill Wendling9d1ee112012-10-25 23:28:48 +00005555 // Strip off constraint modifiers.
5556 while (Constraint[0] == '=' ||
5557 Constraint[0] == '+' ||
5558 Constraint[0] == '&')
5559 Constraint = Constraint.substr(1);
5560
5561 switch (Constraint[0]) {
5562 default: break;
5563 case 'r': {
5564 switch (Modifier) {
5565 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005566 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005567 case 'q':
5568 // A register of size 32 cannot fit a vector type.
5569 return false;
5570 }
5571 }
5572 }
5573
5574 return true;
5575 }
Craig Topper3164f332014-03-11 03:39:26 +00005576 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005577 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005578 return "";
5579 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005580
Craig Topper3164f332014-03-11 03:39:26 +00005581 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005582 switch (CC) {
5583 case CC_AAPCS:
5584 case CC_AAPCS_VFP:
5585 case CC_Swift:
5586 return CCCR_OK;
5587 default:
5588 return CCCR_Warning;
5589 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005590 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005591
Craig Topper3164f332014-03-11 03:39:26 +00005592 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005593 if (RegNo == 0) return 0;
5594 if (RegNo == 1) return 1;
5595 return -1;
5596 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005597
5598 bool hasSjLjLowering() const override {
5599 return true;
5600 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005601};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005602
Rafael Espindolaeb265472013-08-21 21:59:03 +00005603bool ARMTargetInfo::setFPMath(StringRef Name) {
5604 if (Name == "neon") {
5605 FPMath = FP_Neon;
5606 return true;
5607 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5608 Name == "vfp4") {
5609 FPMath = FP_VFP;
5610 return true;
5611 }
5612 return false;
5613}
5614
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005615const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005616 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005617 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005618 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5619
5620 // Float registers
5621 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5622 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5623 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005624 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005625
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005626 // Double registers
5627 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5628 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005629 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5630 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005631
5632 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005633 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5634 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005635};
5636
Craig Topperf054e3a2015-10-19 03:52:27 +00005637ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5638 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005639}
5640
5641const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005642 { { "a1" }, "r0" },
5643 { { "a2" }, "r1" },
5644 { { "a3" }, "r2" },
5645 { { "a4" }, "r3" },
5646 { { "v1" }, "r4" },
5647 { { "v2" }, "r5" },
5648 { { "v3" }, "r6" },
5649 { { "v4" }, "r7" },
5650 { { "v5" }, "r8" },
5651 { { "v6", "rfp" }, "r9" },
5652 { { "sl" }, "r10" },
5653 { { "fp" }, "r11" },
5654 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005655 { { "r13" }, "sp" },
5656 { { "r14" }, "lr" },
5657 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005658 // The S, D and Q registers overlap, but aren't really aliases; we
5659 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005660};
5661
Craig Topperf054e3a2015-10-19 03:52:27 +00005662ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5663 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005664}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005665
5666const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005667#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005668 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005669#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5670 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005671#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005672
Craig Topper07d3b622015-08-07 05:14:44 +00005673#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005674 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005675#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005676 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005677#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5678 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005679#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5680 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005681#include "clang/Basic/BuiltinsARM.def"
5682};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005683
5684class ARMleTargetInfo : public ARMTargetInfo {
5685public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005686 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005687 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005688 void getTargetDefines(const LangOptions &Opts,
5689 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005690 Builder.defineMacro("__ARMEL__");
5691 ARMTargetInfo::getTargetDefines(Opts, Builder);
5692 }
5693};
5694
5695class ARMbeTargetInfo : public ARMTargetInfo {
5696public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005697 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005698 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005699 void getTargetDefines(const LangOptions &Opts,
5700 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005701 Builder.defineMacro("__ARMEB__");
5702 Builder.defineMacro("__ARM_BIG_ENDIAN");
5703 ARMTargetInfo::getTargetDefines(Opts, Builder);
5704 }
5705};
Chris Lattner17df24e2008-04-21 18:56:49 +00005706
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005707class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5708 const llvm::Triple Triple;
5709public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005710 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5711 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005712 WCharType = UnsignedShort;
5713 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005714 }
5715 void getVisualStudioDefines(const LangOptions &Opts,
5716 MacroBuilder &Builder) const {
5717 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5718
5719 // FIXME: this is invalid for WindowsCE
5720 Builder.defineMacro("_M_ARM_NT", "1");
5721 Builder.defineMacro("_M_ARMT", "_M_ARM");
5722 Builder.defineMacro("_M_THUMB", "_M_ARM");
5723
5724 assert((Triple.getArch() == llvm::Triple::arm ||
5725 Triple.getArch() == llvm::Triple::thumb) &&
5726 "invalid architecture for Windows ARM target info");
5727 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5728 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5729
5730 // TODO map the complete set of values
5731 // 31: VFPv3 40: VFPv4
5732 Builder.defineMacro("_M_ARM_FP", "31");
5733 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005734 BuiltinVaListKind getBuiltinVaListKind() const override {
5735 return TargetInfo::CharPtrBuiltinVaList;
5736 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005737 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5738 switch (CC) {
5739 case CC_X86StdCall:
5740 case CC_X86ThisCall:
5741 case CC_X86FastCall:
5742 case CC_X86VectorCall:
5743 return CCCR_Ignore;
5744 case CC_C:
5745 return CCCR_OK;
5746 default:
5747 return CCCR_Warning;
5748 }
5749 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005750};
5751
5752// Windows ARM + Itanium C++ ABI Target
5753class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5754public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005755 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5756 const TargetOptions &Opts)
5757 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005758 TheCXXABI.set(TargetCXXABI::GenericARM);
5759 }
5760
5761 void getTargetDefines(const LangOptions &Opts,
5762 MacroBuilder &Builder) const override {
5763 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5764
5765 if (Opts.MSVCCompat)
5766 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5767 }
5768};
5769
5770// Windows ARM, MS (C++) ABI
5771class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005773 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5774 const TargetOptions &Opts)
5775 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005776 TheCXXABI.set(TargetCXXABI::Microsoft);
5777 }
5778
5779 void getTargetDefines(const LangOptions &Opts,
5780 MacroBuilder &Builder) const override {
5781 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5782 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5783 }
5784};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005785
Yaron Keren321249c2015-07-15 13:32:23 +00005786// ARM MinGW target
5787class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005789 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5790 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005791 TheCXXABI.set(TargetCXXABI::GenericARM);
5792 }
5793
5794 void getTargetDefines(const LangOptions &Opts,
5795 MacroBuilder &Builder) const override {
5796 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5797 DefineStd(Builder, "WIN32", Opts);
5798 DefineStd(Builder, "WINNT", Opts);
5799 Builder.defineMacro("_ARM_");
5800 addMinGWDefines(Opts, Builder);
5801 }
5802};
5803
5804// ARM Cygwin target
5805class CygwinARMTargetInfo : public ARMleTargetInfo {
5806public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005807 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5808 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005809 TLSSupported = false;
5810 WCharType = UnsignedShort;
5811 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005812 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005813 }
5814 void getTargetDefines(const LangOptions &Opts,
5815 MacroBuilder &Builder) const override {
5816 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5817 Builder.defineMacro("_ARM_");
5818 Builder.defineMacro("__CYGWIN__");
5819 Builder.defineMacro("__CYGWIN32__");
5820 DefineStd(Builder, "unix", Opts);
5821 if (Opts.CPlusPlus)
5822 Builder.defineMacro("_GNU_SOURCE");
5823 }
5824};
5825
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005826class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005827protected:
Craig Topper3164f332014-03-11 03:39:26 +00005828 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5829 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005830 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005831 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005832
Torok Edwinb2b37c62009-06-30 17:10:35 +00005833public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005834 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5835 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005836 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005837 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005838 // FIXME: This should be based off of the target features in
5839 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005840 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005841
Tim Northoverd88ecb32016-01-27 19:32:40 +00005842 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005843 // Darwin on iOS uses a variant of the ARM C++ ABI.
5844 TheCXXABI.set(TargetCXXABI::WatchOS);
5845
5846 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5847 // size_t is long, it's a bit weird for it to be int.
5848 PtrDiffType = SignedLong;
5849
5850 // BOOL should be a real boolean on the new ABI
5851 UseSignedCharForObjCBool = false;
5852 } else
5853 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005854 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005855};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005856
Tim Northover573cbee2014-05-24 12:52:07 +00005857class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005858 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005859 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5860 static const char *const GCCRegNames[];
5861
James Molloy75f5f9e2014-04-16 15:33:48 +00005862 enum FPUModeEnum {
5863 FPUMode,
5864 NeonMode
5865 };
5866
5867 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005868 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005869 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005870 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005871 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005872
Tim Northovera2ee4332014-03-29 15:09:45 +00005873 static const Builtin::Info BuiltinInfo[];
5874
5875 std::string ABI;
5876
5877public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005878 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005879 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005880 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5881 WCharType = SignedInt;
5882
5883 // NetBSD apparently prefers consistency across ARM targets to consistency
5884 // across 64-bit targets.
5885 Int64Type = SignedLongLong;
5886 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005887 } else {
5888 WCharType = UnsignedInt;
5889 Int64Type = SignedLong;
5890 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005891 }
5892
Tim Northovera2ee4332014-03-29 15:09:45 +00005893 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005894 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005895 MaxAtomicInlineWidth = 128;
5896 MaxAtomicPromoteWidth = 128;
5897
Tim Northovera6a19f12015-02-06 01:25:07 +00005898 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005899 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005900
Tim Northovera2ee4332014-03-29 15:09:45 +00005901 // {} in inline assembly are neon specifiers, not assembly variant
5902 // specifiers.
5903 NoAsmVariants = true;
5904
Tim Northover7ad87af2015-01-16 18:44:04 +00005905 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5906 // contributes to the alignment of the containing aggregate in the same way
5907 // a plain (non bit-field) member of that type would, without exception for
5908 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005909 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005910 UseZeroLengthBitfieldAlignment = true;
5911
Tim Northover573cbee2014-05-24 12:52:07 +00005912 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005913 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005914
5915 if (Triple.getOS() == llvm::Triple::Linux ||
5916 Triple.getOS() == llvm::Triple::UnknownOS)
5917 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005918 }
5919
Alp Toker4925ba72014-06-07 23:30:42 +00005920 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005921 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005922 if (Name != "aapcs" && Name != "darwinpcs")
5923 return false;
5924
5925 ABI = Name;
5926 return true;
5927 }
5928
David Blaikie1cbb9712014-11-14 19:09:44 +00005929 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005930 return Name == "generic" ||
5931 llvm::AArch64::parseCPUArch(Name) !=
5932 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005933 }
5934
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005935 void getTargetDefines(const LangOptions &Opts,
5936 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005937 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005938 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005939
5940 // Target properties.
5941 Builder.defineMacro("_LP64");
5942 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005943
5944 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5945 Builder.defineMacro("__ARM_ACLE", "200");
5946 Builder.defineMacro("__ARM_ARCH", "8");
5947 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5948
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005949 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005950 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005951 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005952
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005953 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5954 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5955 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5956 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005957 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005958 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5959 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005960
5961 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5962
5963 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005964 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005965
5966 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5967 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005968 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5969 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005970
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005971 if (Opts.UnsafeFPMath)
5972 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005973
5974 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5975
5976 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5977 Opts.ShortEnums ? "1" : "4");
5978
James Molloy75f5f9e2014-04-16 15:33:48 +00005979 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005980 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005981 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005982 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005983 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005984
Bradley Smith418c5932014-05-02 15:17:51 +00005985 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005986 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005987
James Molloy75f5f9e2014-04-16 15:33:48 +00005988 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005989 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5990
5991 if (Unaligned)
5992 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005993
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005994 if (V8_1A)
5995 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5996
Reid Klecknerd167d422015-05-06 15:31:46 +00005997 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5998 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5999 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6000 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6001 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006002 }
6003
Craig Topper6c03a542015-10-19 04:51:35 +00006004 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6005 return llvm::makeArrayRef(BuiltinInfo,
6006 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006007 }
6008
David Blaikie1cbb9712014-11-14 19:09:44 +00006009 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006010 return Feature == "aarch64" ||
6011 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006012 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006013 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006014 }
6015
James Molloy5e73df52014-04-16 15:06:20 +00006016 bool handleTargetFeatures(std::vector<std::string> &Features,
6017 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006018 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006019 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006020 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006021 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006022 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006023
Eric Christopher610fe112015-08-26 08:21:55 +00006024 for (const auto &Feature : Features) {
6025 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006026 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006027 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006028 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006029 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006030 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006031 if (Feature == "+strict-align")
6032 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006033 if (Feature == "+v8.1a")
6034 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006035 }
6036
James Y Knightb214cbc2016-03-04 19:00:41 +00006037 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006038
6039 return true;
6040 }
6041
John McCall477f2bb2016-03-03 06:39:32 +00006042 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6043 switch (CC) {
6044 case CC_C:
6045 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006046 case CC_PreserveMost:
6047 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006048 return CCCR_OK;
6049 default:
6050 return CCCR_Warning;
6051 }
6052 }
6053
David Blaikie1cbb9712014-11-14 19:09:44 +00006054 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006055
David Blaikie1cbb9712014-11-14 19:09:44 +00006056 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006057 return TargetInfo::AArch64ABIBuiltinVaList;
6058 }
6059
Craig Topperf054e3a2015-10-19 03:52:27 +00006060 ArrayRef<const char *> getGCCRegNames() const override;
6061 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006062
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006063 bool validateAsmConstraint(const char *&Name,
6064 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006065 switch (*Name) {
6066 default:
6067 return false;
6068 case 'w': // Floating point and SIMD registers (V0-V31)
6069 Info.setAllowsRegister();
6070 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006071 case 'I': // Constant that can be used with an ADD instruction
6072 case 'J': // Constant that can be used with a SUB instruction
6073 case 'K': // Constant that can be used with a 32-bit logical instruction
6074 case 'L': // Constant that can be used with a 64-bit logical instruction
6075 case 'M': // Constant that can be used as a 32-bit MOV immediate
6076 case 'N': // Constant that can be used as a 64-bit MOV immediate
6077 case 'Y': // Floating point constant zero
6078 case 'Z': // Integer constant zero
6079 return true;
6080 case 'Q': // A memory reference with base register and no offset
6081 Info.setAllowsMemory();
6082 return true;
6083 case 'S': // A symbolic address
6084 Info.setAllowsRegister();
6085 return true;
6086 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006087 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6088 // Utf: A memory address suitable for ldp/stp in TF mode.
6089 // Usa: An absolute symbolic address.
6090 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6091 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006092 case 'z': // Zero register, wzr or xzr
6093 Info.setAllowsRegister();
6094 return true;
6095 case 'x': // Floating point and SIMD registers (V0-V15)
6096 Info.setAllowsRegister();
6097 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006098 }
6099 return false;
6100 }
6101
Akira Hatanaka987f1862014-08-22 06:05:21 +00006102 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006103 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006104 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006105 // Strip off constraint modifiers.
6106 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6107 Constraint = Constraint.substr(1);
6108
6109 switch (Constraint[0]) {
6110 default:
6111 return true;
6112 case 'z':
6113 case 'r': {
6114 switch (Modifier) {
6115 case 'x':
6116 case 'w':
6117 // For now assume that the person knows what they're
6118 // doing with the modifier.
6119 return true;
6120 default:
6121 // By default an 'r' constraint will be in the 'x'
6122 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006123 if (Size == 64)
6124 return true;
6125
6126 SuggestedModifier = "w";
6127 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006128 }
6129 }
6130 }
6131 }
6132
David Blaikie1cbb9712014-11-14 19:09:44 +00006133 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006134
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006135 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006136 if (RegNo == 0)
6137 return 0;
6138 if (RegNo == 1)
6139 return 1;
6140 return -1;
6141 }
6142};
6143
Tim Northover573cbee2014-05-24 12:52:07 +00006144const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006145 // 32-bit Integer registers
6146 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6147 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6148 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6149
6150 // 64-bit Integer registers
6151 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6152 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6153 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6154
6155 // 32-bit floating point regsisters
6156 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6157 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6158 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6159
6160 // 64-bit floating point regsisters
6161 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6162 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6163 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6164
6165 // Vector registers
6166 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6167 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6168 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6169};
6170
Craig Topperf054e3a2015-10-19 03:52:27 +00006171ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6172 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006173}
6174
Tim Northover573cbee2014-05-24 12:52:07 +00006175const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006176 { { "w31" }, "wsp" },
6177 { { "x29" }, "fp" },
6178 { { "x30" }, "lr" },
6179 { { "x31" }, "sp" },
6180 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6181 // don't want to substitute one of these for a different-sized one.
6182};
6183
Craig Topperf054e3a2015-10-19 03:52:27 +00006184ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6185 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006186}
6187
Tim Northover573cbee2014-05-24 12:52:07 +00006188const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006189#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006190 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006191#include "clang/Basic/BuiltinsNEON.def"
6192
6193#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006194 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006195#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006196};
James Molloy5e73df52014-04-16 15:06:20 +00006197
Tim Northover573cbee2014-05-24 12:52:07 +00006198class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006199 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006200 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006201 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006202 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006203 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006204 }
6205
6206public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006207 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6208 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006209 }
James Molloy5e73df52014-04-16 15:06:20 +00006210 void getTargetDefines(const LangOptions &Opts,
6211 MacroBuilder &Builder) const override {
6212 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006213 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006214 }
6215};
6216
Tim Northover573cbee2014-05-24 12:52:07 +00006217class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006218 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006219 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006220 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006221 }
6222
6223public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006224 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6225 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006226 void getTargetDefines(const LangOptions &Opts,
6227 MacroBuilder &Builder) const override {
6228 Builder.defineMacro("__AARCH64EB__");
6229 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6230 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006231 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006232 }
6233};
Tim Northovera2ee4332014-03-29 15:09:45 +00006234
Tim Northover573cbee2014-05-24 12:52:07 +00006235class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006236protected:
6237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6238 MacroBuilder &Builder) const override {
6239 Builder.defineMacro("__AARCH64_SIMD__");
6240 Builder.defineMacro("__ARM64_ARCH_8__");
6241 Builder.defineMacro("__ARM_NEON__");
6242 Builder.defineMacro("__LITTLE_ENDIAN__");
6243 Builder.defineMacro("__REGISTER_PREFIX__", "");
6244 Builder.defineMacro("__arm64", "1");
6245 Builder.defineMacro("__arm64__", "1");
6246
6247 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6248 }
6249
Tim Northovera2ee4332014-03-29 15:09:45 +00006250public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006251 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6252 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006253 Int64Type = SignedLongLong;
6254 WCharType = SignedInt;
6255 UseSignedCharForObjCBool = false;
6256
Tim Northovera6a19f12015-02-06 01:25:07 +00006257 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006258 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006259
6260 TheCXXABI.set(TargetCXXABI::iOS64);
6261 }
6262
David Blaikie1cbb9712014-11-14 19:09:44 +00006263 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006264 return TargetInfo::CharPtrBuiltinVaList;
6265 }
6266};
Tim Northovera2ee4332014-03-29 15:09:45 +00006267
Tony Linthicum76329bf2011-12-12 21:14:55 +00006268// Hexagon abstract base class
6269class HexagonTargetInfo : public TargetInfo {
6270 static const Builtin::Info BuiltinInfo[];
6271 static const char * const GCCRegNames[];
6272 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6273 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006274 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006275 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006276
Tony Linthicum76329bf2011-12-12 21:14:55 +00006277public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006278 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6279 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006280 // Specify the vector alignment explicitly. For v512x1, the calculated
6281 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6282 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006283 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006284 "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 +00006285 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006286 SizeType = UnsignedInt;
6287 PtrDiffType = SignedInt;
6288 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006289
6290 // {} in inline assembly are packet specifiers, not assembly variant
6291 // specifiers.
6292 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006293
6294 LargeArrayMinWidth = 64;
6295 LargeArrayAlign = 64;
6296 UseBitFieldTypeAlignment = true;
6297 ZeroLengthBitfieldBoundary = 32;
6298 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006299 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006300 }
6301
Craig Topper6c03a542015-10-19 04:51:35 +00006302 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6303 return llvm::makeArrayRef(BuiltinInfo,
6304 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006305 }
6306
Craig Topper3164f332014-03-11 03:39:26 +00006307 bool validateAsmConstraint(const char *&Name,
6308 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006309 switch (*Name) {
6310 case 'v':
6311 case 'q':
6312 if (HasHVX) {
6313 Info.setAllowsRegister();
6314 return true;
6315 }
6316 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006317 case 's':
6318 // Relocatable constant.
6319 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006320 }
6321 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006322 }
6323
Craig Topper3164f332014-03-11 03:39:26 +00006324 void getTargetDefines(const LangOptions &Opts,
6325 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006326
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006327 bool isCLZForZeroUndef() const override { return false; }
6328
Craig Topper3164f332014-03-11 03:39:26 +00006329 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006330 return llvm::StringSwitch<bool>(Feature)
6331 .Case("hexagon", true)
6332 .Case("hvx", HasHVX)
6333 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006334 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006335 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006336 }
Craig Topper3164f332014-03-11 03:39:26 +00006337
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006338 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6339 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6340 const override;
6341
6342 bool handleTargetFeatures(std::vector<std::string> &Features,
6343 DiagnosticsEngine &Diags) override;
6344
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006345 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6346 bool Enabled) const override;
6347
Craig Topper3164f332014-03-11 03:39:26 +00006348 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006349 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006350 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006351 ArrayRef<const char *> getGCCRegNames() const override;
6352 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006353 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006354 return "";
6355 }
Sebastian Pop86500282012-01-13 20:37:10 +00006356
6357 static const char *getHexagonCPUSuffix(StringRef Name) {
6358 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006359 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006360 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006361 .Case("hexagonv55", "55")
6362 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006363 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006364 }
6365
Craig Topper3164f332014-03-11 03:39:26 +00006366 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006367 if (!getHexagonCPUSuffix(Name))
6368 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006369 CPU = Name;
6370 return true;
6371 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006372
6373 int getEHDataRegisterNumber(unsigned RegNo) const override {
6374 return RegNo < 2 ? RegNo : -1;
6375 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006376};
6377
6378void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006379 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006380 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006381 Builder.defineMacro("__hexagon__", "1");
6382
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006383 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006384 Builder.defineMacro("__HEXAGON_V4__");
6385 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006386 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006387 Builder.defineMacro("__QDSP6_V4__");
6388 Builder.defineMacro("__QDSP6_ARCH__", "4");
6389 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006390 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006391 Builder.defineMacro("__HEXAGON_V5__");
6392 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6393 if(Opts.HexagonQdsp6Compat) {
6394 Builder.defineMacro("__QDSP6_V5__");
6395 Builder.defineMacro("__QDSP6_ARCH__", "5");
6396 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006397 } else if (CPU == "hexagonv55") {
6398 Builder.defineMacro("__HEXAGON_V55__");
6399 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6400 Builder.defineMacro("__QDSP6_V55__");
6401 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006402 } else if (CPU == "hexagonv60") {
6403 Builder.defineMacro("__HEXAGON_V60__");
6404 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6405 Builder.defineMacro("__QDSP6_V60__");
6406 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006407 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006408
6409 if (hasFeature("hvx")) {
6410 Builder.defineMacro("__HVX__");
6411 if (hasFeature("hvx-double"))
6412 Builder.defineMacro("__HVXDBL__");
6413 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006414}
6415
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006416bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6417 DiagnosticsEngine &Diags, StringRef CPU,
6418 const std::vector<std::string> &FeaturesVec) const {
6419 // Default for v60: -hvx, -hvx-double.
6420 Features["hvx"] = false;
6421 Features["hvx-double"] = false;
6422 Features["long-calls"] = false;
6423
6424 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6425}
6426
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006427bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6428 DiagnosticsEngine &Diags) {
6429 for (auto &F : Features) {
6430 if (F == "+hvx")
6431 HasHVX = true;
6432 else if (F == "-hvx")
6433 HasHVX = HasHVXDouble = false;
6434 else if (F == "+hvx-double")
6435 HasHVX = HasHVXDouble = true;
6436 else if (F == "-hvx-double")
6437 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006438
6439 if (F == "+long-calls")
6440 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006441 else if (F == "-long-calls")
6442 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006443 }
6444 return true;
6445}
6446
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006447void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6448 StringRef Name, bool Enabled) const {
6449 if (Enabled) {
6450 if (Name == "hvx-double")
6451 Features["hvx"] = true;
6452 } else {
6453 if (Name == "hvx")
6454 Features["hvx-double"] = false;
6455 }
6456 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006457}
6458
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006459const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006460 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6461 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6462 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6463 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6464 "p0", "p1", "p2", "p3",
6465 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6466};
6467
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006468ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006469 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006470}
6471
Tony Linthicum76329bf2011-12-12 21:14:55 +00006472const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6473 { { "sp" }, "r29" },
6474 { { "fp" }, "r30" },
6475 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006477
Craig Topperf054e3a2015-10-19 03:52:27 +00006478ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6479 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006480}
6481
6482
6483const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006484#define BUILTIN(ID, TYPE, ATTRS) \
6485 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6486#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6487 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006488#include "clang/Basic/BuiltinsHexagon.def"
6489};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006490
Jacques Pienaard964cc22016-03-28 21:02:54 +00006491class LanaiTargetInfo : public TargetInfo {
6492 // Class for Lanai (32-bit).
6493 // The CPU profiles supported by the Lanai backend
6494 enum CPUKind {
6495 CK_NONE,
6496 CK_V11,
6497 } CPU;
6498
6499 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6500 static const char *const GCCRegNames[];
6501
6502public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006503 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6504 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006505 // Description string has to be kept in sync with backend.
6506 resetDataLayout("E" // Big endian
6507 "-m:e" // ELF name manging
6508 "-p:32:32" // 32 bit pointers, 32 bit aligned
6509 "-i64:64" // 64 bit integers, 64 bit aligned
6510 "-a:0:32" // 32 bit alignment of objects of aggregate type
6511 "-n32" // 32 bit native integer width
6512 "-S64" // 64 bit natural stack alignment
6513 );
6514
6515 // Setting RegParmMax equal to what mregparm was set to in the old
6516 // toolchain
6517 RegParmMax = 4;
6518
6519 // Set the default CPU to V11
6520 CPU = CK_V11;
6521
6522 // Temporary approach to make everything at least word-aligned and allow for
6523 // safely casting between pointers with different alignment requirements.
6524 // TODO: Remove this when there are no more cast align warnings on the
6525 // firmware.
6526 MinGlobalAlign = 32;
6527 }
6528
6529 void getTargetDefines(const LangOptions &Opts,
6530 MacroBuilder &Builder) const override {
6531 // Define __lanai__ when building for target lanai.
6532 Builder.defineMacro("__lanai__");
6533
6534 // Set define for the CPU specified.
6535 switch (CPU) {
6536 case CK_V11:
6537 Builder.defineMacro("__LANAI_V11__");
6538 break;
6539 case CK_NONE:
6540 llvm_unreachable("Unhandled target CPU");
6541 }
6542 }
6543
6544 bool setCPU(const std::string &Name) override {
6545 CPU = llvm::StringSwitch<CPUKind>(Name)
6546 .Case("v11", CK_V11)
6547 .Default(CK_NONE);
6548
6549 return CPU != CK_NONE;
6550 }
6551
6552 bool hasFeature(StringRef Feature) const override {
6553 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6554 }
6555
6556 ArrayRef<const char *> getGCCRegNames() const override;
6557
6558 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6559
6560 BuiltinVaListKind getBuiltinVaListKind() const override {
6561 return TargetInfo::VoidPtrBuiltinVaList;
6562 }
6563
6564 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6565
6566 bool validateAsmConstraint(const char *&Name,
6567 TargetInfo::ConstraintInfo &info) const override {
6568 return false;
6569 }
6570
6571 const char *getClobbers() const override { return ""; }
6572};
6573
6574const char *const LanaiTargetInfo::GCCRegNames[] = {
6575 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6576 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6577 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6578
6579ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6580 return llvm::makeArrayRef(GCCRegNames);
6581}
6582
6583const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6584 {{"pc"}, "r2"},
6585 {{"sp"}, "r4"},
6586 {{"fp"}, "r5"},
6587 {{"rv"}, "r8"},
6588 {{"rr1"}, "r10"},
6589 {{"rr2"}, "r11"},
6590 {{"rca"}, "r15"},
6591};
6592
6593ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6594 return llvm::makeArrayRef(GCCRegAliases);
6595}
6596
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006597// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6598class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006599 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6600 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006601 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006602public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006603 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006604 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006605
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006606 int getEHDataRegisterNumber(unsigned RegNo) const override {
6607 if (RegNo == 0) return 24;
6608 if (RegNo == 1) return 25;
6609 return -1;
6610 }
6611
Craig Topper3164f332014-03-11 03:39:26 +00006612 bool handleTargetFeatures(std::vector<std::string> &Features,
6613 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006614 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006615 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6616 if (Feature != Features.end()) {
6617 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006618 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006619 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006620 }
Craig Topper3164f332014-03-11 03:39:26 +00006621 void getTargetDefines(const LangOptions &Opts,
6622 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006623 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006624 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006625
6626 if (SoftFloat)
6627 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006628 }
Craig Topper3164f332014-03-11 03:39:26 +00006629
6630 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006631 return llvm::StringSwitch<bool>(Feature)
6632 .Case("softfloat", SoftFloat)
6633 .Case("sparc", true)
6634 .Default(false);
6635 }
Craig Topper3164f332014-03-11 03:39:26 +00006636
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006637 bool hasSjLjLowering() const override {
6638 return true;
6639 }
6640
Craig Topper6c03a542015-10-19 04:51:35 +00006641 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006642 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006643 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006644 }
Craig Topper3164f332014-03-11 03:39:26 +00006645 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006646 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006647 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006648 ArrayRef<const char *> getGCCRegNames() const override;
6649 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006650 bool validateAsmConstraint(const char *&Name,
6651 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006652 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006653 switch (*Name) {
6654 case 'I': // Signed 13-bit constant
6655 case 'J': // Zero
6656 case 'K': // 32-bit constant with the low 12 bits clear
6657 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6658 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6659 case 'N': // Same as 'K' but zext (required for SIMode)
6660 case 'O': // The constant 4096
6661 return true;
6662 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006663 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006664 }
Craig Topper3164f332014-03-11 03:39:26 +00006665 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006666 // FIXME: Implement!
6667 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006668 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006669
6670 // No Sparc V7 for now, the backend doesn't support it anyway.
6671 enum CPUKind {
6672 CK_GENERIC,
6673 CK_V8,
6674 CK_SUPERSPARC,
6675 CK_SPARCLITE,
6676 CK_F934,
6677 CK_HYPERSPARC,
6678 CK_SPARCLITE86X,
6679 CK_SPARCLET,
6680 CK_TSC701,
6681 CK_V9,
6682 CK_ULTRASPARC,
6683 CK_ULTRASPARC3,
6684 CK_NIAGARA,
6685 CK_NIAGARA2,
6686 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006687 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006688 CK_MYRIAD2100,
6689 CK_MYRIAD2150,
6690 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006691 CK_LEON2,
6692 CK_LEON2_AT697E,
6693 CK_LEON2_AT697F,
6694 CK_LEON3,
6695 CK_LEON3_UT699,
6696 CK_LEON3_GR712RC,
6697 CK_LEON4,
6698 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006699 } CPU = CK_GENERIC;
6700
6701 enum CPUGeneration {
6702 CG_V8,
6703 CG_V9,
6704 };
6705
6706 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6707 switch (Kind) {
6708 case CK_GENERIC:
6709 case CK_V8:
6710 case CK_SUPERSPARC:
6711 case CK_SPARCLITE:
6712 case CK_F934:
6713 case CK_HYPERSPARC:
6714 case CK_SPARCLITE86X:
6715 case CK_SPARCLET:
6716 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006717 case CK_MYRIAD2100:
6718 case CK_MYRIAD2150:
6719 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006720 case CK_LEON2:
6721 case CK_LEON2_AT697E:
6722 case CK_LEON2_AT697F:
6723 case CK_LEON3:
6724 case CK_LEON3_UT699:
6725 case CK_LEON3_GR712RC:
6726 case CK_LEON4:
6727 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006728 return CG_V8;
6729 case CK_V9:
6730 case CK_ULTRASPARC:
6731 case CK_ULTRASPARC3:
6732 case CK_NIAGARA:
6733 case CK_NIAGARA2:
6734 case CK_NIAGARA3:
6735 case CK_NIAGARA4:
6736 return CG_V9;
6737 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006738 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006739 }
6740
6741 CPUKind getCPUKind(StringRef Name) const {
6742 return llvm::StringSwitch<CPUKind>(Name)
6743 .Case("v8", CK_V8)
6744 .Case("supersparc", CK_SUPERSPARC)
6745 .Case("sparclite", CK_SPARCLITE)
6746 .Case("f934", CK_F934)
6747 .Case("hypersparc", CK_HYPERSPARC)
6748 .Case("sparclite86x", CK_SPARCLITE86X)
6749 .Case("sparclet", CK_SPARCLET)
6750 .Case("tsc701", CK_TSC701)
6751 .Case("v9", CK_V9)
6752 .Case("ultrasparc", CK_ULTRASPARC)
6753 .Case("ultrasparc3", CK_ULTRASPARC3)
6754 .Case("niagara", CK_NIAGARA)
6755 .Case("niagara2", CK_NIAGARA2)
6756 .Case("niagara3", CK_NIAGARA3)
6757 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006758 .Case("ma2100", CK_MYRIAD2100)
6759 .Case("ma2150", CK_MYRIAD2150)
6760 .Case("ma2450", CK_MYRIAD2450)
6761 // FIXME: the myriad2[.n] spellings are obsolete,
6762 // but a grace period is needed to allow updating dependent builds.
6763 .Case("myriad2", CK_MYRIAD2100)
6764 .Case("myriad2.1", CK_MYRIAD2100)
6765 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006766 .Case("leon2", CK_LEON2)
6767 .Case("at697e", CK_LEON2_AT697E)
6768 .Case("at697f", CK_LEON2_AT697F)
6769 .Case("leon3", CK_LEON3)
6770 .Case("ut699", CK_LEON3_UT699)
6771 .Case("gr712rc", CK_LEON3_GR712RC)
6772 .Case("leon4", CK_LEON4)
6773 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006774 .Default(CK_GENERIC);
6775 }
6776
6777 bool setCPU(const std::string &Name) override {
6778 CPU = getCPUKind(Name);
6779 return CPU != CK_GENERIC;
6780 }
Gabor Greif49991682008-02-21 16:29:08 +00006781};
6782
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006783const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006784 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6785 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6786 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6787 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6788};
6789
Craig Topperf054e3a2015-10-19 03:52:27 +00006790ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6791 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006792}
6793
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006794const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006795 { { "g0" }, "r0" },
6796 { { "g1" }, "r1" },
6797 { { "g2" }, "r2" },
6798 { { "g3" }, "r3" },
6799 { { "g4" }, "r4" },
6800 { { "g5" }, "r5" },
6801 { { "g6" }, "r6" },
6802 { { "g7" }, "r7" },
6803 { { "o0" }, "r8" },
6804 { { "o1" }, "r9" },
6805 { { "o2" }, "r10" },
6806 { { "o3" }, "r11" },
6807 { { "o4" }, "r12" },
6808 { { "o5" }, "r13" },
6809 { { "o6", "sp" }, "r14" },
6810 { { "o7" }, "r15" },
6811 { { "l0" }, "r16" },
6812 { { "l1" }, "r17" },
6813 { { "l2" }, "r18" },
6814 { { "l3" }, "r19" },
6815 { { "l4" }, "r20" },
6816 { { "l5" }, "r21" },
6817 { { "l6" }, "r22" },
6818 { { "l7" }, "r23" },
6819 { { "i0" }, "r24" },
6820 { { "i1" }, "r25" },
6821 { { "i2" }, "r26" },
6822 { { "i3" }, "r27" },
6823 { { "i4" }, "r28" },
6824 { { "i5" }, "r29" },
6825 { { "i6", "fp" }, "r30" },
6826 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006827};
6828
Craig Topperf054e3a2015-10-19 03:52:27 +00006829ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6830 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006831}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006832
6833// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6834class SparcV8TargetInfo : public SparcTargetInfo {
6835public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006836 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6837 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006838 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006839 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6840 switch (getTriple().getOS()) {
6841 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006842 SizeType = UnsignedInt;
6843 IntPtrType = SignedInt;
6844 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006845 break;
6846 case llvm::Triple::NetBSD:
6847 case llvm::Triple::OpenBSD:
6848 SizeType = UnsignedLong;
6849 IntPtrType = SignedLong;
6850 PtrDiffType = SignedLong;
6851 break;
Brad Smith56495d52015-08-13 22:00:53 +00006852 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006853 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6854 // on up to 64 bits.
6855 MaxAtomicPromoteWidth = 64;
6856 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006857 }
6858
Craig Topper3164f332014-03-11 03:39:26 +00006859 void getTargetDefines(const LangOptions &Opts,
6860 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006861 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006862 switch (getCPUGeneration(CPU)) {
6863 case CG_V8:
6864 Builder.defineMacro("__sparcv8");
6865 if (getTriple().getOS() != llvm::Triple::Solaris)
6866 Builder.defineMacro("__sparcv8__");
6867 break;
6868 case CG_V9:
6869 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006870 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006871 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006872 Builder.defineMacro("__sparc_v9__");
6873 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006874 break;
6875 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006876 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006877 std::string MyriadArchValue, Myriad2Value;
6878 Builder.defineMacro("__sparc_v8__");
6879 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006880 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006881 case CK_MYRIAD2150:
6882 MyriadArchValue = "__ma2150";
6883 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006884 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006885 case CK_MYRIAD2450:
6886 MyriadArchValue = "__ma2450";
6887 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006888 break;
6889 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006890 MyriadArchValue = "__ma2100";
6891 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006892 break;
6893 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006894 Builder.defineMacro(MyriadArchValue, "1");
6895 Builder.defineMacro(MyriadArchValue+"__", "1");
6896 Builder.defineMacro("__myriad2__", Myriad2Value);
6897 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006898 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006899 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006900
6901 bool hasSjLjLowering() const override {
6902 return true;
6903 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006904};
6905
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006906// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6907class SparcV8elTargetInfo : public SparcV8TargetInfo {
6908 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006909 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6910 : SparcV8TargetInfo(Triple, Opts) {
6911 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006912 }
6913};
6914
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006915// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6916class SparcV9TargetInfo : public SparcTargetInfo {
6917public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006918 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6919 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006920 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006921 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006922 // This is an LP64 platform.
6923 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006924
6925 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006926 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006927 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006928 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006929 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006930 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006931
6932 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6933 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6934 LongDoubleWidth = 128;
6935 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006936 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006937 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006938 }
6939
Craig Topper3164f332014-03-11 03:39:26 +00006940 void getTargetDefines(const LangOptions &Opts,
6941 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006942 SparcTargetInfo::getTargetDefines(Opts, Builder);
6943 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006944 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006945 // Solaris doesn't need these variants, but the BSDs do.
6946 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006947 Builder.defineMacro("__sparc64__");
6948 Builder.defineMacro("__sparc_v9__");
6949 Builder.defineMacro("__sparcv9__");
6950 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006951 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006952
Craig Topper3164f332014-03-11 03:39:26 +00006953 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006954 if (!SparcTargetInfo::setCPU(Name))
6955 return false;
6956 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006957 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006958};
6959
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006960class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006961 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006962 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006963 std::string CPU;
6964 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006965 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006966
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006967public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006968 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006969 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6970 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006971 IntMaxType = SignedLong;
6972 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006973 TLSSupported = true;
6974 IntWidth = IntAlign = 32;
6975 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6976 PointerWidth = PointerAlign = 64;
6977 LongDoubleWidth = 128;
6978 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006979 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006980 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006981 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006982 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 +00006983 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6984 }
6985 void getTargetDefines(const LangOptions &Opts,
6986 MacroBuilder &Builder) const override {
6987 Builder.defineMacro("__s390__");
6988 Builder.defineMacro("__s390x__");
6989 Builder.defineMacro("__zarch__");
6990 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006991
6992 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6993 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6994 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6995 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6996
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006997 if (HasTransactionalExecution)
6998 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006999 if (Opts.ZVector)
7000 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007001 }
Craig Topper6c03a542015-10-19 04:51:35 +00007002 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7003 return llvm::makeArrayRef(BuiltinInfo,
7004 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007005 }
7006
Craig Topperf054e3a2015-10-19 03:52:27 +00007007 ArrayRef<const char *> getGCCRegNames() const override;
7008 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007009 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007010 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007011 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007012 bool validateAsmConstraint(const char *&Name,
7013 TargetInfo::ConstraintInfo &info) const override;
7014 const char *getClobbers() const override {
7015 // FIXME: Is this really right?
7016 return "";
7017 }
7018 BuiltinVaListKind getBuiltinVaListKind() const override {
7019 return TargetInfo::SystemZBuiltinVaList;
7020 }
7021 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007022 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007023 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7024 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007025 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007026 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007027 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007028 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007029 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007030 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007031 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007032 .Default(false);
7033
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007034 return CPUKnown;
7035 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007036 bool
7037 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7038 StringRef CPU,
7039 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007040 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007041 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007042 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007043 Features["transactional-execution"] = true;
7044 Features["vector"] = true;
7045 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007046 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007047 }
7048
7049 bool handleTargetFeatures(std::vector<std::string> &Features,
7050 DiagnosticsEngine &Diags) override {
7051 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007052 for (const auto &Feature : Features) {
7053 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007054 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007055 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007056 HasVector = true;
7057 }
7058 // If we use the vector ABI, vector types are 64-bit aligned.
7059 if (HasVector) {
7060 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007061 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7062 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007063 }
7064 return true;
7065 }
7066
7067 bool hasFeature(StringRef Feature) const override {
7068 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007069 .Case("systemz", true)
7070 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007071 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007072 .Default(false);
7073 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007074
Bryan Chane3f1ed52016-04-28 13:56:43 +00007075 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7076 switch (CC) {
7077 case CC_C:
7078 case CC_Swift:
7079 return CCCR_OK;
7080 default:
7081 return CCCR_Warning;
7082 }
7083 }
7084
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007085 StringRef getABI() const override {
7086 if (HasVector)
7087 return "vector";
7088 return "";
7089 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007090
7091 bool useFloat128ManglingForLongDouble() const override {
7092 return true;
7093 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007094};
7095
7096const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7097#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007098 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007099#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7100 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007101#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007102};
7103
7104const char *const SystemZTargetInfo::GCCRegNames[] = {
7105 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7106 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7107 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7108 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7109};
7110
Craig Topperf054e3a2015-10-19 03:52:27 +00007111ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7112 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007113}
7114
7115bool SystemZTargetInfo::
7116validateAsmConstraint(const char *&Name,
7117 TargetInfo::ConstraintInfo &Info) const {
7118 switch (*Name) {
7119 default:
7120 return false;
7121
7122 case 'a': // Address register
7123 case 'd': // Data register (equivalent to 'r')
7124 case 'f': // Floating-point register
7125 Info.setAllowsRegister();
7126 return true;
7127
7128 case 'I': // Unsigned 8-bit constant
7129 case 'J': // Unsigned 12-bit constant
7130 case 'K': // Signed 16-bit constant
7131 case 'L': // Signed 20-bit displacement (on all targets we support)
7132 case 'M': // 0x7fffffff
7133 return true;
7134
7135 case 'Q': // Memory with base and unsigned 12-bit displacement
7136 case 'R': // Likewise, plus an index
7137 case 'S': // Memory with base and signed 20-bit displacement
7138 case 'T': // Likewise, plus an index
7139 Info.setAllowsMemory();
7140 return true;
7141 }
7142}
Ulrich Weigand47445072013-05-06 16:26:41 +00007143
Eric Christopherc48497a2015-09-18 21:26:24 +00007144class MSP430TargetInfo : public TargetInfo {
7145 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007146
Eric Christopherc48497a2015-09-18 21:26:24 +00007147public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007148 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7149 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007150 TLSSupported = false;
7151 IntWidth = 16;
7152 IntAlign = 16;
7153 LongWidth = 32;
7154 LongLongWidth = 64;
7155 LongAlign = LongLongAlign = 16;
7156 PointerWidth = 16;
7157 PointerAlign = 16;
7158 SuitableAlign = 16;
7159 SizeType = UnsignedInt;
7160 IntMaxType = SignedLongLong;
7161 IntPtrType = SignedInt;
7162 PtrDiffType = SignedInt;
7163 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007164 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007165 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007166 void getTargetDefines(const LangOptions &Opts,
7167 MacroBuilder &Builder) const override {
7168 Builder.defineMacro("MSP430");
7169 Builder.defineMacro("__MSP430__");
7170 // FIXME: defines for different 'flavours' of MCU
7171 }
Craig Topper6c03a542015-10-19 04:51:35 +00007172 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007173 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007174 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007175 }
7176 bool hasFeature(StringRef Feature) const override {
7177 return Feature == "msp430";
7178 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007179 ArrayRef<const char *> getGCCRegNames() const override;
7180 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007181 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007182 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007183 }
7184 bool validateAsmConstraint(const char *&Name,
7185 TargetInfo::ConstraintInfo &info) const override {
7186 // FIXME: implement
7187 switch (*Name) {
7188 case 'K': // the constant 1
7189 case 'L': // constant -1^20 .. 1^19
7190 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007191 return true;
7192 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007193 // No target constraints for now.
7194 return false;
7195 }
7196 const char *getClobbers() const override {
7197 // FIXME: Is this really right?
7198 return "";
7199 }
7200 BuiltinVaListKind getBuiltinVaListKind() const override {
7201 // FIXME: implement
7202 return TargetInfo::CharPtrBuiltinVaList;
7203 }
7204};
7205
7206const char *const MSP430TargetInfo::GCCRegNames[] = {
7207 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7208 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7209
Craig Topperf054e3a2015-10-19 03:52:27 +00007210ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7211 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007212}
7213
7214// LLVM and Clang cannot be used directly to output native binaries for
7215// target, but is used to compile C code to llvm bitcode with correct
7216// type and alignment information.
7217//
7218// TCE uses the llvm bitcode as input and uses it for generating customized
7219// target processor and program binary. TCE co-design environment is
7220// publicly available in http://tce.cs.tut.fi
7221
7222static const unsigned TCEOpenCLAddrSpaceMap[] = {
7223 3, // opencl_global
7224 4, // opencl_local
7225 5, // opencl_constant
7226 // FIXME: generic has to be added to the target
7227 0, // opencl_generic
7228 0, // cuda_device
7229 0, // cuda_constant
7230 0 // cuda_shared
7231};
7232
7233class TCETargetInfo : public TargetInfo {
7234public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007235 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7236 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007237 TLSSupported = false;
7238 IntWidth = 32;
7239 LongWidth = LongLongWidth = 32;
7240 PointerWidth = 32;
7241 IntAlign = 32;
7242 LongAlign = LongLongAlign = 32;
7243 PointerAlign = 32;
7244 SuitableAlign = 32;
7245 SizeType = UnsignedInt;
7246 IntMaxType = SignedLong;
7247 IntPtrType = SignedInt;
7248 PtrDiffType = SignedInt;
7249 FloatWidth = 32;
7250 FloatAlign = 32;
7251 DoubleWidth = 32;
7252 DoubleAlign = 32;
7253 LongDoubleWidth = 32;
7254 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007255 FloatFormat = &llvm::APFloat::IEEEsingle();
7256 DoubleFormat = &llvm::APFloat::IEEEsingle();
7257 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007258 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7259 "i16:16:32-i32:32:32-i64:32:32-"
7260 "f32:32:32-f64:32:32-v64:32:32-"
7261 "v128:32:32-v256:32:32-v512:32:32-"
7262 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007263 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7264 UseAddrSpaceMapMangling = true;
7265 }
7266
7267 void getTargetDefines(const LangOptions &Opts,
7268 MacroBuilder &Builder) const override {
7269 DefineStd(Builder, "tce", Opts);
7270 Builder.defineMacro("__TCE__");
7271 Builder.defineMacro("__TCE_V1__");
7272 }
7273 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7274
Craig Topper6c03a542015-10-19 04:51:35 +00007275 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007276 const char *getClobbers() const override { return ""; }
7277 BuiltinVaListKind getBuiltinVaListKind() const override {
7278 return TargetInfo::VoidPtrBuiltinVaList;
7279 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007280 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007281 bool validateAsmConstraint(const char *&Name,
7282 TargetInfo::ConstraintInfo &info) const override {
7283 return true;
7284 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007285 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7286 return None;
7287 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007288};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007289
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007290class TCELETargetInfo : public TCETargetInfo {
7291public:
7292 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7293 : TCETargetInfo(Triple, Opts) {
7294 BigEndian = false;
7295
7296 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7297 "i16:16:32-i32:32:32-i64:32:32-"
7298 "f32:32:32-f64:32:32-v64:32:32-"
7299 "v128:32:32-v256:32:32-v512:32:32-"
7300 "v1024:32:32-a0:0:32-n32");
7301
7302 }
7303
7304 virtual void getTargetDefines(const LangOptions &Opts,
7305 MacroBuilder &Builder) const {
7306 DefineStd(Builder, "tcele", Opts);
7307 Builder.defineMacro("__TCE__");
7308 Builder.defineMacro("__TCE_V1__");
7309 Builder.defineMacro("__TCELE__");
7310 Builder.defineMacro("__TCELE_V1__");
7311 }
7312
7313};
7314
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007315class BPFTargetInfo : public TargetInfo {
7316public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007317 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7318 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007319 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7320 SizeType = UnsignedLong;
7321 PtrDiffType = SignedLong;
7322 IntPtrType = SignedLong;
7323 IntMaxType = SignedLong;
7324 Int64Type = SignedLong;
7325 RegParmMax = 5;
7326 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007327 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007328 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007329 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007330 }
7331 MaxAtomicPromoteWidth = 64;
7332 MaxAtomicInlineWidth = 64;
7333 TLSSupported = false;
7334 }
7335 void getTargetDefines(const LangOptions &Opts,
7336 MacroBuilder &Builder) const override {
7337 DefineStd(Builder, "bpf", Opts);
7338 Builder.defineMacro("__BPF__");
7339 }
7340 bool hasFeature(StringRef Feature) const override {
7341 return Feature == "bpf";
7342 }
7343
Craig Topper6c03a542015-10-19 04:51:35 +00007344 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007345 const char *getClobbers() const override {
7346 return "";
7347 }
7348 BuiltinVaListKind getBuiltinVaListKind() const override {
7349 return TargetInfo::VoidPtrBuiltinVaList;
7350 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007351 ArrayRef<const char *> getGCCRegNames() const override {
7352 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007353 }
7354 bool validateAsmConstraint(const char *&Name,
7355 TargetInfo::ConstraintInfo &info) const override {
7356 return true;
7357 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007358 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7359 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007360 }
7361};
7362
Daniel Sanders4672af62016-05-27 11:51:02 +00007363class MipsTargetInfo : public TargetInfo {
7364 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007365 StringRef Layout;
7366
7367 if (ABI == "o32")
7368 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7369 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007370 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007371 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007372 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007373 else
7374 llvm_unreachable("Invalid ABI");
7375
7376 if (BigEndian)
7377 resetDataLayout(("E-" + Layout).str());
7378 else
7379 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007380 }
7381
Akira Hatanaka9064e362013-10-29 18:30:33 +00007382
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007383 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007384 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007385 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007386 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007387 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007388 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007389 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007390 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007391 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007392 enum DspRevEnum {
7393 NoDSP, DSP1, DSP2
7394 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007395 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007396
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007397protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007398 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007399 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007400
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007401public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007402 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007403 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7404 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7405 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007406 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007407
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007408 setABI((getTriple().getArch() == llvm::Triple::mips ||
7409 getTriple().getArch() == llvm::Triple::mipsel)
7410 ? "o32"
7411 : "n64");
7412
7413 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007414 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007415
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007416 bool isNaN2008Default() const {
7417 return CPU == "mips32r6" || CPU == "mips64r6";
7418 }
7419
7420 bool isFP64Default() const {
7421 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7422 }
7423
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007424 bool isNan2008() const override {
7425 return IsNan2008;
7426 }
7427
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007428 bool processorSupportsGPR64() const {
7429 return llvm::StringSwitch<bool>(CPU)
7430 .Case("mips3", true)
7431 .Case("mips4", true)
7432 .Case("mips5", true)
7433 .Case("mips64", true)
7434 .Case("mips64r2", true)
7435 .Case("mips64r3", true)
7436 .Case("mips64r5", true)
7437 .Case("mips64r6", true)
7438 .Case("octeon", true)
7439 .Default(false);
7440 return false;
7441 }
7442
Alp Toker4925ba72014-06-07 23:30:42 +00007443 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007444 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007445 if (Name == "o32") {
7446 setO32ABITypes();
7447 ABI = Name;
7448 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007449 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007450
7451 if (Name == "n32") {
7452 setN32ABITypes();
7453 ABI = Name;
7454 return true;
7455 }
7456 if (Name == "n64") {
7457 setN64ABITypes();
7458 ABI = Name;
7459 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007460 }
7461 return false;
7462 }
7463
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007464 void setO32ABITypes() {
7465 Int64Type = SignedLongLong;
7466 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007467 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007468 LongDoubleWidth = LongDoubleAlign = 64;
7469 LongWidth = LongAlign = 32;
7470 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7471 PointerWidth = PointerAlign = 32;
7472 PtrDiffType = SignedInt;
7473 SizeType = UnsignedInt;
7474 SuitableAlign = 64;
7475 }
7476
7477 void setN32N64ABITypes() {
7478 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007479 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007480 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7481 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007482 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007483 }
7484 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7485 SuitableAlign = 128;
7486 }
7487
Daniel Sanders4672af62016-05-27 11:51:02 +00007488 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007489 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007490 Int64Type = SignedLong;
7491 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007492 LongWidth = LongAlign = 64;
7493 PointerWidth = PointerAlign = 64;
7494 PtrDiffType = SignedLong;
7495 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007496 }
7497
7498 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007499 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007500 Int64Type = SignedLongLong;
7501 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007502 LongWidth = LongAlign = 32;
7503 PointerWidth = PointerAlign = 32;
7504 PtrDiffType = SignedInt;
7505 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007506 }
7507
Craig Topper3164f332014-03-11 03:39:26 +00007508 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007509 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007510 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007511 .Case("mips1", true)
7512 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007513 .Case("mips3", true)
7514 .Case("mips4", true)
7515 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007516 .Case("mips32", true)
7517 .Case("mips32r2", true)
7518 .Case("mips32r3", true)
7519 .Case("mips32r5", true)
7520 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007521 .Case("mips64", true)
7522 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007523 .Case("mips64r3", true)
7524 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007525 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007526 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007527 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007528 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007529 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007530 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007531 bool
7532 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7533 StringRef CPU,
7534 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007535 if (CPU.empty())
7536 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007537 if (CPU == "octeon")
7538 Features["mips64r2"] = Features["cnmips"] = true;
7539 else
7540 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007541 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007542 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007543
Craig Topper3164f332014-03-11 03:39:26 +00007544 void getTargetDefines(const LangOptions &Opts,
7545 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007546 if (BigEndian) {
7547 DefineStd(Builder, "MIPSEB", Opts);
7548 Builder.defineMacro("_MIPSEB");
7549 } else {
7550 DefineStd(Builder, "MIPSEL", Opts);
7551 Builder.defineMacro("_MIPSEL");
7552 }
7553
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007554 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007555 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007556 if (Opts.GNUMode)
7557 Builder.defineMacro("mips");
7558
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007559 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007560 Builder.defineMacro("__mips", "32");
7561 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7562 } else {
7563 Builder.defineMacro("__mips", "64");
7564 Builder.defineMacro("__mips64");
7565 Builder.defineMacro("__mips64__");
7566 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7567 }
7568
7569 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7570 .Cases("mips32", "mips64", "1")
7571 .Cases("mips32r2", "mips64r2", "2")
7572 .Cases("mips32r3", "mips64r3", "3")
7573 .Cases("mips32r5", "mips64r5", "5")
7574 .Cases("mips32r6", "mips64r6", "6")
7575 .Default("");
7576 if (!ISARev.empty())
7577 Builder.defineMacro("__mips_isa_rev", ISARev);
7578
7579 if (ABI == "o32") {
7580 Builder.defineMacro("__mips_o32");
7581 Builder.defineMacro("_ABIO32", "1");
7582 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007583 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007584 Builder.defineMacro("__mips_n32");
7585 Builder.defineMacro("_ABIN32", "2");
7586 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7587 } else if (ABI == "n64") {
7588 Builder.defineMacro("__mips_n64");
7589 Builder.defineMacro("_ABI64", "3");
7590 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7591 } else
7592 llvm_unreachable("Invalid ABI.");
7593
Simon Atanasyan683535b2012-08-29 19:14:58 +00007594 Builder.defineMacro("__REGISTER_PREFIX__", "");
7595
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007596 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007597 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007598 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007599 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007600 case SoftFloat:
7601 Builder.defineMacro("__mips_soft_float", Twine(1));
7602 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007603 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007604
Simon Atanasyan16071912013-04-14 14:07:30 +00007605 if (IsSingleFloat)
7606 Builder.defineMacro("__mips_single_float", Twine(1));
7607
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007608 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7609 Builder.defineMacro("_MIPS_FPSET",
7610 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7611
Simon Atanasyan72244b62012-07-05 16:06:06 +00007612 if (IsMips16)
7613 Builder.defineMacro("__mips16", Twine(1));
7614
Simon Atanasyan60777612013-04-14 14:07:51 +00007615 if (IsMicromips)
7616 Builder.defineMacro("__mips_micromips", Twine(1));
7617
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007618 if (IsNan2008)
7619 Builder.defineMacro("__mips_nan2008", Twine(1));
7620
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007621 switch (DspRev) {
7622 default:
7623 break;
7624 case DSP1:
7625 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7626 Builder.defineMacro("__mips_dsp", Twine(1));
7627 break;
7628 case DSP2:
7629 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7630 Builder.defineMacro("__mips_dspr2", Twine(1));
7631 Builder.defineMacro("__mips_dsp", Twine(1));
7632 break;
7633 }
7634
Jack Carter44ff1e52013-08-12 17:20:29 +00007635 if (HasMSA)
7636 Builder.defineMacro("__mips_msa", Twine(1));
7637
Simon Atanasyan26f19672012-04-05 19:28:31 +00007638 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7639 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7640 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007641
7642 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7643 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007644
7645 // These shouldn't be defined for MIPS-I but there's no need to check
7646 // for that since MIPS-I isn't supported.
7647 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7648 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7649 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007650
7651 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7652 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7653 // the instructions exist but using them violates the ABI since they
7654 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7655 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007656 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007657 }
7658
Craig Topper6c03a542015-10-19 04:51:35 +00007659 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7660 return llvm::makeArrayRef(BuiltinInfo,
7661 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007662 }
Craig Topper3164f332014-03-11 03:39:26 +00007663 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007664 return llvm::StringSwitch<bool>(Feature)
7665 .Case("mips", true)
7666 .Case("fp64", HasFP64)
7667 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007668 }
Craig Topper3164f332014-03-11 03:39:26 +00007669 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007670 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007671 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007672 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007673 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007674 // CPU register names
7675 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007676 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7677 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7678 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007679 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7680 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007681 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7682 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7683 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7684 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007685 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007686 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007687 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7688 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007689 // MSA register names
7690 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7691 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7692 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7693 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7694 // MSA control register names
7695 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7696 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007697 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007698 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007699 }
Craig Topper3164f332014-03-11 03:39:26 +00007700 bool validateAsmConstraint(const char *&Name,
7701 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007702 switch (*Name) {
7703 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007704 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007705 case 'r': // CPU registers.
7706 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007707 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007708 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007709 case 'c': // $25 for indirect jumps
7710 case 'l': // lo register
7711 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007712 Info.setAllowsRegister();
7713 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007714 case 'I': // Signed 16-bit constant
7715 case 'J': // Integer 0
7716 case 'K': // Unsigned 16-bit constant
7717 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7718 case 'M': // Constants not loadable via lui, addiu, or ori
7719 case 'N': // Constant -1 to -65535
7720 case 'O': // A signed 15-bit constant
7721 case 'P': // A constant between 1 go 65535
7722 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007723 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007724 Info.setAllowsMemory();
7725 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007726 case 'Z':
7727 if (Name[1] == 'C') { // An address usable by ll, and sc.
7728 Info.setAllowsMemory();
7729 Name++; // Skip over 'Z'.
7730 return true;
7731 }
7732 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007733 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007734 }
7735
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007736 std::string convertConstraint(const char *&Constraint) const override {
7737 std::string R;
7738 switch (*Constraint) {
7739 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7740 if (Constraint[1] == 'C') {
7741 R = std::string("^") + std::string(Constraint, 2);
7742 Constraint++;
7743 return R;
7744 }
7745 break;
7746 }
7747 return TargetInfo::convertConstraint(Constraint);
7748 }
7749
Craig Topper3164f332014-03-11 03:39:26 +00007750 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007751 // In GCC, $1 is not widely used in generated code (it's used only in a few
7752 // specific situations), so there is no real need for users to add it to
7753 // the clobbers list if they want to use it in their inline assembly code.
7754 //
7755 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7756 // code generation, so using it in inline assembly without adding it to the
7757 // clobbers list can cause conflicts between the inline assembly code and
7758 // the surrounding generated code.
7759 //
7760 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7761 // operands, which will conflict with the ".set at" assembler option (which
7762 // we use only for inline assembly, in order to maintain compatibility with
7763 // GCC) and will also conflict with the user's usage of $1.
7764 //
7765 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7766 // register for generated code is to automatically clobber $1 for all inline
7767 // assembly code.
7768 //
7769 // FIXME: We should automatically clobber $1 only for inline assembly code
7770 // which actually uses it. This would allow LLVM to use $1 for inline
7771 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007772 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007773 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007774
Craig Topper3164f332014-03-11 03:39:26 +00007775 bool handleTargetFeatures(std::vector<std::string> &Features,
7776 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007777 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007778 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007779 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007780 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007781 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007782 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007783 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007784
Eric Christopher610fe112015-08-26 08:21:55 +00007785 for (const auto &Feature : Features) {
7786 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007787 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007788 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007789 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007790 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007791 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007792 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007793 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007794 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007795 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007796 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007797 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007798 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007799 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007800 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007801 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007802 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007803 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007804 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007805 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007806 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007807 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007808 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007809
James Y Knightb214cbc2016-03-04 19:00:41 +00007810 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007811
Rafael Espindolaeb265472013-08-21 21:59:03 +00007812 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007813 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007814
Craig Topper3164f332014-03-11 03:39:26 +00007815 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007816 if (RegNo == 0) return 4;
7817 if (RegNo == 1) return 5;
7818 return -1;
7819 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007820
7821 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007822
7823 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7824 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7825 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7826 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7827 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7828 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7829 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7830 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7831 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7832 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7833 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7834 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7835 {{"ra"}, "$31"}};
7836 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7837 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7838 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7839 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7840 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7841 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7842 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7843 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7844 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7845 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7846 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7847 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007848 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007849 return llvm::makeArrayRef(O32RegAliases);
7850 return llvm::makeArrayRef(NewABIRegAliases);
7851 }
7852
7853 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007854 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007855 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007856
7857 bool validateTarget(DiagnosticsEngine &Diags) const override {
7858 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7859 // this yet. It's better to fail here than on the backend assertion.
7860 if (processorSupportsGPR64() && ABI == "o32") {
7861 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7862 return false;
7863 }
7864
7865 // 64-bit ABI's require 64-bit CPU's.
7866 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7867 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7868 return false;
7869 }
7870
7871 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7872 // can't handle this yet. It's better to fail here than on the
7873 // backend assertion.
7874 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7875 getTriple().getArch() == llvm::Triple::mips64el) &&
7876 ABI == "o32") {
7877 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7878 << ABI << getTriple().str();
7879 return false;
7880 }
7881
7882 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7883 // can't handle this yet. It's better to fail here than on the
7884 // backend assertion.
7885 if ((getTriple().getArch() == llvm::Triple::mips ||
7886 getTriple().getArch() == llvm::Triple::mipsel) &&
7887 (ABI == "n32" || ABI == "n64")) {
7888 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7889 << ABI << getTriple().str();
7890 return false;
7891 }
7892
7893 return true;
7894 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007895};
7896
Daniel Sanders4672af62016-05-27 11:51:02 +00007897const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007898#define BUILTIN(ID, TYPE, ATTRS) \
7899 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7900#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7901 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007902#include "clang/Basic/BuiltinsMips.def"
7903};
7904
Ivan Krasindd7403e2011-08-24 20:22:22 +00007905class PNaClTargetInfo : public TargetInfo {
7906public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007907 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7908 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007909 this->LongAlign = 32;
7910 this->LongWidth = 32;
7911 this->PointerAlign = 32;
7912 this->PointerWidth = 32;
7913 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007914 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007915 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007916 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007917 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007918 this->SizeType = TargetInfo::UnsignedInt;
7919 this->PtrDiffType = TargetInfo::SignedInt;
7920 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007921 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007922 }
7923
Craig Toppere6f17d02014-03-11 04:07:52 +00007924 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007925 Builder.defineMacro("__le32__");
7926 Builder.defineMacro("__pnacl__");
7927 }
Craig Topper3164f332014-03-11 03:39:26 +00007928 void getTargetDefines(const LangOptions &Opts,
7929 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007930 getArchDefines(Opts, Builder);
7931 }
Craig Topper3164f332014-03-11 03:39:26 +00007932 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007933 return Feature == "pnacl";
7934 }
Craig Topper6c03a542015-10-19 04:51:35 +00007935 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007936 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007937 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007938 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007939 ArrayRef<const char *> getGCCRegNames() const override;
7940 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007941 bool validateAsmConstraint(const char *&Name,
7942 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007943 return false;
7944 }
7945
Craig Topper3164f332014-03-11 03:39:26 +00007946 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007947 return "";
7948 }
7949};
7950
Craig Topperf054e3a2015-10-19 03:52:27 +00007951ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7952 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007953}
7954
Craig Topperf054e3a2015-10-19 03:52:27 +00007955ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7956 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007957}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007958
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007959// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007960class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007961public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007962 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7963 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007964
7965 BuiltinVaListKind getBuiltinVaListKind() const override {
7966 return TargetInfo::PNaClABIBuiltinVaList;
7967 }
7968};
7969
JF Bastien643817d2014-09-12 17:52:47 +00007970class Le64TargetInfo : public TargetInfo {
7971 static const Builtin::Info BuiltinInfo[];
7972
7973public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007974 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7975 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007976 NoAsmVariants = true;
7977 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7978 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007979 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007980 }
7981
7982 void getTargetDefines(const LangOptions &Opts,
7983 MacroBuilder &Builder) const override {
7984 DefineStd(Builder, "unix", Opts);
7985 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7986 Builder.defineMacro("__ELF__");
7987 }
Craig Topper6c03a542015-10-19 04:51:35 +00007988 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7989 return llvm::makeArrayRef(BuiltinInfo,
7990 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007991 }
7992 BuiltinVaListKind getBuiltinVaListKind() const override {
7993 return TargetInfo::PNaClABIBuiltinVaList;
7994 }
7995 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007996 ArrayRef<const char *> getGCCRegNames() const override {
7997 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007998 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007999 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8000 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008001 }
8002 bool validateAsmConstraint(const char *&Name,
8003 TargetInfo::ConstraintInfo &Info) const override {
8004 return false;
8005 }
8006
8007 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008008};
Dan Gohmanc2853072015-09-03 22:51:53 +00008009
8010class WebAssemblyTargetInfo : public TargetInfo {
8011 static const Builtin::Info BuiltinInfo[];
8012
8013 enum SIMDEnum {
8014 NoSIMD,
8015 SIMD128,
8016 } SIMDLevel;
8017
8018public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008019 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008020 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008021 NoAsmVariants = true;
8022 SuitableAlign = 128;
8023 LargeArrayMinWidth = 128;
8024 LargeArrayAlign = 128;
8025 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008026 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008027 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008028 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008029 SizeType = UnsignedInt;
8030 PtrDiffType = SignedInt;
8031 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008032 }
8033
8034protected:
8035 void getTargetDefines(const LangOptions &Opts,
8036 MacroBuilder &Builder) const override {
8037 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8038 if (SIMDLevel >= SIMD128)
8039 Builder.defineMacro("__wasm_simd128__");
8040 }
8041
8042private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008043 bool
8044 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8045 StringRef CPU,
8046 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008047 if (CPU == "bleeding-edge")
8048 Features["simd128"] = true;
8049 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8050 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008051 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008052 return llvm::StringSwitch<bool>(Feature)
8053 .Case("simd128", SIMDLevel >= SIMD128)
8054 .Default(false);
8055 }
8056 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008057 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008058 for (const auto &Feature : Features) {
8059 if (Feature == "+simd128") {
8060 SIMDLevel = std::max(SIMDLevel, SIMD128);
8061 continue;
8062 }
8063 if (Feature == "-simd128") {
8064 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8065 continue;
8066 }
8067
8068 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8069 << "-target-feature";
8070 return false;
8071 }
8072 return true;
8073 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008074 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008075 return llvm::StringSwitch<bool>(Name)
8076 .Case("mvp", true)
8077 .Case("bleeding-edge", true)
8078 .Case("generic", true)
8079 .Default(false);
8080 }
Craig Topper6c03a542015-10-19 04:51:35 +00008081 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8082 return llvm::makeArrayRef(BuiltinInfo,
8083 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008084 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008085 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008086 return VoidPtrBuiltinVaList;
8087 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008088 ArrayRef<const char *> getGCCRegNames() const final {
8089 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008090 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008091 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8092 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008093 }
8094 bool
8095 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008096 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008097 return false;
8098 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008099 const char *getClobbers() const final { return ""; }
8100 bool isCLZForZeroUndef() const final { return false; }
8101 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008102 IntType getIntTypeByWidth(unsigned BitWidth,
8103 bool IsSigned) const final {
8104 // WebAssembly prefers long long for explicitly 64-bit integers.
8105 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8106 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8107 }
8108 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8109 bool IsSigned) const final {
8110 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8111 return BitWidth == 64
8112 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8113 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8114 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008115};
8116
8117const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8118#define BUILTIN(ID, TYPE, ATTRS) \
8119 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8120#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8121 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8122#include "clang/Basic/BuiltinsWebAssembly.def"
8123};
8124
8125class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8126public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008127 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8128 const TargetOptions &Opts)
8129 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008130 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008131 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008132 }
8133
8134protected:
8135 void getTargetDefines(const LangOptions &Opts,
8136 MacroBuilder &Builder) const override {
8137 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8138 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8139 }
8140};
8141
8142class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8143public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008144 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8145 const TargetOptions &Opts)
8146 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008147 LongAlign = LongWidth = 64;
8148 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008149 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008150 SizeType = UnsignedLong;
8151 PtrDiffType = SignedLong;
8152 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008153 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008154 }
8155
8156protected:
8157 void getTargetDefines(const LangOptions &Opts,
8158 MacroBuilder &Builder) const override {
8159 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8160 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8161 }
8162};
8163
JF Bastien643817d2014-09-12 17:52:47 +00008164const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8165#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008166 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008167#include "clang/Basic/BuiltinsLe64.def"
8168};
8169
Eric Christopherc48497a2015-09-18 21:26:24 +00008170static const unsigned SPIRAddrSpaceMap[] = {
8171 1, // opencl_global
8172 3, // opencl_local
8173 2, // opencl_constant
8174 4, // opencl_generic
8175 0, // cuda_device
8176 0, // cuda_constant
8177 0 // cuda_shared
8178};
8179class SPIRTargetInfo : public TargetInfo {
8180public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008181 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8182 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008183 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8184 "SPIR target must use unknown OS");
8185 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8186 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008187 TLSSupported = false;
8188 LongWidth = LongAlign = 64;
8189 AddrSpaceMap = &SPIRAddrSpaceMap;
8190 UseAddrSpaceMapMangling = true;
8191 // Define available target features
8192 // These must be defined in sorted order!
8193 NoAsmVariants = true;
8194 }
8195 void getTargetDefines(const LangOptions &Opts,
8196 MacroBuilder &Builder) const override {
8197 DefineStd(Builder, "SPIR", Opts);
8198 }
8199 bool hasFeature(StringRef Feature) const override {
8200 return Feature == "spir";
8201 }
Craig Topper3164f332014-03-11 03:39:26 +00008202
Craig Topper6c03a542015-10-19 04:51:35 +00008203 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008204 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008205 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008206 bool validateAsmConstraint(const char *&Name,
8207 TargetInfo::ConstraintInfo &info) const override {
8208 return true;
8209 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008210 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8211 return None;
8212 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008213 BuiltinVaListKind getBuiltinVaListKind() const override {
8214 return TargetInfo::VoidPtrBuiltinVaList;
8215 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008216
Eric Christopherc48497a2015-09-18 21:26:24 +00008217 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008218 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8219 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008220 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008221
Eric Christopherc48497a2015-09-18 21:26:24 +00008222 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8223 return CC_SpirFunction;
8224 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008225
8226 void setSupportedOpenCLOpts() override {
8227 // Assume all OpenCL extensions and optional core features are supported
8228 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008229 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008230 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008231};
Guy Benyeib798fc92012-12-11 21:38:14 +00008232
Eric Christopherc48497a2015-09-18 21:26:24 +00008233class SPIR32TargetInfo : public SPIRTargetInfo {
8234public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8236 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008237 PointerWidth = PointerAlign = 32;
8238 SizeType = TargetInfo::UnsignedInt;
8239 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008240 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8241 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008242 }
8243 void getTargetDefines(const LangOptions &Opts,
8244 MacroBuilder &Builder) const override {
8245 DefineStd(Builder, "SPIR32", Opts);
8246 }
8247};
Guy Benyeib798fc92012-12-11 21:38:14 +00008248
Eric Christopherc48497a2015-09-18 21:26:24 +00008249class SPIR64TargetInfo : public SPIRTargetInfo {
8250public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8252 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008253 PointerWidth = PointerAlign = 64;
8254 SizeType = TargetInfo::UnsignedLong;
8255 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008256 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8257 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008258 }
8259 void getTargetDefines(const LangOptions &Opts,
8260 MacroBuilder &Builder) const override {
8261 DefineStd(Builder, "SPIR64", Opts);
8262 }
8263};
Guy Benyeib798fc92012-12-11 21:38:14 +00008264
Robert Lytton0e076492013-08-13 09:43:10 +00008265class XCoreTargetInfo : public TargetInfo {
8266 static const Builtin::Info BuiltinInfo[];
8267public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008268 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8269 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008270 NoAsmVariants = true;
8271 LongLongAlign = 32;
8272 SuitableAlign = 32;
8273 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008274 SizeType = UnsignedInt;
8275 PtrDiffType = SignedInt;
8276 IntPtrType = SignedInt;
8277 WCharType = UnsignedChar;
8278 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008279 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008280 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8281 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008282 }
Craig Topper3164f332014-03-11 03:39:26 +00008283 void getTargetDefines(const LangOptions &Opts,
8284 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008285 Builder.defineMacro("__XS1B__");
8286 }
Craig Topper6c03a542015-10-19 04:51:35 +00008287 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8288 return llvm::makeArrayRef(BuiltinInfo,
8289 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008290 }
Craig Topper3164f332014-03-11 03:39:26 +00008291 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008292 return TargetInfo::VoidPtrBuiltinVaList;
8293 }
Craig Topper3164f332014-03-11 03:39:26 +00008294 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008295 return "";
8296 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008297 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008298 static const char * const GCCRegNames[] = {
8299 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8300 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8301 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008302 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008303 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008304 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8305 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008306 }
Craig Topper3164f332014-03-11 03:39:26 +00008307 bool validateAsmConstraint(const char *&Name,
8308 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008309 return false;
8310 }
Craig Topper3164f332014-03-11 03:39:26 +00008311 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008312 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8313 return (RegNo < 2)? RegNo : -1;
8314 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008315 bool allowsLargerPreferedTypeAlignment() const override {
8316 return false;
8317 }
Robert Lytton0e076492013-08-13 09:43:10 +00008318};
8319
8320const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008321#define BUILTIN(ID, TYPE, ATTRS) \
8322 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8323#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8324 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008325#include "clang/Basic/BuiltinsXCore.def"
8326};
Robert Lytton0e076492013-08-13 09:43:10 +00008327
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008328// x86_32 Android target
8329class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8330public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8332 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008333 SuitableAlign = 32;
8334 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008335 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008336 }
8337};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008338
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008339// x86_64 Android target
8340class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8341public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008342 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8343 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008344 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008345 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008346
8347 bool useFloat128ManglingForLongDouble() const override {
8348 return true;
8349 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008350};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008351
8352// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8353class RenderScript32TargetInfo : public ARMleTargetInfo {
8354public:
8355 RenderScript32TargetInfo(const llvm::Triple &Triple,
8356 const TargetOptions &Opts)
8357 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8358 Triple.getOSName(),
8359 Triple.getEnvironmentName()),
8360 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008361 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008362 LongWidth = LongAlign = 64;
8363 }
8364 void getTargetDefines(const LangOptions &Opts,
8365 MacroBuilder &Builder) const override {
8366 Builder.defineMacro("__RENDERSCRIPT__");
8367 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8368 }
8369};
8370
8371// 64-bit RenderScript is aarch64
8372class RenderScript64TargetInfo : public AArch64leTargetInfo {
8373public:
8374 RenderScript64TargetInfo(const llvm::Triple &Triple,
8375 const TargetOptions &Opts)
8376 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8377 Triple.getOSName(),
8378 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008379 Opts) {
8380 IsRenderScriptTarget = true;
8381 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008382
8383 void getTargetDefines(const LangOptions &Opts,
8384 MacroBuilder &Builder) const override {
8385 Builder.defineMacro("__RENDERSCRIPT__");
8386 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8387 }
8388};
8389
Dylan McKay924fa3a2017-01-05 05:20:27 +00008390
8391// AVR Target
8392class AVRTargetInfo : public TargetInfo {
8393public:
8394 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8395 : TargetInfo(Triple) {
8396 TLSSupported = false;
8397 PointerWidth = 16;
8398 PointerAlign = 8;
8399 IntWidth = 16;
8400 IntAlign = 8;
8401 LongWidth = 32;
8402 LongAlign = 8;
8403 LongLongWidth = 64;
8404 LongLongAlign = 8;
8405 SuitableAlign = 8;
8406 DefaultAlignForAttributeAligned = 8;
8407 HalfWidth = 16;
8408 HalfAlign = 8;
8409 FloatWidth = 32;
8410 FloatAlign = 8;
8411 DoubleWidth = 32;
8412 DoubleAlign = 8;
8413 DoubleFormat = &llvm::APFloat::IEEEsingle();
8414 LongDoubleWidth = 32;
8415 LongDoubleAlign = 8;
8416 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8417 SizeType = UnsignedInt;
8418 PtrDiffType = SignedInt;
8419 IntPtrType = SignedInt;
8420 Char16Type = UnsignedInt;
8421 WCharType = SignedInt;
8422 WIntType = SignedInt;
8423 Char32Type = UnsignedLong;
8424 SigAtomicType = SignedChar;
8425 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8426 "-f32:32:32-f64:64:64-n8");
8427 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008428
Dylan McKay924fa3a2017-01-05 05:20:27 +00008429 void getTargetDefines(const LangOptions &Opts,
8430 MacroBuilder &Builder) const override {
8431 Builder.defineMacro("__AVR__");
8432 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008433
Dylan McKay924fa3a2017-01-05 05:20:27 +00008434 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8435 return None;
8436 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008437
Dylan McKay924fa3a2017-01-05 05:20:27 +00008438 BuiltinVaListKind getBuiltinVaListKind() const override {
8439 return TargetInfo::VoidPtrBuiltinVaList;
8440 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008441
Dylan McKay924fa3a2017-01-05 05:20:27 +00008442 const char *getClobbers() const override {
8443 return "";
8444 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008445
Dylan McKay924fa3a2017-01-05 05:20:27 +00008446 ArrayRef<const char *> getGCCRegNames() const override {
8447 static const char * const GCCRegNames[] = {
8448 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8449 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8450 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008451 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008452 };
8453 return llvm::makeArrayRef(GCCRegNames);
8454 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008455
Dylan McKay924fa3a2017-01-05 05:20:27 +00008456 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8457 return None;
8458 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008459
Dylan McKay924fa3a2017-01-05 05:20:27 +00008460 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8461 static const TargetInfo::AddlRegName AddlRegNames[] = {
8462 { { "r26", "r27"}, 26 },
8463 { { "r28", "r29"}, 27 },
8464 { { "r30", "r31"}, 28 },
8465 { { "SPL", "SPH"}, 29 },
8466 };
8467 return llvm::makeArrayRef(AddlRegNames);
8468 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008469
Dylan McKay924fa3a2017-01-05 05:20:27 +00008470 bool validateAsmConstraint(const char *&Name,
8471 TargetInfo::ConstraintInfo &Info) const override {
8472 return false;
8473 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008474
Dylan McKay924fa3a2017-01-05 05:20:27 +00008475 IntType getIntTypeByWidth(unsigned BitWidth,
8476 bool IsSigned) const final {
8477 // AVR prefers int for 16-bit integers.
8478 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8479 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8480 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008481
Dylan McKay924fa3a2017-01-05 05:20:27 +00008482 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8483 bool IsSigned) const final {
8484 // AVR uses int for int_least16_t and int_fast16_t.
8485 return BitWidth == 16
8486 ? (IsSigned ? SignedInt : UnsignedInt)
8487 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8488 }
8489};
8490
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008491} // end anonymous namespace
8492
Chris Lattner5ba61f02006-10-14 07:39:34 +00008493//===----------------------------------------------------------------------===//
8494// Driver code
8495//===----------------------------------------------------------------------===//
8496
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8498 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008499 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008500
Daniel Dunbar52322032009-08-18 05:47:58 +00008501 switch (Triple.getArch()) {
8502 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008503 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008504
Tim Northover2a0783d2014-05-30 14:14:07 +00008505 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008506 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008507
8508 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008510
Jacques Pienaard964cc22016-03-28 21:02:54 +00008511 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008512 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008513
Tim Northover2a0783d2014-05-30 14:14:07 +00008514 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008515 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008516 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008517
8518 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008519 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008520 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008521 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008522 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008523 case llvm::Triple::Fuchsia:
8524 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008525 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008526 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008527 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008528 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008529 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008530 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008531 }
8532
Christian Pirker9b019ae2014-02-25 13:51:00 +00008533 case llvm::Triple::aarch64_be:
8534 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008535 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008536 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008537 case llvm::Triple::Fuchsia:
8538 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008539 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008540 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008541 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008542 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008543 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008544 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008545 }
8546
Daniel Dunbar52322032009-08-18 05:47:58 +00008547 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008548 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008549 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008550 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008551
Daniel Dunbar52322032009-08-18 05:47:58 +00008552 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008553 case llvm::Triple::CloudABI:
8554 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008555 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008557 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008558 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008559 case llvm::Triple::Fuchsia:
8560 return new FuchsiaTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008561 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008562 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008563 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008564 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008565 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008567 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008568 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008569 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008571 case llvm::Triple::Win32:
8572 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008573 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008575 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008577 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008579 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008580 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008581 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008582 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008583 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008585 }
8586
8587 case llvm::Triple::armeb:
8588 case llvm::Triple::thumbeb:
8589 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008590 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008591
8592 switch (os) {
8593 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008594 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008595 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008596 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008597 case llvm::Triple::Fuchsia:
8598 return new FuchsiaTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008599 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008600 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008601 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008602 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008603 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008604 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008605 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008606 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008607 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008609 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008611 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008612
Dylan McKay924fa3a2017-01-05 05:20:27 +00008613 case llvm::Triple::avr:
8614 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008615 case llvm::Triple::bpfeb:
8616 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008617 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008618
Daniel Dunbar52322032009-08-18 05:47:58 +00008619 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008620 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008621
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008622 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008623 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008624 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008625 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008626 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008627 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008628 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008629 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008630 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008631 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008632 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008633 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008634 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008635
8636 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008637 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008638 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008639 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008640 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008641 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008642 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008643 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008644 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008645 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008646 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008647 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008648 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008649 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008650 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008651
Akira Hatanakabef17452011-09-20 19:21:49 +00008652 case llvm::Triple::mips64:
8653 switch (os) {
8654 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008655 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008656 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008657 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008658 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008659 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008660 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008661 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008662 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008663 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008664 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008665 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008666 }
8667
8668 case llvm::Triple::mips64el:
8669 switch (os) {
8670 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008671 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008672 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008673 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008674 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008675 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008676 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008677 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008678 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008679 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008680 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008681 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008682 }
8683
Ivan Krasindd7403e2011-08-24 20:22:22 +00008684 case llvm::Triple::le32:
8685 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008686 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008687 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008688 default:
8689 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008690 }
8691
JF Bastien643817d2014-09-12 17:52:47 +00008692 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008693 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008694
Daniel Dunbar52322032009-08-18 05:47:58 +00008695 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008696 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008697 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008698 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008699 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008700 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008701 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008702 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008703 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008704 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008705 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008706 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008707 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008708 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008709 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008710 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008711 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008712
8713 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008714 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008715 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008716 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008717 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008718 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008719 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008720 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008721 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008722 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008723 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008724 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008725 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008726 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008727 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008728
Bill Schmidt778d3872013-07-26 01:36:11 +00008729 case llvm::Triple::ppc64le:
8730 switch (os) {
8731 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008732 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008733 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008734 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008735 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008736 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008737 }
8738
Peter Collingbournec947aae2012-05-20 23:28:41 +00008739 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00008740 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008741 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00008742 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008743
Tom Stellardd8e38a32015-01-06 20:34:47 +00008744 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008745 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008746 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008747
Daniel Dunbar52322032009-08-18 05:47:58 +00008748 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008749 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008750 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008751 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008752 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008753 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008754 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008755 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008756 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008757 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008758 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008759 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008760 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008761 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008762 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008763
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008764 // The 'sparcel' architecture copies all the above cases except for Solaris.
8765 case llvm::Triple::sparcel:
8766 switch (os) {
8767 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008768 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008769 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008770 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008771 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008772 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008773 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008774 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008775 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008776 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008777 }
8778
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008779 case llvm::Triple::sparcv9:
8780 switch (os) {
8781 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008782 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008783 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008784 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008785 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008786 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008787 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008788 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008789 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008790 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008791 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008792 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008793 }
8794
Ulrich Weigand47445072013-05-06 16:26:41 +00008795 case llvm::Triple::systemz:
8796 switch (os) {
8797 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008798 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008799 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008800 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008801 }
8802
Eli Friedmana9c3d712009-08-19 20:47:07 +00008803 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008804 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008805
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00008806 case llvm::Triple::tcele:
8807 return new TCELETargetInfo(Triple, Opts);
8808
Daniel Dunbar52322032009-08-18 05:47:58 +00008809 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008810 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008811 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008812
Daniel Dunbar52322032009-08-18 05:47:58 +00008813 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008814 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008815 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008816 case llvm::Triple::Linux: {
8817 switch (Triple.getEnvironment()) {
8818 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008819 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008820 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008821 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008822 }
8823 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008824 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008825 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008826 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008827 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008828 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008829 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008830 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008831 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008832 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008833 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008834 case llvm::Triple::Fuchsia:
8835 return new FuchsiaTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008836 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008837 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008838 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008839 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008840 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008841 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008842 case llvm::Triple::Win32: {
8843 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008844 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008845 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008846 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008847 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008848 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008849 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008850 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008851 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008852 }
8853 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008854 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008855 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008856 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008857 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008858 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008859 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008860 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008861 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008862 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008863 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008864 }
8865
8866 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008867 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008868 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008869
Daniel Dunbar52322032009-08-18 05:47:58 +00008870 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008871 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008872 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008873 case llvm::Triple::Linux: {
8874 switch (Triple.getEnvironment()) {
8875 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008876 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008877 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008878 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008879 }
8880 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008881 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008882 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008883 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008884 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008885 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008886 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008887 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008888 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008889 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008890 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008891 case llvm::Triple::Fuchsia:
8892 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008893 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008894 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008895 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008896 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008897 case llvm::Triple::Win32: {
8898 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008899 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008900 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008901 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008902 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008903 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008904 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008905 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008906 }
8907 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008908 case llvm::Triple::Haiku:
8909 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008910 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008911 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008912 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008913 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008914 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008915 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008916 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008917
Douglas Katzman78d7c542015-05-12 21:18:10 +00008918 case llvm::Triple::spir: {
8919 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8920 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8921 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008922 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008923 }
8924 case llvm::Triple::spir64: {
8925 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8926 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8927 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008928 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008929 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008930 case llvm::Triple::wasm32:
8931 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8932 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008933 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008934 case llvm::Triple::wasm64:
8935 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8936 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008937 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008938
8939 case llvm::Triple::renderscript32:
8940 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8941 case llvm::Triple::renderscript64:
8942 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008943 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008944}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008945
8946/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008947/// options.
Alp Toker80758082014-07-06 05:26:44 +00008948TargetInfo *
8949TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008950 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008951 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008952
8953 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008954 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008955 if (!Target) {
8956 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008957 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008958 }
Alp Toker80758082014-07-06 05:26:44 +00008959 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008960
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008961 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008962 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8963 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008964 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008965 }
8966
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008967 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008968 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8969 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008970 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008971 }
8972
Rafael Espindolaeb265472013-08-21 21:59:03 +00008973 // Set the fp math unit.
8974 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8975 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008976 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008977 }
8978
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008979 // Compute the default target features, we need the target to handle this
8980 // because features may have dependencies on one another.
8981 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008982 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8983 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008984 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008985
8986 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008987 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008988 for (const auto &F : Features)
8989 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8990
Eric Christopher3ff21b32013-10-16 21:26:26 +00008991 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008992 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008993
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008994 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00008995 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008996
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008997 if (!Target->validateTarget(Diags))
8998 return nullptr;
8999
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009000 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009001}