blob: 39ac8be445dfcd52869c9e13a31b0201c03e44fd [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000873 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000874
Ulrich Weigand8afad612014-07-28 13:17:52 +0000875protected:
876 std::string ABI;
877
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000879 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000880 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
881 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000882 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001161 } else if (Feature == "+power9-vector") {
1162 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001163 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001164 // TODO: Finish this list and add an assert that we've handled them
1165 // all.
1166 }
Eric Christopher02c33352015-08-25 00:59:11 +00001167
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001168 return true;
1169}
1170
Chris Lattnerecd49032009-03-02 22:27:17 +00001171/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1172/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001173void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001175 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001177 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001179 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001183 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001184 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001185 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001187
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1190 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001191 } else {
1192 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1193 getTriple().getOS() != llvm::Triple::OpenBSD)
1194 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001195 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001196
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001198 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001199 Builder.defineMacro("_CALL_ELF", "1");
1200 if (ABI == "elfv2")
1201 Builder.defineMacro("_CALL_ELF", "2");
1202
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1205 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001206
Chris Lattnerecd49032009-03-02 22:27:17 +00001207 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001208 if (LongDoubleWidth == 128)
1209 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001210
John Thompsone467e192009-11-19 17:18:50 +00001211 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001212 Builder.defineMacro("__VEC__", "10206");
1213 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001214 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001215
1216 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001217 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1218 .Case("440", ArchDefineName)
1219 .Case("450", ArchDefineName | ArchDefine440)
1220 .Case("601", ArchDefineName)
1221 .Case("602", ArchDefineName | ArchDefinePpcgr)
1222 .Case("603", ArchDefineName | ArchDefinePpcgr)
1223 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1224 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1225 .Case("604", ArchDefineName | ArchDefinePpcgr)
1226 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1227 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001229 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1230 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1231 .Case("750", ArchDefineName | ArchDefinePpcgr)
1232 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1233 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001234 .Case("a2", ArchDefineA2)
1235 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 .Case("pwr3", ArchDefinePpcgr)
1237 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1238 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1239 | ArchDefinePpcsq)
1240 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1243 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1244 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1245 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1246 | ArchDefinePpcsq)
1247 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1248 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001249 | ArchDefinePpcgr | ArchDefinePpcsq)
1250 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1251 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1252 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001253 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1254 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1255 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1256 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("power3", ArchDefinePpcgr)
1258 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1259 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1260 | ArchDefinePpcsq)
1261 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1262 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1264 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1265 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1266 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1267 | ArchDefinePpcsq)
1268 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1269 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001270 | ArchDefinePpcgr | ArchDefinePpcsq)
1271 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1272 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1273 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001274 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1275 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1276 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1277 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001278 .Default(ArchDefineNone);
1279
1280 if (defs & ArchDefineName)
1281 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1282 if (defs & ArchDefinePpcgr)
1283 Builder.defineMacro("_ARCH_PPCGR");
1284 if (defs & ArchDefinePpcsq)
1285 Builder.defineMacro("_ARCH_PPCSQ");
1286 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001287 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001288 if (defs & ArchDefine603)
1289 Builder.defineMacro("_ARCH_603");
1290 if (defs & ArchDefine604)
1291 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001295 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001296 if (defs & ArchDefinePwr5x)
1297 Builder.defineMacro("_ARCH_PWR5X");
1298 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001299 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001300 if (defs & ArchDefinePwr6x)
1301 Builder.defineMacro("_ARCH_PWR6X");
1302 if (defs & ArchDefinePwr7)
1303 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001304 if (defs & ArchDefinePwr8)
1305 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001306 if (defs & ArchDefinePwr9)
1307 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001308 if (defs & ArchDefineA2)
1309 Builder.defineMacro("_ARCH_A2");
1310 if (defs & ArchDefineA2q) {
1311 Builder.defineMacro("_ARCH_A2Q");
1312 Builder.defineMacro("_ARCH_QP");
1313 }
1314
1315 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1316 Builder.defineMacro("__bg__");
1317 Builder.defineMacro("__THW_BLUEGENE__");
1318 Builder.defineMacro("__bgq__");
1319 Builder.defineMacro("__TOS_BGQ__");
1320 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001321
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001322 if (HasVSX)
1323 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001324 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001325 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001326 if (HasP8Crypto)
1327 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001328 if (HasHTM)
1329 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001330 if (HasFloat128)
1331 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001332 if (HasP9Vector)
1333 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001334
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1338 if (PointerWidth == 64)
1339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001340
Bill Schmidt38378a02013-02-01 20:23:10 +00001341 // FIXME: The following are not yet generated here by Clang, but are
1342 // generated by GCC:
1343 //
1344 // _SOFT_FLOAT_
1345 // __RECIP_PRECISION__
1346 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 // __RECIP__
1348 // __RECIPF__
1349 // __RSQRTE__
1350 // __RSQRTEF__
1351 // _SOFT_DOUBLE_
1352 // __NO_LWSYNC__
1353 // __HAVE_BSWAP__
1354 // __LONGDOUBLE128
1355 // __CMODEL_MEDIUM__
1356 // __CMODEL_LARGE__
1357 // _CALL_SYSV
1358 // _CALL_DARWIN
1359 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001360}
1361
Eric Christophera8a14c32015-08-31 18:39:16 +00001362// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001363// explicitly turned off vsx and turned on any of:
1364// - power8-vector
1365// - direct-move
1366// - float128
1367// - power9-vector
1368// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001369// set of options.
1370static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001371 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1374 FeaturesVec.end()) {
1375 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1376 FeaturesVec.end()) {
1377 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1378 << "-mno-vsx";
1379 return false;
1380 }
1381
1382 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1383 FeaturesVec.end()) {
1384 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1385 << "-mno-vsx";
1386 return false;
1387 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001388
1389 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1390 FeaturesVec.end()) {
1391 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1392 << "-mno-vsx";
1393 return false;
1394 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001395
1396 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1397 FeaturesVec.end()) {
1398 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1399 << "-mno-vsx";
1400 return false;
1401 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001402 }
1403
1404 return true;
1405}
1406
Eric Christopher8c47b422015-10-09 18:39:55 +00001407bool PPCTargetInfo::initFeatureMap(
1408 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1409 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001410 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("7400", true)
1412 .Case("g4", true)
1413 .Case("7450", true)
1414 .Case("g4+", true)
1415 .Case("970", true)
1416 .Case("g5", true)
1417 .Case("pwr6", true)
1418 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001419 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001421 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001422 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001423 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001424
1425 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001426 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001427 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001430 .Case("pwr8", true)
1431 .Default(false);
1432 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001437 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
1443 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1444 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001445 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001446 .Case("pwr8", true)
1447 .Case("pwr7", true)
1448 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001449 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001452 .Case("pwr8", true)
1453 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001454 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001457 .Case("pwr8", true)
1458 .Case("pwr7", true)
1459 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001460
Eric Christophera8a14c32015-08-31 18:39:16 +00001461 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1462 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001463
Eric Christopher007b0a02015-08-28 22:32:01 +00001464 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001465}
1466
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001467bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001468 return llvm::StringSwitch<bool>(Feature)
1469 .Case("powerpc", true)
1470 .Case("vsx", HasVSX)
1471 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001472 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001474 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001475 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001476 .Case("bpermd", HasBPERMD)
1477 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001478 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001479 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001480 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001481}
Chris Lattner17df24e2008-04-21 18:56:49 +00001482
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001483void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1484 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1486 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1487 // incompatible options.
1488 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001489 if (Name == "direct-move" ||
1490 Name == "power8-vector" ||
1491 Name == "float128" ||
1492 Name == "power9-vector") {
1493 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001494 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001495 if (Name == "power9-vector")
1496 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001497 } else {
1498 Features[Name] = true;
1499 }
1500 } else {
1501 if (Name == "vsx") {
1502 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001504 } else {
1505 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001506 }
1507 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001508}
1509
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001510const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001511 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1512 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1513 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1514 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1515 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1516 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1517 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1518 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001519 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001520 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001521 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001522 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1523 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1524 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1525 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001526 "vrsave", "vscr",
1527 "spe_acc", "spefscr",
1528 "sfp"
1529};
Chris Lattner10a5b382007-01-29 05:24:35 +00001530
Craig Topperf054e3a2015-10-19 03:52:27 +00001531ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1532 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001533}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001534
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1536 // While some of these aliases do map to different registers
1537 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001538 { { "0" }, "r0" },
1539 { { "1"}, "r1" },
1540 { { "2" }, "r2" },
1541 { { "3" }, "r3" },
1542 { { "4" }, "r4" },
1543 { { "5" }, "r5" },
1544 { { "6" }, "r6" },
1545 { { "7" }, "r7" },
1546 { { "8" }, "r8" },
1547 { { "9" }, "r9" },
1548 { { "10" }, "r10" },
1549 { { "11" }, "r11" },
1550 { { "12" }, "r12" },
1551 { { "13" }, "r13" },
1552 { { "14" }, "r14" },
1553 { { "15" }, "r15" },
1554 { { "16" }, "r16" },
1555 { { "17" }, "r17" },
1556 { { "18" }, "r18" },
1557 { { "19" }, "r19" },
1558 { { "20" }, "r20" },
1559 { { "21" }, "r21" },
1560 { { "22" }, "r22" },
1561 { { "23" }, "r23" },
1562 { { "24" }, "r24" },
1563 { { "25" }, "r25" },
1564 { { "26" }, "r26" },
1565 { { "27" }, "r27" },
1566 { { "28" }, "r28" },
1567 { { "29" }, "r29" },
1568 { { "30" }, "r30" },
1569 { { "31" }, "r31" },
1570 { { "fr0" }, "f0" },
1571 { { "fr1" }, "f1" },
1572 { { "fr2" }, "f2" },
1573 { { "fr3" }, "f3" },
1574 { { "fr4" }, "f4" },
1575 { { "fr5" }, "f5" },
1576 { { "fr6" }, "f6" },
1577 { { "fr7" }, "f7" },
1578 { { "fr8" }, "f8" },
1579 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001580 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001581 { { "fr11" }, "f11" },
1582 { { "fr12" }, "f12" },
1583 { { "fr13" }, "f13" },
1584 { { "fr14" }, "f14" },
1585 { { "fr15" }, "f15" },
1586 { { "fr16" }, "f16" },
1587 { { "fr17" }, "f17" },
1588 { { "fr18" }, "f18" },
1589 { { "fr19" }, "f19" },
1590 { { "fr20" }, "f20" },
1591 { { "fr21" }, "f21" },
1592 { { "fr22" }, "f22" },
1593 { { "fr23" }, "f23" },
1594 { { "fr24" }, "f24" },
1595 { { "fr25" }, "f25" },
1596 { { "fr26" }, "f26" },
1597 { { "fr27" }, "f27" },
1598 { { "fr28" }, "f28" },
1599 { { "fr29" }, "f29" },
1600 { { "fr30" }, "f30" },
1601 { { "fr31" }, "f31" },
1602 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001603};
1604
Craig Topperf054e3a2015-10-19 03:52:27 +00001605ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1606 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001607}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001608
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001609class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001610public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001611 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1612 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001613 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001614
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001615 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001616 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001617 case llvm::Triple::FreeBSD:
1618 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001619 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001620 PtrDiffType = SignedInt;
1621 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001622 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001623 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001624 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001625 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001626
Roman Divacky3ffe7462012-03-13 19:20:17 +00001627 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1628 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001629 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001630 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001631
1632 // PPC32 supports atomics up to 4 bytes.
1633 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001634 }
1635
Craig Topper3164f332014-03-11 03:39:26 +00001636 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001637 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001639 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001640};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001641
Bill Schmidt778d3872013-07-26 01:36:11 +00001642// Note: ABI differences may eventually require us to have a separate
1643// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001644class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001646 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1647 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001648 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001649 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001650 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001652 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001653 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001654 ABI = "elfv2";
1655 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001656 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001657 ABI = "elfv1";
1658 }
1659
1660 switch (getTriple().getOS()) {
1661 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001662 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001663 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001664 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001665 case llvm::Triple::NetBSD:
1666 IntMaxType = SignedLongLong;
1667 Int64Type = SignedLongLong;
1668 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001669 default:
1670 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001671 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001672
1673 // PPC64 supports atomics up to 8 bytes.
1674 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001675 }
Craig Topper3164f332014-03-11 03:39:26 +00001676 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001677 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001678 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001679 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001680 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001681 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001682 ABI = Name;
1683 return true;
1684 }
1685 return false;
1686 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001687};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001688
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001689class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001691 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1692 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001694 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001695 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001696 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001697 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001698 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001702 }
1703};
1704
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001705class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001707 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1708 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001709 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001710 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001711 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712 }
1713};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714
Eric Christopherc48497a2015-09-18 21:26:24 +00001715static const unsigned NVPTXAddrSpaceMap[] = {
1716 1, // opencl_global
1717 3, // opencl_local
1718 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001719 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001720 0, // opencl_generic
1721 1, // cuda_device
1722 4, // cuda_constant
1723 3, // cuda_shared
1724};
1725
1726class NVPTXTargetInfo : public TargetInfo {
1727 static const char *const GCCRegNames[];
1728 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001729 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001730
Eric Christopherc48497a2015-09-18 21:26:24 +00001731public:
Justin Lebar76945b22016-04-29 23:05:19 +00001732 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001733 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001734 TLSSupported = false;
1735 LongWidth = LongAlign = 64;
1736 AddrSpaceMap = &NVPTXAddrSpaceMap;
1737 UseAddrSpaceMapMangling = true;
1738 // Define available target features
1739 // These must be defined in sorted order!
1740 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001741 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001742
1743 // If possible, get a TargetInfo for our host triple, so we can match its
1744 // types.
1745 llvm::Triple HostTriple(Opts.HostTriple);
1746 if (HostTriple.isNVPTX())
1747 return;
1748 std::unique_ptr<TargetInfo> HostTarget(
1749 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1750 if (!HostTarget) {
1751 return;
1752 }
1753
1754 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1755 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1756 BoolWidth = HostTarget->getBoolWidth();
1757 BoolAlign = HostTarget->getBoolAlign();
1758 IntWidth = HostTarget->getIntWidth();
1759 IntAlign = HostTarget->getIntAlign();
1760 HalfWidth = HostTarget->getHalfWidth();
1761 HalfAlign = HostTarget->getHalfAlign();
1762 FloatWidth = HostTarget->getFloatWidth();
1763 FloatAlign = HostTarget->getFloatAlign();
1764 DoubleWidth = HostTarget->getDoubleWidth();
1765 DoubleAlign = HostTarget->getDoubleAlign();
1766 LongWidth = HostTarget->getLongWidth();
1767 LongAlign = HostTarget->getLongAlign();
1768 LongLongWidth = HostTarget->getLongLongWidth();
1769 LongLongAlign = HostTarget->getLongLongAlign();
1770 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001771 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001772 DefaultAlignForAttributeAligned =
1773 HostTarget->getDefaultAlignForAttributeAligned();
1774 SizeType = HostTarget->getSizeType();
1775 IntMaxType = HostTarget->getIntMaxType();
1776 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1777 IntPtrType = HostTarget->getIntPtrType();
1778 WCharType = HostTarget->getWCharType();
1779 WIntType = HostTarget->getWIntType();
1780 Char16Type = HostTarget->getChar16Type();
1781 Char32Type = HostTarget->getChar32Type();
1782 Int64Type = HostTarget->getInt64Type();
1783 SigAtomicType = HostTarget->getSigAtomicType();
1784 ProcessIDType = HostTarget->getProcessIDType();
1785
1786 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1787 UseZeroLengthBitfieldAlignment =
1788 HostTarget->useZeroLengthBitfieldAlignment();
1789 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1790 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1791
Justin Lebar5057f172016-09-09 20:35:43 +00001792 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1793 // we need those macros to be identical on host and device, because (among
1794 // other things) they affect which standard library classes are defined, and
1795 // we need all classes to be defined on both the host and device.
1796 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1797
Justin Lebar76945b22016-04-29 23:05:19 +00001798 // Properties intentionally not copied from host:
1799 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1800 // host/device boundary.
1801 // - SuitableAlign: Not visible across the host/device boundary, and may
1802 // correctly be different on host/device, e.g. if host has wider vector
1803 // types than device.
1804 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1805 // as its double type, but that's not necessarily true on the host.
1806 // TODO: nvcc emits a warning when using long double on device; we should
1807 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001808 }
1809 void getTargetDefines(const LangOptions &Opts,
1810 MacroBuilder &Builder) const override {
1811 Builder.defineMacro("__PTX__");
1812 Builder.defineMacro("__NVPTX__");
1813 if (Opts.CUDAIsDevice) {
1814 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001815 std::string CUDAArchCode = [this] {
1816 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001817 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 assert(false && "No GPU arch when compiling CUDA device code.");
1819 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001820 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001821 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001822 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001823 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001824 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001825 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001826 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001827 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001828 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001829 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001830 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001831 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001832 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001833 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001834 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001835 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001836 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001837 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001838 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001839 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001840 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001841 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001842 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001843 return "620";
1844 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001845 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001846 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001847 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001848 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001849 }
Craig Topper6c03a542015-10-19 04:51:35 +00001850 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1851 return llvm::makeArrayRef(BuiltinInfo,
1852 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001853 }
Artem Belevichfda99052016-09-28 17:47:35 +00001854 bool
1855 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1856 StringRef CPU,
1857 const std::vector<std::string> &FeaturesVec) const override {
1858 Features["satom"] = GPU >= CudaArch::SM_60;
1859 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1860 }
1861
Eric Christopherc48497a2015-09-18 21:26:24 +00001862 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001863 return llvm::StringSwitch<bool>(Feature)
1864 .Cases("ptx", "nvptx", true)
1865 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1866 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001867 }
1868
Craig Topperf054e3a2015-10-19 03:52:27 +00001869 ArrayRef<const char *> getGCCRegNames() const override;
1870 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001871 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001872 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001873 }
1874 bool validateAsmConstraint(const char *&Name,
1875 TargetInfo::ConstraintInfo &Info) const override {
1876 switch (*Name) {
1877 default:
1878 return false;
1879 case 'c':
1880 case 'h':
1881 case 'r':
1882 case 'l':
1883 case 'f':
1884 case 'd':
1885 Info.setAllowsRegister();
1886 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001887 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001888 }
1889 const char *getClobbers() const override {
1890 // FIXME: Is this really right?
1891 return "";
1892 }
1893 BuiltinVaListKind getBuiltinVaListKind() const override {
1894 // FIXME: implement
1895 return TargetInfo::CharPtrBuiltinVaList;
1896 }
1897 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001898 GPU = StringToCudaArch(Name);
1899 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001901 void setSupportedOpenCLOpts() override {
1902 auto &Opts = getSupportedOpenCLOpts();
1903 Opts.cl_clang_storage_class_specifiers = 1;
1904 Opts.cl_khr_gl_sharing = 1;
1905 Opts.cl_khr_icd = 1;
1906
1907 Opts.cl_khr_fp64 = 1;
1908 Opts.cl_khr_byte_addressable_store = 1;
1909 Opts.cl_khr_global_int32_base_atomics = 1;
1910 Opts.cl_khr_global_int32_extended_atomics = 1;
1911 Opts.cl_khr_local_int32_base_atomics = 1;
1912 Opts.cl_khr_local_int32_extended_atomics = 1;
1913 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001914};
1915
1916const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1917#define BUILTIN(ID, TYPE, ATTRS) \
1918 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1919#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1920 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001921#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1922 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001923#include "clang/Basic/BuiltinsNVPTX.def"
1924};
1925
1926const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1927
Craig Topperf054e3a2015-10-19 03:52:27 +00001928ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1929 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001930}
1931
1932class NVPTX32TargetInfo : public NVPTXTargetInfo {
1933public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001934 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1935 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001936 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001937 PointerWidth = PointerAlign = 32;
1938 SizeType = TargetInfo::UnsignedInt;
1939 PtrDiffType = TargetInfo::SignedInt;
1940 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001941 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001942 }
1943};
1944
1945class NVPTX64TargetInfo : public NVPTXTargetInfo {
1946public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001947 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1948 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001949 PointerWidth = PointerAlign = 64;
1950 SizeType = TargetInfo::UnsignedLong;
1951 PtrDiffType = TargetInfo::SignedLong;
1952 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001953 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001954 }
1955};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001956
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001957static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001958 1, // opencl_global
1959 3, // opencl_local
1960 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001961 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001962 1, // cuda_device
1963 2, // cuda_constant
1964 3 // cuda_shared
1965};
1966
Tom Stellarda96344b2014-08-21 13:58:40 +00001967// If you edit the description strings, make sure you update
1968// getPointerWidthV().
1969
Craig Topper273dbc62015-10-18 05:29:26 +00001970static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001971 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1972 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001973
Craig Topper273dbc62015-10-18 05:29:26 +00001974static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001975 "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 +00001976 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1977 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001978
Matt Arsenault250024f2016-06-08 01:56:42 +00001979class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001980 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001981 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001982
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001983 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001984 enum GPUKind {
1985 GK_NONE,
1986 GK_R600,
1987 GK_R600_DOUBLE_OPS,
1988 GK_R700,
1989 GK_R700_DOUBLE_OPS,
1990 GK_EVERGREEN,
1991 GK_EVERGREEN_DOUBLE_OPS,
1992 GK_NORTHERN_ISLANDS,
1993 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001994 GK_GFX6,
1995 GK_GFX7,
1996 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001997 } GPU;
1998
Jan Veselyeebeaea2015-05-04 19:53:36 +00001999 bool hasFP64:1;
2000 bool hasFMAF:1;
2001 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002002 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002003
Matt Arsenault250024f2016-06-08 01:56:42 +00002004 static bool isAMDGCN(const llvm::Triple &TT) {
2005 return TT.getArch() == llvm::Triple::amdgcn;
2006 }
2007
Eli Friedmand13b41e2012-10-12 23:32:00 +00002008public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002009 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002010 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002011 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002012 hasFP64(false),
2013 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002014 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002015 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002016 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002017 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002018 hasFMAF = true;
2019 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002020 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002021
2022 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2023 DataLayoutStringSI : DataLayoutStringR600);
2024
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002025 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002026 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002027 }
2028
Tom Stellarda96344b2014-08-21 13:58:40 +00002029 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2030 if (GPU <= GK_CAYMAN)
2031 return 32;
2032
2033 switch(AddrSpace) {
2034 default:
2035 return 64;
2036 case 0:
2037 case 3:
2038 case 5:
2039 return 32;
2040 }
2041 }
2042
Yaxun Liu26f75662016-08-19 05:17:25 +00002043 uint64_t getMaxPointerWidth() const override {
2044 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2045 }
2046
Craig Topper3164f332014-03-11 03:39:26 +00002047 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002048 return "";
2049 }
2050
Craig Topperf054e3a2015-10-19 03:52:27 +00002051 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002052
Craig Topperf054e3a2015-10-19 03:52:27 +00002053 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2054 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002055 }
2056
Craig Topper3164f332014-03-11 03:39:26 +00002057 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002058 TargetInfo::ConstraintInfo &Info) const override {
2059 switch (*Name) {
2060 default: break;
2061 case 'v': // vgpr
2062 case 's': // sgpr
2063 Info.setAllowsRegister();
2064 return true;
2065 }
2066 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002067 }
2068
Matt Arsenault250024f2016-06-08 01:56:42 +00002069 bool initFeatureMap(llvm::StringMap<bool> &Features,
2070 DiagnosticsEngine &Diags, StringRef CPU,
2071 const std::vector<std::string> &FeatureVec) const override;
2072
Yaxun Liu2c17e822016-08-09 19:43:38 +00002073 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2074 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002075 bool hasFP32Denormals = false;
2076 bool hasFP64Denormals = false;
2077 for (auto &I : TargetOpts.FeaturesAsWritten) {
2078 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2079 hasFP32Denormals = true;
2080 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2081 hasFP64Denormals = true;
2082 }
2083 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002084 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2085 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2086 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002087 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002088 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002089 }
2090
Craig Topper6c03a542015-10-19 04:51:35 +00002091 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2092 return llvm::makeArrayRef(BuiltinInfo,
2093 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002094 }
2095
Craig Topper3164f332014-03-11 03:39:26 +00002096 void getTargetDefines(const LangOptions &Opts,
2097 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002098 if (getTriple().getArch() == llvm::Triple::amdgcn)
2099 Builder.defineMacro("__AMDGCN__");
2100 else
2101 Builder.defineMacro("__R600__");
2102
Jan Veselyeebeaea2015-05-04 19:53:36 +00002103 if (hasFMAF)
2104 Builder.defineMacro("__HAS_FMAF__");
2105 if (hasLDEXPF)
2106 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002107 if (hasFP64)
2108 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002109 }
2110
Craig Topper3164f332014-03-11 03:39:26 +00002111 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002112 return TargetInfo::CharPtrBuiltinVaList;
2113 }
2114
Matt Arsenault250024f2016-06-08 01:56:42 +00002115 static GPUKind parseR600Name(StringRef Name) {
2116 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002117 .Case("r600" , GK_R600)
2118 .Case("rv610", GK_R600)
2119 .Case("rv620", GK_R600)
2120 .Case("rv630", GK_R600)
2121 .Case("rv635", GK_R600)
2122 .Case("rs780", GK_R600)
2123 .Case("rs880", GK_R600)
2124 .Case("rv670", GK_R600_DOUBLE_OPS)
2125 .Case("rv710", GK_R700)
2126 .Case("rv730", GK_R700)
2127 .Case("rv740", GK_R700_DOUBLE_OPS)
2128 .Case("rv770", GK_R700_DOUBLE_OPS)
2129 .Case("palm", GK_EVERGREEN)
2130 .Case("cedar", GK_EVERGREEN)
2131 .Case("sumo", GK_EVERGREEN)
2132 .Case("sumo2", GK_EVERGREEN)
2133 .Case("redwood", GK_EVERGREEN)
2134 .Case("juniper", GK_EVERGREEN)
2135 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2136 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2137 .Case("barts", GK_NORTHERN_ISLANDS)
2138 .Case("turks", GK_NORTHERN_ISLANDS)
2139 .Case("caicos", GK_NORTHERN_ISLANDS)
2140 .Case("cayman", GK_CAYMAN)
2141 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002142 .Default(GK_NONE);
2143 }
2144
2145 static GPUKind parseAMDGCNName(StringRef Name) {
2146 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002147 .Case("tahiti", GK_GFX6)
2148 .Case("pitcairn", GK_GFX6)
2149 .Case("verde", GK_GFX6)
2150 .Case("oland", GK_GFX6)
2151 .Case("hainan", GK_GFX6)
2152 .Case("bonaire", GK_GFX7)
2153 .Case("kabini", GK_GFX7)
2154 .Case("kaveri", GK_GFX7)
2155 .Case("hawaii", GK_GFX7)
2156 .Case("mullins", GK_GFX7)
2157 .Case("tonga", GK_GFX8)
2158 .Case("iceland", GK_GFX8)
2159 .Case("carrizo", GK_GFX8)
2160 .Case("fiji", GK_GFX8)
2161 .Case("stoney", GK_GFX8)
2162 .Case("polaris10", GK_GFX8)
2163 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002164 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002165 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002166
Matt Arsenault250024f2016-06-08 01:56:42 +00002167 bool setCPU(const std::string &Name) override {
2168 if (getTriple().getArch() == llvm::Triple::amdgcn)
2169 GPU = parseAMDGCNName(Name);
2170 else
2171 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002172
Matt Arsenault250024f2016-06-08 01:56:42 +00002173 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002174 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002175
Jan Vesely211ba782016-06-17 02:25:03 +00002176 void setSupportedOpenCLOpts() override {
2177 auto &Opts = getSupportedOpenCLOpts();
2178 Opts.cl_clang_storage_class_specifiers = 1;
2179 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002180
Jan Vesely211ba782016-06-17 02:25:03 +00002181 if (hasFP64)
2182 Opts.cl_khr_fp64 = 1;
2183 if (GPU >= GK_EVERGREEN) {
2184 Opts.cl_khr_byte_addressable_store = 1;
2185 Opts.cl_khr_global_int32_base_atomics = 1;
2186 Opts.cl_khr_global_int32_extended_atomics = 1;
2187 Opts.cl_khr_local_int32_base_atomics = 1;
2188 Opts.cl_khr_local_int32_extended_atomics = 1;
2189 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002190 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002191 Opts.cl_khr_fp16 = 1;
2192 Opts.cl_khr_int64_base_atomics = 1;
2193 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002194 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002195 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002196 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002197 Opts.cl_amd_media_ops = 1;
2198 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002199 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002200 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002201
Yaxun Liu99444cb2016-08-03 20:38:06 +00002202 LangAS::ID getOpenCLImageAddrSpace() const override {
2203 return LangAS::opencl_constant;
2204 }
2205
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002206 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2207 switch (CC) {
2208 default:
2209 return CCCR_Warning;
2210 case CC_C:
2211 case CC_OpenCLKernel:
2212 return CCCR_OK;
2213 }
2214 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002215};
2216
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002217const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002218#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002219 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002220#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2221 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002222#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002223};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002224const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002225 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2226 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2227 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2228 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2229 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2230 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2231 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2232 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2233 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2234 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2235 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2236 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2237 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2238 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2239 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2240 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2241 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2242 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2243 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2244 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2245 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2246 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2247 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2248 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2249 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2250 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2251 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2252 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2253 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2254 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2255 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2256 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2257 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2258 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2259 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2260 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2261 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2262 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2263 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2264 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2265 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2266 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2267 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2268 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2269 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2270 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2271 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002272 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002273 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2274 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002275};
2276
Craig Topperf054e3a2015-10-19 03:52:27 +00002277ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2278 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002279}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002280
Matt Arsenault250024f2016-06-08 01:56:42 +00002281bool AMDGPUTargetInfo::initFeatureMap(
2282 llvm::StringMap<bool> &Features,
2283 DiagnosticsEngine &Diags, StringRef CPU,
2284 const std::vector<std::string> &FeatureVec) const {
2285
2286 // XXX - What does the member GPU mean if device name string passed here?
2287 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2288 if (CPU.empty())
2289 CPU = "tahiti";
2290
2291 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002292 case GK_GFX6:
2293 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002294 break;
2295
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002296 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002297 Features["s-memrealtime"] = true;
2298 Features["16-bit-insts"] = true;
2299 break;
2300
2301 case GK_NONE:
2302 return false;
2303 default:
2304 llvm_unreachable("unhandled subtarget");
2305 }
2306 } else {
2307 if (CPU.empty())
2308 CPU = "r600";
2309
2310 switch (parseR600Name(CPU)) {
2311 case GK_R600:
2312 case GK_R700:
2313 case GK_EVERGREEN:
2314 case GK_NORTHERN_ISLANDS:
2315 break;
2316 case GK_R600_DOUBLE_OPS:
2317 case GK_R700_DOUBLE_OPS:
2318 case GK_EVERGREEN_DOUBLE_OPS:
2319 case GK_CAYMAN:
2320 Features["fp64"] = true;
2321 break;
2322 case GK_NONE:
2323 return false;
2324 default:
2325 llvm_unreachable("unhandled subtarget");
2326 }
2327 }
2328
2329 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2330}
2331
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002332const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002333#define BUILTIN(ID, TYPE, ATTRS) \
2334 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002335#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002336 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002337#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2338 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002339#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002340
2341#define BUILTIN(ID, TYPE, ATTRS) \
2342 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
2343#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2344 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2345#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002346};
Eli Friedmanb5366062008-05-20 14:21:01 +00002347
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002348
Nuno Lopescfca1f02009-12-23 17:49:57 +00002349static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002350 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2351 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002352 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002353 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2354 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2355 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002356 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002357 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2358 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002359 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2360 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2361 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2362 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2363 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2364 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2365 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2366 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002367};
2368
Eric Christophercdd36352011-06-21 00:05:20 +00002369const TargetInfo::AddlRegName AddlRegNames[] = {
2370 { { "al", "ah", "eax", "rax" }, 0 },
2371 { { "bl", "bh", "ebx", "rbx" }, 3 },
2372 { { "cl", "ch", "ecx", "rcx" }, 2 },
2373 { { "dl", "dh", "edx", "rdx" }, 1 },
2374 { { "esi", "rsi" }, 4 },
2375 { { "edi", "rdi" }, 5 },
2376 { { "esp", "rsp" }, 7 },
2377 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002378 { { "r8d", "r8w", "r8b" }, 38 },
2379 { { "r9d", "r9w", "r9b" }, 39 },
2380 { { "r10d", "r10w", "r10b" }, 40 },
2381 { { "r11d", "r11w", "r11b" }, 41 },
2382 { { "r12d", "r12w", "r12b" }, 42 },
2383 { { "r13d", "r13w", "r13b" }, 43 },
2384 { { "r14d", "r14w", "r14b" }, 44 },
2385 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002386};
2387
2388// X86 target abstract base class; x86-32 and x86-64 are very close, so
2389// most of the implementation can be shared.
2390class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002391 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002392 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002393 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002394 enum MMX3DNowEnum {
2395 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002396 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002397 enum XOPEnum {
2398 NoXOP,
2399 SSE4A,
2400 FMA4,
2401 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002402 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002403
Craig Topper543f3bd2015-10-14 23:47:57 +00002404 bool HasAES = false;
2405 bool HasPCLMUL = false;
2406 bool HasLZCNT = false;
2407 bool HasRDRND = false;
2408 bool HasFSGSBASE = false;
2409 bool HasBMI = false;
2410 bool HasBMI2 = false;
2411 bool HasPOPCNT = false;
2412 bool HasRTM = false;
2413 bool HasPRFCHW = false;
2414 bool HasRDSEED = false;
2415 bool HasADX = false;
2416 bool HasTBM = false;
2417 bool HasFMA = false;
2418 bool HasF16C = false;
2419 bool HasAVX512CD = false;
2420 bool HasAVX512ER = false;
2421 bool HasAVX512PF = false;
2422 bool HasAVX512DQ = false;
2423 bool HasAVX512BW = false;
2424 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002425 bool HasAVX512VBMI = false;
2426 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002427 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002428 bool HasMPX = false;
2429 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002430 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002431 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002432 bool HasXSAVE = false;
2433 bool HasXSAVEOPT = false;
2434 bool HasXSAVEC = false;
2435 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002436 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002437 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002438 bool HasCLFLUSHOPT = false;
2439 bool HasPCOMMIT = false;
2440 bool HasCLWB = false;
2441 bool HasUMIP = false;
2442 bool HasMOVBE = false;
2443 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002444
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002445 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2446 ///
2447 /// Each enumeration represents a particular CPU supported by Clang. These
2448 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2449 enum CPUKind {
2450 CK_Generic,
2451
2452 /// \name i386
2453 /// i386-generation processors.
2454 //@{
2455 CK_i386,
2456 //@}
2457
2458 /// \name i486
2459 /// i486-generation processors.
2460 //@{
2461 CK_i486,
2462 CK_WinChipC6,
2463 CK_WinChip2,
2464 CK_C3,
2465 //@}
2466
2467 /// \name i586
2468 /// i586-generation processors, P5 microarchitecture based.
2469 //@{
2470 CK_i586,
2471 CK_Pentium,
2472 CK_PentiumMMX,
2473 //@}
2474
2475 /// \name i686
2476 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2477 //@{
2478 CK_i686,
2479 CK_PentiumPro,
2480 CK_Pentium2,
2481 CK_Pentium3,
2482 CK_Pentium3M,
2483 CK_PentiumM,
2484 CK_C3_2,
2485
2486 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2487 /// Clang however has some logic to suport this.
2488 // FIXME: Warn, deprecate, and potentially remove this.
2489 CK_Yonah,
2490 //@}
2491
2492 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002493 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002494 //@{
2495 CK_Pentium4,
2496 CK_Pentium4M,
2497 CK_Prescott,
2498 CK_Nocona,
2499 //@}
2500
2501 /// \name Core
2502 /// Core microarchitecture based processors.
2503 //@{
2504 CK_Core2,
2505
2506 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2507 /// codename which GCC no longer accepts as an option to -march, but Clang
2508 /// has some logic for recognizing it.
2509 // FIXME: Warn, deprecate, and potentially remove this.
2510 CK_Penryn,
2511 //@}
2512
2513 /// \name Atom
2514 /// Atom processors
2515 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002516 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002517 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002518 //@}
2519
2520 /// \name Nehalem
2521 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002522 CK_Nehalem,
2523
2524 /// \name Westmere
2525 /// Westmere microarchitecture based processors.
2526 CK_Westmere,
2527
2528 /// \name Sandy Bridge
2529 /// Sandy Bridge microarchitecture based processors.
2530 CK_SandyBridge,
2531
2532 /// \name Ivy Bridge
2533 /// Ivy Bridge microarchitecture based processors.
2534 CK_IvyBridge,
2535
2536 /// \name Haswell
2537 /// Haswell microarchitecture based processors.
2538 CK_Haswell,
2539
2540 /// \name Broadwell
2541 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002542 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002543
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002544 /// \name Skylake Client
2545 /// Skylake client microarchitecture based processors.
2546 CK_SkylakeClient,
2547
2548 /// \name Skylake Server
2549 /// Skylake server microarchitecture based processors.
2550 CK_SkylakeServer,
2551
2552 /// \name Cannonlake Client
2553 /// Cannonlake client microarchitecture based processors.
2554 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002555
Craig Topper449314e2013-08-20 07:09:39 +00002556 /// \name Knights Landing
2557 /// Knights Landing processor.
2558 CK_KNL,
2559
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002560 /// \name Lakemont
2561 /// Lakemont microarchitecture based processors.
2562 CK_Lakemont,
2563
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002564 /// \name K6
2565 /// K6 architecture processors.
2566 //@{
2567 CK_K6,
2568 CK_K6_2,
2569 CK_K6_3,
2570 //@}
2571
2572 /// \name K7
2573 /// K7 architecture processors.
2574 //@{
2575 CK_Athlon,
2576 CK_AthlonThunderbird,
2577 CK_Athlon4,
2578 CK_AthlonXP,
2579 CK_AthlonMP,
2580 //@}
2581
2582 /// \name K8
2583 /// K8 architecture processors.
2584 //@{
2585 CK_Athlon64,
2586 CK_Athlon64SSE3,
2587 CK_AthlonFX,
2588 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002589 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002590 CK_Opteron,
2591 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002592 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002593 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002594
Benjamin Kramer569f2152012-01-10 11:50:18 +00002595 /// \name Bobcat
2596 /// Bobcat architecture processors.
2597 //@{
2598 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002599 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002600 //@}
2601
2602 /// \name Bulldozer
2603 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002604 //@{
2605 CK_BDVER1,
2606 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002607 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002608 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002609 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002610
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002611 /// This specification is deprecated and will be removed in the future.
2612 /// Users should prefer \see CK_K8.
2613 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002614 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002615 CK_x86_64,
2616 //@}
2617
2618 /// \name Geode
2619 /// Geode processors.
2620 //@{
2621 CK_Geode
2622 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002623 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002624
Eric Christopherc50738f2015-08-27 00:05:50 +00002625 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002626 return llvm::StringSwitch<CPUKind>(CPU)
2627 .Case("i386", CK_i386)
2628 .Case("i486", CK_i486)
2629 .Case("winchip-c6", CK_WinChipC6)
2630 .Case("winchip2", CK_WinChip2)
2631 .Case("c3", CK_C3)
2632 .Case("i586", CK_i586)
2633 .Case("pentium", CK_Pentium)
2634 .Case("pentium-mmx", CK_PentiumMMX)
2635 .Case("i686", CK_i686)
2636 .Case("pentiumpro", CK_PentiumPro)
2637 .Case("pentium2", CK_Pentium2)
2638 .Case("pentium3", CK_Pentium3)
2639 .Case("pentium3m", CK_Pentium3M)
2640 .Case("pentium-m", CK_PentiumM)
2641 .Case("c3-2", CK_C3_2)
2642 .Case("yonah", CK_Yonah)
2643 .Case("pentium4", CK_Pentium4)
2644 .Case("pentium4m", CK_Pentium4M)
2645 .Case("prescott", CK_Prescott)
2646 .Case("nocona", CK_Nocona)
2647 .Case("core2", CK_Core2)
2648 .Case("penryn", CK_Penryn)
2649 .Case("bonnell", CK_Bonnell)
2650 .Case("atom", CK_Bonnell) // Legacy name.
2651 .Case("silvermont", CK_Silvermont)
2652 .Case("slm", CK_Silvermont) // Legacy name.
2653 .Case("nehalem", CK_Nehalem)
2654 .Case("corei7", CK_Nehalem) // Legacy name.
2655 .Case("westmere", CK_Westmere)
2656 .Case("sandybridge", CK_SandyBridge)
2657 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2658 .Case("ivybridge", CK_IvyBridge)
2659 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2660 .Case("haswell", CK_Haswell)
2661 .Case("core-avx2", CK_Haswell) // Legacy name.
2662 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002663 .Case("skylake", CK_SkylakeClient)
2664 .Case("skylake-avx512", CK_SkylakeServer)
2665 .Case("skx", CK_SkylakeServer) // Legacy name.
2666 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002667 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002668 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002669 .Case("k6", CK_K6)
2670 .Case("k6-2", CK_K6_2)
2671 .Case("k6-3", CK_K6_3)
2672 .Case("athlon", CK_Athlon)
2673 .Case("athlon-tbird", CK_AthlonThunderbird)
2674 .Case("athlon-4", CK_Athlon4)
2675 .Case("athlon-xp", CK_AthlonXP)
2676 .Case("athlon-mp", CK_AthlonMP)
2677 .Case("athlon64", CK_Athlon64)
2678 .Case("athlon64-sse3", CK_Athlon64SSE3)
2679 .Case("athlon-fx", CK_AthlonFX)
2680 .Case("k8", CK_K8)
2681 .Case("k8-sse3", CK_K8SSE3)
2682 .Case("opteron", CK_Opteron)
2683 .Case("opteron-sse3", CK_OpteronSSE3)
2684 .Case("barcelona", CK_AMDFAM10)
2685 .Case("amdfam10", CK_AMDFAM10)
2686 .Case("btver1", CK_BTVER1)
2687 .Case("btver2", CK_BTVER2)
2688 .Case("bdver1", CK_BDVER1)
2689 .Case("bdver2", CK_BDVER2)
2690 .Case("bdver3", CK_BDVER3)
2691 .Case("bdver4", CK_BDVER4)
2692 .Case("x86-64", CK_x86_64)
2693 .Case("geode", CK_Geode)
2694 .Default(CK_Generic);
2695 }
2696
Rafael Espindolaeb265472013-08-21 21:59:03 +00002697 enum FPMathKind {
2698 FP_Default,
2699 FP_SSE,
2700 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002701 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002702
Eli Friedman3fd920a2008-08-20 02:34:37 +00002703public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002704 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2705 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002706 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002707 }
Craig Topper3164f332014-03-11 03:39:26 +00002708 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002709 // X87 evaluates with 80 bits "long double" precision.
2710 return SSELevel == NoSSE ? 2 : 0;
2711 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002712 ArrayRef<const char *> getGCCRegNames() const override {
2713 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002714 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002715 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2716 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002717 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002718 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2719 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002720 }
Eric Christopherd9832702015-06-29 21:00:05 +00002721 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002722 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002723 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002724
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002725 bool validateGlobalRegisterVariable(StringRef RegName,
2726 unsigned RegSize,
2727 bool &HasSizeMismatch) const override {
2728 // esp and ebp are the only 32-bit registers the x86 backend can currently
2729 // handle.
2730 if (RegName.equals("esp") || RegName.equals("ebp")) {
2731 // Check that the register size is 32-bit.
2732 HasSizeMismatch = RegSize != 32;
2733 return true;
2734 }
2735
2736 return false;
2737 }
2738
Akira Hatanaka974131e2014-09-18 18:17:18 +00002739 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2740
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002741 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2742
Akira Hatanaka974131e2014-09-18 18:17:18 +00002743 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2744
Craig Topper3164f332014-03-11 03:39:26 +00002745 std::string convertConstraint(const char *&Constraint) const override;
2746 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002747 return "~{dirflag},~{fpsr},~{flags}";
2748 }
Craig Topper3164f332014-03-11 03:39:26 +00002749 void getTargetDefines(const LangOptions &Opts,
2750 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002751 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2752 bool Enabled);
2753 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2754 bool Enabled);
2755 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2756 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002757 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2758 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002759 setFeatureEnabledImpl(Features, Name, Enabled);
2760 }
2761 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002762 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002763 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2764 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002765 bool
2766 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2767 StringRef CPU,
2768 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002769 bool hasFeature(StringRef Feature) const override;
2770 bool handleTargetFeatures(std::vector<std::string> &Features,
2771 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002772 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002773 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2774 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002775 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002776 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002777 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002778 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002779 return "no-mmx";
2780 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002781 }
Craig Topper3164f332014-03-11 03:39:26 +00002782 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002783 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002784
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002785 // Perform any per-CPU checks necessary to determine if this CPU is
2786 // acceptable.
2787 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2788 // invalid without explaining *why*.
2789 switch (CPU) {
2790 case CK_Generic:
2791 // No processor selected!
2792 return false;
2793
2794 case CK_i386:
2795 case CK_i486:
2796 case CK_WinChipC6:
2797 case CK_WinChip2:
2798 case CK_C3:
2799 case CK_i586:
2800 case CK_Pentium:
2801 case CK_PentiumMMX:
2802 case CK_i686:
2803 case CK_PentiumPro:
2804 case CK_Pentium2:
2805 case CK_Pentium3:
2806 case CK_Pentium3M:
2807 case CK_PentiumM:
2808 case CK_Yonah:
2809 case CK_C3_2:
2810 case CK_Pentium4:
2811 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002812 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002813 case CK_Prescott:
2814 case CK_K6:
2815 case CK_K6_2:
2816 case CK_K6_3:
2817 case CK_Athlon:
2818 case CK_AthlonThunderbird:
2819 case CK_Athlon4:
2820 case CK_AthlonXP:
2821 case CK_AthlonMP:
2822 case CK_Geode:
2823 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002824 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002825 return false;
2826
2827 // Fallthrough
2828 case CK_Nocona:
2829 case CK_Core2:
2830 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002831 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002832 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002833 case CK_Nehalem:
2834 case CK_Westmere:
2835 case CK_SandyBridge:
2836 case CK_IvyBridge:
2837 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002838 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002839 case CK_SkylakeClient:
2840 case CK_SkylakeServer:
2841 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002842 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002843 case CK_Athlon64:
2844 case CK_Athlon64SSE3:
2845 case CK_AthlonFX:
2846 case CK_K8:
2847 case CK_K8SSE3:
2848 case CK_Opteron:
2849 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002850 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002851 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002852 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002853 case CK_BDVER1:
2854 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002855 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002856 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002857 case CK_x86_64:
2858 return true;
2859 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002860 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002861 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002862
Craig Topper3164f332014-03-11 03:39:26 +00002863 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002864
Craig Topper3164f332014-03-11 03:39:26 +00002865 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002866 // Most of the non-ARM calling conventions are i386 conventions.
2867 switch (CC) {
2868 case CC_X86ThisCall:
2869 case CC_X86FastCall:
2870 case CC_X86StdCall:
2871 case CC_X86VectorCall:
2872 case CC_C:
2873 case CC_Swift:
2874 case CC_X86Pascal:
2875 case CC_IntelOclBicc:
2876 return CCCR_OK;
2877 default:
2878 return CCCR_Warning;
2879 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002880 }
2881
Craig Topper3164f332014-03-11 03:39:26 +00002882 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002883 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002884 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002885
2886 bool hasSjLjLowering() const override {
2887 return true;
2888 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002889
2890 void setSupportedOpenCLOpts() override {
2891 getSupportedOpenCLOpts().setAll();
2892 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002893};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002894
Rafael Espindolaeb265472013-08-21 21:59:03 +00002895bool X86TargetInfo::setFPMath(StringRef Name) {
2896 if (Name == "387") {
2897 FPMath = FP_387;
2898 return true;
2899 }
2900 if (Name == "sse") {
2901 FPMath = FP_SSE;
2902 return true;
2903 }
2904 return false;
2905}
2906
Eric Christopher007b0a02015-08-28 22:32:01 +00002907bool X86TargetInfo::initFeatureMap(
2908 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002909 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002910 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002911 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002912 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002913 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002914
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002915 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002916
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002917 // Enable X87 for all X86 processors but Lakemont.
2918 if (Kind != CK_Lakemont)
2919 setFeatureEnabledImpl(Features, "x87", true);
2920
2921 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002922 case CK_Generic:
2923 case CK_i386:
2924 case CK_i486:
2925 case CK_i586:
2926 case CK_Pentium:
2927 case CK_i686:
2928 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002929 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002930 break;
2931 case CK_PentiumMMX:
2932 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002933 case CK_K6:
2934 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002935 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002936 break;
2937 case CK_Pentium3:
2938 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002939 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002940 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002941 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 break;
2943 case CK_PentiumM:
2944 case CK_Pentium4:
2945 case CK_Pentium4M:
2946 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002947 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002948 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002949 break;
2950 case CK_Yonah:
2951 case CK_Prescott:
2952 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002953 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002954 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002955 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002956 break;
2957 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002958 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002959 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002960 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002961 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002962 break;
2963 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002964 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002965 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002966 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002967 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002968 case CK_Cannonlake:
2969 setFeatureEnabledImpl(Features, "avx512ifma", true);
2970 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2971 setFeatureEnabledImpl(Features, "sha", true);
2972 setFeatureEnabledImpl(Features, "umip", true);
2973 // FALLTHROUGH
2974 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002975 setFeatureEnabledImpl(Features, "avx512f", true);
2976 setFeatureEnabledImpl(Features, "avx512cd", true);
2977 setFeatureEnabledImpl(Features, "avx512dq", true);
2978 setFeatureEnabledImpl(Features, "avx512bw", true);
2979 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002980 setFeatureEnabledImpl(Features, "pku", true);
2981 setFeatureEnabledImpl(Features, "pcommit", true);
2982 setFeatureEnabledImpl(Features, "clwb", true);
2983 // FALLTHROUGH
2984 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002985 setFeatureEnabledImpl(Features, "xsavec", true);
2986 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002987 setFeatureEnabledImpl(Features, "mpx", true);
2988 setFeatureEnabledImpl(Features, "sgx", true);
2989 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002990 // FALLTHROUGH
2991 case CK_Broadwell:
2992 setFeatureEnabledImpl(Features, "rdseed", true);
2993 setFeatureEnabledImpl(Features, "adx", true);
2994 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002995 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002996 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002997 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002998 setFeatureEnabledImpl(Features, "bmi", true);
2999 setFeatureEnabledImpl(Features, "bmi2", true);
3000 setFeatureEnabledImpl(Features, "rtm", true);
3001 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003002 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003003 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003004 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003005 setFeatureEnabledImpl(Features, "rdrnd", true);
3006 setFeatureEnabledImpl(Features, "f16c", true);
3007 setFeatureEnabledImpl(Features, "fsgsbase", true);
3008 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003009 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003010 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003011 setFeatureEnabledImpl(Features, "xsave", true);
3012 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003013 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003014 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003015 case CK_Silvermont:
3016 setFeatureEnabledImpl(Features, "aes", true);
3017 setFeatureEnabledImpl(Features, "pclmul", true);
3018 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003019 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003020 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003021 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003022 setFeatureEnabledImpl(Features, "cx16", true);
3023 break;
3024 case CK_KNL:
3025 setFeatureEnabledImpl(Features, "avx512f", true);
3026 setFeatureEnabledImpl(Features, "avx512cd", true);
3027 setFeatureEnabledImpl(Features, "avx512er", true);
3028 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003029 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003030 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003031 setFeatureEnabledImpl(Features, "rdseed", true);
3032 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003033 setFeatureEnabledImpl(Features, "lzcnt", true);
3034 setFeatureEnabledImpl(Features, "bmi", true);
3035 setFeatureEnabledImpl(Features, "bmi2", true);
3036 setFeatureEnabledImpl(Features, "rtm", true);
3037 setFeatureEnabledImpl(Features, "fma", true);
3038 setFeatureEnabledImpl(Features, "rdrnd", true);
3039 setFeatureEnabledImpl(Features, "f16c", true);
3040 setFeatureEnabledImpl(Features, "fsgsbase", true);
3041 setFeatureEnabledImpl(Features, "aes", true);
3042 setFeatureEnabledImpl(Features, "pclmul", true);
3043 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003044 setFeatureEnabledImpl(Features, "xsaveopt", true);
3045 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003046 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 break;
3048 case CK_K6_2:
3049 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003050 case CK_WinChip2:
3051 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003052 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003053 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003054 case CK_Athlon:
3055 case CK_AthlonThunderbird:
3056 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003057 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003058 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 case CK_Athlon4:
3060 case CK_AthlonXP:
3061 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003062 setFeatureEnabledImpl(Features, "sse", true);
3063 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003064 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 break;
3066 case CK_K8:
3067 case CK_Opteron:
3068 case CK_Athlon64:
3069 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003070 setFeatureEnabledImpl(Features, "sse2", true);
3071 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003072 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003073 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003074 case CK_AMDFAM10:
3075 setFeatureEnabledImpl(Features, "sse4a", true);
3076 setFeatureEnabledImpl(Features, "lzcnt", true);
3077 setFeatureEnabledImpl(Features, "popcnt", true);
3078 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003079 case CK_K8SSE3:
3080 case CK_OpteronSSE3:
3081 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003082 setFeatureEnabledImpl(Features, "sse3", true);
3083 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003084 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003085 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003086 case CK_BTVER2:
3087 setFeatureEnabledImpl(Features, "avx", true);
3088 setFeatureEnabledImpl(Features, "aes", true);
3089 setFeatureEnabledImpl(Features, "pclmul", true);
3090 setFeatureEnabledImpl(Features, "bmi", true);
3091 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003092 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003093 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003094 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003095 setFeatureEnabledImpl(Features, "ssse3", true);
3096 setFeatureEnabledImpl(Features, "sse4a", true);
3097 setFeatureEnabledImpl(Features, "lzcnt", true);
3098 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003099 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003100 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003101 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003102 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003103 case CK_BDVER4:
3104 setFeatureEnabledImpl(Features, "avx2", true);
3105 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003106 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003107 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003108 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003109 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003110 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003111 // FALLTHROUGH
3112 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003113 setFeatureEnabledImpl(Features, "bmi", true);
3114 setFeatureEnabledImpl(Features, "fma", true);
3115 setFeatureEnabledImpl(Features, "f16c", true);
3116 setFeatureEnabledImpl(Features, "tbm", true);
3117 // FALLTHROUGH
3118 case CK_BDVER1:
3119 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003120 setFeatureEnabledImpl(Features, "xop", true);
3121 setFeatureEnabledImpl(Features, "lzcnt", true);
3122 setFeatureEnabledImpl(Features, "aes", true);
3123 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003124 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003125 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003126 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003127 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003128 break;
Eli Friedman33465822011-07-08 23:31:17 +00003129 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003130 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3131 return false;
3132
3133 // Can't do this earlier because we need to be able to explicitly enable
3134 // or disable these features and the things that they depend upon.
3135
3136 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3137 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003138 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003139 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3140 FeaturesVec.end())
3141 Features["popcnt"] = true;
3142
3143 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3144 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003145 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003146 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3147 FeaturesVec.end())
3148 Features["prfchw"] = true;
3149
Eric Christophera7260af2015-10-08 20:10:18 +00003150 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3151 // then enable MMX.
3152 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003153 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003154 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3155 FeaturesVec.end())
3156 Features["mmx"] = true;
3157
Eric Christopherbbd746d2015-10-08 20:10:14 +00003158 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003159}
3160
Rafael Espindolae62e2792013-08-20 13:44:29 +00003161void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003162 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003163 if (Enabled) {
3164 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003165 case AVX512F:
3166 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003167 case AVX2:
3168 Features["avx2"] = true;
3169 case AVX:
3170 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003171 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003172 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003173 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003174 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003175 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003176 case SSSE3:
3177 Features["ssse3"] = true;
3178 case SSE3:
3179 Features["sse3"] = true;
3180 case SSE2:
3181 Features["sse2"] = true;
3182 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183 Features["sse"] = true;
3184 case NoSSE:
3185 break;
3186 }
3187 return;
3188 }
3189
3190 switch (Level) {
3191 case NoSSE:
3192 case SSE1:
3193 Features["sse"] = false;
3194 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003195 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3196 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003197 case SSE3:
3198 Features["sse3"] = false;
3199 setXOPLevel(Features, NoXOP, false);
3200 case SSSE3:
3201 Features["ssse3"] = false;
3202 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003203 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003204 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003205 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003206 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003207 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3208 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003209 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003210 case AVX2:
3211 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003212 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003213 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003214 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003215 Features["avx512vl"] = Features["avx512vbmi"] =
3216 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 }
3218}
3219
3220void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003221 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003222 if (Enabled) {
3223 switch (Level) {
3224 case AMD3DNowAthlon:
3225 Features["3dnowa"] = true;
3226 case AMD3DNow:
3227 Features["3dnow"] = true;
3228 case MMX:
3229 Features["mmx"] = true;
3230 case NoMMX3DNow:
3231 break;
3232 }
3233 return;
3234 }
3235
3236 switch (Level) {
3237 case NoMMX3DNow:
3238 case MMX:
3239 Features["mmx"] = false;
3240 case AMD3DNow:
3241 Features["3dnow"] = false;
3242 case AMD3DNowAthlon:
3243 Features["3dnowa"] = false;
3244 }
3245}
3246
3247void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003248 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003249 if (Enabled) {
3250 switch (Level) {
3251 case XOP:
3252 Features["xop"] = true;
3253 case FMA4:
3254 Features["fma4"] = true;
3255 setSSELevel(Features, AVX, true);
3256 case SSE4A:
3257 Features["sse4a"] = true;
3258 setSSELevel(Features, SSE3, true);
3259 case NoXOP:
3260 break;
3261 }
3262 return;
3263 }
3264
3265 switch (Level) {
3266 case NoXOP:
3267 case SSE4A:
3268 Features["sse4a"] = false;
3269 case FMA4:
3270 Features["fma4"] = false;
3271 case XOP:
3272 Features["xop"] = false;
3273 }
3274}
3275
Craig Topper86d79ef2013-09-17 04:51:29 +00003276void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3277 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003278 // This is a bit of a hack to deal with the sse4 target feature when used
3279 // as part of the target attribute. We handle sse4 correctly everywhere
3280 // else. See below for more information on how we handle the sse4 options.
3281 if (Name != "sse4")
3282 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003283
Craig Topper29561122013-09-19 01:13:07 +00003284 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003285 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003286 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003287 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003288 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003289 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003290 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003291 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003292 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003293 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003294 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003295 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003296 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003298 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003299 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003300 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003301 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003302 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003303 if (Enabled)
3304 setSSELevel(Features, SSE2, Enabled);
3305 } else if (Name == "pclmul") {
3306 if (Enabled)
3307 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003308 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003309 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003310 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003311 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003312 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003313 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003314 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3315 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3316 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003317 if (Enabled)
3318 setSSELevel(Features, AVX512F, Enabled);
3319 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003320 if (Enabled)
3321 setSSELevel(Features, AVX, Enabled);
3322 } else if (Name == "fma4") {
3323 setXOPLevel(Features, FMA4, Enabled);
3324 } else if (Name == "xop") {
3325 setXOPLevel(Features, XOP, Enabled);
3326 } else if (Name == "sse4a") {
3327 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003328 } else if (Name == "f16c") {
3329 if (Enabled)
3330 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003331 } else if (Name == "sha") {
3332 if (Enabled)
3333 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003334 } else if (Name == "sse4") {
3335 // We can get here via the __target__ attribute since that's not controlled
3336 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3337 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3338 // disabled.
3339 if (Enabled)
3340 setSSELevel(Features, SSE42, Enabled);
3341 else
3342 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003343 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003344 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003345 Features["xsaveopt"] = false;
3346 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003347 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003348 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003349 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003350}
3351
Eric Christopher3ff21b32013-10-16 21:26:26 +00003352/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003353/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003354bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003355 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003356 for (const auto &Feature : Features) {
3357 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003358 continue;
3359
Eric Christopher610fe112015-08-26 08:21:55 +00003360 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003361 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003363 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003365 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003366 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003367 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003368 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003369 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003370 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003371 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003372 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003373 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003374 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003375 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003376 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003377 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003378 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003379 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003380 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003381 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003382 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003383 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003384 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003385 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003386 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003387 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003388 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003389 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003390 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003391 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003392 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003393 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003394 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003395 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003396 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003397 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003398 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003399 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003400 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003401 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003402 } else if (Feature == "+avx512vbmi") {
3403 HasAVX512VBMI = true;
3404 } else if (Feature == "+avx512ifma") {
3405 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003406 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003407 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003408 } else if (Feature == "+mpx") {
3409 HasMPX = true;
3410 } else if (Feature == "+movbe") {
3411 HasMOVBE = true;
3412 } else if (Feature == "+sgx") {
3413 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003414 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003415 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003416 } else if (Feature == "+fxsr") {
3417 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003418 } else if (Feature == "+xsave") {
3419 HasXSAVE = true;
3420 } else if (Feature == "+xsaveopt") {
3421 HasXSAVEOPT = true;
3422 } else if (Feature == "+xsavec") {
3423 HasXSAVEC = true;
3424 } else if (Feature == "+xsaves") {
3425 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003426 } else if (Feature == "+mwaitx") {
3427 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003428 } else if (Feature == "+pku") {
3429 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003430 } else if (Feature == "+clflushopt") {
3431 HasCLFLUSHOPT = true;
3432 } else if (Feature == "+pcommit") {
3433 HasPCOMMIT = true;
3434 } else if (Feature == "+clwb") {
3435 HasCLWB = true;
3436 } else if (Feature == "+umip") {
3437 HasUMIP = true;
3438 } else if (Feature == "+prefetchwt1") {
3439 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003440 }
3441
Benjamin Kramer27402c62012-03-05 15:10:44 +00003442 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003443 .Case("+avx512f", AVX512F)
3444 .Case("+avx2", AVX2)
3445 .Case("+avx", AVX)
3446 .Case("+sse4.2", SSE42)
3447 .Case("+sse4.1", SSE41)
3448 .Case("+ssse3", SSSE3)
3449 .Case("+sse3", SSE3)
3450 .Case("+sse2", SSE2)
3451 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003452 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003453 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003454
Eli Friedman33465822011-07-08 23:31:17 +00003455 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003456 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003457 .Case("+3dnowa", AMD3DNowAthlon)
3458 .Case("+3dnow", AMD3DNow)
3459 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003460 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003461 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003462
3463 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003464 .Case("+xop", XOP)
3465 .Case("+fma4", FMA4)
3466 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003467 .Default(NoXOP);
3468 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003469 }
Eli Friedman33465822011-07-08 23:31:17 +00003470
Rafael Espindolaeb265472013-08-21 21:59:03 +00003471 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3472 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003473 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3474 (FPMath == FP_387 && SSELevel >= SSE1)) {
3475 Diags.Report(diag::err_target_unsupported_fpmath) <<
3476 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003477 return false;
3478 }
3479
Alexey Bataev00396512015-07-02 03:40:19 +00003480 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003481 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003482 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003483}
Chris Lattnerecd49032009-03-02 22:27:17 +00003484
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003485/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3486/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003487void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003488 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003489 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003490 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003491 Builder.defineMacro("__amd64__");
3492 Builder.defineMacro("__amd64");
3493 Builder.defineMacro("__x86_64");
3494 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003495 if (getTriple().getArchName() == "x86_64h") {
3496 Builder.defineMacro("__x86_64h");
3497 Builder.defineMacro("__x86_64h__");
3498 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003499 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003500 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003501 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003502
Chris Lattnerecd49032009-03-02 22:27:17 +00003503 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003504 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3505 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003506 switch (CPU) {
3507 case CK_Generic:
3508 break;
3509 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003510 // The rest are coming from the i386 define above.
3511 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003512 break;
3513 case CK_i486:
3514 case CK_WinChipC6:
3515 case CK_WinChip2:
3516 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003517 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003518 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003519 case CK_PentiumMMX:
3520 Builder.defineMacro("__pentium_mmx__");
3521 Builder.defineMacro("__tune_pentium_mmx__");
3522 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003523 case CK_i586:
3524 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003525 defineCPUMacros(Builder, "i586");
3526 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003527 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003528 case CK_Pentium3:
3529 case CK_Pentium3M:
3530 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003531 Builder.defineMacro("__tune_pentium3__");
3532 // Fallthrough
3533 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003534 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003535 Builder.defineMacro("__tune_pentium2__");
3536 // Fallthrough
3537 case CK_PentiumPro:
3538 Builder.defineMacro("__tune_i686__");
3539 Builder.defineMacro("__tune_pentiumpro__");
3540 // Fallthrough
3541 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003542 Builder.defineMacro("__i686");
3543 Builder.defineMacro("__i686__");
3544 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3545 Builder.defineMacro("__pentiumpro");
3546 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003547 break;
3548 case CK_Pentium4:
3549 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003550 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003551 break;
3552 case CK_Yonah:
3553 case CK_Prescott:
3554 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003555 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003556 break;
3557 case CK_Core2:
3558 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003559 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003560 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003561 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003562 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003563 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003564 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003565 defineCPUMacros(Builder, "slm");
3566 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003567 case CK_Nehalem:
3568 case CK_Westmere:
3569 case CK_SandyBridge:
3570 case CK_IvyBridge:
3571 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003572 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003573 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003574 // FIXME: Historically, we defined this legacy name, it would be nice to
3575 // remove it at some point. We've never exposed fine-grained names for
3576 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003577 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003578 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003579 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003580 defineCPUMacros(Builder, "skx");
3581 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003582 case CK_Cannonlake:
3583 break;
Craig Topper449314e2013-08-20 07:09:39 +00003584 case CK_KNL:
3585 defineCPUMacros(Builder, "knl");
3586 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003587 case CK_Lakemont:
3588 Builder.defineMacro("__tune_lakemont__");
3589 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003590 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003591 Builder.defineMacro("__k6_2__");
3592 Builder.defineMacro("__tune_k6_2__");
3593 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003594 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003595 if (CPU != CK_K6_2) { // In case of fallthrough
3596 // FIXME: GCC may be enabling these in cases where some other k6
3597 // architecture is specified but -m3dnow is explicitly provided. The
3598 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003599 Builder.defineMacro("__k6_3__");
3600 Builder.defineMacro("__tune_k6_3__");
3601 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003602 // Fallthrough
3603 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003604 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003605 break;
3606 case CK_Athlon:
3607 case CK_AthlonThunderbird:
3608 case CK_Athlon4:
3609 case CK_AthlonXP:
3610 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003611 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003612 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003613 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003614 Builder.defineMacro("__tune_athlon_sse__");
3615 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003616 break;
3617 case CK_K8:
3618 case CK_K8SSE3:
3619 case CK_x86_64:
3620 case CK_Opteron:
3621 case CK_OpteronSSE3:
3622 case CK_Athlon64:
3623 case CK_Athlon64SSE3:
3624 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003625 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003626 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003627 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003628 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003629 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003630 case CK_BTVER1:
3631 defineCPUMacros(Builder, "btver1");
3632 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003633 case CK_BTVER2:
3634 defineCPUMacros(Builder, "btver2");
3635 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003636 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003637 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003638 break;
3639 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003640 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003641 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003642 case CK_BDVER3:
3643 defineCPUMacros(Builder, "bdver3");
3644 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003645 case CK_BDVER4:
3646 defineCPUMacros(Builder, "bdver4");
3647 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003648 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003649 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003650 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003651 }
Chris Lattner96e43572009-03-02 22:40:39 +00003652
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003653 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003654 Builder.defineMacro("__REGISTER_PREFIX__", "");
3655
Chris Lattner6df41af2009-04-19 17:32:33 +00003656 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3657 // functions in glibc header files that use FP Stack inline asm which the
3658 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003659 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003660
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003661 if (HasAES)
3662 Builder.defineMacro("__AES__");
3663
Craig Topper3f122a72012-05-31 05:18:48 +00003664 if (HasPCLMUL)
3665 Builder.defineMacro("__PCLMUL__");
3666
Craig Topper22967d42011-12-25 05:06:45 +00003667 if (HasLZCNT)
3668 Builder.defineMacro("__LZCNT__");
3669
Benjamin Kramer1e250392012-07-07 09:39:18 +00003670 if (HasRDRND)
3671 Builder.defineMacro("__RDRND__");
3672
Craig Topper8c7f2512014-11-03 06:51:41 +00003673 if (HasFSGSBASE)
3674 Builder.defineMacro("__FSGSBASE__");
3675
Craig Topper22967d42011-12-25 05:06:45 +00003676 if (HasBMI)
3677 Builder.defineMacro("__BMI__");
3678
3679 if (HasBMI2)
3680 Builder.defineMacro("__BMI2__");
3681
Craig Topper1de83482011-12-29 16:10:46 +00003682 if (HasPOPCNT)
3683 Builder.defineMacro("__POPCNT__");
3684
Michael Liao625a8752012-11-10 05:17:46 +00003685 if (HasRTM)
3686 Builder.defineMacro("__RTM__");
3687
Michael Liao74f4eaf2013-03-26 17:52:08 +00003688 if (HasPRFCHW)
3689 Builder.defineMacro("__PRFCHW__");
3690
Michael Liaoffaae352013-03-29 05:17:55 +00003691 if (HasRDSEED)
3692 Builder.defineMacro("__RDSEED__");
3693
Robert Khasanov50e6f582014-09-19 09:53:48 +00003694 if (HasADX)
3695 Builder.defineMacro("__ADX__");
3696
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003697 if (HasTBM)
3698 Builder.defineMacro("__TBM__");
3699
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003700 if (HasMWAITX)
3701 Builder.defineMacro("__MWAITX__");
3702
Rafael Espindolae62e2792013-08-20 13:44:29 +00003703 switch (XOPLevel) {
3704 case XOP:
3705 Builder.defineMacro("__XOP__");
3706 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003707 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003708 case SSE4A:
3709 Builder.defineMacro("__SSE4A__");
3710 case NoXOP:
3711 break;
3712 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003713
Craig Topperbba778b2012-06-03 21:46:30 +00003714 if (HasFMA)
3715 Builder.defineMacro("__FMA__");
3716
Manman Rena45358c2012-10-11 00:59:55 +00003717 if (HasF16C)
3718 Builder.defineMacro("__F16C__");
3719
Craig Topper679b53a2013-08-21 05:29:10 +00003720 if (HasAVX512CD)
3721 Builder.defineMacro("__AVX512CD__");
3722 if (HasAVX512ER)
3723 Builder.defineMacro("__AVX512ER__");
3724 if (HasAVX512PF)
3725 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003726 if (HasAVX512DQ)
3727 Builder.defineMacro("__AVX512DQ__");
3728 if (HasAVX512BW)
3729 Builder.defineMacro("__AVX512BW__");
3730 if (HasAVX512VL)
3731 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003732 if (HasAVX512VBMI)
3733 Builder.defineMacro("__AVX512VBMI__");
3734 if (HasAVX512IFMA)
3735 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003736
Ben Langmuir58078d02013-09-19 13:22:04 +00003737 if (HasSHA)
3738 Builder.defineMacro("__SHA__");
3739
Craig Toppere33f51f2015-10-16 06:22:36 +00003740 if (HasFXSR)
3741 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003742 if (HasXSAVE)
3743 Builder.defineMacro("__XSAVE__");
3744 if (HasXSAVEOPT)
3745 Builder.defineMacro("__XSAVEOPT__");
3746 if (HasXSAVEC)
3747 Builder.defineMacro("__XSAVEC__");
3748 if (HasXSAVES)
3749 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003750 if (HasPKU)
3751 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003752 if (HasCX16)
3753 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3754
Chris Lattner96e43572009-03-02 22:40:39 +00003755 // Each case falls through to the previous one here.
3756 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003757 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003758 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003759 case AVX2:
3760 Builder.defineMacro("__AVX2__");
3761 case AVX:
3762 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003763 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003764 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003765 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003766 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003767 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003768 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003769 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003770 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003771 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003772 Builder.defineMacro("__SSE2__");
3773 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003774 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003775 Builder.defineMacro("__SSE__");
3776 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003777 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003778 break;
3779 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003780
Derek Schuffc7dd7222012-10-11 15:52:22 +00003781 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003782 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003783 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003784 case AVX2:
3785 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003786 case SSE42:
3787 case SSE41:
3788 case SSSE3:
3789 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003790 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003791 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003792 break;
3793 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003794 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003795 break;
3796 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003797 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003798 }
3799 }
3800
Anders Carlssone437c682010-01-27 03:47:49 +00003801 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003802 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003803 case AMD3DNowAthlon:
3804 Builder.defineMacro("__3dNOW_A__");
3805 case AMD3DNow:
3806 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003807 case MMX:
3808 Builder.defineMacro("__MMX__");
3809 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003810 break;
3811 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003812
3813 if (CPU >= CK_i486) {
3814 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3815 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3816 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3817 }
3818 if (CPU >= CK_i586)
3819 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003820}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003821
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003822bool X86TargetInfo::hasFeature(StringRef Feature) const {
3823 return llvm::StringSwitch<bool>(Feature)
3824 .Case("aes", HasAES)
3825 .Case("avx", SSELevel >= AVX)
3826 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003827 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003828 .Case("avx512cd", HasAVX512CD)
3829 .Case("avx512er", HasAVX512ER)
3830 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003831 .Case("avx512dq", HasAVX512DQ)
3832 .Case("avx512bw", HasAVX512BW)
3833 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003834 .Case("avx512vbmi", HasAVX512VBMI)
3835 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003836 .Case("bmi", HasBMI)
3837 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003838 .Case("clflushopt", HasCLFLUSHOPT)
3839 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003840 .Case("cx16", HasCX16)
3841 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003842 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003843 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003844 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003845 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003846 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003847 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3848 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3849 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003850 .Case("movbe", HasMOVBE)
3851 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003852 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003853 .Case("pcommit", HasPCOMMIT)
3854 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003855 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003856 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003857 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003858 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003859 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003860 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003861 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003862 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003863 .Case("sse", SSELevel >= SSE1)
3864 .Case("sse2", SSELevel >= SSE2)
3865 .Case("sse3", SSELevel >= SSE3)
3866 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003867 .Case("sse4.1", SSELevel >= SSE41)
3868 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003869 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003870 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003871 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003872 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003873 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3874 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003875 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003876 .Case("xsave", HasXSAVE)
3877 .Case("xsavec", HasXSAVEC)
3878 .Case("xsaves", HasXSAVES)
3879 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003880 .Default(false);
3881}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003882
Eric Christopherd9832702015-06-29 21:00:05 +00003883// We can't use a generic validation scheme for the features accepted here
3884// versus subtarget features accepted in the target attribute because the
3885// bitfield structure that's initialized in the runtime only supports the
3886// below currently rather than the full range of subtarget features. (See
3887// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3888bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3889 return llvm::StringSwitch<bool>(FeatureStr)
3890 .Case("cmov", true)
3891 .Case("mmx", true)
3892 .Case("popcnt", true)
3893 .Case("sse", true)
3894 .Case("sse2", true)
3895 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003896 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003897 .Case("sse4.1", true)
3898 .Case("sse4.2", true)
3899 .Case("avx", true)
3900 .Case("avx2", true)
3901 .Case("sse4a", true)
3902 .Case("fma4", true)
3903 .Case("xop", true)
3904 .Case("fma", true)
3905 .Case("avx512f", true)
3906 .Case("bmi", true)
3907 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003908 .Case("aes", true)
3909 .Case("pclmul", true)
3910 .Case("avx512vl", true)
3911 .Case("avx512bw", true)
3912 .Case("avx512dq", true)
3913 .Case("avx512cd", true)
3914 .Case("avx512er", true)
3915 .Case("avx512pf", true)
3916 .Case("avx512vbmi", true)
3917 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003918 .Default(false);
3919}
3920
Eli Friedman3fd920a2008-08-20 02:34:37 +00003921bool
Anders Carlsson58436352009-02-28 17:11:49 +00003922X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003923 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003924 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003925 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003926 // Constant constraints.
3927 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3928 // instructions.
3929 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3930 // x86_64 instructions.
3931 case 's':
3932 Info.setRequiresImmediate();
3933 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003934 case 'I':
3935 Info.setRequiresImmediate(0, 31);
3936 return true;
3937 case 'J':
3938 Info.setRequiresImmediate(0, 63);
3939 return true;
3940 case 'K':
3941 Info.setRequiresImmediate(-128, 127);
3942 return true;
3943 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003944 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003945 return true;
3946 case 'M':
3947 Info.setRequiresImmediate(0, 3);
3948 return true;
3949 case 'N':
3950 Info.setRequiresImmediate(0, 255);
3951 return true;
3952 case 'O':
3953 Info.setRequiresImmediate(0, 127);
3954 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003955 // Register constraints.
3956 case 'Y': // 'Y' is the first character for several 2-character constraints.
3957 // Shift the pointer to the second character of the constraint.
3958 Name++;
3959 switch (*Name) {
3960 default:
3961 return false;
3962 case '0': // First SSE register.
3963 case 't': // Any SSE register, when SSE2 is enabled.
3964 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3965 case 'm': // Any MMX register, when inter-unit moves enabled.
3966 Info.setAllowsRegister();
3967 return true;
3968 }
3969 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003970 // Constraint 'f' cannot be used for output operands.
3971 if (Info.ConstraintStr[0] == '=')
3972 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003973 Info.setAllowsRegister();
3974 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003975 case 'a': // eax.
3976 case 'b': // ebx.
3977 case 'c': // ecx.
3978 case 'd': // edx.
3979 case 'S': // esi.
3980 case 'D': // edi.
3981 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003982 case 't': // Top of floating point stack.
3983 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003984 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003985 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003986 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003987 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003988 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3989 case 'l': // "Index" registers: any general register that can be used as an
3990 // index in a base+index memory access.
3991 Info.setAllowsRegister();
3992 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003993 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003994 case 'C': // SSE floating point constant.
3995 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003996 return true;
3997 }
3998}
3999
Akira Hatanaka974131e2014-09-18 18:17:18 +00004000bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4001 unsigned Size) const {
4002 // Strip off constraint modifiers.
4003 while (Constraint[0] == '=' ||
4004 Constraint[0] == '+' ||
4005 Constraint[0] == '&')
4006 Constraint = Constraint.substr(1);
4007
4008 return validateOperandSize(Constraint, Size);
4009}
4010
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004011bool X86TargetInfo::validateInputSize(StringRef Constraint,
4012 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004013 return validateOperandSize(Constraint, Size);
4014}
4015
4016bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4017 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004018 switch (Constraint[0]) {
4019 default: break;
4020 case 'y':
4021 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004022 case 'f':
4023 case 't':
4024 case 'u':
4025 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004026 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004027 if (SSELevel >= AVX512F)
4028 // 512-bit zmm registers can be used if target supports AVX512F.
4029 return Size <= 512U;
4030 else if (SSELevel >= AVX)
4031 // 256-bit ymm registers can be used if target supports AVX.
4032 return Size <= 256U;
4033 return Size <= 128U;
4034 case 'Y':
4035 // 'Y' is the first character for several 2-character constraints.
4036 switch (Constraint[1]) {
4037 default: break;
4038 case 'm':
4039 // 'Ym' is synonymous with 'y'.
4040 return Size <= 64;
4041 case 'i':
4042 case 't':
4043 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4044 if (SSELevel >= AVX512F)
4045 return Size <= 512U;
4046 else if (SSELevel >= AVX)
4047 return Size <= 256U;
4048 return SSELevel >= SSE2 && Size <= 128U;
4049 }
4050
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004051 }
4052
4053 return true;
4054}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004055
Eli Friedman3fd920a2008-08-20 02:34:37 +00004056std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004057X86TargetInfo::convertConstraint(const char *&Constraint) const {
4058 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004059 case 'a': return std::string("{ax}");
4060 case 'b': return std::string("{bx}");
4061 case 'c': return std::string("{cx}");
4062 case 'd': return std::string("{dx}");
4063 case 'S': return std::string("{si}");
4064 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004065 case 'p': // address
4066 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004067 case 't': // top of floating point stack.
4068 return std::string("{st}");
4069 case 'u': // second from top of floating point stack.
4070 return std::string("{st(1)}"); // second from top of floating point stack.
4071 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004072 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004073 }
4074}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004075
Eli Friedman3fd920a2008-08-20 02:34:37 +00004076// X86-32 generic target
4077class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004078public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004079 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4080 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004081 DoubleAlign = LongLongAlign = 32;
4082 LongDoubleWidth = 96;
4083 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004084 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004085 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004086 SizeType = UnsignedInt;
4087 PtrDiffType = SignedInt;
4088 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004089 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004090
4091 // Use fpret for all types.
4092 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4093 (1 << TargetInfo::Double) |
4094 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004095
4096 // x86-32 has atomics up to 8 bytes
4097 // FIXME: Check that we actually have cmpxchg8b before setting
4098 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4099 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004100 }
Craig Topper3164f332014-03-11 03:39:26 +00004101 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004102 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004103 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004104
Craig Topper3164f332014-03-11 03:39:26 +00004105 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004106 if (RegNo == 0) return 0;
4107 if (RegNo == 1) return 2;
4108 return -1;
4109 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004110 bool validateOperandSize(StringRef Constraint,
4111 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004112 switch (Constraint[0]) {
4113 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004114 case 'R':
4115 case 'q':
4116 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004117 case 'a':
4118 case 'b':
4119 case 'c':
4120 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004121 case 'S':
4122 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004123 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004124 case 'A':
4125 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004126 }
4127
Akira Hatanaka974131e2014-09-18 18:17:18 +00004128 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004129 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004130 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4131 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4132 Builtin::FirstTSBuiltin + 1);
4133 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004134};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004135
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004136class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4137public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004138 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4139 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004140
Craig Topper3164f332014-03-11 03:39:26 +00004141 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004142 unsigned Major, Minor, Micro;
4143 getTriple().getOSVersion(Major, Minor, Micro);
4144 // New NetBSD uses the default rounding mode.
4145 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4146 return X86_32TargetInfo::getFloatEvalMethod();
4147 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004148 return 1;
4149 }
4150};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004151
Eli Friedmane3aa4542009-07-05 18:47:56 +00004152class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4153public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004154 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4155 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004156 SizeType = UnsignedLong;
4157 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004158 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004159 }
4160};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004161
Eli Friedman9fa28852012-08-08 23:57:20 +00004162class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4163public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004164 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4165 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004166 SizeType = UnsignedLong;
4167 IntPtrType = SignedLong;
4168 PtrDiffType = SignedLong;
4169 }
4170};
Eli Friedman9fa28852012-08-08 23:57:20 +00004171
Torok Edwinb2b37c62009-06-30 17:10:35 +00004172class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004173public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004174 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4175 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004176 LongDoubleWidth = 128;
4177 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004178 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004179 MaxVectorAlign = 256;
4180 // The watchOS simulator uses the builtin bool type for Objective-C.
4181 llvm::Triple T = llvm::Triple(Triple);
4182 if (T.isWatchOS())
4183 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004184 SizeType = UnsignedLong;
4185 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004186 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004187 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004188 }
4189
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004190 bool handleTargetFeatures(std::vector<std::string> &Features,
4191 DiagnosticsEngine &Diags) override {
4192 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4193 Diags))
4194 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004195 // We now know the features we have: we can decide how to align vectors.
4196 MaxVectorAlign =
4197 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004198 return true;
4199 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004200};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004201
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004202// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004203class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004204public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004205 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4206 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004207 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004208 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004209 bool IsWinCOFF =
4210 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004211 resetDataLayout(IsWinCOFF
4212 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4213 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004214 }
Craig Topper3164f332014-03-11 03:39:26 +00004215 void getTargetDefines(const LangOptions &Opts,
4216 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004217 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4218 }
4219};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004220
4221// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004222class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004223public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004224 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4225 const TargetOptions &Opts)
4226 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004227 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004228 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4229 }
Craig Topper3164f332014-03-11 03:39:26 +00004230 void getTargetDefines(const LangOptions &Opts,
4231 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004232 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4233 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4234 // The value of the following reflects processor type.
4235 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4236 // We lost the original triple, so we use the default.
4237 Builder.defineMacro("_M_IX86", "600");
4238 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004239};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004240
David Majnemerae1ed0e2015-05-28 04:36:18 +00004241static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004242 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4243 // supports __declspec natively under -fms-extensions, but we define a no-op
4244 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004245 if (Opts.MicrosoftExt)
4246 Builder.defineMacro("__declspec", "__declspec");
4247 else
4248 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4249
4250 if (!Opts.MicrosoftExt) {
4251 // Provide macros for all the calling convention keywords. Provide both
4252 // single and double underscore prefixed variants. These are available on
4253 // x64 as well as x86, even though they have no effect.
4254 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4255 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004256 std::string GCCSpelling = "__attribute__((__";
4257 GCCSpelling += CC;
4258 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004259 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4260 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4261 }
4262 }
4263}
4264
David Majnemerae1ed0e2015-05-28 04:36:18 +00004265static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4266 Builder.defineMacro("__MSVCRT__");
4267 Builder.defineMacro("__MINGW32__");
4268 addCygMingDefines(Opts, Builder);
4269}
4270
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004271// x86-32 MinGW target
4272class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4273public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004274 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4275 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004276 void getTargetDefines(const LangOptions &Opts,
4277 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004278 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004279 DefineStd(Builder, "WIN32", Opts);
4280 DefineStd(Builder, "WINNT", Opts);
4281 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004282 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004283 }
4284};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004285
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004286// x86-32 Cygwin target
4287class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4288public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004289 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4290 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004291 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004292 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004293 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 +00004294 }
Craig Topper3164f332014-03-11 03:39:26 +00004295 void getTargetDefines(const LangOptions &Opts,
4296 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004297 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004298 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004299 Builder.defineMacro("__CYGWIN__");
4300 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004301 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004302 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004303 if (Opts.CPlusPlus)
4304 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004305 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004306};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004307
Chris Lattnerb986aba2010-04-11 19:29:39 +00004308// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004309class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004310public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004311 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004312 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004313 }
Craig Topper3164f332014-03-11 03:39:26 +00004314 void getTargetDefines(const LangOptions &Opts,
4315 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004316 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004317 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004318 }
4319};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004320
Alexey Bataevc99b0492015-11-25 09:24:26 +00004321// X86-32 MCU target
4322class MCUX86_32TargetInfo : public X86_32TargetInfo {
4323public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004324 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4325 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004326 LongDoubleWidth = 64;
4327 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004328 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 +00004329 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004330 }
4331
4332 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4333 // On MCU we support only C calling convention.
4334 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4335 }
4336
4337 void getTargetDefines(const LangOptions &Opts,
4338 MacroBuilder &Builder) const override {
4339 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4340 Builder.defineMacro("__iamcu");
4341 Builder.defineMacro("__iamcu__");
4342 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004343
4344 bool allowsLargerPreferedTypeAlignment() const override {
4345 return false;
4346 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004347};
4348
Douglas Gregor9fabd852011-07-01 22:41:14 +00004349// RTEMS Target
4350template<typename Target>
4351class RTEMSTargetInfo : public OSTargetInfo<Target> {
4352protected:
Craig Topper3164f332014-03-11 03:39:26 +00004353 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4354 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004355 // RTEMS defines; list based off of gcc output
4356
Douglas Gregor9fabd852011-07-01 22:41:14 +00004357 Builder.defineMacro("__rtems__");
4358 Builder.defineMacro("__ELF__");
4359 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004360
Douglas Gregor9fabd852011-07-01 22:41:14 +00004361public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004362 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4363 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004364 switch (Triple.getArch()) {
4365 default:
4366 case llvm::Triple::x86:
4367 // this->MCountName = ".mcount";
4368 break;
4369 case llvm::Triple::mips:
4370 case llvm::Triple::mipsel:
4371 case llvm::Triple::ppc:
4372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004374 // this->MCountName = "_mcount";
4375 break;
4376 case llvm::Triple::arm:
4377 // this->MCountName = "__mcount";
4378 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004380 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004381};
4382
Douglas Gregor9fabd852011-07-01 22:41:14 +00004383// x86-32 RTEMS target
4384class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4385public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004386 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4387 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004388 SizeType = UnsignedLong;
4389 IntPtrType = SignedLong;
4390 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004391 }
Craig Topper3164f332014-03-11 03:39:26 +00004392 void getTargetDefines(const LangOptions &Opts,
4393 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004394 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4395 Builder.defineMacro("__INTEL__");
4396 Builder.defineMacro("__rtems__");
4397 }
4398};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004399
Eli Friedman3fd920a2008-08-20 02:34:37 +00004400// x86-64 generic target
4401class X86_64TargetInfo : public X86TargetInfo {
4402public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004403 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4404 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004405 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004406 bool IsWinCOFF =
4407 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004408 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004409 LongDoubleWidth = 128;
4410 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004411 LargeArrayMinWidth = 128;
4412 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004413 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004414 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4415 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4416 IntPtrType = IsX32 ? SignedInt : SignedLong;
4417 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004418 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004419 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004420
Eric Christopher917e9522014-11-18 22:36:15 +00004421 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004422 resetDataLayout(IsX32
4423 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4424 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4425 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004426
4427 // Use fpret only for long double.
4428 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004429
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004430 // Use fp2ret for _Complex long double.
4431 ComplexLongDoubleUsesFP2Ret = true;
4432
Charles Davisc7d5c942015-09-17 20:55:33 +00004433 // Make __builtin_ms_va_list available.
4434 HasBuiltinMSVaList = true;
4435
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004436 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004437 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004438 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004439 }
Craig Topper3164f332014-03-11 03:39:26 +00004440 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004441 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004442 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004443
Craig Topper3164f332014-03-11 03:39:26 +00004444 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004445 if (RegNo == 0) return 0;
4446 if (RegNo == 1) return 1;
4447 return -1;
4448 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004449
Craig Topper3164f332014-03-11 03:39:26 +00004450 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004451 switch (CC) {
4452 case CC_C:
4453 case CC_Swift:
4454 case CC_X86VectorCall:
4455 case CC_IntelOclBicc:
4456 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004457 case CC_PreserveMost:
4458 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004459 return CCCR_OK;
4460 default:
4461 return CCCR_Warning;
4462 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004463 }
4464
Craig Topper3164f332014-03-11 03:39:26 +00004465 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004466 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004467 }
4468
Pavel Chupinfd223e12014-08-04 12:39:43 +00004469 // for x32 we need it here explicitly
4470 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004471 unsigned getUnwindWordWidth() const override { return 64; }
4472 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004473
4474 bool validateGlobalRegisterVariable(StringRef RegName,
4475 unsigned RegSize,
4476 bool &HasSizeMismatch) const override {
4477 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4478 // handle.
4479 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4480 // Check that the register size is 64-bit.
4481 HasSizeMismatch = RegSize != 64;
4482 return true;
4483 }
4484
4485 // Check if the register is a 32-bit register the backend can handle.
4486 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4487 HasSizeMismatch);
4488 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004489 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4490 return llvm::makeArrayRef(BuiltinInfoX86,
4491 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4492 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004493};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004494
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004495// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004496class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004497public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004498 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4499 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004500 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004501 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004502 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004503 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004504 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004505 SizeType = UnsignedLongLong;
4506 PtrDiffType = SignedLongLong;
4507 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004508 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004509
Craig Topper3164f332014-03-11 03:39:26 +00004510 void getTargetDefines(const LangOptions &Opts,
4511 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004512 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004513 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004514 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004515
Craig Topper3164f332014-03-11 03:39:26 +00004516 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004517 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004518 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004519
Craig Topper3164f332014-03-11 03:39:26 +00004520 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004521 switch (CC) {
4522 case CC_X86StdCall:
4523 case CC_X86ThisCall:
4524 case CC_X86FastCall:
4525 return CCCR_Ignore;
4526 case CC_C:
4527 case CC_X86VectorCall:
4528 case CC_IntelOclBicc:
4529 case CC_X86_64SysV:
4530 return CCCR_OK;
4531 default:
4532 return CCCR_Warning;
4533 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004534 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004535};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004536
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004537// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004538class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004539public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004540 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4541 const TargetOptions &Opts)
4542 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004543 LongDoubleWidth = LongDoubleAlign = 64;
4544 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004545 }
Craig Topper3164f332014-03-11 03:39:26 +00004546 void getTargetDefines(const LangOptions &Opts,
4547 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004548 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4549 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004550 Builder.defineMacro("_M_X64", "100");
4551 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004552 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004553};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004554
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004555// x86-64 MinGW target
4556class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4557public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004558 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4559 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004560 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4561 // with x86 FP ops. Weird.
4562 LongDoubleWidth = LongDoubleAlign = 128;
4563 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4564 }
4565
Craig Topper3164f332014-03-11 03:39:26 +00004566 void getTargetDefines(const LangOptions &Opts,
4567 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004568 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004569 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004570 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004571 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004572
4573 // GCC defines this macro when it is using __gxx_personality_seh0.
4574 if (!Opts.SjLjExceptions)
4575 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004576 }
4577};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004578
Yaron Kerend030d112015-07-22 17:38:19 +00004579// x86-64 Cygwin target
4580class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4581public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004582 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4583 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004584 TLSSupported = false;
4585 WCharType = UnsignedShort;
4586 }
4587 void getTargetDefines(const LangOptions &Opts,
4588 MacroBuilder &Builder) const override {
4589 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4590 Builder.defineMacro("__x86_64__");
4591 Builder.defineMacro("__CYGWIN__");
4592 Builder.defineMacro("__CYGWIN64__");
4593 addCygMingDefines(Opts, Builder);
4594 DefineStd(Builder, "unix", Opts);
4595 if (Opts.CPlusPlus)
4596 Builder.defineMacro("_GNU_SOURCE");
4597
4598 // GCC defines this macro when it is using __gxx_personality_seh0.
4599 if (!Opts.SjLjExceptions)
4600 Builder.defineMacro("__SEH__");
4601 }
4602};
4603
Eli Friedman2857ccb2009-07-01 03:36:11 +00004604class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4605public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004606 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4607 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004608 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004609 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4610 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004611 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004612 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004613 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004614 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004615
4616 bool handleTargetFeatures(std::vector<std::string> &Features,
4617 DiagnosticsEngine &Diags) override {
4618 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4619 Diags))
4620 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004621 // We now know the features we have: we can decide how to align vectors.
4622 MaxVectorAlign =
4623 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004624 return true;
4625 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004626};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004627
Eli Friedman245f2292009-07-05 22:31:18 +00004628class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4629public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004630 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4631 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004632 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004633 Int64Type = SignedLongLong;
4634 }
4635};
Eli Friedman245f2292009-07-05 22:31:18 +00004636
Eli Friedman9fa28852012-08-08 23:57:20 +00004637class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4638public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004639 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4640 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004641 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004642 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004643 }
4644};
Tim Northover9bb857a2013-01-31 12:13:10 +00004645
Eli Friedmanf05b7722008-08-20 07:44:10 +00004646class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004647 // Possible FPU choices.
4648 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004649 VFP2FPU = (1 << 0),
4650 VFP3FPU = (1 << 1),
4651 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004652 NeonFPU = (1 << 3),
4653 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004654 };
4655
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004656 // Possible HWDiv features.
4657 enum HWDivMode {
4658 HWDivThumb = (1 << 0),
4659 HWDivARM = (1 << 1)
4660 };
4661
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004662 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004663 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004664 }
4665
4666 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4667 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004668
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004669 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004670
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004671 StringRef CPUProfile;
4672 StringRef CPUAttr;
4673
Rafael Espindolaeb265472013-08-21 21:59:03 +00004674 enum {
4675 FP_Default,
4676 FP_VFP,
4677 FP_Neon
4678 } FPMath;
4679
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004680 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004681 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004682 unsigned ArchProfile;
4683 unsigned ArchVersion;
4684
Bernard Ogdenda13af32013-10-24 18:32:51 +00004685 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004686
Logan Chien57086ce2012-10-10 06:56:20 +00004687 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004688 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004689
4690 // Initialized via features.
4691 unsigned SoftFloat : 1;
4692 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004693
Bernard Ogden18b57012013-10-29 09:47:51 +00004694 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004695 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004696 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004697 unsigned Unaligned : 1;
4698
4699 enum {
4700 LDREX_B = (1 << 0), /// byte (8-bit)
4701 LDREX_H = (1 << 1), /// half (16-bit)
4702 LDREX_W = (1 << 2), /// word (32-bit)
4703 LDREX_D = (1 << 3), /// double (64-bit)
4704 };
4705
4706 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004707
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004708 // ACLE 6.5.1 Hardware floating point
4709 enum {
4710 HW_FP_HP = (1 << 1), /// half (16-bit)
4711 HW_FP_SP = (1 << 2), /// single (32-bit)
4712 HW_FP_DP = (1 << 3), /// double (64-bit)
4713 };
4714 uint32_t HW_FP;
4715
Chris Lattner5cc15e02010-03-03 19:03:45 +00004716 static const Builtin::Info BuiltinInfo[];
4717
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004718 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004719 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004720
4721 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004722 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004723
Renato Golin0201a9e2016-09-22 19:28:20 +00004724 // size_t is unsigned long on MachO-derived environments, NetBSD,
4725 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004726 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004727 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004728 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004729 SizeType = UnsignedLong;
4730 else
4731 SizeType = UnsignedInt;
4732
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004733 switch (T.getOS()) {
4734 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004735 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004736 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004737 break;
4738 case llvm::Triple::Win32:
4739 WCharType = UnsignedShort;
4740 break;
4741 case llvm::Triple::Linux:
4742 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004743 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4744 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004745 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004746 }
4747
4748 UseBitFieldTypeAlignment = true;
4749
4750 ZeroLengthBitfieldBoundary = 0;
4751
Tim Northover147cd2f2014-10-14 22:12:21 +00004752 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4753 // so set preferred for small types to 32.
4754 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004755 resetDataLayout(BigEndian
4756 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4757 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004758 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004759 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004760 resetDataLayout("e"
4761 "-m:w"
4762 "-p:32:32"
4763 "-i64:64"
4764 "-v128:64:128"
4765 "-a:0:32"
4766 "-n32"
4767 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004768 } else if (T.isOSNaCl()) {
4769 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004770 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004771 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004772 resetDataLayout(BigEndian
4773 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4774 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004775 }
4776
4777 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004778 }
4779
Tim Northover5627d392015-10-30 16:30:45 +00004780 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004781 const llvm::Triple &T = getTriple();
4782
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004783 IsAAPCS = false;
4784
Tim Northover5627d392015-10-30 16:30:45 +00004785 if (IsAAPCS16)
4786 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4787 else
4788 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004789
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004790 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004791 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004792 SizeType = UnsignedInt;
4793 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004794 SizeType = UnsignedLong;
4795
4796 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4797 WCharType = SignedInt;
4798
4799 // Do not respect the alignment of bit-field types when laying out
4800 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4801 UseBitFieldTypeAlignment = false;
4802
4803 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4804 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4805 /// gcc.
4806 ZeroLengthBitfieldBoundary = 32;
4807
Tim Northover5627d392015-10-30 16:30:45 +00004808 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4809 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004810 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004811 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004812 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004813 BigEndian
4814 ? "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 +00004815 : "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 +00004816 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004817 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004818 BigEndian
4819 ? "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 +00004820 : "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 +00004821
4822 // FIXME: Override "preferred align" for double and long long.
4823 }
4824
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004825 void setArchInfo() {
4826 StringRef ArchName = getTriple().getArchName();
4827
Renato Goline84b0002015-10-08 16:43:26 +00004828 ArchISA = llvm::ARM::parseArchISA(ArchName);
4829 CPU = llvm::ARM::getDefaultCPU(ArchName);
4830 unsigned AK = llvm::ARM::parseArch(ArchName);
4831 if (AK != llvm::ARM::AK_INVALID)
4832 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004833 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004834 }
4835
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004836 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 StringRef SubArch;
4838
4839 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004840 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004841 SubArch = llvm::ARM::getSubArch(ArchKind);
4842 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4843 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004844
4845 // cache CPU related strings
4846 CPUAttr = getCPUAttr();
4847 CPUProfile = getCPUProfile();
4848 }
4849
4850 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004851 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004852 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004853 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004854 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4855 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004856 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004857 if (ArchProfile == llvm::ARM::PK_M) {
4858 MaxAtomicPromoteWidth = 32;
4859 if (ShouldUseInlineAtomic)
4860 MaxAtomicInlineWidth = 32;
4861 }
4862 else {
4863 MaxAtomicPromoteWidth = 64;
4864 if (ShouldUseInlineAtomic)
4865 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004866 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004867 }
4868
4869 bool isThumb() const {
4870 return (ArchISA == llvm::ARM::IK_THUMB);
4871 }
4872
4873 bool supportsThumb() const {
4874 return CPUAttr.count('T') || ArchVersion >= 6;
4875 }
4876
4877 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004878 return CPUAttr.equals("6T2") ||
4879 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004880 }
4881
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004882 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004883 // For most sub-arches, the build attribute CPU name is enough.
4884 // For Cortex variants, it's slightly different.
4885 switch(ArchKind) {
4886 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004887 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004888 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004889 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004890 case llvm::ARM::AK_ARMV7S:
4891 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004892 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004893 return "7A";
4894 case llvm::ARM::AK_ARMV7R:
4895 return "7R";
4896 case llvm::ARM::AK_ARMV7M:
4897 return "7M";
4898 case llvm::ARM::AK_ARMV7EM:
4899 return "7EM";
4900 case llvm::ARM::AK_ARMV8A:
4901 return "8A";
4902 case llvm::ARM::AK_ARMV8_1A:
4903 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004904 case llvm::ARM::AK_ARMV8_2A:
4905 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004906 case llvm::ARM::AK_ARMV8MBaseline:
4907 return "8M_BASE";
4908 case llvm::ARM::AK_ARMV8MMainline:
4909 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004910 }
4911 }
4912
4913 StringRef getCPUProfile() const {
4914 switch(ArchProfile) {
4915 case llvm::ARM::PK_A:
4916 return "A";
4917 case llvm::ARM::PK_R:
4918 return "R";
4919 case llvm::ARM::PK_M:
4920 return "M";
4921 default:
4922 return "";
4923 }
4924 }
4925
Chris Lattner17df24e2008-04-21 18:56:49 +00004926public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004927 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004928 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4929 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004930
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004931 switch (getTriple().getOS()) {
4932 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004933 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004934 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004935 break;
4936 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004937 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004938 break;
4939 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004940
Renato Goline84b0002015-10-08 16:43:26 +00004941 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004942 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004943
Chris Lattner1a8f3942010-04-23 16:29:58 +00004944 // {} in inline assembly are neon specifiers, not assembly variant
4945 // specifiers.
4946 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004947
Eric Christopher0e261882014-12-05 01:06:59 +00004948 // FIXME: This duplicates code from the driver that sets the -target-abi
4949 // option - this code is used if -target-abi isn't passed and should
4950 // be unified in some way.
4951 if (Triple.isOSBinFormatMachO()) {
4952 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4953 // the frontend matches that.
4954 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4955 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004956 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004957 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004958 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004959 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004960 } else {
4961 setABI("apcs-gnu");
4962 }
4963 } else if (Triple.isOSWindows()) {
4964 // FIXME: this is invalid for WindowsCE
4965 setABI("aapcs");
4966 } else {
4967 // Select the default based on the platform.
4968 switch (Triple.getEnvironment()) {
4969 case llvm::Triple::Android:
4970 case llvm::Triple::GNUEABI:
4971 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004972 case llvm::Triple::MuslEABI:
4973 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004974 setABI("aapcs-linux");
4975 break;
4976 case llvm::Triple::EABIHF:
4977 case llvm::Triple::EABI:
4978 setABI("aapcs");
4979 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004980 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004981 setABI("apcs-gnu");
4982 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004983 default:
4984 if (Triple.getOS() == llvm::Triple::NetBSD)
4985 setABI("apcs-gnu");
4986 else
4987 setABI("aapcs");
4988 break;
4989 }
4990 }
John McCall86353412010-08-21 22:46:04 +00004991
4992 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004993 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004994
Renato Golin15b86152015-07-03 16:41:13 +00004995 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004996 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004997
James Molloya7139222012-03-12 09:14:10 +00004998 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004999 // the alignment of the zero-length bitfield is greater than the member
5000 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005001 // zero length bitfield.
5002 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005003
5004 if (Triple.getOS() == llvm::Triple::Linux ||
5005 Triple.getOS() == llvm::Triple::UnknownOS)
5006 this->MCountName =
5007 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005008 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005009
Alp Toker4925ba72014-06-07 23:30:42 +00005010 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005011
Craig Topper3164f332014-03-11 03:39:26 +00005012 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005013 ABI = Name;
5014
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005015 // The defaults (above) are for AAPCS, check if we need to change them.
5016 //
5017 // FIXME: We need support for -meabi... we could just mangle it into the
5018 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005019 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005020 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005021 return true;
5022 }
5023 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5024 setABIAAPCS();
5025 return true;
5026 }
5027 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005028 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005029
Renato Golinf5c4dec2015-05-27 13:33:00 +00005030 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005031 bool
5032 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5033 StringRef CPU,
5034 const std::vector<std::string> &FeaturesVec) const override {
5035
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005036 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005037 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005038
5039 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005040 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005041 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5042
5043 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005044 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005045 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5046
5047 for (const char *Feature : TargetFeatures)
5048 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005049 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005050
Eric Christopher007b0a02015-08-28 22:32:01 +00005051 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005052 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005053
Craig Topper3164f332014-03-11 03:39:26 +00005054 bool handleTargetFeatures(std::vector<std::string> &Features,
5055 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005056 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005057 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005058 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005059 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005060 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005061 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005062 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005063
Ranjeet Singhac08e532015-06-24 23:39:25 +00005064 // This does not diagnose illegal cases like having both
5065 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5066 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005067 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005068 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005069 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005070 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005071 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005072 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005073 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005074 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005075 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005076 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005077 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005078 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005079 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005080 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005081 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005082 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005083 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005084 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005085 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005086 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005087 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005088 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005089 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005090 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005091 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005092 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005093 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005094 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005095 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005096 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005097 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005098 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005099 } else if (Feature == "+strict-align") {
5100 Unaligned = 0;
5101 } else if (Feature == "+fp16") {
5102 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005103 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005104 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005105 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005106
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005107 switch (ArchVersion) {
5108 case 6:
5109 if (ArchProfile == llvm::ARM::PK_M)
5110 LDREX = 0;
5111 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5112 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5113 else
5114 LDREX = LDREX_W;
5115 break;
5116 case 7:
5117 if (ArchProfile == llvm::ARM::PK_M)
5118 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5119 else
5120 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5121 break;
5122 case 8:
5123 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5124 }
5125
Rafael Espindolaeb265472013-08-21 21:59:03 +00005126 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5127 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5128 return false;
5129 }
5130
5131 if (FPMath == FP_Neon)
5132 Features.push_back("+neonfp");
5133 else if (FPMath == FP_VFP)
5134 Features.push_back("-neonfp");
5135
Daniel Dunbar893d4752009-12-19 04:15:38 +00005136 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005137 auto Feature =
5138 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5139 if (Feature != Features.end())
5140 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005141
Rafael Espindolaeb265472013-08-21 21:59:03 +00005142 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005143 }
5144
Craig Topper3164f332014-03-11 03:39:26 +00005145 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005146 return llvm::StringSwitch<bool>(Feature)
5147 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005148 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005149 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005150 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005151 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005152 .Case("hwdiv", HWDiv & HWDivThumb)
5153 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005154 .Default(false);
5155 }
Renato Golin15b86152015-07-03 16:41:13 +00005156
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005157 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005158 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005159 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005160
Renato Golin15b86152015-07-03 16:41:13 +00005161 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005162 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005163 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005164 CPU = Name;
5165 return true;
5166 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005167
Craig Topper3164f332014-03-11 03:39:26 +00005168 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005169
Craig Topper3164f332014-03-11 03:39:26 +00005170 void getTargetDefines(const LangOptions &Opts,
5171 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005172 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005173 Builder.defineMacro("__arm");
5174 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005175 // For bare-metal none-eabi.
5176 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5177 getTriple().getEnvironment() == llvm::Triple::EABI)
5178 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005179
Chris Lattnerecd49032009-03-02 22:27:17 +00005180 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005181 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005182
5183 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5184 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005185 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005186 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5187
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005188 if (!CPUAttr.empty())
5189 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005190
5191 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005192 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005193 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005194
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005195 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005196 // ACLE 6.5.7 Crypto Extension
5197 if (Crypto)
5198 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5199 // ACLE 6.5.8 CRC32 Extension
5200 if (CRC)
5201 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5202 // ACLE 6.5.10 Numeric Maximum and Minimum
5203 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5204 // ACLE 6.5.9 Directed Rounding
5205 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005206 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005207
5208 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5209 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005210 // NOTE that the default profile is assumed to be 'A'
5211 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005212 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5213
Bradley Smithf4affc12016-03-03 13:52:22 +00005214 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5215 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5216 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5217 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005218 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005219 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005220 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005221 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5222
5223 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5224 // instruction set such as ARM or Thumb.
5225 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5226
5227 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5228
5229 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005230 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005231 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005232
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005233 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005234 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005235 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005236
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005237 // ACLE 6.4.4 LDREX/STREX
5238 if (LDREX)
5239 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5240
5241 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005242 if (ArchVersion == 5 ||
5243 (ArchVersion == 6 && CPUProfile != "M") ||
5244 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005245 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5246
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005247 // ACLE 6.5.1 Hardware Floating Point
5248 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005249 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005250
Yi Konga44c4d72014-06-27 21:25:42 +00005251 // ACLE predefines.
5252 Builder.defineMacro("__ARM_ACLE", "200");
5253
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005254 // FP16 support (we currently only support IEEE format).
5255 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5256 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5257
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005258 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005259 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5261
Mike Stump9d54bd72009-04-08 02:07:04 +00005262 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005263
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005264 // FIXME: It's more complicated than this and we don't really support
5265 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005266 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005267 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005268 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005269
David Tweed8f676532012-10-25 13:33:01 +00005270 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005271 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005272 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005273 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005274 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005275 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005276 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005277
Tim Northover28fc0e12016-04-28 13:59:55 +00005278 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5279 ABI == "aapcs16")
5280 Builder.defineMacro("__ARM_PCS_VFP", "1");
5281
Daniel Dunbar893d4752009-12-19 04:15:38 +00005282 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005283 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005284
Zijiao Ma56a83722016-08-17 02:13:33 +00005285 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005286 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005287
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005288 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005289 Builder.defineMacro("__THUMBEL__");
5290 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005291 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005292 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005293 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005294
5295 // ACLE 6.4.9 32-bit SIMD instructions
5296 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5297 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5298
5299 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005300 if (((HWDiv & HWDivThumb) && isThumb()) ||
5301 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005302 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005303 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005304 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005305
5306 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005307 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005308
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005309 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005310 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005311 if (FPU & VFP2FPU)
5312 Builder.defineMacro("__ARM_VFPV2__");
5313 if (FPU & VFP3FPU)
5314 Builder.defineMacro("__ARM_VFPV3__");
5315 if (FPU & VFP4FPU)
5316 Builder.defineMacro("__ARM_VFPV4__");
5317 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005318
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005319 // This only gets set when Neon instructions are actually available, unlike
5320 // the VFP define, hence the soft float and arch check. This is subtly
5321 // different from gcc, we follow the intent which was that it should be set
5322 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005323 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005324 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005325 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005326 // current AArch32 NEON implementations do not support double-precision
5327 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005328 Builder.defineMacro("__ARM_NEON_FP",
5329 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005330 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005331
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005332 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5333 Opts.ShortWChar ? "2" : "4");
5334
5335 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5336 Opts.ShortEnums ? "1" : "4");
5337
Bradley Smithf4affc12016-03-03 13:52:22 +00005338 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5340 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5341 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5342 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5343 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005344
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005345 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005346 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005347 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005348 }
5349
5350 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005351 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005352 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5353 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005354 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005355 }
5356
5357 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005358 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005359 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005360
5361 if (Opts.UnsafeFPMath)
5362 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005363
5364 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5365 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005366 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005367
Craig Topper6c03a542015-10-19 04:51:35 +00005368 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5369 return llvm::makeArrayRef(BuiltinInfo,
5370 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005371 }
Craig Topper3164f332014-03-11 03:39:26 +00005372 bool isCLZForZeroUndef() const override { return false; }
5373 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005374 return IsAAPCS
5375 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005376 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5377 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005378 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005379 ArrayRef<const char *> getGCCRegNames() const override;
5380 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005381 bool validateAsmConstraint(const char *&Name,
5382 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005383 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005384 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005385 case 'l': // r0-r7
5386 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005387 case 't': // VFP Floating point register single precision
5388 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005389 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005390 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005391 case 'I':
5392 case 'J':
5393 case 'K':
5394 case 'L':
5395 case 'M':
5396 // FIXME
5397 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005398 case 'Q': // A memory address that is a single base register.
5399 Info.setAllowsMemory();
5400 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005401 case 'U': // a memory reference...
5402 switch (Name[1]) {
5403 case 'q': // ...ARMV4 ldrsb
5404 case 'v': // ...VFP load/store (reg+constant offset)
5405 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005406 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005407 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005408 case 'n': // valid address for Neon doubleword vector load/store
5409 case 'm': // valid address for Neon element and structure load/store
5410 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005411 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005412 Info.setAllowsMemory();
5413 Name++;
5414 return true;
5415 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005416 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005417 return false;
5418 }
Craig Topper3164f332014-03-11 03:39:26 +00005419 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005420 std::string R;
5421 switch (*Constraint) {
5422 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005423 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005424 Constraint++;
5425 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005426 case 'p': // 'p' should be translated to 'r' by default.
5427 R = std::string("r");
5428 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005429 default:
5430 return std::string(1, *Constraint);
5431 }
5432 return R;
5433 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005434 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005435 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005436 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005437 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005438 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005439
Bill Wendling9d1ee112012-10-25 23:28:48 +00005440 // Strip off constraint modifiers.
5441 while (Constraint[0] == '=' ||
5442 Constraint[0] == '+' ||
5443 Constraint[0] == '&')
5444 Constraint = Constraint.substr(1);
5445
5446 switch (Constraint[0]) {
5447 default: break;
5448 case 'r': {
5449 switch (Modifier) {
5450 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005451 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005452 case 'q':
5453 // A register of size 32 cannot fit a vector type.
5454 return false;
5455 }
5456 }
5457 }
5458
5459 return true;
5460 }
Craig Topper3164f332014-03-11 03:39:26 +00005461 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005462 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005463 return "";
5464 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005465
Craig Topper3164f332014-03-11 03:39:26 +00005466 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005467 switch (CC) {
5468 case CC_AAPCS:
5469 case CC_AAPCS_VFP:
5470 case CC_Swift:
5471 return CCCR_OK;
5472 default:
5473 return CCCR_Warning;
5474 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005475 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005476
Craig Topper3164f332014-03-11 03:39:26 +00005477 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005478 if (RegNo == 0) return 0;
5479 if (RegNo == 1) return 1;
5480 return -1;
5481 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005482
5483 bool hasSjLjLowering() const override {
5484 return true;
5485 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005486};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005487
Rafael Espindolaeb265472013-08-21 21:59:03 +00005488bool ARMTargetInfo::setFPMath(StringRef Name) {
5489 if (Name == "neon") {
5490 FPMath = FP_Neon;
5491 return true;
5492 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5493 Name == "vfp4") {
5494 FPMath = FP_VFP;
5495 return true;
5496 }
5497 return false;
5498}
5499
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005500const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005501 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005502 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005503 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5504
5505 // Float registers
5506 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5507 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5508 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005509 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005510
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005511 // Double registers
5512 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5513 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005514 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5515 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005516
5517 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005518 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5519 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005520};
5521
Craig Topperf054e3a2015-10-19 03:52:27 +00005522ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5523 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005524}
5525
5526const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005527 { { "a1" }, "r0" },
5528 { { "a2" }, "r1" },
5529 { { "a3" }, "r2" },
5530 { { "a4" }, "r3" },
5531 { { "v1" }, "r4" },
5532 { { "v2" }, "r5" },
5533 { { "v3" }, "r6" },
5534 { { "v4" }, "r7" },
5535 { { "v5" }, "r8" },
5536 { { "v6", "rfp" }, "r9" },
5537 { { "sl" }, "r10" },
5538 { { "fp" }, "r11" },
5539 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005540 { { "r13" }, "sp" },
5541 { { "r14" }, "lr" },
5542 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005543 // The S, D and Q registers overlap, but aren't really aliases; we
5544 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005545};
5546
Craig Topperf054e3a2015-10-19 03:52:27 +00005547ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5548 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005549}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005550
5551const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005552#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005553 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005554#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5555 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005556#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005557
Craig Topper07d3b622015-08-07 05:14:44 +00005558#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005559 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005560#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005561 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005562#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5563 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005564#include "clang/Basic/BuiltinsARM.def"
5565};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005566
5567class ARMleTargetInfo : public ARMTargetInfo {
5568public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005569 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005570 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005571 void getTargetDefines(const LangOptions &Opts,
5572 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005573 Builder.defineMacro("__ARMEL__");
5574 ARMTargetInfo::getTargetDefines(Opts, Builder);
5575 }
5576};
5577
5578class ARMbeTargetInfo : public ARMTargetInfo {
5579public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005580 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005581 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005582 void getTargetDefines(const LangOptions &Opts,
5583 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005584 Builder.defineMacro("__ARMEB__");
5585 Builder.defineMacro("__ARM_BIG_ENDIAN");
5586 ARMTargetInfo::getTargetDefines(Opts, Builder);
5587 }
5588};
Chris Lattner17df24e2008-04-21 18:56:49 +00005589
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005590class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5591 const llvm::Triple Triple;
5592public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005593 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5594 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005595 WCharType = UnsignedShort;
5596 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005597 }
5598 void getVisualStudioDefines(const LangOptions &Opts,
5599 MacroBuilder &Builder) const {
5600 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5601
5602 // FIXME: this is invalid for WindowsCE
5603 Builder.defineMacro("_M_ARM_NT", "1");
5604 Builder.defineMacro("_M_ARMT", "_M_ARM");
5605 Builder.defineMacro("_M_THUMB", "_M_ARM");
5606
5607 assert((Triple.getArch() == llvm::Triple::arm ||
5608 Triple.getArch() == llvm::Triple::thumb) &&
5609 "invalid architecture for Windows ARM target info");
5610 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5611 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5612
5613 // TODO map the complete set of values
5614 // 31: VFPv3 40: VFPv4
5615 Builder.defineMacro("_M_ARM_FP", "31");
5616 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005617 BuiltinVaListKind getBuiltinVaListKind() const override {
5618 return TargetInfo::CharPtrBuiltinVaList;
5619 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005620 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5621 switch (CC) {
5622 case CC_X86StdCall:
5623 case CC_X86ThisCall:
5624 case CC_X86FastCall:
5625 case CC_X86VectorCall:
5626 return CCCR_Ignore;
5627 case CC_C:
5628 return CCCR_OK;
5629 default:
5630 return CCCR_Warning;
5631 }
5632 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005633};
5634
5635// Windows ARM + Itanium C++ ABI Target
5636class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5637public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005638 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5639 const TargetOptions &Opts)
5640 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005641 TheCXXABI.set(TargetCXXABI::GenericARM);
5642 }
5643
5644 void getTargetDefines(const LangOptions &Opts,
5645 MacroBuilder &Builder) const override {
5646 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5647
5648 if (Opts.MSVCCompat)
5649 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5650 }
5651};
5652
5653// Windows ARM, MS (C++) ABI
5654class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5655public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005656 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5657 const TargetOptions &Opts)
5658 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005659 TheCXXABI.set(TargetCXXABI::Microsoft);
5660 }
5661
5662 void getTargetDefines(const LangOptions &Opts,
5663 MacroBuilder &Builder) const override {
5664 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5665 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5666 }
5667};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005668
Yaron Keren321249c2015-07-15 13:32:23 +00005669// ARM MinGW target
5670class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005672 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5673 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005674 TheCXXABI.set(TargetCXXABI::GenericARM);
5675 }
5676
5677 void getTargetDefines(const LangOptions &Opts,
5678 MacroBuilder &Builder) const override {
5679 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5680 DefineStd(Builder, "WIN32", Opts);
5681 DefineStd(Builder, "WINNT", Opts);
5682 Builder.defineMacro("_ARM_");
5683 addMinGWDefines(Opts, Builder);
5684 }
5685};
5686
5687// ARM Cygwin target
5688class CygwinARMTargetInfo : public ARMleTargetInfo {
5689public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005690 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5691 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005692 TLSSupported = false;
5693 WCharType = UnsignedShort;
5694 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005695 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005696 }
5697 void getTargetDefines(const LangOptions &Opts,
5698 MacroBuilder &Builder) const override {
5699 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5700 Builder.defineMacro("_ARM_");
5701 Builder.defineMacro("__CYGWIN__");
5702 Builder.defineMacro("__CYGWIN32__");
5703 DefineStd(Builder, "unix", Opts);
5704 if (Opts.CPlusPlus)
5705 Builder.defineMacro("_GNU_SOURCE");
5706 }
5707};
5708
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005709class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005710protected:
Craig Topper3164f332014-03-11 03:39:26 +00005711 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5712 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005713 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005714 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005715
Torok Edwinb2b37c62009-06-30 17:10:35 +00005716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005717 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5718 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005719 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005720 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005721 // FIXME: This should be based off of the target features in
5722 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005723 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005724
Tim Northoverd88ecb32016-01-27 19:32:40 +00005725 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005726 // Darwin on iOS uses a variant of the ARM C++ ABI.
5727 TheCXXABI.set(TargetCXXABI::WatchOS);
5728
5729 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5730 // size_t is long, it's a bit weird for it to be int.
5731 PtrDiffType = SignedLong;
5732
5733 // BOOL should be a real boolean on the new ABI
5734 UseSignedCharForObjCBool = false;
5735 } else
5736 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005737 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005738};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005739
Tim Northover573cbee2014-05-24 12:52:07 +00005740class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005741 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005742 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5743 static const char *const GCCRegNames[];
5744
James Molloy75f5f9e2014-04-16 15:33:48 +00005745 enum FPUModeEnum {
5746 FPUMode,
5747 NeonMode
5748 };
5749
5750 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005751 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005752 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005753 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005754 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005755
Tim Northovera2ee4332014-03-29 15:09:45 +00005756 static const Builtin::Info BuiltinInfo[];
5757
5758 std::string ABI;
5759
5760public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005761 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005762 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005763 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5764 WCharType = SignedInt;
5765
5766 // NetBSD apparently prefers consistency across ARM targets to consistency
5767 // across 64-bit targets.
5768 Int64Type = SignedLongLong;
5769 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005770 } else {
5771 WCharType = UnsignedInt;
5772 Int64Type = SignedLong;
5773 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005774 }
5775
Tim Northovera2ee4332014-03-29 15:09:45 +00005776 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005777 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005778 MaxAtomicInlineWidth = 128;
5779 MaxAtomicPromoteWidth = 128;
5780
Tim Northovera6a19f12015-02-06 01:25:07 +00005781 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005782 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5783
Tim Northovera2ee4332014-03-29 15:09:45 +00005784 // {} in inline assembly are neon specifiers, not assembly variant
5785 // specifiers.
5786 NoAsmVariants = true;
5787
Tim Northover7ad87af2015-01-16 18:44:04 +00005788 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5789 // contributes to the alignment of the containing aggregate in the same way
5790 // a plain (non bit-field) member of that type would, without exception for
5791 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005792 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005793 UseZeroLengthBitfieldAlignment = true;
5794
Tim Northover573cbee2014-05-24 12:52:07 +00005795 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005796 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005797
5798 if (Triple.getOS() == llvm::Triple::Linux ||
5799 Triple.getOS() == llvm::Triple::UnknownOS)
5800 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005801 }
5802
Alp Toker4925ba72014-06-07 23:30:42 +00005803 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005804 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005805 if (Name != "aapcs" && Name != "darwinpcs")
5806 return false;
5807
5808 ABI = Name;
5809 return true;
5810 }
5811
David Blaikie1cbb9712014-11-14 19:09:44 +00005812 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005813 return Name == "generic" ||
5814 llvm::AArch64::parseCPUArch(Name) !=
5815 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005816 }
5817
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005818 void getTargetDefines(const LangOptions &Opts,
5819 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005820 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005821 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005822
5823 // Target properties.
5824 Builder.defineMacro("_LP64");
5825 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005826
5827 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5828 Builder.defineMacro("__ARM_ACLE", "200");
5829 Builder.defineMacro("__ARM_ARCH", "8");
5830 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5831
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005832 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005833 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005834 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005835
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005836 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5837 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5838 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5839 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005840 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005841 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5842 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005843
5844 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5845
5846 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005847 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005848
5849 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5850 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005851 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5852 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005853
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005854 if (Opts.UnsafeFPMath)
5855 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005856
5857 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5858
5859 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5860 Opts.ShortEnums ? "1" : "4");
5861
James Molloy75f5f9e2014-04-16 15:33:48 +00005862 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005863 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005864 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005865 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005866 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005867
Bradley Smith418c5932014-05-02 15:17:51 +00005868 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005869 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005870
James Molloy75f5f9e2014-04-16 15:33:48 +00005871 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005872 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5873
5874 if (Unaligned)
5875 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005876
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005877 if (V8_1A)
5878 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5879
Reid Klecknerd167d422015-05-06 15:31:46 +00005880 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5881 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5882 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5883 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5884 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005885 }
5886
Craig Topper6c03a542015-10-19 04:51:35 +00005887 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5888 return llvm::makeArrayRef(BuiltinInfo,
5889 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005890 }
5891
David Blaikie1cbb9712014-11-14 19:09:44 +00005892 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005893 return Feature == "aarch64" ||
5894 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005895 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005896 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005897 }
5898
James Molloy5e73df52014-04-16 15:06:20 +00005899 bool handleTargetFeatures(std::vector<std::string> &Features,
5900 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005901 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005902 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005903 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005904 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005905 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005906
Eric Christopher610fe112015-08-26 08:21:55 +00005907 for (const auto &Feature : Features) {
5908 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005909 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005910 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005911 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005912 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005913 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005914 if (Feature == "+strict-align")
5915 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005916 if (Feature == "+v8.1a")
5917 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005918 }
5919
James Y Knightb214cbc2016-03-04 19:00:41 +00005920 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005921
5922 return true;
5923 }
5924
John McCall477f2bb2016-03-03 06:39:32 +00005925 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5926 switch (CC) {
5927 case CC_C:
5928 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005929 case CC_PreserveMost:
5930 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005931 return CCCR_OK;
5932 default:
5933 return CCCR_Warning;
5934 }
5935 }
5936
David Blaikie1cbb9712014-11-14 19:09:44 +00005937 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005938
David Blaikie1cbb9712014-11-14 19:09:44 +00005939 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005940 return TargetInfo::AArch64ABIBuiltinVaList;
5941 }
5942
Craig Topperf054e3a2015-10-19 03:52:27 +00005943 ArrayRef<const char *> getGCCRegNames() const override;
5944 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005945
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005946 bool validateAsmConstraint(const char *&Name,
5947 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005948 switch (*Name) {
5949 default:
5950 return false;
5951 case 'w': // Floating point and SIMD registers (V0-V31)
5952 Info.setAllowsRegister();
5953 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005954 case 'I': // Constant that can be used with an ADD instruction
5955 case 'J': // Constant that can be used with a SUB instruction
5956 case 'K': // Constant that can be used with a 32-bit logical instruction
5957 case 'L': // Constant that can be used with a 64-bit logical instruction
5958 case 'M': // Constant that can be used as a 32-bit MOV immediate
5959 case 'N': // Constant that can be used as a 64-bit MOV immediate
5960 case 'Y': // Floating point constant zero
5961 case 'Z': // Integer constant zero
5962 return true;
5963 case 'Q': // A memory reference with base register and no offset
5964 Info.setAllowsMemory();
5965 return true;
5966 case 'S': // A symbolic address
5967 Info.setAllowsRegister();
5968 return true;
5969 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005970 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5971 // Utf: A memory address suitable for ldp/stp in TF mode.
5972 // Usa: An absolute symbolic address.
5973 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5974 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005975 case 'z': // Zero register, wzr or xzr
5976 Info.setAllowsRegister();
5977 return true;
5978 case 'x': // Floating point and SIMD registers (V0-V15)
5979 Info.setAllowsRegister();
5980 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005981 }
5982 return false;
5983 }
5984
Akira Hatanaka987f1862014-08-22 06:05:21 +00005985 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005986 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005987 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005988 // Strip off constraint modifiers.
5989 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5990 Constraint = Constraint.substr(1);
5991
5992 switch (Constraint[0]) {
5993 default:
5994 return true;
5995 case 'z':
5996 case 'r': {
5997 switch (Modifier) {
5998 case 'x':
5999 case 'w':
6000 // For now assume that the person knows what they're
6001 // doing with the modifier.
6002 return true;
6003 default:
6004 // By default an 'r' constraint will be in the 'x'
6005 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006006 if (Size == 64)
6007 return true;
6008
6009 SuggestedModifier = "w";
6010 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006011 }
6012 }
6013 }
6014 }
6015
David Blaikie1cbb9712014-11-14 19:09:44 +00006016 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006017
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006018 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006019 if (RegNo == 0)
6020 return 0;
6021 if (RegNo == 1)
6022 return 1;
6023 return -1;
6024 }
6025};
6026
Tim Northover573cbee2014-05-24 12:52:07 +00006027const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006028 // 32-bit Integer registers
6029 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6030 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6031 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6032
6033 // 64-bit Integer registers
6034 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6035 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6036 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6037
6038 // 32-bit floating point regsisters
6039 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6040 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6041 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6042
6043 // 64-bit floating point regsisters
6044 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6045 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6046 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6047
6048 // Vector registers
6049 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6050 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6051 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6052};
6053
Craig Topperf054e3a2015-10-19 03:52:27 +00006054ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6055 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006056}
6057
Tim Northover573cbee2014-05-24 12:52:07 +00006058const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006059 { { "w31" }, "wsp" },
6060 { { "x29" }, "fp" },
6061 { { "x30" }, "lr" },
6062 { { "x31" }, "sp" },
6063 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6064 // don't want to substitute one of these for a different-sized one.
6065};
6066
Craig Topperf054e3a2015-10-19 03:52:27 +00006067ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6068 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006069}
6070
Tim Northover573cbee2014-05-24 12:52:07 +00006071const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006072#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006073 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006074#include "clang/Basic/BuiltinsNEON.def"
6075
6076#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006077 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006078#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006079};
James Molloy5e73df52014-04-16 15:06:20 +00006080
Tim Northover573cbee2014-05-24 12:52:07 +00006081class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006082 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006083 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006084 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006085 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006086 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006087 }
6088
6089public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006090 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6091 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006092 }
James Molloy5e73df52014-04-16 15:06:20 +00006093 void getTargetDefines(const LangOptions &Opts,
6094 MacroBuilder &Builder) const override {
6095 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006096 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006097 }
6098};
6099
Tim Northover573cbee2014-05-24 12:52:07 +00006100class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006101 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006102 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006103 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006104 }
6105
6106public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006107 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6108 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006109 void getTargetDefines(const LangOptions &Opts,
6110 MacroBuilder &Builder) const override {
6111 Builder.defineMacro("__AARCH64EB__");
6112 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6113 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006114 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006115 }
6116};
Tim Northovera2ee4332014-03-29 15:09:45 +00006117
Tim Northover573cbee2014-05-24 12:52:07 +00006118class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006119protected:
6120 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6121 MacroBuilder &Builder) const override {
6122 Builder.defineMacro("__AARCH64_SIMD__");
6123 Builder.defineMacro("__ARM64_ARCH_8__");
6124 Builder.defineMacro("__ARM_NEON__");
6125 Builder.defineMacro("__LITTLE_ENDIAN__");
6126 Builder.defineMacro("__REGISTER_PREFIX__", "");
6127 Builder.defineMacro("__arm64", "1");
6128 Builder.defineMacro("__arm64__", "1");
6129
6130 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6131 }
6132
Tim Northovera2ee4332014-03-29 15:09:45 +00006133public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006134 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6135 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006136 Int64Type = SignedLongLong;
6137 WCharType = SignedInt;
6138 UseSignedCharForObjCBool = false;
6139
Tim Northovera6a19f12015-02-06 01:25:07 +00006140 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006141 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6142
6143 TheCXXABI.set(TargetCXXABI::iOS64);
6144 }
6145
David Blaikie1cbb9712014-11-14 19:09:44 +00006146 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006147 return TargetInfo::CharPtrBuiltinVaList;
6148 }
6149};
Tim Northovera2ee4332014-03-29 15:09:45 +00006150
Tony Linthicum76329bf2011-12-12 21:14:55 +00006151// Hexagon abstract base class
6152class HexagonTargetInfo : public TargetInfo {
6153 static const Builtin::Info BuiltinInfo[];
6154 static const char * const GCCRegNames[];
6155 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6156 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006157 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006158 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006159
Tony Linthicum76329bf2011-12-12 21:14:55 +00006160public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006161 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6162 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006163 // Specify the vector alignment explicitly. For v512x1, the calculated
6164 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6165 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006166 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006167 "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 +00006168 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006169 SizeType = UnsignedInt;
6170 PtrDiffType = SignedInt;
6171 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006172
6173 // {} in inline assembly are packet specifiers, not assembly variant
6174 // specifiers.
6175 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006176
6177 LargeArrayMinWidth = 64;
6178 LargeArrayAlign = 64;
6179 UseBitFieldTypeAlignment = true;
6180 ZeroLengthBitfieldBoundary = 32;
6181 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006182 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006183 }
6184
Craig Topper6c03a542015-10-19 04:51:35 +00006185 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6186 return llvm::makeArrayRef(BuiltinInfo,
6187 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006188 }
6189
Craig Topper3164f332014-03-11 03:39:26 +00006190 bool validateAsmConstraint(const char *&Name,
6191 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006192 switch (*Name) {
6193 case 'v':
6194 case 'q':
6195 if (HasHVX) {
6196 Info.setAllowsRegister();
6197 return true;
6198 }
6199 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006200 case 's':
6201 // Relocatable constant.
6202 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006203 }
6204 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006205 }
6206
Craig Topper3164f332014-03-11 03:39:26 +00006207 void getTargetDefines(const LangOptions &Opts,
6208 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006209
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006210 bool isCLZForZeroUndef() const override { return false; }
6211
Craig Topper3164f332014-03-11 03:39:26 +00006212 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006213 return llvm::StringSwitch<bool>(Feature)
6214 .Case("hexagon", true)
6215 .Case("hvx", HasHVX)
6216 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006217 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006219 }
Craig Topper3164f332014-03-11 03:39:26 +00006220
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006221 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6222 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6223 const override;
6224
6225 bool handleTargetFeatures(std::vector<std::string> &Features,
6226 DiagnosticsEngine &Diags) override;
6227
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006228 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6229 bool Enabled) const override;
6230
Craig Topper3164f332014-03-11 03:39:26 +00006231 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006232 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006233 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006234 ArrayRef<const char *> getGCCRegNames() const override;
6235 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006236 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006237 return "";
6238 }
Sebastian Pop86500282012-01-13 20:37:10 +00006239
6240 static const char *getHexagonCPUSuffix(StringRef Name) {
6241 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006242 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006243 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006244 .Case("hexagonv55", "55")
6245 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006246 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006247 }
6248
Craig Topper3164f332014-03-11 03:39:26 +00006249 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006250 if (!getHexagonCPUSuffix(Name))
6251 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006252 CPU = Name;
6253 return true;
6254 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006255
6256 int getEHDataRegisterNumber(unsigned RegNo) const override {
6257 return RegNo < 2 ? RegNo : -1;
6258 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006259};
6260
6261void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006262 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006263 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006264 Builder.defineMacro("__hexagon__", "1");
6265
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006266 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006267 Builder.defineMacro("__HEXAGON_V4__");
6268 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006269 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006270 Builder.defineMacro("__QDSP6_V4__");
6271 Builder.defineMacro("__QDSP6_ARCH__", "4");
6272 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006273 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006274 Builder.defineMacro("__HEXAGON_V5__");
6275 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6276 if(Opts.HexagonQdsp6Compat) {
6277 Builder.defineMacro("__QDSP6_V5__");
6278 Builder.defineMacro("__QDSP6_ARCH__", "5");
6279 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006280 } else if (CPU == "hexagonv55") {
6281 Builder.defineMacro("__HEXAGON_V55__");
6282 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6283 Builder.defineMacro("__QDSP6_V55__");
6284 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006285 } else if (CPU == "hexagonv60") {
6286 Builder.defineMacro("__HEXAGON_V60__");
6287 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6288 Builder.defineMacro("__QDSP6_V60__");
6289 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006290 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006291
6292 if (hasFeature("hvx")) {
6293 Builder.defineMacro("__HVX__");
6294 if (hasFeature("hvx-double"))
6295 Builder.defineMacro("__HVXDBL__");
6296 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006297}
6298
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006299bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6300 DiagnosticsEngine &Diags, StringRef CPU,
6301 const std::vector<std::string> &FeaturesVec) const {
6302 // Default for v60: -hvx, -hvx-double.
6303 Features["hvx"] = false;
6304 Features["hvx-double"] = false;
6305 Features["long-calls"] = false;
6306
6307 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6308}
6309
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006310bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6311 DiagnosticsEngine &Diags) {
6312 for (auto &F : Features) {
6313 if (F == "+hvx")
6314 HasHVX = true;
6315 else if (F == "-hvx")
6316 HasHVX = HasHVXDouble = false;
6317 else if (F == "+hvx-double")
6318 HasHVX = HasHVXDouble = true;
6319 else if (F == "-hvx-double")
6320 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006321
6322 if (F == "+long-calls")
6323 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006324 else if (F == "-long-calls")
6325 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006326 }
6327 return true;
6328}
6329
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006330void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6331 StringRef Name, bool Enabled) const {
6332 if (Enabled) {
6333 if (Name == "hvx-double")
6334 Features["hvx"] = true;
6335 } else {
6336 if (Name == "hvx")
6337 Features["hvx-double"] = false;
6338 }
6339 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006340}
6341
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006342const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006343 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6344 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6345 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6346 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6347 "p0", "p1", "p2", "p3",
6348 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6349};
6350
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006351ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006352 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006353}
6354
Tony Linthicum76329bf2011-12-12 21:14:55 +00006355const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6356 { { "sp" }, "r29" },
6357 { { "fp" }, "r30" },
6358 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006359};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006360
Craig Topperf054e3a2015-10-19 03:52:27 +00006361ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6362 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006363}
6364
6365
6366const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006367#define BUILTIN(ID, TYPE, ATTRS) \
6368 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6369#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6370 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006371#include "clang/Basic/BuiltinsHexagon.def"
6372};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006373
Jacques Pienaard964cc22016-03-28 21:02:54 +00006374class LanaiTargetInfo : public TargetInfo {
6375 // Class for Lanai (32-bit).
6376 // The CPU profiles supported by the Lanai backend
6377 enum CPUKind {
6378 CK_NONE,
6379 CK_V11,
6380 } CPU;
6381
6382 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6383 static const char *const GCCRegNames[];
6384
6385public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006386 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6387 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006388 // Description string has to be kept in sync with backend.
6389 resetDataLayout("E" // Big endian
6390 "-m:e" // ELF name manging
6391 "-p:32:32" // 32 bit pointers, 32 bit aligned
6392 "-i64:64" // 64 bit integers, 64 bit aligned
6393 "-a:0:32" // 32 bit alignment of objects of aggregate type
6394 "-n32" // 32 bit native integer width
6395 "-S64" // 64 bit natural stack alignment
6396 );
6397
6398 // Setting RegParmMax equal to what mregparm was set to in the old
6399 // toolchain
6400 RegParmMax = 4;
6401
6402 // Set the default CPU to V11
6403 CPU = CK_V11;
6404
6405 // Temporary approach to make everything at least word-aligned and allow for
6406 // safely casting between pointers with different alignment requirements.
6407 // TODO: Remove this when there are no more cast align warnings on the
6408 // firmware.
6409 MinGlobalAlign = 32;
6410 }
6411
6412 void getTargetDefines(const LangOptions &Opts,
6413 MacroBuilder &Builder) const override {
6414 // Define __lanai__ when building for target lanai.
6415 Builder.defineMacro("__lanai__");
6416
6417 // Set define for the CPU specified.
6418 switch (CPU) {
6419 case CK_V11:
6420 Builder.defineMacro("__LANAI_V11__");
6421 break;
6422 case CK_NONE:
6423 llvm_unreachable("Unhandled target CPU");
6424 }
6425 }
6426
6427 bool setCPU(const std::string &Name) override {
6428 CPU = llvm::StringSwitch<CPUKind>(Name)
6429 .Case("v11", CK_V11)
6430 .Default(CK_NONE);
6431
6432 return CPU != CK_NONE;
6433 }
6434
6435 bool hasFeature(StringRef Feature) const override {
6436 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6437 }
6438
6439 ArrayRef<const char *> getGCCRegNames() const override;
6440
6441 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6442
6443 BuiltinVaListKind getBuiltinVaListKind() const override {
6444 return TargetInfo::VoidPtrBuiltinVaList;
6445 }
6446
6447 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6448
6449 bool validateAsmConstraint(const char *&Name,
6450 TargetInfo::ConstraintInfo &info) const override {
6451 return false;
6452 }
6453
6454 const char *getClobbers() const override { return ""; }
6455};
6456
6457const char *const LanaiTargetInfo::GCCRegNames[] = {
6458 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6459 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6460 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6461
6462ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6463 return llvm::makeArrayRef(GCCRegNames);
6464}
6465
6466const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6467 {{"pc"}, "r2"},
6468 {{"sp"}, "r4"},
6469 {{"fp"}, "r5"},
6470 {{"rv"}, "r8"},
6471 {{"rr1"}, "r10"},
6472 {{"rr2"}, "r11"},
6473 {{"rca"}, "r15"},
6474};
6475
6476ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6477 return llvm::makeArrayRef(GCCRegAliases);
6478}
6479
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006480// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6481class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006482 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6483 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006484 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006485public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006486 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006487 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006488
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006489 int getEHDataRegisterNumber(unsigned RegNo) const override {
6490 if (RegNo == 0) return 24;
6491 if (RegNo == 1) return 25;
6492 return -1;
6493 }
6494
Craig Topper3164f332014-03-11 03:39:26 +00006495 bool handleTargetFeatures(std::vector<std::string> &Features,
6496 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006497 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006498 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6499 if (Feature != Features.end()) {
6500 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006501 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006502 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006503 }
Craig Topper3164f332014-03-11 03:39:26 +00006504 void getTargetDefines(const LangOptions &Opts,
6505 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006506 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006507 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006508
6509 if (SoftFloat)
6510 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006511 }
Craig Topper3164f332014-03-11 03:39:26 +00006512
6513 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006514 return llvm::StringSwitch<bool>(Feature)
6515 .Case("softfloat", SoftFloat)
6516 .Case("sparc", true)
6517 .Default(false);
6518 }
Craig Topper3164f332014-03-11 03:39:26 +00006519
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006520 bool hasSjLjLowering() const override {
6521 return true;
6522 }
6523
Craig Topper6c03a542015-10-19 04:51:35 +00006524 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006525 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006526 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006527 }
Craig Topper3164f332014-03-11 03:39:26 +00006528 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006529 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006530 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006531 ArrayRef<const char *> getGCCRegNames() const override;
6532 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006533 bool validateAsmConstraint(const char *&Name,
6534 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006535 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006536 switch (*Name) {
6537 case 'I': // Signed 13-bit constant
6538 case 'J': // Zero
6539 case 'K': // 32-bit constant with the low 12 bits clear
6540 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6541 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6542 case 'N': // Same as 'K' but zext (required for SIMode)
6543 case 'O': // The constant 4096
6544 return true;
6545 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006546 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006547 }
Craig Topper3164f332014-03-11 03:39:26 +00006548 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006549 // FIXME: Implement!
6550 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006551 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006552
6553 // No Sparc V7 for now, the backend doesn't support it anyway.
6554 enum CPUKind {
6555 CK_GENERIC,
6556 CK_V8,
6557 CK_SUPERSPARC,
6558 CK_SPARCLITE,
6559 CK_F934,
6560 CK_HYPERSPARC,
6561 CK_SPARCLITE86X,
6562 CK_SPARCLET,
6563 CK_TSC701,
6564 CK_V9,
6565 CK_ULTRASPARC,
6566 CK_ULTRASPARC3,
6567 CK_NIAGARA,
6568 CK_NIAGARA2,
6569 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006570 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006571 CK_MYRIAD2100,
6572 CK_MYRIAD2150,
6573 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006574 CK_LEON2,
6575 CK_LEON2_AT697E,
6576 CK_LEON2_AT697F,
6577 CK_LEON3,
6578 CK_LEON3_UT699,
6579 CK_LEON3_GR712RC,
6580 CK_LEON4,
6581 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006582 } CPU = CK_GENERIC;
6583
6584 enum CPUGeneration {
6585 CG_V8,
6586 CG_V9,
6587 };
6588
6589 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6590 switch (Kind) {
6591 case CK_GENERIC:
6592 case CK_V8:
6593 case CK_SUPERSPARC:
6594 case CK_SPARCLITE:
6595 case CK_F934:
6596 case CK_HYPERSPARC:
6597 case CK_SPARCLITE86X:
6598 case CK_SPARCLET:
6599 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006600 case CK_MYRIAD2100:
6601 case CK_MYRIAD2150:
6602 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006603 case CK_LEON2:
6604 case CK_LEON2_AT697E:
6605 case CK_LEON2_AT697F:
6606 case CK_LEON3:
6607 case CK_LEON3_UT699:
6608 case CK_LEON3_GR712RC:
6609 case CK_LEON4:
6610 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006611 return CG_V8;
6612 case CK_V9:
6613 case CK_ULTRASPARC:
6614 case CK_ULTRASPARC3:
6615 case CK_NIAGARA:
6616 case CK_NIAGARA2:
6617 case CK_NIAGARA3:
6618 case CK_NIAGARA4:
6619 return CG_V9;
6620 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006621 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006622 }
6623
6624 CPUKind getCPUKind(StringRef Name) const {
6625 return llvm::StringSwitch<CPUKind>(Name)
6626 .Case("v8", CK_V8)
6627 .Case("supersparc", CK_SUPERSPARC)
6628 .Case("sparclite", CK_SPARCLITE)
6629 .Case("f934", CK_F934)
6630 .Case("hypersparc", CK_HYPERSPARC)
6631 .Case("sparclite86x", CK_SPARCLITE86X)
6632 .Case("sparclet", CK_SPARCLET)
6633 .Case("tsc701", CK_TSC701)
6634 .Case("v9", CK_V9)
6635 .Case("ultrasparc", CK_ULTRASPARC)
6636 .Case("ultrasparc3", CK_ULTRASPARC3)
6637 .Case("niagara", CK_NIAGARA)
6638 .Case("niagara2", CK_NIAGARA2)
6639 .Case("niagara3", CK_NIAGARA3)
6640 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006641 .Case("ma2100", CK_MYRIAD2100)
6642 .Case("ma2150", CK_MYRIAD2150)
6643 .Case("ma2450", CK_MYRIAD2450)
6644 // FIXME: the myriad2[.n] spellings are obsolete,
6645 // but a grace period is needed to allow updating dependent builds.
6646 .Case("myriad2", CK_MYRIAD2100)
6647 .Case("myriad2.1", CK_MYRIAD2100)
6648 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006649 .Case("leon2", CK_LEON2)
6650 .Case("at697e", CK_LEON2_AT697E)
6651 .Case("at697f", CK_LEON2_AT697F)
6652 .Case("leon3", CK_LEON3)
6653 .Case("ut699", CK_LEON3_UT699)
6654 .Case("gr712rc", CK_LEON3_GR712RC)
6655 .Case("leon4", CK_LEON4)
6656 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006657 .Default(CK_GENERIC);
6658 }
6659
6660 bool setCPU(const std::string &Name) override {
6661 CPU = getCPUKind(Name);
6662 return CPU != CK_GENERIC;
6663 }
Gabor Greif49991682008-02-21 16:29:08 +00006664};
6665
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006666const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006667 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6668 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6669 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6670 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6671};
6672
Craig Topperf054e3a2015-10-19 03:52:27 +00006673ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6674 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006675}
6676
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006677const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006678 { { "g0" }, "r0" },
6679 { { "g1" }, "r1" },
6680 { { "g2" }, "r2" },
6681 { { "g3" }, "r3" },
6682 { { "g4" }, "r4" },
6683 { { "g5" }, "r5" },
6684 { { "g6" }, "r6" },
6685 { { "g7" }, "r7" },
6686 { { "o0" }, "r8" },
6687 { { "o1" }, "r9" },
6688 { { "o2" }, "r10" },
6689 { { "o3" }, "r11" },
6690 { { "o4" }, "r12" },
6691 { { "o5" }, "r13" },
6692 { { "o6", "sp" }, "r14" },
6693 { { "o7" }, "r15" },
6694 { { "l0" }, "r16" },
6695 { { "l1" }, "r17" },
6696 { { "l2" }, "r18" },
6697 { { "l3" }, "r19" },
6698 { { "l4" }, "r20" },
6699 { { "l5" }, "r21" },
6700 { { "l6" }, "r22" },
6701 { { "l7" }, "r23" },
6702 { { "i0" }, "r24" },
6703 { { "i1" }, "r25" },
6704 { { "i2" }, "r26" },
6705 { { "i3" }, "r27" },
6706 { { "i4" }, "r28" },
6707 { { "i5" }, "r29" },
6708 { { "i6", "fp" }, "r30" },
6709 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006710};
6711
Craig Topperf054e3a2015-10-19 03:52:27 +00006712ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6713 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006714}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006715
6716// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6717class SparcV8TargetInfo : public SparcTargetInfo {
6718public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006719 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6720 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006721 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006722 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6723 switch (getTriple().getOS()) {
6724 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006725 SizeType = UnsignedInt;
6726 IntPtrType = SignedInt;
6727 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006728 break;
6729 case llvm::Triple::NetBSD:
6730 case llvm::Triple::OpenBSD:
6731 SizeType = UnsignedLong;
6732 IntPtrType = SignedLong;
6733 PtrDiffType = SignedLong;
6734 break;
Brad Smith56495d52015-08-13 22:00:53 +00006735 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006736 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006737 }
6738
Craig Topper3164f332014-03-11 03:39:26 +00006739 void getTargetDefines(const LangOptions &Opts,
6740 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006741 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006742 switch (getCPUGeneration(CPU)) {
6743 case CG_V8:
6744 Builder.defineMacro("__sparcv8");
6745 if (getTriple().getOS() != llvm::Triple::Solaris)
6746 Builder.defineMacro("__sparcv8__");
6747 break;
6748 case CG_V9:
6749 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006750 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006751 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006752 Builder.defineMacro("__sparc_v9__");
6753 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006754 break;
6755 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006756 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006757 std::string MyriadArchValue, Myriad2Value;
6758 Builder.defineMacro("__sparc_v8__");
6759 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006760 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006761 case CK_MYRIAD2150:
6762 MyriadArchValue = "__ma2150";
6763 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006764 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006765 case CK_MYRIAD2450:
6766 MyriadArchValue = "__ma2450";
6767 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006768 break;
6769 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006770 MyriadArchValue = "__ma2100";
6771 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006772 break;
6773 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006774 Builder.defineMacro(MyriadArchValue, "1");
6775 Builder.defineMacro(MyriadArchValue+"__", "1");
6776 Builder.defineMacro("__myriad2__", Myriad2Value);
6777 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006778 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006779 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006780
6781 bool hasSjLjLowering() const override {
6782 return true;
6783 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006784};
6785
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006786// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6787class SparcV8elTargetInfo : public SparcV8TargetInfo {
6788 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006789 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6790 : SparcV8TargetInfo(Triple, Opts) {
6791 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006792 }
6793};
6794
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006795// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6796class SparcV9TargetInfo : public SparcTargetInfo {
6797public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006798 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6799 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006800 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006801 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006802 // This is an LP64 platform.
6803 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006804
6805 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006806 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006807 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006808 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006809 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006810 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006811
6812 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6813 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6814 LongDoubleWidth = 128;
6815 LongDoubleAlign = 128;
6816 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006817 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006818 }
6819
Craig Topper3164f332014-03-11 03:39:26 +00006820 void getTargetDefines(const LangOptions &Opts,
6821 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006822 SparcTargetInfo::getTargetDefines(Opts, Builder);
6823 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006824 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006825 // Solaris doesn't need these variants, but the BSDs do.
6826 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006827 Builder.defineMacro("__sparc64__");
6828 Builder.defineMacro("__sparc_v9__");
6829 Builder.defineMacro("__sparcv9__");
6830 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006831 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006832
Craig Topper3164f332014-03-11 03:39:26 +00006833 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006834 if (!SparcTargetInfo::setCPU(Name))
6835 return false;
6836 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006837 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006838};
6839
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006840class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006841 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006842 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006843 std::string CPU;
6844 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006845 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006846
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006847public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006848 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006849 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6850 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006851 IntMaxType = SignedLong;
6852 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006853 TLSSupported = true;
6854 IntWidth = IntAlign = 32;
6855 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6856 PointerWidth = PointerAlign = 64;
6857 LongDoubleWidth = 128;
6858 LongDoubleAlign = 64;
6859 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006860 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006861 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006862 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 +00006863 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6864 }
6865 void getTargetDefines(const LangOptions &Opts,
6866 MacroBuilder &Builder) const override {
6867 Builder.defineMacro("__s390__");
6868 Builder.defineMacro("__s390x__");
6869 Builder.defineMacro("__zarch__");
6870 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006871
6872 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6873 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6874 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6875 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6876
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006877 if (HasTransactionalExecution)
6878 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006879 if (Opts.ZVector)
6880 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006881 }
Craig Topper6c03a542015-10-19 04:51:35 +00006882 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6883 return llvm::makeArrayRef(BuiltinInfo,
6884 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006885 }
6886
Craig Topperf054e3a2015-10-19 03:52:27 +00006887 ArrayRef<const char *> getGCCRegNames() const override;
6888 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006889 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006890 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006891 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006892 bool validateAsmConstraint(const char *&Name,
6893 TargetInfo::ConstraintInfo &info) const override;
6894 const char *getClobbers() const override {
6895 // FIXME: Is this really right?
6896 return "";
6897 }
6898 BuiltinVaListKind getBuiltinVaListKind() const override {
6899 return TargetInfo::SystemZBuiltinVaList;
6900 }
6901 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006902 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006903 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6904 .Case("z10", true)
6905 .Case("z196", true)
6906 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006907 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006908 .Default(false);
6909
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006910 return CPUKnown;
6911 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006912 bool
6913 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6914 StringRef CPU,
6915 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006916 if (CPU == "zEC12")
6917 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006918 if (CPU == "z13") {
6919 Features["transactional-execution"] = true;
6920 Features["vector"] = true;
6921 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006922 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006923 }
6924
6925 bool handleTargetFeatures(std::vector<std::string> &Features,
6926 DiagnosticsEngine &Diags) override {
6927 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006928 for (const auto &Feature : Features) {
6929 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006930 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006931 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006932 HasVector = true;
6933 }
6934 // If we use the vector ABI, vector types are 64-bit aligned.
6935 if (HasVector) {
6936 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006937 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6938 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006939 }
6940 return true;
6941 }
6942
6943 bool hasFeature(StringRef Feature) const override {
6944 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006945 .Case("systemz", true)
6946 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006947 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006948 .Default(false);
6949 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006950
Bryan Chane3f1ed52016-04-28 13:56:43 +00006951 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6952 switch (CC) {
6953 case CC_C:
6954 case CC_Swift:
6955 return CCCR_OK;
6956 default:
6957 return CCCR_Warning;
6958 }
6959 }
6960
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006961 StringRef getABI() const override {
6962 if (HasVector)
6963 return "vector";
6964 return "";
6965 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006966
6967 bool useFloat128ManglingForLongDouble() const override {
6968 return true;
6969 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006970};
6971
6972const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6973#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006974 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006975#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6976 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006977#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006978};
6979
6980const char *const SystemZTargetInfo::GCCRegNames[] = {
6981 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6982 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6983 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6984 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6985};
6986
Craig Topperf054e3a2015-10-19 03:52:27 +00006987ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6988 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006989}
6990
6991bool SystemZTargetInfo::
6992validateAsmConstraint(const char *&Name,
6993 TargetInfo::ConstraintInfo &Info) const {
6994 switch (*Name) {
6995 default:
6996 return false;
6997
6998 case 'a': // Address register
6999 case 'd': // Data register (equivalent to 'r')
7000 case 'f': // Floating-point register
7001 Info.setAllowsRegister();
7002 return true;
7003
7004 case 'I': // Unsigned 8-bit constant
7005 case 'J': // Unsigned 12-bit constant
7006 case 'K': // Signed 16-bit constant
7007 case 'L': // Signed 20-bit displacement (on all targets we support)
7008 case 'M': // 0x7fffffff
7009 return true;
7010
7011 case 'Q': // Memory with base and unsigned 12-bit displacement
7012 case 'R': // Likewise, plus an index
7013 case 'S': // Memory with base and signed 20-bit displacement
7014 case 'T': // Likewise, plus an index
7015 Info.setAllowsMemory();
7016 return true;
7017 }
7018}
Ulrich Weigand47445072013-05-06 16:26:41 +00007019
Eric Christopherc48497a2015-09-18 21:26:24 +00007020class MSP430TargetInfo : public TargetInfo {
7021 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007022
Eric Christopherc48497a2015-09-18 21:26:24 +00007023public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007024 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7025 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007026 TLSSupported = false;
7027 IntWidth = 16;
7028 IntAlign = 16;
7029 LongWidth = 32;
7030 LongLongWidth = 64;
7031 LongAlign = LongLongAlign = 16;
7032 PointerWidth = 16;
7033 PointerAlign = 16;
7034 SuitableAlign = 16;
7035 SizeType = UnsignedInt;
7036 IntMaxType = SignedLongLong;
7037 IntPtrType = SignedInt;
7038 PtrDiffType = SignedInt;
7039 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007040 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007041 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007042 void getTargetDefines(const LangOptions &Opts,
7043 MacroBuilder &Builder) const override {
7044 Builder.defineMacro("MSP430");
7045 Builder.defineMacro("__MSP430__");
7046 // FIXME: defines for different 'flavours' of MCU
7047 }
Craig Topper6c03a542015-10-19 04:51:35 +00007048 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007049 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007050 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007051 }
7052 bool hasFeature(StringRef Feature) const override {
7053 return Feature == "msp430";
7054 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007055 ArrayRef<const char *> getGCCRegNames() const override;
7056 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007057 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007058 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007059 }
7060 bool validateAsmConstraint(const char *&Name,
7061 TargetInfo::ConstraintInfo &info) const override {
7062 // FIXME: implement
7063 switch (*Name) {
7064 case 'K': // the constant 1
7065 case 'L': // constant -1^20 .. 1^19
7066 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007067 return true;
7068 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007069 // No target constraints for now.
7070 return false;
7071 }
7072 const char *getClobbers() const override {
7073 // FIXME: Is this really right?
7074 return "";
7075 }
7076 BuiltinVaListKind getBuiltinVaListKind() const override {
7077 // FIXME: implement
7078 return TargetInfo::CharPtrBuiltinVaList;
7079 }
7080};
7081
7082const char *const MSP430TargetInfo::GCCRegNames[] = {
7083 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7084 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7085
Craig Topperf054e3a2015-10-19 03:52:27 +00007086ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7087 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007088}
7089
7090// LLVM and Clang cannot be used directly to output native binaries for
7091// target, but is used to compile C code to llvm bitcode with correct
7092// type and alignment information.
7093//
7094// TCE uses the llvm bitcode as input and uses it for generating customized
7095// target processor and program binary. TCE co-design environment is
7096// publicly available in http://tce.cs.tut.fi
7097
7098static const unsigned TCEOpenCLAddrSpaceMap[] = {
7099 3, // opencl_global
7100 4, // opencl_local
7101 5, // opencl_constant
7102 // FIXME: generic has to be added to the target
7103 0, // opencl_generic
7104 0, // cuda_device
7105 0, // cuda_constant
7106 0 // cuda_shared
7107};
7108
7109class TCETargetInfo : public TargetInfo {
7110public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007111 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7112 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007113 TLSSupported = false;
7114 IntWidth = 32;
7115 LongWidth = LongLongWidth = 32;
7116 PointerWidth = 32;
7117 IntAlign = 32;
7118 LongAlign = LongLongAlign = 32;
7119 PointerAlign = 32;
7120 SuitableAlign = 32;
7121 SizeType = UnsignedInt;
7122 IntMaxType = SignedLong;
7123 IntPtrType = SignedInt;
7124 PtrDiffType = SignedInt;
7125 FloatWidth = 32;
7126 FloatAlign = 32;
7127 DoubleWidth = 32;
7128 DoubleAlign = 32;
7129 LongDoubleWidth = 32;
7130 LongDoubleAlign = 32;
7131 FloatFormat = &llvm::APFloat::IEEEsingle;
7132 DoubleFormat = &llvm::APFloat::IEEEsingle;
7133 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007134 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7135 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007136 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7137 UseAddrSpaceMapMangling = true;
7138 }
7139
7140 void getTargetDefines(const LangOptions &Opts,
7141 MacroBuilder &Builder) const override {
7142 DefineStd(Builder, "tce", Opts);
7143 Builder.defineMacro("__TCE__");
7144 Builder.defineMacro("__TCE_V1__");
7145 }
7146 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7147
Craig Topper6c03a542015-10-19 04:51:35 +00007148 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007149 const char *getClobbers() const override { return ""; }
7150 BuiltinVaListKind getBuiltinVaListKind() const override {
7151 return TargetInfo::VoidPtrBuiltinVaList;
7152 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007153 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007154 bool validateAsmConstraint(const char *&Name,
7155 TargetInfo::ConstraintInfo &info) const override {
7156 return true;
7157 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007158 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7159 return None;
7160 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007161};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007162
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007163class BPFTargetInfo : public TargetInfo {
7164public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007165 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7166 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007167 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7168 SizeType = UnsignedLong;
7169 PtrDiffType = SignedLong;
7170 IntPtrType = SignedLong;
7171 IntMaxType = SignedLong;
7172 Int64Type = SignedLong;
7173 RegParmMax = 5;
7174 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007175 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007176 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007177 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007178 }
7179 MaxAtomicPromoteWidth = 64;
7180 MaxAtomicInlineWidth = 64;
7181 TLSSupported = false;
7182 }
7183 void getTargetDefines(const LangOptions &Opts,
7184 MacroBuilder &Builder) const override {
7185 DefineStd(Builder, "bpf", Opts);
7186 Builder.defineMacro("__BPF__");
7187 }
7188 bool hasFeature(StringRef Feature) const override {
7189 return Feature == "bpf";
7190 }
7191
Craig Topper6c03a542015-10-19 04:51:35 +00007192 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007193 const char *getClobbers() const override {
7194 return "";
7195 }
7196 BuiltinVaListKind getBuiltinVaListKind() const override {
7197 return TargetInfo::VoidPtrBuiltinVaList;
7198 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007199 ArrayRef<const char *> getGCCRegNames() const override {
7200 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007201 }
7202 bool validateAsmConstraint(const char *&Name,
7203 TargetInfo::ConstraintInfo &info) const override {
7204 return true;
7205 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007206 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7207 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007208 }
7209};
7210
Daniel Sanders4672af62016-05-27 11:51:02 +00007211class MipsTargetInfo : public TargetInfo {
7212 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007213 StringRef Layout;
7214
7215 if (ABI == "o32")
7216 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7217 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007218 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007219 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007220 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007221 else
7222 llvm_unreachable("Invalid ABI");
7223
7224 if (BigEndian)
7225 resetDataLayout(("E-" + Layout).str());
7226 else
7227 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007228 }
7229
Akira Hatanaka9064e362013-10-29 18:30:33 +00007230
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007231 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007232 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007233 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007234 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007235 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007236 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007237 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007238 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007239 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007240 enum DspRevEnum {
7241 NoDSP, DSP1, DSP2
7242 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007243 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007244
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007245protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007246 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007247 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007248
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007249public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007250 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007251 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7252 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7253 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007254 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007255
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007256 setABI((getTriple().getArch() == llvm::Triple::mips ||
7257 getTriple().getArch() == llvm::Triple::mipsel)
7258 ? "o32"
7259 : "n64");
7260
7261 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007262 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007263
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007264 bool isNaN2008Default() const {
7265 return CPU == "mips32r6" || CPU == "mips64r6";
7266 }
7267
7268 bool isFP64Default() const {
7269 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7270 }
7271
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007272 bool isNan2008() const override {
7273 return IsNan2008;
7274 }
7275
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007276 bool processorSupportsGPR64() const {
7277 return llvm::StringSwitch<bool>(CPU)
7278 .Case("mips3", true)
7279 .Case("mips4", true)
7280 .Case("mips5", true)
7281 .Case("mips64", true)
7282 .Case("mips64r2", true)
7283 .Case("mips64r3", true)
7284 .Case("mips64r5", true)
7285 .Case("mips64r6", true)
7286 .Case("octeon", true)
7287 .Default(false);
7288 return false;
7289 }
7290
Alp Toker4925ba72014-06-07 23:30:42 +00007291 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007292 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007293 if (Name == "o32") {
7294 setO32ABITypes();
7295 ABI = Name;
7296 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007297 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007298
7299 if (Name == "n32") {
7300 setN32ABITypes();
7301 ABI = Name;
7302 return true;
7303 }
7304 if (Name == "n64") {
7305 setN64ABITypes();
7306 ABI = Name;
7307 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007308 }
7309 return false;
7310 }
7311
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007312 void setO32ABITypes() {
7313 Int64Type = SignedLongLong;
7314 IntMaxType = Int64Type;
7315 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7316 LongDoubleWidth = LongDoubleAlign = 64;
7317 LongWidth = LongAlign = 32;
7318 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7319 PointerWidth = PointerAlign = 32;
7320 PtrDiffType = SignedInt;
7321 SizeType = UnsignedInt;
7322 SuitableAlign = 64;
7323 }
7324
7325 void setN32N64ABITypes() {
7326 LongDoubleWidth = LongDoubleAlign = 128;
7327 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7328 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7329 LongDoubleWidth = LongDoubleAlign = 64;
7330 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7331 }
7332 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7333 SuitableAlign = 128;
7334 }
7335
Daniel Sanders4672af62016-05-27 11:51:02 +00007336 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007337 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007338 Int64Type = SignedLong;
7339 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007340 LongWidth = LongAlign = 64;
7341 PointerWidth = PointerAlign = 64;
7342 PtrDiffType = SignedLong;
7343 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007344 }
7345
7346 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007347 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007348 Int64Type = SignedLongLong;
7349 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007350 LongWidth = LongAlign = 32;
7351 PointerWidth = PointerAlign = 32;
7352 PtrDiffType = SignedInt;
7353 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007354 }
7355
Craig Topper3164f332014-03-11 03:39:26 +00007356 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007357 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007358 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007359 .Case("mips1", true)
7360 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007361 .Case("mips3", true)
7362 .Case("mips4", true)
7363 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007364 .Case("mips32", true)
7365 .Case("mips32r2", true)
7366 .Case("mips32r3", true)
7367 .Case("mips32r5", true)
7368 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007369 .Case("mips64", true)
7370 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007371 .Case("mips64r3", true)
7372 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007373 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007374 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007375 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007376 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007377 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007378 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007379 bool
7380 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7381 StringRef CPU,
7382 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007383 if (CPU.empty())
7384 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007385 if (CPU == "octeon")
7386 Features["mips64r2"] = Features["cnmips"] = true;
7387 else
7388 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007389 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007390 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007391
Craig Topper3164f332014-03-11 03:39:26 +00007392 void getTargetDefines(const LangOptions &Opts,
7393 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007394 if (BigEndian) {
7395 DefineStd(Builder, "MIPSEB", Opts);
7396 Builder.defineMacro("_MIPSEB");
7397 } else {
7398 DefineStd(Builder, "MIPSEL", Opts);
7399 Builder.defineMacro("_MIPSEL");
7400 }
7401
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007402 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007403 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007404 if (Opts.GNUMode)
7405 Builder.defineMacro("mips");
7406
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007407 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007408 Builder.defineMacro("__mips", "32");
7409 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7410 } else {
7411 Builder.defineMacro("__mips", "64");
7412 Builder.defineMacro("__mips64");
7413 Builder.defineMacro("__mips64__");
7414 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7415 }
7416
7417 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7418 .Cases("mips32", "mips64", "1")
7419 .Cases("mips32r2", "mips64r2", "2")
7420 .Cases("mips32r3", "mips64r3", "3")
7421 .Cases("mips32r5", "mips64r5", "5")
7422 .Cases("mips32r6", "mips64r6", "6")
7423 .Default("");
7424 if (!ISARev.empty())
7425 Builder.defineMacro("__mips_isa_rev", ISARev);
7426
7427 if (ABI == "o32") {
7428 Builder.defineMacro("__mips_o32");
7429 Builder.defineMacro("_ABIO32", "1");
7430 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007431 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007432 Builder.defineMacro("__mips_n32");
7433 Builder.defineMacro("_ABIN32", "2");
7434 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7435 } else if (ABI == "n64") {
7436 Builder.defineMacro("__mips_n64");
7437 Builder.defineMacro("_ABI64", "3");
7438 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7439 } else
7440 llvm_unreachable("Invalid ABI.");
7441
Simon Atanasyan683535b2012-08-29 19:14:58 +00007442 Builder.defineMacro("__REGISTER_PREFIX__", "");
7443
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007444 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007445 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007446 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007447 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007448 case SoftFloat:
7449 Builder.defineMacro("__mips_soft_float", Twine(1));
7450 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007451 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007452
Simon Atanasyan16071912013-04-14 14:07:30 +00007453 if (IsSingleFloat)
7454 Builder.defineMacro("__mips_single_float", Twine(1));
7455
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007456 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7457 Builder.defineMacro("_MIPS_FPSET",
7458 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7459
Simon Atanasyan72244b62012-07-05 16:06:06 +00007460 if (IsMips16)
7461 Builder.defineMacro("__mips16", Twine(1));
7462
Simon Atanasyan60777612013-04-14 14:07:51 +00007463 if (IsMicromips)
7464 Builder.defineMacro("__mips_micromips", Twine(1));
7465
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007466 if (IsNan2008)
7467 Builder.defineMacro("__mips_nan2008", Twine(1));
7468
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007469 switch (DspRev) {
7470 default:
7471 break;
7472 case DSP1:
7473 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7474 Builder.defineMacro("__mips_dsp", Twine(1));
7475 break;
7476 case DSP2:
7477 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7478 Builder.defineMacro("__mips_dspr2", Twine(1));
7479 Builder.defineMacro("__mips_dsp", Twine(1));
7480 break;
7481 }
7482
Jack Carter44ff1e52013-08-12 17:20:29 +00007483 if (HasMSA)
7484 Builder.defineMacro("__mips_msa", Twine(1));
7485
Simon Atanasyan26f19672012-04-05 19:28:31 +00007486 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7487 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7488 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007489
7490 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7491 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007492
7493 // These shouldn't be defined for MIPS-I but there's no need to check
7494 // for that since MIPS-I isn't supported.
7495 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7496 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7497 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007498
7499 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7500 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7501 // the instructions exist but using them violates the ABI since they
7502 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7503 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007504 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007505 }
7506
Craig Topper6c03a542015-10-19 04:51:35 +00007507 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7508 return llvm::makeArrayRef(BuiltinInfo,
7509 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007510 }
Craig Topper3164f332014-03-11 03:39:26 +00007511 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007512 return llvm::StringSwitch<bool>(Feature)
7513 .Case("mips", true)
7514 .Case("fp64", HasFP64)
7515 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007516 }
Craig Topper3164f332014-03-11 03:39:26 +00007517 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007518 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007519 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007520 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007521 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007522 // CPU register names
7523 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007524 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7525 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7526 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007527 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7528 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007529 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7530 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7531 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7532 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007533 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007534 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007535 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7536 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007537 // MSA register names
7538 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7539 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7540 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7541 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7542 // MSA control register names
7543 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7544 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007545 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007546 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007547 }
Craig Topper3164f332014-03-11 03:39:26 +00007548 bool validateAsmConstraint(const char *&Name,
7549 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007550 switch (*Name) {
7551 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007552 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007553 case 'r': // CPU registers.
7554 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007555 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007556 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007557 case 'c': // $25 for indirect jumps
7558 case 'l': // lo register
7559 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007560 Info.setAllowsRegister();
7561 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007562 case 'I': // Signed 16-bit constant
7563 case 'J': // Integer 0
7564 case 'K': // Unsigned 16-bit constant
7565 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7566 case 'M': // Constants not loadable via lui, addiu, or ori
7567 case 'N': // Constant -1 to -65535
7568 case 'O': // A signed 15-bit constant
7569 case 'P': // A constant between 1 go 65535
7570 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007571 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007572 Info.setAllowsMemory();
7573 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007574 case 'Z':
7575 if (Name[1] == 'C') { // An address usable by ll, and sc.
7576 Info.setAllowsMemory();
7577 Name++; // Skip over 'Z'.
7578 return true;
7579 }
7580 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007581 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007582 }
7583
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007584 std::string convertConstraint(const char *&Constraint) const override {
7585 std::string R;
7586 switch (*Constraint) {
7587 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7588 if (Constraint[1] == 'C') {
7589 R = std::string("^") + std::string(Constraint, 2);
7590 Constraint++;
7591 return R;
7592 }
7593 break;
7594 }
7595 return TargetInfo::convertConstraint(Constraint);
7596 }
7597
Craig Topper3164f332014-03-11 03:39:26 +00007598 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007599 // In GCC, $1 is not widely used in generated code (it's used only in a few
7600 // specific situations), so there is no real need for users to add it to
7601 // the clobbers list if they want to use it in their inline assembly code.
7602 //
7603 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7604 // code generation, so using it in inline assembly without adding it to the
7605 // clobbers list can cause conflicts between the inline assembly code and
7606 // the surrounding generated code.
7607 //
7608 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7609 // operands, which will conflict with the ".set at" assembler option (which
7610 // we use only for inline assembly, in order to maintain compatibility with
7611 // GCC) and will also conflict with the user's usage of $1.
7612 //
7613 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7614 // register for generated code is to automatically clobber $1 for all inline
7615 // assembly code.
7616 //
7617 // FIXME: We should automatically clobber $1 only for inline assembly code
7618 // which actually uses it. This would allow LLVM to use $1 for inline
7619 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007620 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007621 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007622
Craig Topper3164f332014-03-11 03:39:26 +00007623 bool handleTargetFeatures(std::vector<std::string> &Features,
7624 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007625 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007626 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007627 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007628 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007629 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007630 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007631 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007632
Eric Christopher610fe112015-08-26 08:21:55 +00007633 for (const auto &Feature : Features) {
7634 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007635 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007636 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007637 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007638 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007639 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007640 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007641 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007642 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007643 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007644 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007645 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007646 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007647 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007648 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007649 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007650 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007651 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007652 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007653 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007654 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007655 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007656 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007657
James Y Knightb214cbc2016-03-04 19:00:41 +00007658 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007659
Rafael Espindolaeb265472013-08-21 21:59:03 +00007660 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007661 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007662
Craig Topper3164f332014-03-11 03:39:26 +00007663 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007664 if (RegNo == 0) return 4;
7665 if (RegNo == 1) return 5;
7666 return -1;
7667 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007668
7669 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007670
7671 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7672 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7673 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7674 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7675 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7676 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7677 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7678 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7679 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7680 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7681 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7682 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7683 {{"ra"}, "$31"}};
7684 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7685 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7686 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7687 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7688 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7689 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7690 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7691 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7692 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7693 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7694 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7695 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007696 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007697 return llvm::makeArrayRef(O32RegAliases);
7698 return llvm::makeArrayRef(NewABIRegAliases);
7699 }
7700
7701 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007702 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007703 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007704
7705 bool validateTarget(DiagnosticsEngine &Diags) const override {
7706 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7707 // this yet. It's better to fail here than on the backend assertion.
7708 if (processorSupportsGPR64() && ABI == "o32") {
7709 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7710 return false;
7711 }
7712
7713 // 64-bit ABI's require 64-bit CPU's.
7714 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7715 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7716 return false;
7717 }
7718
7719 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7720 // can't handle this yet. It's better to fail here than on the
7721 // backend assertion.
7722 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7723 getTriple().getArch() == llvm::Triple::mips64el) &&
7724 ABI == "o32") {
7725 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7726 << ABI << getTriple().str();
7727 return false;
7728 }
7729
7730 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7731 // can't handle this yet. It's better to fail here than on the
7732 // backend assertion.
7733 if ((getTriple().getArch() == llvm::Triple::mips ||
7734 getTriple().getArch() == llvm::Triple::mipsel) &&
7735 (ABI == "n32" || ABI == "n64")) {
7736 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7737 << ABI << getTriple().str();
7738 return false;
7739 }
7740
7741 return true;
7742 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007743};
7744
Daniel Sanders4672af62016-05-27 11:51:02 +00007745const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007746#define BUILTIN(ID, TYPE, ATTRS) \
7747 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7748#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7749 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007750#include "clang/Basic/BuiltinsMips.def"
7751};
7752
Ivan Krasindd7403e2011-08-24 20:22:22 +00007753class PNaClTargetInfo : public TargetInfo {
7754public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007755 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7756 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007757 this->LongAlign = 32;
7758 this->LongWidth = 32;
7759 this->PointerAlign = 32;
7760 this->PointerWidth = 32;
7761 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007762 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007763 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007764 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007765 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007766 this->SizeType = TargetInfo::UnsignedInt;
7767 this->PtrDiffType = TargetInfo::SignedInt;
7768 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007769 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007770 }
7771
Craig Toppere6f17d02014-03-11 04:07:52 +00007772 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007773 Builder.defineMacro("__le32__");
7774 Builder.defineMacro("__pnacl__");
7775 }
Craig Topper3164f332014-03-11 03:39:26 +00007776 void getTargetDefines(const LangOptions &Opts,
7777 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007778 getArchDefines(Opts, Builder);
7779 }
Craig Topper3164f332014-03-11 03:39:26 +00007780 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007781 return Feature == "pnacl";
7782 }
Craig Topper6c03a542015-10-19 04:51:35 +00007783 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007784 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007785 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007786 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007787 ArrayRef<const char *> getGCCRegNames() const override;
7788 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007789 bool validateAsmConstraint(const char *&Name,
7790 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007791 return false;
7792 }
7793
Craig Topper3164f332014-03-11 03:39:26 +00007794 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007795 return "";
7796 }
7797};
7798
Craig Topperf054e3a2015-10-19 03:52:27 +00007799ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7800 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007801}
7802
Craig Topperf054e3a2015-10-19 03:52:27 +00007803ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7804 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007805}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007806
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007807// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007808class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007809public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007810 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7811 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007812
7813 BuiltinVaListKind getBuiltinVaListKind() const override {
7814 return TargetInfo::PNaClABIBuiltinVaList;
7815 }
7816};
7817
JF Bastien643817d2014-09-12 17:52:47 +00007818class Le64TargetInfo : public TargetInfo {
7819 static const Builtin::Info BuiltinInfo[];
7820
7821public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007822 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7823 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007824 NoAsmVariants = true;
7825 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7826 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007827 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007828 }
7829
7830 void getTargetDefines(const LangOptions &Opts,
7831 MacroBuilder &Builder) const override {
7832 DefineStd(Builder, "unix", Opts);
7833 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7834 Builder.defineMacro("__ELF__");
7835 }
Craig Topper6c03a542015-10-19 04:51:35 +00007836 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7837 return llvm::makeArrayRef(BuiltinInfo,
7838 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007839 }
7840 BuiltinVaListKind getBuiltinVaListKind() const override {
7841 return TargetInfo::PNaClABIBuiltinVaList;
7842 }
7843 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007844 ArrayRef<const char *> getGCCRegNames() const override {
7845 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007846 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007847 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7848 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007849 }
7850 bool validateAsmConstraint(const char *&Name,
7851 TargetInfo::ConstraintInfo &Info) const override {
7852 return false;
7853 }
7854
7855 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007856};
Dan Gohmanc2853072015-09-03 22:51:53 +00007857
7858class WebAssemblyTargetInfo : public TargetInfo {
7859 static const Builtin::Info BuiltinInfo[];
7860
7861 enum SIMDEnum {
7862 NoSIMD,
7863 SIMD128,
7864 } SIMDLevel;
7865
7866public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007867 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007868 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007869 NoAsmVariants = true;
7870 SuitableAlign = 128;
7871 LargeArrayMinWidth = 128;
7872 LargeArrayAlign = 128;
7873 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007874 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007875 LongDoubleWidth = LongDoubleAlign = 128;
7876 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007877 SizeType = UnsignedInt;
7878 PtrDiffType = SignedInt;
7879 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007880 }
7881
7882protected:
7883 void getTargetDefines(const LangOptions &Opts,
7884 MacroBuilder &Builder) const override {
7885 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7886 if (SIMDLevel >= SIMD128)
7887 Builder.defineMacro("__wasm_simd128__");
7888 }
7889
7890private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007891 bool
7892 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7893 StringRef CPU,
7894 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007895 if (CPU == "bleeding-edge")
7896 Features["simd128"] = true;
7897 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7898 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007899 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007900 return llvm::StringSwitch<bool>(Feature)
7901 .Case("simd128", SIMDLevel >= SIMD128)
7902 .Default(false);
7903 }
7904 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007905 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007906 for (const auto &Feature : Features) {
7907 if (Feature == "+simd128") {
7908 SIMDLevel = std::max(SIMDLevel, SIMD128);
7909 continue;
7910 }
7911 if (Feature == "-simd128") {
7912 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7913 continue;
7914 }
7915
7916 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7917 << "-target-feature";
7918 return false;
7919 }
7920 return true;
7921 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007922 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007923 return llvm::StringSwitch<bool>(Name)
7924 .Case("mvp", true)
7925 .Case("bleeding-edge", true)
7926 .Case("generic", true)
7927 .Default(false);
7928 }
Craig Topper6c03a542015-10-19 04:51:35 +00007929 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7930 return llvm::makeArrayRef(BuiltinInfo,
7931 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007932 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007933 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007934 return VoidPtrBuiltinVaList;
7935 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007936 ArrayRef<const char *> getGCCRegNames() const final {
7937 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007938 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007939 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7940 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007941 }
7942 bool
7943 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007944 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007945 return false;
7946 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007947 const char *getClobbers() const final { return ""; }
7948 bool isCLZForZeroUndef() const final { return false; }
7949 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007950 IntType getIntTypeByWidth(unsigned BitWidth,
7951 bool IsSigned) const final {
7952 // WebAssembly prefers long long for explicitly 64-bit integers.
7953 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7954 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7955 }
7956 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7957 bool IsSigned) const final {
7958 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7959 return BitWidth == 64
7960 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7961 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7962 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007963};
7964
7965const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7966#define BUILTIN(ID, TYPE, ATTRS) \
7967 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7968#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7969 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7970#include "clang/Basic/BuiltinsWebAssembly.def"
7971};
7972
7973class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7974public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007975 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7976 const TargetOptions &Opts)
7977 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007978 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007979 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007980 }
7981
7982protected:
7983 void getTargetDefines(const LangOptions &Opts,
7984 MacroBuilder &Builder) const override {
7985 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7986 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7987 }
7988};
7989
7990class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7991public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007992 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7993 const TargetOptions &Opts)
7994 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007995 LongAlign = LongWidth = 64;
7996 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007997 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007998 SizeType = UnsignedLong;
7999 PtrDiffType = SignedLong;
8000 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008001 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008002 }
8003
8004protected:
8005 void getTargetDefines(const LangOptions &Opts,
8006 MacroBuilder &Builder) const override {
8007 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8008 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8009 }
8010};
8011
JF Bastien643817d2014-09-12 17:52:47 +00008012const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8013#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008014 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008015#include "clang/Basic/BuiltinsLe64.def"
8016};
8017
Eric Christopherc48497a2015-09-18 21:26:24 +00008018static const unsigned SPIRAddrSpaceMap[] = {
8019 1, // opencl_global
8020 3, // opencl_local
8021 2, // opencl_constant
8022 4, // opencl_generic
8023 0, // cuda_device
8024 0, // cuda_constant
8025 0 // cuda_shared
8026};
8027class SPIRTargetInfo : public TargetInfo {
8028public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008029 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8030 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008031 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8032 "SPIR target must use unknown OS");
8033 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8034 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008035 TLSSupported = false;
8036 LongWidth = LongAlign = 64;
8037 AddrSpaceMap = &SPIRAddrSpaceMap;
8038 UseAddrSpaceMapMangling = true;
8039 // Define available target features
8040 // These must be defined in sorted order!
8041 NoAsmVariants = true;
8042 }
8043 void getTargetDefines(const LangOptions &Opts,
8044 MacroBuilder &Builder) const override {
8045 DefineStd(Builder, "SPIR", Opts);
8046 }
8047 bool hasFeature(StringRef Feature) const override {
8048 return Feature == "spir";
8049 }
Craig Topper3164f332014-03-11 03:39:26 +00008050
Craig Topper6c03a542015-10-19 04:51:35 +00008051 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008052 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008053 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008054 bool validateAsmConstraint(const char *&Name,
8055 TargetInfo::ConstraintInfo &info) const override {
8056 return true;
8057 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008058 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8059 return None;
8060 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008061 BuiltinVaListKind getBuiltinVaListKind() const override {
8062 return TargetInfo::VoidPtrBuiltinVaList;
8063 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008064
Eric Christopherc48497a2015-09-18 21:26:24 +00008065 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008066 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8067 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008068 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008069
Eric Christopherc48497a2015-09-18 21:26:24 +00008070 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8071 return CC_SpirFunction;
8072 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008073
8074 void setSupportedOpenCLOpts() override {
8075 // Assume all OpenCL extensions and optional core features are supported
8076 // for SPIR since it is a generic target.
8077 getSupportedOpenCLOpts().setAll();
8078 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008079};
Guy Benyeib798fc92012-12-11 21:38:14 +00008080
Eric Christopherc48497a2015-09-18 21:26:24 +00008081class SPIR32TargetInfo : public SPIRTargetInfo {
8082public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8084 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008085 PointerWidth = PointerAlign = 32;
8086 SizeType = TargetInfo::UnsignedInt;
8087 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008088 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8089 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008090 }
8091 void getTargetDefines(const LangOptions &Opts,
8092 MacroBuilder &Builder) const override {
8093 DefineStd(Builder, "SPIR32", Opts);
8094 }
8095};
Guy Benyeib798fc92012-12-11 21:38:14 +00008096
Eric Christopherc48497a2015-09-18 21:26:24 +00008097class SPIR64TargetInfo : public SPIRTargetInfo {
8098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008099 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8100 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008101 PointerWidth = PointerAlign = 64;
8102 SizeType = TargetInfo::UnsignedLong;
8103 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008104 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8105 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008106 }
8107 void getTargetDefines(const LangOptions &Opts,
8108 MacroBuilder &Builder) const override {
8109 DefineStd(Builder, "SPIR64", Opts);
8110 }
8111};
Guy Benyeib798fc92012-12-11 21:38:14 +00008112
Robert Lytton0e076492013-08-13 09:43:10 +00008113class XCoreTargetInfo : public TargetInfo {
8114 static const Builtin::Info BuiltinInfo[];
8115public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008116 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8117 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008118 NoAsmVariants = true;
8119 LongLongAlign = 32;
8120 SuitableAlign = 32;
8121 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008122 SizeType = UnsignedInt;
8123 PtrDiffType = SignedInt;
8124 IntPtrType = SignedInt;
8125 WCharType = UnsignedChar;
8126 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008127 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008128 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8129 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008130 }
Craig Topper3164f332014-03-11 03:39:26 +00008131 void getTargetDefines(const LangOptions &Opts,
8132 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008133 Builder.defineMacro("__XS1B__");
8134 }
Craig Topper6c03a542015-10-19 04:51:35 +00008135 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8136 return llvm::makeArrayRef(BuiltinInfo,
8137 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008138 }
Craig Topper3164f332014-03-11 03:39:26 +00008139 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008140 return TargetInfo::VoidPtrBuiltinVaList;
8141 }
Craig Topper3164f332014-03-11 03:39:26 +00008142 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008143 return "";
8144 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008145 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008146 static const char * const GCCRegNames[] = {
8147 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8148 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8149 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008150 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008151 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008152 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8153 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008154 }
Craig Topper3164f332014-03-11 03:39:26 +00008155 bool validateAsmConstraint(const char *&Name,
8156 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008157 return false;
8158 }
Craig Topper3164f332014-03-11 03:39:26 +00008159 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008160 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8161 return (RegNo < 2)? RegNo : -1;
8162 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008163 bool allowsLargerPreferedTypeAlignment() const override {
8164 return false;
8165 }
Robert Lytton0e076492013-08-13 09:43:10 +00008166};
8167
8168const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008169#define BUILTIN(ID, TYPE, ATTRS) \
8170 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8171#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8172 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008173#include "clang/Basic/BuiltinsXCore.def"
8174};
Robert Lytton0e076492013-08-13 09:43:10 +00008175
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008176// x86_32 Android target
8177class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8178public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008179 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8180 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008181 SuitableAlign = 32;
8182 LongDoubleWidth = 64;
8183 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8184 }
8185};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008186
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008187// x86_64 Android target
8188class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8189public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008190 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8191 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008192 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8193 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008194
8195 bool useFloat128ManglingForLongDouble() const override {
8196 return true;
8197 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008198};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008199
8200// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8201class RenderScript32TargetInfo : public ARMleTargetInfo {
8202public:
8203 RenderScript32TargetInfo(const llvm::Triple &Triple,
8204 const TargetOptions &Opts)
8205 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8206 Triple.getOSName(),
8207 Triple.getEnvironmentName()),
8208 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008209 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008210 LongWidth = LongAlign = 64;
8211 }
8212 void getTargetDefines(const LangOptions &Opts,
8213 MacroBuilder &Builder) const override {
8214 Builder.defineMacro("__RENDERSCRIPT__");
8215 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8216 }
8217};
8218
8219// 64-bit RenderScript is aarch64
8220class RenderScript64TargetInfo : public AArch64leTargetInfo {
8221public:
8222 RenderScript64TargetInfo(const llvm::Triple &Triple,
8223 const TargetOptions &Opts)
8224 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8225 Triple.getOSName(),
8226 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008227 Opts) {
8228 IsRenderScriptTarget = true;
8229 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008230
8231 void getTargetDefines(const LangOptions &Opts,
8232 MacroBuilder &Builder) const override {
8233 Builder.defineMacro("__RENDERSCRIPT__");
8234 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8235 }
8236};
8237
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008238} // end anonymous namespace
8239
Chris Lattner5ba61f02006-10-14 07:39:34 +00008240//===----------------------------------------------------------------------===//
8241// Driver code
8242//===----------------------------------------------------------------------===//
8243
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008244static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8245 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008246 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008247
Daniel Dunbar52322032009-08-18 05:47:58 +00008248 switch (Triple.getArch()) {
8249 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008250 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008251
Tim Northover2a0783d2014-05-30 14:14:07 +00008252 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008254
8255 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008256 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008257
Jacques Pienaard964cc22016-03-28 21:02:54 +00008258 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008260
Tim Northover2a0783d2014-05-30 14:14:07 +00008261 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008262 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008264
8265 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008266 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008268 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008270 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008272 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008274 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008276 }
8277
Christian Pirker9b019ae2014-02-25 13:51:00 +00008278 case llvm::Triple::aarch64_be:
8279 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008280 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008282 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008284 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008286 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008288 }
8289
Daniel Dunbar52322032009-08-18 05:47:58 +00008290 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008291 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008292 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008294
Daniel Dunbar52322032009-08-18 05:47:58 +00008295 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008296 case llvm::Triple::CloudABI:
8297 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008298 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008300 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008302 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008304 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008306 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008308 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008310 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008312 case llvm::Triple::Win32:
8313 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008314 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008316 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008318 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008320 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008321 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008322 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008323 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008324 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008326 }
8327
8328 case llvm::Triple::armeb:
8329 case llvm::Triple::thumbeb:
8330 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008331 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008332
8333 switch (os) {
8334 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008336 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008337 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008338 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008339 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008340 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008341 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008342 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008343 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008344 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008345 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008346 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008347 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008348 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008349 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008350 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008351
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008352 case llvm::Triple::bpfeb:
8353 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008354 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008355
Daniel Dunbar52322032009-08-18 05:47:58 +00008356 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008357 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008358
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008359 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008360 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008361 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008362 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008363 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008364 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008365 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008366 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008367 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008369 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008371 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008372
8373 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008374 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008375 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008376 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008377 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008378 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008379 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008380 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008381 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008382 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008383 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008384 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008385 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008386 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008387 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008388
Akira Hatanakabef17452011-09-20 19:21:49 +00008389 case llvm::Triple::mips64:
8390 switch (os) {
8391 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008392 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008393 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008394 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008395 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008396 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008397 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008398 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008399 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008400 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008401 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008402 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008403 }
8404
8405 case llvm::Triple::mips64el:
8406 switch (os) {
8407 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008408 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008409 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008410 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008411 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008412 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008413 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008414 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008415 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008416 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008417 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008418 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008419 }
8420
Ivan Krasindd7403e2011-08-24 20:22:22 +00008421 case llvm::Triple::le32:
8422 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008423 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008424 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008425 default:
8426 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008427 }
8428
JF Bastien643817d2014-09-12 17:52:47 +00008429 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008431
Daniel Dunbar52322032009-08-18 05:47:58 +00008432 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008433 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008434 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008435 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008436 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008438 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008440 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008442 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008444 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008446 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008448 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008449
8450 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008451 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008453 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008454 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008456 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008458 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008459 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008460 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008462 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008464 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008465
Bill Schmidt778d3872013-07-26 01:36:11 +00008466 case llvm::Triple::ppc64le:
8467 switch (os) {
8468 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008470 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008472 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008474 }
8475
Peter Collingbournec947aae2012-05-20 23:28:41 +00008476 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008478 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008480
Tom Stellardd8e38a32015-01-06 20:34:47 +00008481 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008482 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008484
Daniel Dunbar52322032009-08-18 05:47:58 +00008485 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008486 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008487 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008488 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008489 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008490 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008491 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008492 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008493 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008494 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008495 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008496 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008497 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008498 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008499 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008500
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008501 // The 'sparcel' architecture copies all the above cases except for Solaris.
8502 case llvm::Triple::sparcel:
8503 switch (os) {
8504 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008506 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008508 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008510 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008511 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008512 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008514 }
8515
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008516 case llvm::Triple::sparcv9:
8517 switch (os) {
8518 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008520 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008522 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008524 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008526 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008528 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008530 }
8531
Ulrich Weigand47445072013-05-06 16:26:41 +00008532 case llvm::Triple::systemz:
8533 switch (os) {
8534 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008536 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008538 }
8539
Eli Friedmana9c3d712009-08-19 20:47:07 +00008540 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008542
Daniel Dunbar52322032009-08-18 05:47:58 +00008543 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008544 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008546
Daniel Dunbar52322032009-08-18 05:47:58 +00008547 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008548 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008550 case llvm::Triple::Linux: {
8551 switch (Triple.getEnvironment()) {
8552 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008554 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008556 }
8557 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008558 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008560 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008562 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008563 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008564 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008566 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008568 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008569 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008570 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008571 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008572 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008573 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008574 case llvm::Triple::Win32: {
8575 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008576 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008577 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008578 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008579 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008580 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008581 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008582 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008583 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008584 }
8585 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008586 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008587 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008588 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008589 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008590 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008591 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008592 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008593 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008594 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008595 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008596 }
8597
8598 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008599 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008600 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008601
Daniel Dunbar52322032009-08-18 05:47:58 +00008602 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008603 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008604 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008605 case llvm::Triple::Linux: {
8606 switch (Triple.getEnvironment()) {
8607 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008609 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008611 }
8612 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008613 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008615 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008616 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008617 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008618 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008619 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008620 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008621 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008622 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008623 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008624 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008625 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008626 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008627 case llvm::Triple::Win32: {
8628 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008629 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008630 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008631 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008632 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008633 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008634 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008635 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008636 }
8637 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008638 case llvm::Triple::Haiku:
8639 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008640 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008641 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008642 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008643 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008644 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008645 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008646 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008647
Douglas Katzman78d7c542015-05-12 21:18:10 +00008648 case llvm::Triple::spir: {
8649 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8650 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8651 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008652 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008653 }
8654 case llvm::Triple::spir64: {
8655 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8656 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8657 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008658 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008659 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008660 case llvm::Triple::wasm32:
8661 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8662 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008663 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008664 case llvm::Triple::wasm64:
8665 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8666 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008667 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008668
8669 case llvm::Triple::renderscript32:
8670 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8671 case llvm::Triple::renderscript64:
8672 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008673 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008674}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008675
8676/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008677/// options.
Alp Toker80758082014-07-06 05:26:44 +00008678TargetInfo *
8679TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008680 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008681 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008682
8683 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008684 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008685 if (!Target) {
8686 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008687 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008688 }
Alp Toker80758082014-07-06 05:26:44 +00008689 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008690
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008691 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008692 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8693 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008694 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008695 }
8696
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008697 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008698 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8699 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008700 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008701 }
8702
Rafael Espindolaeb265472013-08-21 21:59:03 +00008703 // Set the fp math unit.
8704 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8705 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008706 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008707 }
8708
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008709 // Compute the default target features, we need the target to handle this
8710 // because features may have dependencies on one another.
8711 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008712 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8713 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008714 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008715
8716 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008717 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008718 for (const auto &F : Features)
8719 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8720
Eric Christopher3ff21b32013-10-16 21:26:26 +00008721 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008722 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008723
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008724 Target->setSupportedOpenCLOpts();
8725
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008726 if (!Target->validateTarget(Diags))
8727 return nullptr;
8728
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008729 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008730}