blob: 15190594fc5a9e3b703c562d445c07b56c6e8375 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000873
Ulrich Weigand8afad612014-07-28 13:17:52 +0000874protected:
875 std::string ABI;
876
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000877public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000878 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000879 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
880 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovicd7d45bf2016-04-15 18:04:13 +0000881 HasBPERMD(false), HasExtDiv(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000882 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000883 LongDoubleWidth = LongDoubleAlign = 128;
884 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
885 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000886
Hal Finkel6b984f02012-07-03 16:51:04 +0000887 /// \brief Flags for architecture specific defines.
888 typedef enum {
889 ArchDefineNone = 0,
890 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
891 ArchDefinePpcgr = 1 << 1,
892 ArchDefinePpcsq = 1 << 2,
893 ArchDefine440 = 1 << 3,
894 ArchDefine603 = 1 << 4,
895 ArchDefine604 = 1 << 5,
896 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000897 ArchDefinePwr5 = 1 << 7,
898 ArchDefinePwr5x = 1 << 8,
899 ArchDefinePwr6 = 1 << 9,
900 ArchDefinePwr6x = 1 << 10,
901 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000902 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000903 ArchDefinePwr9 = 1 << 13,
904 ArchDefineA2 = 1 << 14,
905 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000906 } ArchDefineTypes;
907
Bill Schmidt38378a02013-02-01 20:23:10 +0000908 // Note: GCC recognizes the following additional cpus:
909 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
910 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
911 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000912 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000913 bool CPUKnown = llvm::StringSwitch<bool>(Name)
914 .Case("generic", true)
915 .Case("440", true)
916 .Case("450", true)
917 .Case("601", true)
918 .Case("602", true)
919 .Case("603", true)
920 .Case("603e", true)
921 .Case("603ev", true)
922 .Case("604", true)
923 .Case("604e", true)
924 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000925 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000926 .Case("g3", true)
927 .Case("7400", true)
928 .Case("g4", true)
929 .Case("7450", true)
930 .Case("g4+", true)
931 .Case("750", true)
932 .Case("970", true)
933 .Case("g5", true)
934 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000935 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000936 .Case("e500mc", true)
937 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000938 .Case("power3", true)
939 .Case("pwr3", true)
940 .Case("power4", true)
941 .Case("pwr4", true)
942 .Case("power5", true)
943 .Case("pwr5", true)
944 .Case("power5x", true)
945 .Case("pwr5x", true)
946 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000947 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000948 .Case("power6x", true)
949 .Case("pwr6x", true)
950 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000952 .Case("power8", true)
953 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000954 .Case("power9", true)
955 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000956 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000957 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000958 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000959 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000960 .Case("powerpc64le", true)
961 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000962 .Default(false);
963
964 if (CPUKnown)
965 CPU = Name;
966
967 return CPUKnown;
968 }
969
Ulrich Weigand8afad612014-07-28 13:17:52 +0000970
971 StringRef getABI() const override { return ABI; }
972
Craig Topper6c03a542015-10-19 04:51:35 +0000973 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
974 return llvm::makeArrayRef(BuiltinInfo,
975 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000976 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000977
Craig Topper3164f332014-03-11 03:39:26 +0000978 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000979
Craig Topper3164f332014-03-11 03:39:26 +0000980 void getTargetDefines(const LangOptions &Opts,
981 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000982
Eric Christopher8c47b422015-10-09 18:39:55 +0000983 bool
984 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
985 StringRef CPU,
986 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000987
Craig Topper3164f332014-03-11 03:39:26 +0000988 bool handleTargetFeatures(std::vector<std::string> &Features,
989 DiagnosticsEngine &Diags) override;
990 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000991 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
992 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000993
Craig Topperf054e3a2015-10-19 03:52:27 +0000994 ArrayRef<const char *> getGCCRegNames() const override;
995 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000996 bool validateAsmConstraint(const char *&Name,
997 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000998 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +0000999 default: return false;
1000 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001001 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001002 case 'b': // Base register
1003 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001004 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001005 break;
1006 // FIXME: The following are added to allow parsing.
1007 // I just took a guess at what the actions should be.
1008 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001009 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001010 case 'v': // Altivec vector register
1011 Info.setAllowsRegister();
1012 break;
1013 case 'w':
1014 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001015 case 'd':// VSX vector register to hold vector double data
1016 case 'f':// VSX vector register to hold vector float data
1017 case 's':// VSX vector register to hold scalar float data
1018 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001019 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001020 break;
1021 default:
1022 return false;
1023 }
1024 Info.setAllowsRegister();
1025 Name++; // Skip over 'w'.
1026 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001027 case 'h': // `MQ', `CTR', or `LINK' register
1028 case 'q': // `MQ' register
1029 case 'c': // `CTR' register
1030 case 'l': // `LINK' register
1031 case 'x': // `CR' register (condition register) number 0
1032 case 'y': // `CR' register (condition register)
1033 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001034 Info.setAllowsRegister();
1035 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001036 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001037 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001038 // (use `L' instead for SImode constants)
1039 case 'K': // Unsigned 16-bit constant
1040 case 'L': // Signed 16-bit constant shifted left 16 bits
1041 case 'M': // Constant larger than 31
1042 case 'N': // Exact power of 2
1043 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001044 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001045 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001046 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001047 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001048 break;
1049 case 'm': // Memory operand. Note that on PowerPC targets, m can
1050 // include addresses that update the base register. It
1051 // is therefore only safe to use `m' in an asm statement
1052 // if that asm statement accesses the operand exactly once.
1053 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001054 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001055 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001056 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001057 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001058 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1059 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001060 // register to be updated.
1061 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001062 if (Name[1] != 's')
1063 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001064 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001065 // include any automodification of the base register. Unlike
1066 // `m', this constraint can be used in asm statements that
1067 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001068 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001069 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001070 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001071 break;
1072 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001073 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001074 case 'Z': // Memory operand that is an indexed or indirect from a
1075 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001076 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001077 Info.setAllowsMemory();
1078 Info.setAllowsRegister();
1079 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001081 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // register (`p' is preferable for asm statements)
1083 case 'S': // Constant suitable as a 64-bit mask operand
1084 case 'T': // Constant suitable as a 32-bit mask operand
1085 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001086 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001087 // instructions
1088 case 'W': // Vector constant that does not require memory
1089 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001090 break;
1091 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001092 }
John Thompson07a61a42010-06-24 22:44:13 +00001093 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001094 }
Craig Topper3164f332014-03-11 03:39:26 +00001095 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001096 std::string R;
1097 switch (*Constraint) {
1098 case 'e':
1099 case 'w':
1100 // Two-character constraint; add "^" hint for later parsing.
1101 R = std::string("^") + std::string(Constraint, 2);
1102 Constraint++;
1103 break;
1104 default:
1105 return TargetInfo::convertConstraint(Constraint);
1106 }
1107 return R;
1108 }
Craig Topper3164f332014-03-11 03:39:26 +00001109 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001110 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001111 }
Craig Topper3164f332014-03-11 03:39:26 +00001112 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001113 if (RegNo == 0) return 3;
1114 if (RegNo == 1) return 4;
1115 return -1;
1116 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001117
1118 bool hasSjLjLowering() const override {
1119 return true;
1120 }
David Majnemer2617ea62015-06-09 18:05:33 +00001121
1122 bool useFloat128ManglingForLongDouble() const override {
1123 return LongDoubleWidth == 128 &&
1124 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1125 getTriple().isOSBinFormatELF();
1126 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001127};
Anders Carlssonf511f642007-11-27 04:11:28 +00001128
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001129const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001130#define BUILTIN(ID, TYPE, ATTRS) \
1131 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1132#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1133 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001134#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001136
Eric Christopher917e9522014-11-18 22:36:15 +00001137/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001138/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001139bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001140 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001141 for (const auto &Feature : Features) {
1142 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001143 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001144 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001145 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001146 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001147 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001148 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001149 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001150 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001151 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001152 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001153 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001154 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001155 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001156 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001157 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001158 } else if (Feature == "+float128") {
1159 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001160 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001161 // TODO: Finish this list and add an assert that we've handled them
1162 // all.
1163 }
Eric Christopher02c33352015-08-25 00:59:11 +00001164
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001165 return true;
1166}
1167
Chris Lattnerecd49032009-03-02 22:27:17 +00001168/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1169/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001170void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001171 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001172 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001173 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001174 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001175 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001176 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001177 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001178 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001179 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001180 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001181 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001182 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001183 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001184
Chris Lattnerecd49032009-03-02 22:27:17 +00001185 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001186 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1187 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001188 } else {
1189 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1190 getTriple().getOS() != llvm::Triple::OpenBSD)
1191 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001192 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001193
Ulrich Weigand8afad612014-07-28 13:17:52 +00001194 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001195 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001196 Builder.defineMacro("_CALL_ELF", "1");
1197 if (ABI == "elfv2")
1198 Builder.defineMacro("_CALL_ELF", "2");
1199
Chris Lattnerecd49032009-03-02 22:27:17 +00001200 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001201 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1202 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001203
Chris Lattnerecd49032009-03-02 22:27:17 +00001204 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001205 if (LongDoubleWidth == 128)
1206 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001207
John Thompsone467e192009-11-19 17:18:50 +00001208 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001209 Builder.defineMacro("__VEC__", "10206");
1210 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001211 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001212
1213 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001214 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1215 .Case("440", ArchDefineName)
1216 .Case("450", ArchDefineName | ArchDefine440)
1217 .Case("601", ArchDefineName)
1218 .Case("602", ArchDefineName | ArchDefinePpcgr)
1219 .Case("603", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1221 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("604", ArchDefineName | ArchDefinePpcgr)
1223 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1224 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001225 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001226 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1227 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1228 .Case("750", ArchDefineName | ArchDefinePpcgr)
1229 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1230 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001231 .Case("a2", ArchDefineA2)
1232 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001233 .Case("pwr3", ArchDefinePpcgr)
1234 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1235 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1236 | ArchDefinePpcsq)
1237 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1238 | ArchDefinePpcgr | ArchDefinePpcsq)
1239 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1240 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1241 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1242 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1243 | ArchDefinePpcsq)
1244 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1245 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001246 | ArchDefinePpcgr | ArchDefinePpcsq)
1247 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1248 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1249 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001250 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1251 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1252 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1253 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001254 .Case("power3", ArchDefinePpcgr)
1255 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1256 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
1258 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1259 | ArchDefinePpcgr | ArchDefinePpcsq)
1260 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1261 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1263 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1264 | ArchDefinePpcsq)
1265 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1266 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001267 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1269 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1270 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001271 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1272 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1273 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1274 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001275 .Default(ArchDefineNone);
1276
1277 if (defs & ArchDefineName)
1278 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1279 if (defs & ArchDefinePpcgr)
1280 Builder.defineMacro("_ARCH_PPCGR");
1281 if (defs & ArchDefinePpcsq)
1282 Builder.defineMacro("_ARCH_PPCSQ");
1283 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001284 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001285 if (defs & ArchDefine603)
1286 Builder.defineMacro("_ARCH_603");
1287 if (defs & ArchDefine604)
1288 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001289 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001290 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001291 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001292 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001293 if (defs & ArchDefinePwr5x)
1294 Builder.defineMacro("_ARCH_PWR5X");
1295 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001296 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001297 if (defs & ArchDefinePwr6x)
1298 Builder.defineMacro("_ARCH_PWR6X");
1299 if (defs & ArchDefinePwr7)
1300 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001301 if (defs & ArchDefinePwr8)
1302 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001303 if (defs & ArchDefinePwr9)
1304 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001305 if (defs & ArchDefineA2)
1306 Builder.defineMacro("_ARCH_A2");
1307 if (defs & ArchDefineA2q) {
1308 Builder.defineMacro("_ARCH_A2Q");
1309 Builder.defineMacro("_ARCH_QP");
1310 }
1311
1312 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1313 Builder.defineMacro("__bg__");
1314 Builder.defineMacro("__THW_BLUEGENE__");
1315 Builder.defineMacro("__bgq__");
1316 Builder.defineMacro("__TOS_BGQ__");
1317 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001318
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001319 if (HasVSX)
1320 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001321 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001322 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001323 if (HasP8Crypto)
1324 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001325 if (HasHTM)
1326 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001327 if (HasFloat128)
1328 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001329
1330 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1333 if (PointerWidth == 64)
1334 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001335
Bill Schmidt38378a02013-02-01 20:23:10 +00001336 // FIXME: The following are not yet generated here by Clang, but are
1337 // generated by GCC:
1338 //
1339 // _SOFT_FLOAT_
1340 // __RECIP_PRECISION__
1341 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001342 // __RECIP__
1343 // __RECIPF__
1344 // __RSQRTE__
1345 // __RSQRTEF__
1346 // _SOFT_DOUBLE_
1347 // __NO_LWSYNC__
1348 // __HAVE_BSWAP__
1349 // __LONGDOUBLE128
1350 // __CMODEL_MEDIUM__
1351 // __CMODEL_LARGE__
1352 // _CALL_SYSV
1353 // _CALL_DARWIN
1354 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001355}
1356
Eric Christophera8a14c32015-08-31 18:39:16 +00001357// Handle explicit options being passed to the compiler here: if we've
1358// explicitly turned off vsx and turned on power8-vector or direct-move then
1359// go ahead and error since the customer has expressed a somewhat incompatible
1360// set of options.
1361static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001362 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001363
1364 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1365 FeaturesVec.end()) {
1366 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1367 FeaturesVec.end()) {
1368 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1369 << "-mno-vsx";
1370 return false;
1371 }
1372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1374 FeaturesVec.end()) {
1375 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1376 << "-mno-vsx";
1377 return false;
1378 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001379
1380 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1381 FeaturesVec.end()) {
1382 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1383 << "-mno-vsx";
1384 return false;
1385 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001386 }
1387
1388 return true;
1389}
1390
Eric Christopher8c47b422015-10-09 18:39:55 +00001391bool PPCTargetInfo::initFeatureMap(
1392 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1393 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001394 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1395 .Case("7400", true)
1396 .Case("g4", true)
1397 .Case("7450", true)
1398 .Case("g4+", true)
1399 .Case("970", true)
1400 .Case("g5", true)
1401 .Case("pwr6", true)
1402 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001403 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001404 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001405 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001406 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001407 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001408
1409 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001410 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001412 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001413 .Case("pwr8", true)
1414 .Default(false);
1415 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1416 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001417 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001418 .Case("pwr8", true)
1419 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001420 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1421 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001422 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001423 .Case("pwr8", true)
1424 .Case("pwr7", true)
1425 .Default(false);
1426 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1427 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001428 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001429 .Case("pwr8", true)
1430 .Case("pwr7", true)
1431 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001432 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001437 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001443
Eric Christophera8a14c32015-08-31 18:39:16 +00001444 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1445 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001446
Eric Christopher007b0a02015-08-28 22:32:01 +00001447 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001448}
1449
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001450bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001451 return llvm::StringSwitch<bool>(Feature)
1452 .Case("powerpc", true)
1453 .Case("vsx", HasVSX)
1454 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001455 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001456 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001457 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001458 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001459 .Case("bpermd", HasBPERMD)
1460 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001461 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001462 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001463}
Chris Lattner17df24e2008-04-21 18:56:49 +00001464
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001465void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1466 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001467 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1468 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1469 // incompatible options.
1470 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001471 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001472 Features[Name] = Features["vsx"] = true;
1473 } else if (Name == "power8-vector") {
1474 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001475 } else if (Name == "float128") {
1476 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001477 } else {
1478 Features[Name] = true;
1479 }
1480 } else {
1481 if (Name == "vsx") {
1482 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001483 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001484 } else {
1485 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001486 }
1487 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001488}
1489
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001490const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001491 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1492 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1493 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1494 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1495 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1496 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1497 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1498 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001499 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001500 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001501 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001502 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1503 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1504 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1505 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001506 "vrsave", "vscr",
1507 "spe_acc", "spefscr",
1508 "sfp"
1509};
Chris Lattner10a5b382007-01-29 05:24:35 +00001510
Craig Topperf054e3a2015-10-19 03:52:27 +00001511ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1512 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001513}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001514
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001515const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1516 // While some of these aliases do map to different registers
1517 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001518 { { "0" }, "r0" },
1519 { { "1"}, "r1" },
1520 { { "2" }, "r2" },
1521 { { "3" }, "r3" },
1522 { { "4" }, "r4" },
1523 { { "5" }, "r5" },
1524 { { "6" }, "r6" },
1525 { { "7" }, "r7" },
1526 { { "8" }, "r8" },
1527 { { "9" }, "r9" },
1528 { { "10" }, "r10" },
1529 { { "11" }, "r11" },
1530 { { "12" }, "r12" },
1531 { { "13" }, "r13" },
1532 { { "14" }, "r14" },
1533 { { "15" }, "r15" },
1534 { { "16" }, "r16" },
1535 { { "17" }, "r17" },
1536 { { "18" }, "r18" },
1537 { { "19" }, "r19" },
1538 { { "20" }, "r20" },
1539 { { "21" }, "r21" },
1540 { { "22" }, "r22" },
1541 { { "23" }, "r23" },
1542 { { "24" }, "r24" },
1543 { { "25" }, "r25" },
1544 { { "26" }, "r26" },
1545 { { "27" }, "r27" },
1546 { { "28" }, "r28" },
1547 { { "29" }, "r29" },
1548 { { "30" }, "r30" },
1549 { { "31" }, "r31" },
1550 { { "fr0" }, "f0" },
1551 { { "fr1" }, "f1" },
1552 { { "fr2" }, "f2" },
1553 { { "fr3" }, "f3" },
1554 { { "fr4" }, "f4" },
1555 { { "fr5" }, "f5" },
1556 { { "fr6" }, "f6" },
1557 { { "fr7" }, "f7" },
1558 { { "fr8" }, "f8" },
1559 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001560 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001561 { { "fr11" }, "f11" },
1562 { { "fr12" }, "f12" },
1563 { { "fr13" }, "f13" },
1564 { { "fr14" }, "f14" },
1565 { { "fr15" }, "f15" },
1566 { { "fr16" }, "f16" },
1567 { { "fr17" }, "f17" },
1568 { { "fr18" }, "f18" },
1569 { { "fr19" }, "f19" },
1570 { { "fr20" }, "f20" },
1571 { { "fr21" }, "f21" },
1572 { { "fr22" }, "f22" },
1573 { { "fr23" }, "f23" },
1574 { { "fr24" }, "f24" },
1575 { { "fr25" }, "f25" },
1576 { { "fr26" }, "f26" },
1577 { { "fr27" }, "f27" },
1578 { { "fr28" }, "f28" },
1579 { { "fr29" }, "f29" },
1580 { { "fr30" }, "f30" },
1581 { { "fr31" }, "f31" },
1582 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001583};
1584
Craig Topperf054e3a2015-10-19 03:52:27 +00001585ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1586 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001587}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001588
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001589class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001590public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001591 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1592 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001593 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001594
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001595 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001596 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001597 case llvm::Triple::FreeBSD:
1598 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001599 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001600 PtrDiffType = SignedInt;
1601 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001602 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001603 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001604 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001605 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001606
Roman Divacky3ffe7462012-03-13 19:20:17 +00001607 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1608 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001609 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001610 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001611
1612 // PPC32 supports atomics up to 4 bytes.
1613 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001614 }
1615
Craig Topper3164f332014-03-11 03:39:26 +00001616 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001617 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001618 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001619 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001620};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621
Bill Schmidt778d3872013-07-26 01:36:11 +00001622// Note: ABI differences may eventually require us to have a separate
1623// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001624class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001625public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001626 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1627 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001628 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001629 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001631
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001632 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001633 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001634 ABI = "elfv2";
1635 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001636 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001637 ABI = "elfv1";
1638 }
1639
1640 switch (getTriple().getOS()) {
1641 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001642 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001643 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001644 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001645 case llvm::Triple::NetBSD:
1646 IntMaxType = SignedLongLong;
1647 Int64Type = SignedLongLong;
1648 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001649 default:
1650 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001651 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001652
1653 // PPC64 supports atomics up to 8 bytes.
1654 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001655 }
Craig Topper3164f332014-03-11 03:39:26 +00001656 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001657 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001659 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001660 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001661 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001662 ABI = Name;
1663 return true;
1664 }
1665 return false;
1666 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001667};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001669class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001670public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001671 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1672 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001673 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001674 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001675 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001676 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001677 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001678 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001679 }
Craig Topper3164f332014-03-11 03:39:26 +00001680 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001681 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001682 }
1683};
1684
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001685class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001686public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001687 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1688 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001689 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001690 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001691 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001692 }
1693};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001694
Eric Christopherc48497a2015-09-18 21:26:24 +00001695static const unsigned NVPTXAddrSpaceMap[] = {
1696 1, // opencl_global
1697 3, // opencl_local
1698 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001699 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001700 0, // opencl_generic
1701 1, // cuda_device
1702 4, // cuda_constant
1703 3, // cuda_shared
1704};
1705
1706class NVPTXTargetInfo : public TargetInfo {
1707 static const char *const GCCRegNames[];
1708 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001709 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001710
Eric Christopherc48497a2015-09-18 21:26:24 +00001711public:
Justin Lebar76945b22016-04-29 23:05:19 +00001712 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001714 TLSSupported = false;
1715 LongWidth = LongAlign = 64;
1716 AddrSpaceMap = &NVPTXAddrSpaceMap;
1717 UseAddrSpaceMapMangling = true;
1718 // Define available target features
1719 // These must be defined in sorted order!
1720 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001721 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001722
1723 // If possible, get a TargetInfo for our host triple, so we can match its
1724 // types.
1725 llvm::Triple HostTriple(Opts.HostTriple);
1726 if (HostTriple.isNVPTX())
1727 return;
1728 std::unique_ptr<TargetInfo> HostTarget(
1729 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1730 if (!HostTarget) {
1731 return;
1732 }
1733
1734 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1735 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1736 BoolWidth = HostTarget->getBoolWidth();
1737 BoolAlign = HostTarget->getBoolAlign();
1738 IntWidth = HostTarget->getIntWidth();
1739 IntAlign = HostTarget->getIntAlign();
1740 HalfWidth = HostTarget->getHalfWidth();
1741 HalfAlign = HostTarget->getHalfAlign();
1742 FloatWidth = HostTarget->getFloatWidth();
1743 FloatAlign = HostTarget->getFloatAlign();
1744 DoubleWidth = HostTarget->getDoubleWidth();
1745 DoubleAlign = HostTarget->getDoubleAlign();
1746 LongWidth = HostTarget->getLongWidth();
1747 LongAlign = HostTarget->getLongAlign();
1748 LongLongWidth = HostTarget->getLongLongWidth();
1749 LongLongAlign = HostTarget->getLongLongAlign();
1750 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1751 DefaultAlignForAttributeAligned =
1752 HostTarget->getDefaultAlignForAttributeAligned();
1753 SizeType = HostTarget->getSizeType();
1754 IntMaxType = HostTarget->getIntMaxType();
1755 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1756 IntPtrType = HostTarget->getIntPtrType();
1757 WCharType = HostTarget->getWCharType();
1758 WIntType = HostTarget->getWIntType();
1759 Char16Type = HostTarget->getChar16Type();
1760 Char32Type = HostTarget->getChar32Type();
1761 Int64Type = HostTarget->getInt64Type();
1762 SigAtomicType = HostTarget->getSigAtomicType();
1763 ProcessIDType = HostTarget->getProcessIDType();
1764
1765 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1766 UseZeroLengthBitfieldAlignment =
1767 HostTarget->useZeroLengthBitfieldAlignment();
1768 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1769 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1770
Justin Lebar5057f172016-09-09 20:35:43 +00001771 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1772 // we need those macros to be identical on host and device, because (among
1773 // other things) they affect which standard library classes are defined, and
1774 // we need all classes to be defined on both the host and device.
1775 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // Properties intentionally not copied from host:
1778 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1779 // host/device boundary.
1780 // - SuitableAlign: Not visible across the host/device boundary, and may
1781 // correctly be different on host/device, e.g. if host has wider vector
1782 // types than device.
1783 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1784 // as its double type, but that's not necessarily true on the host.
1785 // TODO: nvcc emits a warning when using long double on device; we should
1786 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001787 }
1788 void getTargetDefines(const LangOptions &Opts,
1789 MacroBuilder &Builder) const override {
1790 Builder.defineMacro("__PTX__");
1791 Builder.defineMacro("__NVPTX__");
1792 if (Opts.CUDAIsDevice) {
1793 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001794 std::string CUDAArchCode = [this] {
1795 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001796 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001797 assert(false && "No GPU arch when compiling CUDA device code.");
1798 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001819 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001821 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001822 return "620";
1823 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001824 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001825 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001826 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001827 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
Craig Topper6c03a542015-10-19 04:51:35 +00001829 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1830 return llvm::makeArrayRef(BuiltinInfo,
1831 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001832 }
1833 bool hasFeature(StringRef Feature) const override {
1834 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001835 }
1836
Craig Topperf054e3a2015-10-19 03:52:27 +00001837 ArrayRef<const char *> getGCCRegNames() const override;
1838 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001839 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001840 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001841 }
1842 bool validateAsmConstraint(const char *&Name,
1843 TargetInfo::ConstraintInfo &Info) const override {
1844 switch (*Name) {
1845 default:
1846 return false;
1847 case 'c':
1848 case 'h':
1849 case 'r':
1850 case 'l':
1851 case 'f':
1852 case 'd':
1853 Info.setAllowsRegister();
1854 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001855 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001856 }
1857 const char *getClobbers() const override {
1858 // FIXME: Is this really right?
1859 return "";
1860 }
1861 BuiltinVaListKind getBuiltinVaListKind() const override {
1862 // FIXME: implement
1863 return TargetInfo::CharPtrBuiltinVaList;
1864 }
1865 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001866 GPU = StringToCudaArch(Name);
1867 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001868 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001869 void setSupportedOpenCLOpts() override {
1870 auto &Opts = getSupportedOpenCLOpts();
1871 Opts.cl_clang_storage_class_specifiers = 1;
1872 Opts.cl_khr_gl_sharing = 1;
1873 Opts.cl_khr_icd = 1;
1874
1875 Opts.cl_khr_fp64 = 1;
1876 Opts.cl_khr_byte_addressable_store = 1;
1877 Opts.cl_khr_global_int32_base_atomics = 1;
1878 Opts.cl_khr_global_int32_extended_atomics = 1;
1879 Opts.cl_khr_local_int32_base_atomics = 1;
1880 Opts.cl_khr_local_int32_extended_atomics = 1;
1881 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001882};
1883
1884const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1885#define BUILTIN(ID, TYPE, ATTRS) \
1886 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1887#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1888 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1889#include "clang/Basic/BuiltinsNVPTX.def"
1890};
1891
1892const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1893
Craig Topperf054e3a2015-10-19 03:52:27 +00001894ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1895 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001896}
1897
1898class NVPTX32TargetInfo : public NVPTXTargetInfo {
1899public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001900 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1901 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001902 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001903 PointerWidth = PointerAlign = 32;
1904 SizeType = TargetInfo::UnsignedInt;
1905 PtrDiffType = TargetInfo::SignedInt;
1906 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001907 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001908 }
1909};
1910
1911class NVPTX64TargetInfo : public NVPTXTargetInfo {
1912public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001913 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1914 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001915 PointerWidth = PointerAlign = 64;
1916 SizeType = TargetInfo::UnsignedLong;
1917 PtrDiffType = TargetInfo::SignedLong;
1918 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001919 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001920 }
1921};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001922
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001923static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // opencl_global
1925 3, // opencl_local
1926 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001927 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001928 1, // cuda_device
1929 2, // cuda_constant
1930 3 // cuda_shared
1931};
1932
Tom Stellarda96344b2014-08-21 13:58:40 +00001933// If you edit the description strings, make sure you update
1934// getPointerWidthV().
1935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001937 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1938 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001939
Craig Topper273dbc62015-10-18 05:29:26 +00001940static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001941 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32"
Rafael Espindola29db13a2014-01-03 18:13:17 +00001942 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1943 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001944
Matt Arsenault250024f2016-06-08 01:56:42 +00001945class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001946 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001947 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001948
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001949 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001950 enum GPUKind {
1951 GK_NONE,
1952 GK_R600,
1953 GK_R600_DOUBLE_OPS,
1954 GK_R700,
1955 GK_R700_DOUBLE_OPS,
1956 GK_EVERGREEN,
1957 GK_EVERGREEN_DOUBLE_OPS,
1958 GK_NORTHERN_ISLANDS,
1959 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001960 GK_GFX6,
1961 GK_GFX7,
1962 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001963 } GPU;
1964
Jan Veselyeebeaea2015-05-04 19:53:36 +00001965 bool hasFP64:1;
1966 bool hasFMAF:1;
1967 bool hasLDEXPF:1;
Yaxun Liu2c17e822016-08-09 19:43:38 +00001968 bool hasDenormSupport:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001969
Matt Arsenault250024f2016-06-08 01:56:42 +00001970 static bool isAMDGCN(const llvm::Triple &TT) {
1971 return TT.getArch() == llvm::Triple::amdgcn;
1972 }
1973
Eli Friedmand13b41e2012-10-12 23:32:00 +00001974public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001975 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001976 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001977 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 hasFP64(false),
1979 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001980 hasLDEXPF(false),
1981 hasDenormSupport(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001982 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001983 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001984 hasFMAF = true;
1985 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001986 }
Yaxun Liu2c17e822016-08-09 19:43:38 +00001987 if (Opts.CPU == "fiji")
1988 hasDenormSupport = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00001989
1990 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1991 DataLayoutStringSI : DataLayoutStringR600);
1992
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001993 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001994 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001995 }
1996
Tom Stellarda96344b2014-08-21 13:58:40 +00001997 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1998 if (GPU <= GK_CAYMAN)
1999 return 32;
2000
2001 switch(AddrSpace) {
2002 default:
2003 return 64;
2004 case 0:
2005 case 3:
2006 case 5:
2007 return 32;
2008 }
2009 }
2010
Yaxun Liu26f75662016-08-19 05:17:25 +00002011 uint64_t getMaxPointerWidth() const override {
2012 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2013 }
2014
Craig Topper3164f332014-03-11 03:39:26 +00002015 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002016 return "";
2017 }
2018
Craig Topperf054e3a2015-10-19 03:52:27 +00002019 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002020
Craig Topperf054e3a2015-10-19 03:52:27 +00002021 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2022 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002023 }
2024
Craig Topper3164f332014-03-11 03:39:26 +00002025 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002026 TargetInfo::ConstraintInfo &Info) const override {
2027 switch (*Name) {
2028 default: break;
2029 case 'v': // vgpr
2030 case 's': // sgpr
2031 Info.setAllowsRegister();
2032 return true;
2033 }
2034 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002035 }
2036
Matt Arsenault250024f2016-06-08 01:56:42 +00002037 bool initFeatureMap(llvm::StringMap<bool> &Features,
2038 DiagnosticsEngine &Diags, StringRef CPU,
2039 const std::vector<std::string> &FeatureVec) const override;
2040
Yaxun Liu2c17e822016-08-09 19:43:38 +00002041 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2042 TargetOptions &TargetOpts) const override {
2043 if (!hasDenormSupport)
2044 return;
2045 bool hasFP32Denormals = false;
2046 bool hasFP64Denormals = false;
2047 for (auto &I : TargetOpts.FeaturesAsWritten) {
2048 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2049 hasFP32Denormals = true;
2050 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2051 hasFP64Denormals = true;
2052 }
2053 if (!hasFP32Denormals)
2054 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2055 Twine("fp32-denormals")).str());
2056 if (!hasFP64Denormals && hasFP64)
2057 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2058 Twine("fp64-denormals")).str());
2059 }
2060
Craig Topper6c03a542015-10-19 04:51:35 +00002061 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2062 return llvm::makeArrayRef(BuiltinInfo,
2063 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002064 }
2065
Craig Topper3164f332014-03-11 03:39:26 +00002066 void getTargetDefines(const LangOptions &Opts,
2067 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002068 if (getTriple().getArch() == llvm::Triple::amdgcn)
2069 Builder.defineMacro("__AMDGCN__");
2070 else
2071 Builder.defineMacro("__R600__");
2072
Jan Veselyeebeaea2015-05-04 19:53:36 +00002073 if (hasFMAF)
2074 Builder.defineMacro("__HAS_FMAF__");
2075 if (hasLDEXPF)
2076 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002077 if (hasFP64)
2078 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002079 }
2080
Craig Topper3164f332014-03-11 03:39:26 +00002081 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002082 return TargetInfo::CharPtrBuiltinVaList;
2083 }
2084
Matt Arsenault250024f2016-06-08 01:56:42 +00002085 static GPUKind parseR600Name(StringRef Name) {
2086 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002087 .Case("r600" , GK_R600)
2088 .Case("rv610", GK_R600)
2089 .Case("rv620", GK_R600)
2090 .Case("rv630", GK_R600)
2091 .Case("rv635", GK_R600)
2092 .Case("rs780", GK_R600)
2093 .Case("rs880", GK_R600)
2094 .Case("rv670", GK_R600_DOUBLE_OPS)
2095 .Case("rv710", GK_R700)
2096 .Case("rv730", GK_R700)
2097 .Case("rv740", GK_R700_DOUBLE_OPS)
2098 .Case("rv770", GK_R700_DOUBLE_OPS)
2099 .Case("palm", GK_EVERGREEN)
2100 .Case("cedar", GK_EVERGREEN)
2101 .Case("sumo", GK_EVERGREEN)
2102 .Case("sumo2", GK_EVERGREEN)
2103 .Case("redwood", GK_EVERGREEN)
2104 .Case("juniper", GK_EVERGREEN)
2105 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2106 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2107 .Case("barts", GK_NORTHERN_ISLANDS)
2108 .Case("turks", GK_NORTHERN_ISLANDS)
2109 .Case("caicos", GK_NORTHERN_ISLANDS)
2110 .Case("cayman", GK_CAYMAN)
2111 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002112 .Default(GK_NONE);
2113 }
2114
2115 static GPUKind parseAMDGCNName(StringRef Name) {
2116 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002117 .Case("tahiti", GK_GFX6)
2118 .Case("pitcairn", GK_GFX6)
2119 .Case("verde", GK_GFX6)
2120 .Case("oland", GK_GFX6)
2121 .Case("hainan", GK_GFX6)
2122 .Case("bonaire", GK_GFX7)
2123 .Case("kabini", GK_GFX7)
2124 .Case("kaveri", GK_GFX7)
2125 .Case("hawaii", GK_GFX7)
2126 .Case("mullins", GK_GFX7)
2127 .Case("tonga", GK_GFX8)
2128 .Case("iceland", GK_GFX8)
2129 .Case("carrizo", GK_GFX8)
2130 .Case("fiji", GK_GFX8)
2131 .Case("stoney", GK_GFX8)
2132 .Case("polaris10", GK_GFX8)
2133 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002134 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002135 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002136
Matt Arsenault250024f2016-06-08 01:56:42 +00002137 bool setCPU(const std::string &Name) override {
2138 if (getTriple().getArch() == llvm::Triple::amdgcn)
2139 GPU = parseAMDGCNName(Name);
2140 else
2141 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002142
Matt Arsenault250024f2016-06-08 01:56:42 +00002143 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002144 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002145
Jan Vesely211ba782016-06-17 02:25:03 +00002146 void setSupportedOpenCLOpts() override {
2147 auto &Opts = getSupportedOpenCLOpts();
2148 Opts.cl_clang_storage_class_specifiers = 1;
2149 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002150
Jan Vesely211ba782016-06-17 02:25:03 +00002151 if (hasFP64)
2152 Opts.cl_khr_fp64 = 1;
2153 if (GPU >= GK_EVERGREEN) {
2154 Opts.cl_khr_byte_addressable_store = 1;
2155 Opts.cl_khr_global_int32_base_atomics = 1;
2156 Opts.cl_khr_global_int32_extended_atomics = 1;
2157 Opts.cl_khr_local_int32_base_atomics = 1;
2158 Opts.cl_khr_local_int32_extended_atomics = 1;
2159 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002160 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002161 Opts.cl_khr_fp16 = 1;
2162 Opts.cl_khr_int64_base_atomics = 1;
2163 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002164 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002165 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002166 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002167 Opts.cl_amd_media_ops = 1;
2168 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002169 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002170 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002171
Yaxun Liu99444cb2016-08-03 20:38:06 +00002172 LangAS::ID getOpenCLImageAddrSpace() const override {
2173 return LangAS::opencl_constant;
2174 }
2175
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002176 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2177 switch (CC) {
2178 default:
2179 return CCCR_Warning;
2180 case CC_C:
2181 case CC_OpenCLKernel:
2182 return CCCR_OK;
2183 }
2184 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002185};
2186
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002187const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002188#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002189 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002190#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2191 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002192#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002193};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002194const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002195 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2196 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2197 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2198 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2199 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2200 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2201 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2202 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2203 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2204 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2205 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2206 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2207 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2208 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2209 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2210 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2211 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2212 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2213 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2214 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2215 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2216 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2217 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2218 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2219 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2220 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2221 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2222 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2223 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2224 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2225 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2226 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2227 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2228 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2229 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2230 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2231 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2232 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2233 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2234 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2235 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2236 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2237 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2238 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2239 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2240 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2241 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002242 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002243 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2244 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002245};
2246
Craig Topperf054e3a2015-10-19 03:52:27 +00002247ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2248 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002249}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002250
Matt Arsenault250024f2016-06-08 01:56:42 +00002251bool AMDGPUTargetInfo::initFeatureMap(
2252 llvm::StringMap<bool> &Features,
2253 DiagnosticsEngine &Diags, StringRef CPU,
2254 const std::vector<std::string> &FeatureVec) const {
2255
2256 // XXX - What does the member GPU mean if device name string passed here?
2257 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2258 if (CPU.empty())
2259 CPU = "tahiti";
2260
2261 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002262 case GK_GFX6:
2263 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002264 break;
2265
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002266 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002267 Features["s-memrealtime"] = true;
2268 Features["16-bit-insts"] = true;
2269 break;
2270
2271 case GK_NONE:
2272 return false;
2273 default:
2274 llvm_unreachable("unhandled subtarget");
2275 }
2276 } else {
2277 if (CPU.empty())
2278 CPU = "r600";
2279
2280 switch (parseR600Name(CPU)) {
2281 case GK_R600:
2282 case GK_R700:
2283 case GK_EVERGREEN:
2284 case GK_NORTHERN_ISLANDS:
2285 break;
2286 case GK_R600_DOUBLE_OPS:
2287 case GK_R700_DOUBLE_OPS:
2288 case GK_EVERGREEN_DOUBLE_OPS:
2289 case GK_CAYMAN:
2290 Features["fp64"] = true;
2291 break;
2292 case GK_NONE:
2293 return false;
2294 default:
2295 llvm_unreachable("unhandled subtarget");
2296 }
2297 }
2298
2299 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2300}
2301
Eli Friedman3fd920a2008-08-20 02:34:37 +00002302// Namespace for x86 abstract base class
2303const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002304#define BUILTIN(ID, TYPE, ATTRS) \
2305 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002306#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002307 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002308#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002309 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002310#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002311};
Eli Friedmanb5366062008-05-20 14:21:01 +00002312
Nuno Lopescfca1f02009-12-23 17:49:57 +00002313static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002314 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2315 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002316 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002317 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2318 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2319 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002320 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002321 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2322 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002323 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2324 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2325 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2326 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2327 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2328 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2329 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2330 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002331};
2332
Eric Christophercdd36352011-06-21 00:05:20 +00002333const TargetInfo::AddlRegName AddlRegNames[] = {
2334 { { "al", "ah", "eax", "rax" }, 0 },
2335 { { "bl", "bh", "ebx", "rbx" }, 3 },
2336 { { "cl", "ch", "ecx", "rcx" }, 2 },
2337 { { "dl", "dh", "edx", "rdx" }, 1 },
2338 { { "esi", "rsi" }, 4 },
2339 { { "edi", "rdi" }, 5 },
2340 { { "esp", "rsp" }, 7 },
2341 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002342 { { "r8d", "r8w", "r8b" }, 38 },
2343 { { "r9d", "r9w", "r9b" }, 39 },
2344 { { "r10d", "r10w", "r10b" }, 40 },
2345 { { "r11d", "r11w", "r11b" }, 41 },
2346 { { "r12d", "r12w", "r12b" }, 42 },
2347 { { "r13d", "r13w", "r13b" }, 43 },
2348 { { "r14d", "r14w", "r14b" }, 44 },
2349 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002350};
2351
2352// X86 target abstract base class; x86-32 and x86-64 are very close, so
2353// most of the implementation can be shared.
2354class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002355 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002356 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002357 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002358 enum MMX3DNowEnum {
2359 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002360 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002361 enum XOPEnum {
2362 NoXOP,
2363 SSE4A,
2364 FMA4,
2365 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002366 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002367
Craig Topper543f3bd2015-10-14 23:47:57 +00002368 bool HasAES = false;
2369 bool HasPCLMUL = false;
2370 bool HasLZCNT = false;
2371 bool HasRDRND = false;
2372 bool HasFSGSBASE = false;
2373 bool HasBMI = false;
2374 bool HasBMI2 = false;
2375 bool HasPOPCNT = false;
2376 bool HasRTM = false;
2377 bool HasPRFCHW = false;
2378 bool HasRDSEED = false;
2379 bool HasADX = false;
2380 bool HasTBM = false;
2381 bool HasFMA = false;
2382 bool HasF16C = false;
2383 bool HasAVX512CD = false;
2384 bool HasAVX512ER = false;
2385 bool HasAVX512PF = false;
2386 bool HasAVX512DQ = false;
2387 bool HasAVX512BW = false;
2388 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002389 bool HasAVX512VBMI = false;
2390 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002391 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002392 bool HasMPX = false;
2393 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002394 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002395 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002396 bool HasXSAVE = false;
2397 bool HasXSAVEOPT = false;
2398 bool HasXSAVEC = false;
2399 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002400 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002401 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002402 bool HasCLFLUSHOPT = false;
2403 bool HasPCOMMIT = false;
2404 bool HasCLWB = false;
2405 bool HasUMIP = false;
2406 bool HasMOVBE = false;
2407 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002408
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002409 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2410 ///
2411 /// Each enumeration represents a particular CPU supported by Clang. These
2412 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2413 enum CPUKind {
2414 CK_Generic,
2415
2416 /// \name i386
2417 /// i386-generation processors.
2418 //@{
2419 CK_i386,
2420 //@}
2421
2422 /// \name i486
2423 /// i486-generation processors.
2424 //@{
2425 CK_i486,
2426 CK_WinChipC6,
2427 CK_WinChip2,
2428 CK_C3,
2429 //@}
2430
2431 /// \name i586
2432 /// i586-generation processors, P5 microarchitecture based.
2433 //@{
2434 CK_i586,
2435 CK_Pentium,
2436 CK_PentiumMMX,
2437 //@}
2438
2439 /// \name i686
2440 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2441 //@{
2442 CK_i686,
2443 CK_PentiumPro,
2444 CK_Pentium2,
2445 CK_Pentium3,
2446 CK_Pentium3M,
2447 CK_PentiumM,
2448 CK_C3_2,
2449
2450 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2451 /// Clang however has some logic to suport this.
2452 // FIXME: Warn, deprecate, and potentially remove this.
2453 CK_Yonah,
2454 //@}
2455
2456 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002457 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002458 //@{
2459 CK_Pentium4,
2460 CK_Pentium4M,
2461 CK_Prescott,
2462 CK_Nocona,
2463 //@}
2464
2465 /// \name Core
2466 /// Core microarchitecture based processors.
2467 //@{
2468 CK_Core2,
2469
2470 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2471 /// codename which GCC no longer accepts as an option to -march, but Clang
2472 /// has some logic for recognizing it.
2473 // FIXME: Warn, deprecate, and potentially remove this.
2474 CK_Penryn,
2475 //@}
2476
2477 /// \name Atom
2478 /// Atom processors
2479 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002480 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002481 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002482 //@}
2483
2484 /// \name Nehalem
2485 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002486 CK_Nehalem,
2487
2488 /// \name Westmere
2489 /// Westmere microarchitecture based processors.
2490 CK_Westmere,
2491
2492 /// \name Sandy Bridge
2493 /// Sandy Bridge microarchitecture based processors.
2494 CK_SandyBridge,
2495
2496 /// \name Ivy Bridge
2497 /// Ivy Bridge microarchitecture based processors.
2498 CK_IvyBridge,
2499
2500 /// \name Haswell
2501 /// Haswell microarchitecture based processors.
2502 CK_Haswell,
2503
2504 /// \name Broadwell
2505 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002506 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002507
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002508 /// \name Skylake Client
2509 /// Skylake client microarchitecture based processors.
2510 CK_SkylakeClient,
2511
2512 /// \name Skylake Server
2513 /// Skylake server microarchitecture based processors.
2514 CK_SkylakeServer,
2515
2516 /// \name Cannonlake Client
2517 /// Cannonlake client microarchitecture based processors.
2518 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002519
Craig Topper449314e2013-08-20 07:09:39 +00002520 /// \name Knights Landing
2521 /// Knights Landing processor.
2522 CK_KNL,
2523
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002524 /// \name Lakemont
2525 /// Lakemont microarchitecture based processors.
2526 CK_Lakemont,
2527
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002528 /// \name K6
2529 /// K6 architecture processors.
2530 //@{
2531 CK_K6,
2532 CK_K6_2,
2533 CK_K6_3,
2534 //@}
2535
2536 /// \name K7
2537 /// K7 architecture processors.
2538 //@{
2539 CK_Athlon,
2540 CK_AthlonThunderbird,
2541 CK_Athlon4,
2542 CK_AthlonXP,
2543 CK_AthlonMP,
2544 //@}
2545
2546 /// \name K8
2547 /// K8 architecture processors.
2548 //@{
2549 CK_Athlon64,
2550 CK_Athlon64SSE3,
2551 CK_AthlonFX,
2552 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002553 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002554 CK_Opteron,
2555 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002556 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002557 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002558
Benjamin Kramer569f2152012-01-10 11:50:18 +00002559 /// \name Bobcat
2560 /// Bobcat architecture processors.
2561 //@{
2562 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002563 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002564 //@}
2565
2566 /// \name Bulldozer
2567 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002568 //@{
2569 CK_BDVER1,
2570 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002571 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002572 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002573 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002574
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002575 /// This specification is deprecated and will be removed in the future.
2576 /// Users should prefer \see CK_K8.
2577 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002578 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002579 CK_x86_64,
2580 //@}
2581
2582 /// \name Geode
2583 /// Geode processors.
2584 //@{
2585 CK_Geode
2586 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002587 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002588
Eric Christopherc50738f2015-08-27 00:05:50 +00002589 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002590 return llvm::StringSwitch<CPUKind>(CPU)
2591 .Case("i386", CK_i386)
2592 .Case("i486", CK_i486)
2593 .Case("winchip-c6", CK_WinChipC6)
2594 .Case("winchip2", CK_WinChip2)
2595 .Case("c3", CK_C3)
2596 .Case("i586", CK_i586)
2597 .Case("pentium", CK_Pentium)
2598 .Case("pentium-mmx", CK_PentiumMMX)
2599 .Case("i686", CK_i686)
2600 .Case("pentiumpro", CK_PentiumPro)
2601 .Case("pentium2", CK_Pentium2)
2602 .Case("pentium3", CK_Pentium3)
2603 .Case("pentium3m", CK_Pentium3M)
2604 .Case("pentium-m", CK_PentiumM)
2605 .Case("c3-2", CK_C3_2)
2606 .Case("yonah", CK_Yonah)
2607 .Case("pentium4", CK_Pentium4)
2608 .Case("pentium4m", CK_Pentium4M)
2609 .Case("prescott", CK_Prescott)
2610 .Case("nocona", CK_Nocona)
2611 .Case("core2", CK_Core2)
2612 .Case("penryn", CK_Penryn)
2613 .Case("bonnell", CK_Bonnell)
2614 .Case("atom", CK_Bonnell) // Legacy name.
2615 .Case("silvermont", CK_Silvermont)
2616 .Case("slm", CK_Silvermont) // Legacy name.
2617 .Case("nehalem", CK_Nehalem)
2618 .Case("corei7", CK_Nehalem) // Legacy name.
2619 .Case("westmere", CK_Westmere)
2620 .Case("sandybridge", CK_SandyBridge)
2621 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2622 .Case("ivybridge", CK_IvyBridge)
2623 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2624 .Case("haswell", CK_Haswell)
2625 .Case("core-avx2", CK_Haswell) // Legacy name.
2626 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002627 .Case("skylake", CK_SkylakeClient)
2628 .Case("skylake-avx512", CK_SkylakeServer)
2629 .Case("skx", CK_SkylakeServer) // Legacy name.
2630 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002631 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002632 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002633 .Case("k6", CK_K6)
2634 .Case("k6-2", CK_K6_2)
2635 .Case("k6-3", CK_K6_3)
2636 .Case("athlon", CK_Athlon)
2637 .Case("athlon-tbird", CK_AthlonThunderbird)
2638 .Case("athlon-4", CK_Athlon4)
2639 .Case("athlon-xp", CK_AthlonXP)
2640 .Case("athlon-mp", CK_AthlonMP)
2641 .Case("athlon64", CK_Athlon64)
2642 .Case("athlon64-sse3", CK_Athlon64SSE3)
2643 .Case("athlon-fx", CK_AthlonFX)
2644 .Case("k8", CK_K8)
2645 .Case("k8-sse3", CK_K8SSE3)
2646 .Case("opteron", CK_Opteron)
2647 .Case("opteron-sse3", CK_OpteronSSE3)
2648 .Case("barcelona", CK_AMDFAM10)
2649 .Case("amdfam10", CK_AMDFAM10)
2650 .Case("btver1", CK_BTVER1)
2651 .Case("btver2", CK_BTVER2)
2652 .Case("bdver1", CK_BDVER1)
2653 .Case("bdver2", CK_BDVER2)
2654 .Case("bdver3", CK_BDVER3)
2655 .Case("bdver4", CK_BDVER4)
2656 .Case("x86-64", CK_x86_64)
2657 .Case("geode", CK_Geode)
2658 .Default(CK_Generic);
2659 }
2660
Rafael Espindolaeb265472013-08-21 21:59:03 +00002661 enum FPMathKind {
2662 FP_Default,
2663 FP_SSE,
2664 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002665 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002666
Eli Friedman3fd920a2008-08-20 02:34:37 +00002667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002668 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2669 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002670 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002671 }
Craig Topper3164f332014-03-11 03:39:26 +00002672 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002673 // X87 evaluates with 80 bits "long double" precision.
2674 return SSELevel == NoSSE ? 2 : 0;
2675 }
Craig Topper6c03a542015-10-19 04:51:35 +00002676 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2677 return llvm::makeArrayRef(BuiltinInfo,
2678 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002679 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002680 ArrayRef<const char *> getGCCRegNames() const override {
2681 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002682 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002683 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2684 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002685 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002686 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2687 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002688 }
Eric Christopherd9832702015-06-29 21:00:05 +00002689 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002690 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002691 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002692
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002693 bool validateGlobalRegisterVariable(StringRef RegName,
2694 unsigned RegSize,
2695 bool &HasSizeMismatch) const override {
2696 // esp and ebp are the only 32-bit registers the x86 backend can currently
2697 // handle.
2698 if (RegName.equals("esp") || RegName.equals("ebp")) {
2699 // Check that the register size is 32-bit.
2700 HasSizeMismatch = RegSize != 32;
2701 return true;
2702 }
2703
2704 return false;
2705 }
2706
Akira Hatanaka974131e2014-09-18 18:17:18 +00002707 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2708
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002709 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2710
Akira Hatanaka974131e2014-09-18 18:17:18 +00002711 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2712
Craig Topper3164f332014-03-11 03:39:26 +00002713 std::string convertConstraint(const char *&Constraint) const override;
2714 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002715 return "~{dirflag},~{fpsr},~{flags}";
2716 }
Craig Topper3164f332014-03-11 03:39:26 +00002717 void getTargetDefines(const LangOptions &Opts,
2718 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002719 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2720 bool Enabled);
2721 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2722 bool Enabled);
2723 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2724 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002725 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2726 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002727 setFeatureEnabledImpl(Features, Name, Enabled);
2728 }
2729 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002730 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002731 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2732 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002733 bool
2734 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2735 StringRef CPU,
2736 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002737 bool hasFeature(StringRef Feature) const override;
2738 bool handleTargetFeatures(std::vector<std::string> &Features,
2739 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002740 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002741 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2742 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002743 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002744 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002745 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002746 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002747 return "no-mmx";
2748 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002749 }
Craig Topper3164f332014-03-11 03:39:26 +00002750 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002751 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002752
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002753 // Perform any per-CPU checks necessary to determine if this CPU is
2754 // acceptable.
2755 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2756 // invalid without explaining *why*.
2757 switch (CPU) {
2758 case CK_Generic:
2759 // No processor selected!
2760 return false;
2761
2762 case CK_i386:
2763 case CK_i486:
2764 case CK_WinChipC6:
2765 case CK_WinChip2:
2766 case CK_C3:
2767 case CK_i586:
2768 case CK_Pentium:
2769 case CK_PentiumMMX:
2770 case CK_i686:
2771 case CK_PentiumPro:
2772 case CK_Pentium2:
2773 case CK_Pentium3:
2774 case CK_Pentium3M:
2775 case CK_PentiumM:
2776 case CK_Yonah:
2777 case CK_C3_2:
2778 case CK_Pentium4:
2779 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002780 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002781 case CK_Prescott:
2782 case CK_K6:
2783 case CK_K6_2:
2784 case CK_K6_3:
2785 case CK_Athlon:
2786 case CK_AthlonThunderbird:
2787 case CK_Athlon4:
2788 case CK_AthlonXP:
2789 case CK_AthlonMP:
2790 case CK_Geode:
2791 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002792 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002793 return false;
2794
2795 // Fallthrough
2796 case CK_Nocona:
2797 case CK_Core2:
2798 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002799 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002800 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002801 case CK_Nehalem:
2802 case CK_Westmere:
2803 case CK_SandyBridge:
2804 case CK_IvyBridge:
2805 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002806 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002807 case CK_SkylakeClient:
2808 case CK_SkylakeServer:
2809 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002810 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002811 case CK_Athlon64:
2812 case CK_Athlon64SSE3:
2813 case CK_AthlonFX:
2814 case CK_K8:
2815 case CK_K8SSE3:
2816 case CK_Opteron:
2817 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002818 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002819 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002820 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002821 case CK_BDVER1:
2822 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002823 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002824 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002825 case CK_x86_64:
2826 return true;
2827 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002828 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002829 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002830
Craig Topper3164f332014-03-11 03:39:26 +00002831 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002832
Craig Topper3164f332014-03-11 03:39:26 +00002833 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002834 // Most of the non-ARM calling conventions are i386 conventions.
2835 switch (CC) {
2836 case CC_X86ThisCall:
2837 case CC_X86FastCall:
2838 case CC_X86StdCall:
2839 case CC_X86VectorCall:
2840 case CC_C:
2841 case CC_Swift:
2842 case CC_X86Pascal:
2843 case CC_IntelOclBicc:
2844 return CCCR_OK;
2845 default:
2846 return CCCR_Warning;
2847 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002848 }
2849
Craig Topper3164f332014-03-11 03:39:26 +00002850 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002851 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002852 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002853
2854 bool hasSjLjLowering() const override {
2855 return true;
2856 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002857
2858 void setSupportedOpenCLOpts() override {
2859 getSupportedOpenCLOpts().setAll();
2860 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002861};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002862
Rafael Espindolaeb265472013-08-21 21:59:03 +00002863bool X86TargetInfo::setFPMath(StringRef Name) {
2864 if (Name == "387") {
2865 FPMath = FP_387;
2866 return true;
2867 }
2868 if (Name == "sse") {
2869 FPMath = FP_SSE;
2870 return true;
2871 }
2872 return false;
2873}
2874
Eric Christopher007b0a02015-08-28 22:32:01 +00002875bool X86TargetInfo::initFeatureMap(
2876 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002877 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002878 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002879 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002880 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002881 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002882
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002883 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002884
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002885 // Enable X87 for all X86 processors but Lakemont.
2886 if (Kind != CK_Lakemont)
2887 setFeatureEnabledImpl(Features, "x87", true);
2888
2889 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002890 case CK_Generic:
2891 case CK_i386:
2892 case CK_i486:
2893 case CK_i586:
2894 case CK_Pentium:
2895 case CK_i686:
2896 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002897 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002898 break;
2899 case CK_PentiumMMX:
2900 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002901 case CK_K6:
2902 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002903 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002904 break;
2905 case CK_Pentium3:
2906 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002907 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002908 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002909 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002910 break;
2911 case CK_PentiumM:
2912 case CK_Pentium4:
2913 case CK_Pentium4M:
2914 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002915 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002916 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002917 break;
2918 case CK_Yonah:
2919 case CK_Prescott:
2920 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002921 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002922 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002923 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002924 break;
2925 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002926 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002927 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002928 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002929 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002930 break;
2931 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002932 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002933 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002934 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002936 case CK_Cannonlake:
2937 setFeatureEnabledImpl(Features, "avx512ifma", true);
2938 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2939 setFeatureEnabledImpl(Features, "sha", true);
2940 setFeatureEnabledImpl(Features, "umip", true);
2941 // FALLTHROUGH
2942 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002943 setFeatureEnabledImpl(Features, "avx512f", true);
2944 setFeatureEnabledImpl(Features, "avx512cd", true);
2945 setFeatureEnabledImpl(Features, "avx512dq", true);
2946 setFeatureEnabledImpl(Features, "avx512bw", true);
2947 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002948 setFeatureEnabledImpl(Features, "pku", true);
2949 setFeatureEnabledImpl(Features, "pcommit", true);
2950 setFeatureEnabledImpl(Features, "clwb", true);
2951 // FALLTHROUGH
2952 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002953 setFeatureEnabledImpl(Features, "xsavec", true);
2954 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002955 setFeatureEnabledImpl(Features, "mpx", true);
2956 setFeatureEnabledImpl(Features, "sgx", true);
2957 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002958 // FALLTHROUGH
2959 case CK_Broadwell:
2960 setFeatureEnabledImpl(Features, "rdseed", true);
2961 setFeatureEnabledImpl(Features, "adx", true);
2962 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002963 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002964 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002965 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002966 setFeatureEnabledImpl(Features, "bmi", true);
2967 setFeatureEnabledImpl(Features, "bmi2", true);
2968 setFeatureEnabledImpl(Features, "rtm", true);
2969 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002970 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002971 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002972 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002973 setFeatureEnabledImpl(Features, "rdrnd", true);
2974 setFeatureEnabledImpl(Features, "f16c", true);
2975 setFeatureEnabledImpl(Features, "fsgsbase", true);
2976 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002977 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002978 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002979 setFeatureEnabledImpl(Features, "xsave", true);
2980 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002981 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002982 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002983 case CK_Silvermont:
2984 setFeatureEnabledImpl(Features, "aes", true);
2985 setFeatureEnabledImpl(Features, "pclmul", true);
2986 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002987 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002988 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002989 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002990 setFeatureEnabledImpl(Features, "cx16", true);
2991 break;
2992 case CK_KNL:
2993 setFeatureEnabledImpl(Features, "avx512f", true);
2994 setFeatureEnabledImpl(Features, "avx512cd", true);
2995 setFeatureEnabledImpl(Features, "avx512er", true);
2996 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002997 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002998 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002999 setFeatureEnabledImpl(Features, "rdseed", true);
3000 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003001 setFeatureEnabledImpl(Features, "lzcnt", true);
3002 setFeatureEnabledImpl(Features, "bmi", true);
3003 setFeatureEnabledImpl(Features, "bmi2", true);
3004 setFeatureEnabledImpl(Features, "rtm", true);
3005 setFeatureEnabledImpl(Features, "fma", true);
3006 setFeatureEnabledImpl(Features, "rdrnd", true);
3007 setFeatureEnabledImpl(Features, "f16c", true);
3008 setFeatureEnabledImpl(Features, "fsgsbase", true);
3009 setFeatureEnabledImpl(Features, "aes", true);
3010 setFeatureEnabledImpl(Features, "pclmul", true);
3011 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003012 setFeatureEnabledImpl(Features, "xsaveopt", true);
3013 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003014 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003015 break;
3016 case CK_K6_2:
3017 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003018 case CK_WinChip2:
3019 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003020 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003021 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003022 case CK_Athlon:
3023 case CK_AthlonThunderbird:
3024 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003025 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003026 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003027 case CK_Athlon4:
3028 case CK_AthlonXP:
3029 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003030 setFeatureEnabledImpl(Features, "sse", true);
3031 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003032 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003033 break;
3034 case CK_K8:
3035 case CK_Opteron:
3036 case CK_Athlon64:
3037 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003038 setFeatureEnabledImpl(Features, "sse2", true);
3039 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003040 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003041 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003042 case CK_AMDFAM10:
3043 setFeatureEnabledImpl(Features, "sse4a", true);
3044 setFeatureEnabledImpl(Features, "lzcnt", true);
3045 setFeatureEnabledImpl(Features, "popcnt", true);
3046 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 case CK_K8SSE3:
3048 case CK_OpteronSSE3:
3049 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003050 setFeatureEnabledImpl(Features, "sse3", true);
3051 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003052 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003053 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003054 case CK_BTVER2:
3055 setFeatureEnabledImpl(Features, "avx", true);
3056 setFeatureEnabledImpl(Features, "aes", true);
3057 setFeatureEnabledImpl(Features, "pclmul", true);
3058 setFeatureEnabledImpl(Features, "bmi", true);
3059 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003060 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003061 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003062 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003063 setFeatureEnabledImpl(Features, "ssse3", true);
3064 setFeatureEnabledImpl(Features, "sse4a", true);
3065 setFeatureEnabledImpl(Features, "lzcnt", true);
3066 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003067 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003068 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003069 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003070 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003071 case CK_BDVER4:
3072 setFeatureEnabledImpl(Features, "avx2", true);
3073 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003074 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003075 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003076 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003077 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003078 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003079 // FALLTHROUGH
3080 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003081 setFeatureEnabledImpl(Features, "bmi", true);
3082 setFeatureEnabledImpl(Features, "fma", true);
3083 setFeatureEnabledImpl(Features, "f16c", true);
3084 setFeatureEnabledImpl(Features, "tbm", true);
3085 // FALLTHROUGH
3086 case CK_BDVER1:
3087 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003088 setFeatureEnabledImpl(Features, "xop", true);
3089 setFeatureEnabledImpl(Features, "lzcnt", true);
3090 setFeatureEnabledImpl(Features, "aes", true);
3091 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003092 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003093 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003094 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003095 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003096 break;
Eli Friedman33465822011-07-08 23:31:17 +00003097 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003098 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3099 return false;
3100
3101 // Can't do this earlier because we need to be able to explicitly enable
3102 // or disable these features and the things that they depend upon.
3103
3104 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3105 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003106 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003107 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3108 FeaturesVec.end())
3109 Features["popcnt"] = true;
3110
3111 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3112 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003113 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003114 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3115 FeaturesVec.end())
3116 Features["prfchw"] = true;
3117
Eric Christophera7260af2015-10-08 20:10:18 +00003118 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3119 // then enable MMX.
3120 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003121 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003122 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3123 FeaturesVec.end())
3124 Features["mmx"] = true;
3125
Eric Christopherbbd746d2015-10-08 20:10:14 +00003126 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003127}
3128
Rafael Espindolae62e2792013-08-20 13:44:29 +00003129void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003130 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003131 if (Enabled) {
3132 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003133 case AVX512F:
3134 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003135 case AVX2:
3136 Features["avx2"] = true;
3137 case AVX:
3138 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003139 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003140 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003141 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003142 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003143 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003144 case SSSE3:
3145 Features["ssse3"] = true;
3146 case SSE3:
3147 Features["sse3"] = true;
3148 case SSE2:
3149 Features["sse2"] = true;
3150 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003151 Features["sse"] = true;
3152 case NoSSE:
3153 break;
3154 }
3155 return;
3156 }
3157
3158 switch (Level) {
3159 case NoSSE:
3160 case SSE1:
3161 Features["sse"] = false;
3162 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003163 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3164 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003165 case SSE3:
3166 Features["sse3"] = false;
3167 setXOPLevel(Features, NoXOP, false);
3168 case SSSE3:
3169 Features["ssse3"] = false;
3170 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003171 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003172 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003173 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003174 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003175 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3176 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003177 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003178 case AVX2:
3179 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003180 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003181 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003182 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003183 Features["avx512vl"] = Features["avx512vbmi"] =
3184 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003185 }
3186}
3187
3188void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003189 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003190 if (Enabled) {
3191 switch (Level) {
3192 case AMD3DNowAthlon:
3193 Features["3dnowa"] = true;
3194 case AMD3DNow:
3195 Features["3dnow"] = true;
3196 case MMX:
3197 Features["mmx"] = true;
3198 case NoMMX3DNow:
3199 break;
3200 }
3201 return;
3202 }
3203
3204 switch (Level) {
3205 case NoMMX3DNow:
3206 case MMX:
3207 Features["mmx"] = false;
3208 case AMD3DNow:
3209 Features["3dnow"] = false;
3210 case AMD3DNowAthlon:
3211 Features["3dnowa"] = false;
3212 }
3213}
3214
3215void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003216 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003217 if (Enabled) {
3218 switch (Level) {
3219 case XOP:
3220 Features["xop"] = true;
3221 case FMA4:
3222 Features["fma4"] = true;
3223 setSSELevel(Features, AVX, true);
3224 case SSE4A:
3225 Features["sse4a"] = true;
3226 setSSELevel(Features, SSE3, true);
3227 case NoXOP:
3228 break;
3229 }
3230 return;
3231 }
3232
3233 switch (Level) {
3234 case NoXOP:
3235 case SSE4A:
3236 Features["sse4a"] = false;
3237 case FMA4:
3238 Features["fma4"] = false;
3239 case XOP:
3240 Features["xop"] = false;
3241 }
3242}
3243
Craig Topper86d79ef2013-09-17 04:51:29 +00003244void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3245 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003246 // This is a bit of a hack to deal with the sse4 target feature when used
3247 // as part of the target attribute. We handle sse4 correctly everywhere
3248 // else. See below for more information on how we handle the sse4 options.
3249 if (Name != "sse4")
3250 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003251
Craig Topper29561122013-09-19 01:13:07 +00003252 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003253 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003254 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003255 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003256 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003257 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003258 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003259 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003260 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003261 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003262 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003263 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003264 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003265 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003266 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003267 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003268 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003269 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003270 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003271 if (Enabled)
3272 setSSELevel(Features, SSE2, Enabled);
3273 } else if (Name == "pclmul") {
3274 if (Enabled)
3275 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003276 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003277 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003278 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003279 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003280 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003281 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003282 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3283 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3284 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003285 if (Enabled)
3286 setSSELevel(Features, AVX512F, Enabled);
3287 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003288 if (Enabled)
3289 setSSELevel(Features, AVX, Enabled);
3290 } else if (Name == "fma4") {
3291 setXOPLevel(Features, FMA4, Enabled);
3292 } else if (Name == "xop") {
3293 setXOPLevel(Features, XOP, Enabled);
3294 } else if (Name == "sse4a") {
3295 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003296 } else if (Name == "f16c") {
3297 if (Enabled)
3298 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003299 } else if (Name == "sha") {
3300 if (Enabled)
3301 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003302 } else if (Name == "sse4") {
3303 // We can get here via the __target__ attribute since that's not controlled
3304 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3305 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3306 // disabled.
3307 if (Enabled)
3308 setSSELevel(Features, SSE42, Enabled);
3309 else
3310 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003311 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003312 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003313 Features["xsaveopt"] = false;
3314 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003315 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003316 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003317 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003318}
3319
Eric Christopher3ff21b32013-10-16 21:26:26 +00003320/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003321/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003322bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003323 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003324 for (const auto &Feature : Features) {
3325 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003326 continue;
3327
Eric Christopher610fe112015-08-26 08:21:55 +00003328 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003329 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003330 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003331 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003332 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003333 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003334 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003335 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003336 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003337 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003338 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003339 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003340 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003341 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003342 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003343 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003344 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003345 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003346 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003347 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003349 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003350 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003351 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003352 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003353 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003354 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003355 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003356 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003357 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003358 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003359 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003360 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003361 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003363 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003365 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003366 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003367 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003368 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003369 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003370 } else if (Feature == "+avx512vbmi") {
3371 HasAVX512VBMI = true;
3372 } else if (Feature == "+avx512ifma") {
3373 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003374 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003375 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003376 } else if (Feature == "+mpx") {
3377 HasMPX = true;
3378 } else if (Feature == "+movbe") {
3379 HasMOVBE = true;
3380 } else if (Feature == "+sgx") {
3381 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003382 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003383 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003384 } else if (Feature == "+fxsr") {
3385 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003386 } else if (Feature == "+xsave") {
3387 HasXSAVE = true;
3388 } else if (Feature == "+xsaveopt") {
3389 HasXSAVEOPT = true;
3390 } else if (Feature == "+xsavec") {
3391 HasXSAVEC = true;
3392 } else if (Feature == "+xsaves") {
3393 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003394 } else if (Feature == "+mwaitx") {
3395 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003396 } else if (Feature == "+pku") {
3397 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003398 } else if (Feature == "+clflushopt") {
3399 HasCLFLUSHOPT = true;
3400 } else if (Feature == "+pcommit") {
3401 HasPCOMMIT = true;
3402 } else if (Feature == "+clwb") {
3403 HasCLWB = true;
3404 } else if (Feature == "+umip") {
3405 HasUMIP = true;
3406 } else if (Feature == "+prefetchwt1") {
3407 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003408 }
3409
Benjamin Kramer27402c62012-03-05 15:10:44 +00003410 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003411 .Case("+avx512f", AVX512F)
3412 .Case("+avx2", AVX2)
3413 .Case("+avx", AVX)
3414 .Case("+sse4.2", SSE42)
3415 .Case("+sse4.1", SSE41)
3416 .Case("+ssse3", SSSE3)
3417 .Case("+sse3", SSE3)
3418 .Case("+sse2", SSE2)
3419 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003420 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003421 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003422
Eli Friedman33465822011-07-08 23:31:17 +00003423 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003424 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003425 .Case("+3dnowa", AMD3DNowAthlon)
3426 .Case("+3dnow", AMD3DNow)
3427 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003428 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003429 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003430
3431 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003432 .Case("+xop", XOP)
3433 .Case("+fma4", FMA4)
3434 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003435 .Default(NoXOP);
3436 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003437 }
Eli Friedman33465822011-07-08 23:31:17 +00003438
Rafael Espindolaeb265472013-08-21 21:59:03 +00003439 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3440 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003441 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3442 (FPMath == FP_387 && SSELevel >= SSE1)) {
3443 Diags.Report(diag::err_target_unsupported_fpmath) <<
3444 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003445 return false;
3446 }
3447
Alexey Bataev00396512015-07-02 03:40:19 +00003448 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003449 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003450 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003451}
Chris Lattnerecd49032009-03-02 22:27:17 +00003452
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003453/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3454/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003455void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003456 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003457 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003458 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003459 Builder.defineMacro("__amd64__");
3460 Builder.defineMacro("__amd64");
3461 Builder.defineMacro("__x86_64");
3462 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003463 if (getTriple().getArchName() == "x86_64h") {
3464 Builder.defineMacro("__x86_64h");
3465 Builder.defineMacro("__x86_64h__");
3466 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003467 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003468 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003469 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003470
Chris Lattnerecd49032009-03-02 22:27:17 +00003471 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003472 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3473 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003474 switch (CPU) {
3475 case CK_Generic:
3476 break;
3477 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003478 // The rest are coming from the i386 define above.
3479 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003480 break;
3481 case CK_i486:
3482 case CK_WinChipC6:
3483 case CK_WinChip2:
3484 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003485 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003486 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003487 case CK_PentiumMMX:
3488 Builder.defineMacro("__pentium_mmx__");
3489 Builder.defineMacro("__tune_pentium_mmx__");
3490 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003491 case CK_i586:
3492 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003493 defineCPUMacros(Builder, "i586");
3494 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003495 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003496 case CK_Pentium3:
3497 case CK_Pentium3M:
3498 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003499 Builder.defineMacro("__tune_pentium3__");
3500 // Fallthrough
3501 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003502 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003503 Builder.defineMacro("__tune_pentium2__");
3504 // Fallthrough
3505 case CK_PentiumPro:
3506 Builder.defineMacro("__tune_i686__");
3507 Builder.defineMacro("__tune_pentiumpro__");
3508 // Fallthrough
3509 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003510 Builder.defineMacro("__i686");
3511 Builder.defineMacro("__i686__");
3512 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3513 Builder.defineMacro("__pentiumpro");
3514 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003515 break;
3516 case CK_Pentium4:
3517 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003518 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003519 break;
3520 case CK_Yonah:
3521 case CK_Prescott:
3522 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003523 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003524 break;
3525 case CK_Core2:
3526 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003527 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003528 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003529 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003530 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003531 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003532 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003533 defineCPUMacros(Builder, "slm");
3534 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003535 case CK_Nehalem:
3536 case CK_Westmere:
3537 case CK_SandyBridge:
3538 case CK_IvyBridge:
3539 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003540 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003541 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003542 // FIXME: Historically, we defined this legacy name, it would be nice to
3543 // remove it at some point. We've never exposed fine-grained names for
3544 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003545 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003546 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003547 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003548 defineCPUMacros(Builder, "skx");
3549 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003550 case CK_Cannonlake:
3551 break;
Craig Topper449314e2013-08-20 07:09:39 +00003552 case CK_KNL:
3553 defineCPUMacros(Builder, "knl");
3554 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003555 case CK_Lakemont:
3556 Builder.defineMacro("__tune_lakemont__");
3557 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003558 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003559 Builder.defineMacro("__k6_2__");
3560 Builder.defineMacro("__tune_k6_2__");
3561 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003562 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003563 if (CPU != CK_K6_2) { // In case of fallthrough
3564 // FIXME: GCC may be enabling these in cases where some other k6
3565 // architecture is specified but -m3dnow is explicitly provided. The
3566 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003567 Builder.defineMacro("__k6_3__");
3568 Builder.defineMacro("__tune_k6_3__");
3569 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003570 // Fallthrough
3571 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003572 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003573 break;
3574 case CK_Athlon:
3575 case CK_AthlonThunderbird:
3576 case CK_Athlon4:
3577 case CK_AthlonXP:
3578 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003579 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003580 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003581 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003582 Builder.defineMacro("__tune_athlon_sse__");
3583 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003584 break;
3585 case CK_K8:
3586 case CK_K8SSE3:
3587 case CK_x86_64:
3588 case CK_Opteron:
3589 case CK_OpteronSSE3:
3590 case CK_Athlon64:
3591 case CK_Athlon64SSE3:
3592 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003593 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003594 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003595 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003596 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003597 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003598 case CK_BTVER1:
3599 defineCPUMacros(Builder, "btver1");
3600 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003601 case CK_BTVER2:
3602 defineCPUMacros(Builder, "btver2");
3603 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003604 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003605 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003606 break;
3607 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003608 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003609 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003610 case CK_BDVER3:
3611 defineCPUMacros(Builder, "bdver3");
3612 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003613 case CK_BDVER4:
3614 defineCPUMacros(Builder, "bdver4");
3615 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003616 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003617 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003618 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003619 }
Chris Lattner96e43572009-03-02 22:40:39 +00003620
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003621 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003622 Builder.defineMacro("__REGISTER_PREFIX__", "");
3623
Chris Lattner6df41af2009-04-19 17:32:33 +00003624 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3625 // functions in glibc header files that use FP Stack inline asm which the
3626 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003627 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003628
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003629 if (HasAES)
3630 Builder.defineMacro("__AES__");
3631
Craig Topper3f122a72012-05-31 05:18:48 +00003632 if (HasPCLMUL)
3633 Builder.defineMacro("__PCLMUL__");
3634
Craig Topper22967d42011-12-25 05:06:45 +00003635 if (HasLZCNT)
3636 Builder.defineMacro("__LZCNT__");
3637
Benjamin Kramer1e250392012-07-07 09:39:18 +00003638 if (HasRDRND)
3639 Builder.defineMacro("__RDRND__");
3640
Craig Topper8c7f2512014-11-03 06:51:41 +00003641 if (HasFSGSBASE)
3642 Builder.defineMacro("__FSGSBASE__");
3643
Craig Topper22967d42011-12-25 05:06:45 +00003644 if (HasBMI)
3645 Builder.defineMacro("__BMI__");
3646
3647 if (HasBMI2)
3648 Builder.defineMacro("__BMI2__");
3649
Craig Topper1de83482011-12-29 16:10:46 +00003650 if (HasPOPCNT)
3651 Builder.defineMacro("__POPCNT__");
3652
Michael Liao625a8752012-11-10 05:17:46 +00003653 if (HasRTM)
3654 Builder.defineMacro("__RTM__");
3655
Michael Liao74f4eaf2013-03-26 17:52:08 +00003656 if (HasPRFCHW)
3657 Builder.defineMacro("__PRFCHW__");
3658
Michael Liaoffaae352013-03-29 05:17:55 +00003659 if (HasRDSEED)
3660 Builder.defineMacro("__RDSEED__");
3661
Robert Khasanov50e6f582014-09-19 09:53:48 +00003662 if (HasADX)
3663 Builder.defineMacro("__ADX__");
3664
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003665 if (HasTBM)
3666 Builder.defineMacro("__TBM__");
3667
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003668 if (HasMWAITX)
3669 Builder.defineMacro("__MWAITX__");
3670
Rafael Espindolae62e2792013-08-20 13:44:29 +00003671 switch (XOPLevel) {
3672 case XOP:
3673 Builder.defineMacro("__XOP__");
3674 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003675 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003676 case SSE4A:
3677 Builder.defineMacro("__SSE4A__");
3678 case NoXOP:
3679 break;
3680 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003681
Craig Topperbba778b2012-06-03 21:46:30 +00003682 if (HasFMA)
3683 Builder.defineMacro("__FMA__");
3684
Manman Rena45358c2012-10-11 00:59:55 +00003685 if (HasF16C)
3686 Builder.defineMacro("__F16C__");
3687
Craig Topper679b53a2013-08-21 05:29:10 +00003688 if (HasAVX512CD)
3689 Builder.defineMacro("__AVX512CD__");
3690 if (HasAVX512ER)
3691 Builder.defineMacro("__AVX512ER__");
3692 if (HasAVX512PF)
3693 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003694 if (HasAVX512DQ)
3695 Builder.defineMacro("__AVX512DQ__");
3696 if (HasAVX512BW)
3697 Builder.defineMacro("__AVX512BW__");
3698 if (HasAVX512VL)
3699 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003700 if (HasAVX512VBMI)
3701 Builder.defineMacro("__AVX512VBMI__");
3702 if (HasAVX512IFMA)
3703 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003704
Ben Langmuir58078d02013-09-19 13:22:04 +00003705 if (HasSHA)
3706 Builder.defineMacro("__SHA__");
3707
Craig Toppere33f51f2015-10-16 06:22:36 +00003708 if (HasFXSR)
3709 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003710 if (HasXSAVE)
3711 Builder.defineMacro("__XSAVE__");
3712 if (HasXSAVEOPT)
3713 Builder.defineMacro("__XSAVEOPT__");
3714 if (HasXSAVEC)
3715 Builder.defineMacro("__XSAVEC__");
3716 if (HasXSAVES)
3717 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003718 if (HasPKU)
3719 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003720 if (HasCX16)
3721 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3722
Chris Lattner96e43572009-03-02 22:40:39 +00003723 // Each case falls through to the previous one here.
3724 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003725 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003726 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003727 case AVX2:
3728 Builder.defineMacro("__AVX2__");
3729 case AVX:
3730 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003731 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003732 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003733 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003734 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003735 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003736 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003737 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003738 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003739 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003740 Builder.defineMacro("__SSE2__");
3741 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003742 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003743 Builder.defineMacro("__SSE__");
3744 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003745 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003746 break;
3747 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003748
Derek Schuffc7dd7222012-10-11 15:52:22 +00003749 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003750 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003751 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003752 case AVX2:
3753 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003754 case SSE42:
3755 case SSE41:
3756 case SSSE3:
3757 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003758 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003759 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003760 break;
3761 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003762 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003763 break;
3764 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003765 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003766 }
3767 }
3768
Anders Carlssone437c682010-01-27 03:47:49 +00003769 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003770 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003771 case AMD3DNowAthlon:
3772 Builder.defineMacro("__3dNOW_A__");
3773 case AMD3DNow:
3774 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003775 case MMX:
3776 Builder.defineMacro("__MMX__");
3777 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003778 break;
3779 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003780
3781 if (CPU >= CK_i486) {
3782 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3783 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3784 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3785 }
3786 if (CPU >= CK_i586)
3787 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003788}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003789
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003790bool X86TargetInfo::hasFeature(StringRef Feature) const {
3791 return llvm::StringSwitch<bool>(Feature)
3792 .Case("aes", HasAES)
3793 .Case("avx", SSELevel >= AVX)
3794 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003795 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003796 .Case("avx512cd", HasAVX512CD)
3797 .Case("avx512er", HasAVX512ER)
3798 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003799 .Case("avx512dq", HasAVX512DQ)
3800 .Case("avx512bw", HasAVX512BW)
3801 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003802 .Case("avx512vbmi", HasAVX512VBMI)
3803 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003804 .Case("bmi", HasBMI)
3805 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003806 .Case("clflushopt", HasCLFLUSHOPT)
3807 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003808 .Case("cx16", HasCX16)
3809 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003810 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003811 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003812 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003813 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003814 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003815 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3816 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3817 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003818 .Case("movbe", HasMOVBE)
3819 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003820 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003821 .Case("pcommit", HasPCOMMIT)
3822 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003823 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003824 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003825 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003826 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003827 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003828 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003829 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003830 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003831 .Case("sse", SSELevel >= SSE1)
3832 .Case("sse2", SSELevel >= SSE2)
3833 .Case("sse3", SSELevel >= SSE3)
3834 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003835 .Case("sse4.1", SSELevel >= SSE41)
3836 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003837 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003838 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003839 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003840 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003841 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3842 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003843 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003844 .Case("xsave", HasXSAVE)
3845 .Case("xsavec", HasXSAVEC)
3846 .Case("xsaves", HasXSAVES)
3847 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003848 .Default(false);
3849}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003850
Eric Christopherd9832702015-06-29 21:00:05 +00003851// We can't use a generic validation scheme for the features accepted here
3852// versus subtarget features accepted in the target attribute because the
3853// bitfield structure that's initialized in the runtime only supports the
3854// below currently rather than the full range of subtarget features. (See
3855// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3856bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3857 return llvm::StringSwitch<bool>(FeatureStr)
3858 .Case("cmov", true)
3859 .Case("mmx", true)
3860 .Case("popcnt", true)
3861 .Case("sse", true)
3862 .Case("sse2", true)
3863 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003864 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003865 .Case("sse4.1", true)
3866 .Case("sse4.2", true)
3867 .Case("avx", true)
3868 .Case("avx2", true)
3869 .Case("sse4a", true)
3870 .Case("fma4", true)
3871 .Case("xop", true)
3872 .Case("fma", true)
3873 .Case("avx512f", true)
3874 .Case("bmi", true)
3875 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003876 .Case("aes", true)
3877 .Case("pclmul", true)
3878 .Case("avx512vl", true)
3879 .Case("avx512bw", true)
3880 .Case("avx512dq", true)
3881 .Case("avx512cd", true)
3882 .Case("avx512er", true)
3883 .Case("avx512pf", true)
3884 .Case("avx512vbmi", true)
3885 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003886 .Default(false);
3887}
3888
Eli Friedman3fd920a2008-08-20 02:34:37 +00003889bool
Anders Carlsson58436352009-02-28 17:11:49 +00003890X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003891 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003892 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003893 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003894 // Constant constraints.
3895 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3896 // instructions.
3897 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3898 // x86_64 instructions.
3899 case 's':
3900 Info.setRequiresImmediate();
3901 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003902 case 'I':
3903 Info.setRequiresImmediate(0, 31);
3904 return true;
3905 case 'J':
3906 Info.setRequiresImmediate(0, 63);
3907 return true;
3908 case 'K':
3909 Info.setRequiresImmediate(-128, 127);
3910 return true;
3911 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003912 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003913 return true;
3914 case 'M':
3915 Info.setRequiresImmediate(0, 3);
3916 return true;
3917 case 'N':
3918 Info.setRequiresImmediate(0, 255);
3919 return true;
3920 case 'O':
3921 Info.setRequiresImmediate(0, 127);
3922 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003923 // Register constraints.
3924 case 'Y': // 'Y' is the first character for several 2-character constraints.
3925 // Shift the pointer to the second character of the constraint.
3926 Name++;
3927 switch (*Name) {
3928 default:
3929 return false;
3930 case '0': // First SSE register.
3931 case 't': // Any SSE register, when SSE2 is enabled.
3932 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3933 case 'm': // Any MMX register, when inter-unit moves enabled.
3934 Info.setAllowsRegister();
3935 return true;
3936 }
3937 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003938 // Constraint 'f' cannot be used for output operands.
3939 if (Info.ConstraintStr[0] == '=')
3940 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003941 Info.setAllowsRegister();
3942 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003943 case 'a': // eax.
3944 case 'b': // ebx.
3945 case 'c': // ecx.
3946 case 'd': // edx.
3947 case 'S': // esi.
3948 case 'D': // edi.
3949 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003950 case 't': // Top of floating point stack.
3951 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003952 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003953 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003954 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003955 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003956 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3957 case 'l': // "Index" registers: any general register that can be used as an
3958 // index in a base+index memory access.
3959 Info.setAllowsRegister();
3960 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003961 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003962 case 'C': // SSE floating point constant.
3963 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003964 return true;
3965 }
3966}
3967
Akira Hatanaka974131e2014-09-18 18:17:18 +00003968bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3969 unsigned Size) const {
3970 // Strip off constraint modifiers.
3971 while (Constraint[0] == '=' ||
3972 Constraint[0] == '+' ||
3973 Constraint[0] == '&')
3974 Constraint = Constraint.substr(1);
3975
3976 return validateOperandSize(Constraint, Size);
3977}
3978
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003979bool X86TargetInfo::validateInputSize(StringRef Constraint,
3980 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003981 return validateOperandSize(Constraint, Size);
3982}
3983
3984bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3985 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003986 switch (Constraint[0]) {
3987 default: break;
3988 case 'y':
3989 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003990 case 'f':
3991 case 't':
3992 case 'u':
3993 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003994 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003995 if (SSELevel >= AVX512F)
3996 // 512-bit zmm registers can be used if target supports AVX512F.
3997 return Size <= 512U;
3998 else if (SSELevel >= AVX)
3999 // 256-bit ymm registers can be used if target supports AVX.
4000 return Size <= 256U;
4001 return Size <= 128U;
4002 case 'Y':
4003 // 'Y' is the first character for several 2-character constraints.
4004 switch (Constraint[1]) {
4005 default: break;
4006 case 'm':
4007 // 'Ym' is synonymous with 'y'.
4008 return Size <= 64;
4009 case 'i':
4010 case 't':
4011 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4012 if (SSELevel >= AVX512F)
4013 return Size <= 512U;
4014 else if (SSELevel >= AVX)
4015 return Size <= 256U;
4016 return SSELevel >= SSE2 && Size <= 128U;
4017 }
4018
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004019 }
4020
4021 return true;
4022}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004023
Eli Friedman3fd920a2008-08-20 02:34:37 +00004024std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004025X86TargetInfo::convertConstraint(const char *&Constraint) const {
4026 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004027 case 'a': return std::string("{ax}");
4028 case 'b': return std::string("{bx}");
4029 case 'c': return std::string("{cx}");
4030 case 'd': return std::string("{dx}");
4031 case 'S': return std::string("{si}");
4032 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004033 case 'p': // address
4034 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004035 case 't': // top of floating point stack.
4036 return std::string("{st}");
4037 case 'u': // second from top of floating point stack.
4038 return std::string("{st(1)}"); // second from top of floating point stack.
4039 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004040 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004041 }
4042}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004043
Eli Friedman3fd920a2008-08-20 02:34:37 +00004044// X86-32 generic target
4045class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004046public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004047 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4048 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004049 DoubleAlign = LongLongAlign = 32;
4050 LongDoubleWidth = 96;
4051 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004052 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004053 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004054 SizeType = UnsignedInt;
4055 PtrDiffType = SignedInt;
4056 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004057 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004058
4059 // Use fpret for all types.
4060 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4061 (1 << TargetInfo::Double) |
4062 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004063
4064 // x86-32 has atomics up to 8 bytes
4065 // FIXME: Check that we actually have cmpxchg8b before setting
4066 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4067 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004068 }
Craig Topper3164f332014-03-11 03:39:26 +00004069 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004070 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004071 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004072
Craig Topper3164f332014-03-11 03:39:26 +00004073 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004074 if (RegNo == 0) return 0;
4075 if (RegNo == 1) return 2;
4076 return -1;
4077 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004078 bool validateOperandSize(StringRef Constraint,
4079 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004080 switch (Constraint[0]) {
4081 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004082 case 'R':
4083 case 'q':
4084 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004085 case 'a':
4086 case 'b':
4087 case 'c':
4088 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004089 case 'S':
4090 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004091 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004092 case 'A':
4093 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004094 }
4095
Akira Hatanaka974131e2014-09-18 18:17:18 +00004096 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004097 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004098};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004099
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004100class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4101public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004102 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4103 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004104
Craig Topper3164f332014-03-11 03:39:26 +00004105 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004106 unsigned Major, Minor, Micro;
4107 getTriple().getOSVersion(Major, Minor, Micro);
4108 // New NetBSD uses the default rounding mode.
4109 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4110 return X86_32TargetInfo::getFloatEvalMethod();
4111 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004112 return 1;
4113 }
4114};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004115
Eli Friedmane3aa4542009-07-05 18:47:56 +00004116class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4117public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004118 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4119 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004120 SizeType = UnsignedLong;
4121 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004122 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004123 }
4124};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004125
Eli Friedman9fa28852012-08-08 23:57:20 +00004126class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4127public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004128 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4129 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004130 SizeType = UnsignedLong;
4131 IntPtrType = SignedLong;
4132 PtrDiffType = SignedLong;
4133 }
4134};
Eli Friedman9fa28852012-08-08 23:57:20 +00004135
Torok Edwinb2b37c62009-06-30 17:10:35 +00004136class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004137public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004138 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4139 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004140 LongDoubleWidth = 128;
4141 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004142 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004143 MaxVectorAlign = 256;
4144 // The watchOS simulator uses the builtin bool type for Objective-C.
4145 llvm::Triple T = llvm::Triple(Triple);
4146 if (T.isWatchOS())
4147 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004148 SizeType = UnsignedLong;
4149 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004150 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004151 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004152 }
4153
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004154 bool handleTargetFeatures(std::vector<std::string> &Features,
4155 DiagnosticsEngine &Diags) override {
4156 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4157 Diags))
4158 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004159 // We now know the features we have: we can decide how to align vectors.
4160 MaxVectorAlign =
4161 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004162 return true;
4163 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004164};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004165
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004166// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004167class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004168public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004169 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4170 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004171 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004172 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004173 bool IsWinCOFF =
4174 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004175 resetDataLayout(IsWinCOFF
4176 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4177 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004178 }
Craig Topper3164f332014-03-11 03:39:26 +00004179 void getTargetDefines(const LangOptions &Opts,
4180 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004181 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4182 }
4183};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004184
4185// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004186class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004187public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004188 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4189 const TargetOptions &Opts)
4190 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004191 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004192 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4193 }
Craig Topper3164f332014-03-11 03:39:26 +00004194 void getTargetDefines(const LangOptions &Opts,
4195 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004196 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4197 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4198 // The value of the following reflects processor type.
4199 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4200 // We lost the original triple, so we use the default.
4201 Builder.defineMacro("_M_IX86", "600");
4202 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004203};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004204
David Majnemerae1ed0e2015-05-28 04:36:18 +00004205static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004206 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4207 // supports __declspec natively under -fms-extensions, but we define a no-op
4208 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004209 if (Opts.MicrosoftExt)
4210 Builder.defineMacro("__declspec", "__declspec");
4211 else
4212 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4213
4214 if (!Opts.MicrosoftExt) {
4215 // Provide macros for all the calling convention keywords. Provide both
4216 // single and double underscore prefixed variants. These are available on
4217 // x64 as well as x86, even though they have no effect.
4218 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4219 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004220 std::string GCCSpelling = "__attribute__((__";
4221 GCCSpelling += CC;
4222 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004223 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4224 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4225 }
4226 }
4227}
4228
David Majnemerae1ed0e2015-05-28 04:36:18 +00004229static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4230 Builder.defineMacro("__MSVCRT__");
4231 Builder.defineMacro("__MINGW32__");
4232 addCygMingDefines(Opts, Builder);
4233}
4234
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004235// x86-32 MinGW target
4236class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4237public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004238 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4239 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004240 void getTargetDefines(const LangOptions &Opts,
4241 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004242 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004243 DefineStd(Builder, "WIN32", Opts);
4244 DefineStd(Builder, "WINNT", Opts);
4245 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004246 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004247 }
4248};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004249
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004250// x86-32 Cygwin target
4251class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4252public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004253 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4254 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004255 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004256 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004257 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 +00004258 }
Craig Topper3164f332014-03-11 03:39:26 +00004259 void getTargetDefines(const LangOptions &Opts,
4260 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004261 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004262 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004263 Builder.defineMacro("__CYGWIN__");
4264 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004265 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004266 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004267 if (Opts.CPlusPlus)
4268 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004269 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004270};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004271
Chris Lattnerb986aba2010-04-11 19:29:39 +00004272// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004273class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004274public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004275 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004276 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004277 }
Craig Topper3164f332014-03-11 03:39:26 +00004278 void getTargetDefines(const LangOptions &Opts,
4279 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004280 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004281 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004282 }
4283};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004284
Alexey Bataevc99b0492015-11-25 09:24:26 +00004285// X86-32 MCU target
4286class MCUX86_32TargetInfo : public X86_32TargetInfo {
4287public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004288 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4289 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004290 LongDoubleWidth = 64;
4291 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004292 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 +00004293 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004294 }
4295
4296 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4297 // On MCU we support only C calling convention.
4298 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4299 }
4300
4301 void getTargetDefines(const LangOptions &Opts,
4302 MacroBuilder &Builder) const override {
4303 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4304 Builder.defineMacro("__iamcu");
4305 Builder.defineMacro("__iamcu__");
4306 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004307
4308 bool allowsLargerPreferedTypeAlignment() const override {
4309 return false;
4310 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004311};
4312
Douglas Gregor9fabd852011-07-01 22:41:14 +00004313// RTEMS Target
4314template<typename Target>
4315class RTEMSTargetInfo : public OSTargetInfo<Target> {
4316protected:
Craig Topper3164f332014-03-11 03:39:26 +00004317 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4318 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004319 // RTEMS defines; list based off of gcc output
4320
Douglas Gregor9fabd852011-07-01 22:41:14 +00004321 Builder.defineMacro("__rtems__");
4322 Builder.defineMacro("__ELF__");
4323 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004324
Douglas Gregor9fabd852011-07-01 22:41:14 +00004325public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004326 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4327 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004328 switch (Triple.getArch()) {
4329 default:
4330 case llvm::Triple::x86:
4331 // this->MCountName = ".mcount";
4332 break;
4333 case llvm::Triple::mips:
4334 case llvm::Triple::mipsel:
4335 case llvm::Triple::ppc:
4336 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004337 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004338 // this->MCountName = "_mcount";
4339 break;
4340 case llvm::Triple::arm:
4341 // this->MCountName = "__mcount";
4342 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004343 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004344 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004345};
4346
Douglas Gregor9fabd852011-07-01 22:41:14 +00004347// x86-32 RTEMS target
4348class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4349public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004350 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4351 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004352 SizeType = UnsignedLong;
4353 IntPtrType = SignedLong;
4354 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004355 }
Craig Topper3164f332014-03-11 03:39:26 +00004356 void getTargetDefines(const LangOptions &Opts,
4357 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004358 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4359 Builder.defineMacro("__INTEL__");
4360 Builder.defineMacro("__rtems__");
4361 }
4362};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004363
Eli Friedman3fd920a2008-08-20 02:34:37 +00004364// x86-64 generic target
4365class X86_64TargetInfo : public X86TargetInfo {
4366public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004367 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4368 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004369 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004370 bool IsWinCOFF =
4371 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004372 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004373 LongDoubleWidth = 128;
4374 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004375 LargeArrayMinWidth = 128;
4376 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004377 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004378 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4379 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4380 IntPtrType = IsX32 ? SignedInt : SignedLong;
4381 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004382 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004383 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004384
Eric Christopher917e9522014-11-18 22:36:15 +00004385 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004386 resetDataLayout(IsX32
4387 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4388 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4389 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004390
4391 // Use fpret only for long double.
4392 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004393
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004394 // Use fp2ret for _Complex long double.
4395 ComplexLongDoubleUsesFP2Ret = true;
4396
Charles Davisc7d5c942015-09-17 20:55:33 +00004397 // Make __builtin_ms_va_list available.
4398 HasBuiltinMSVaList = true;
4399
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004400 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004401 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004402 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004403 }
Craig Topper3164f332014-03-11 03:39:26 +00004404 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004405 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004406 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004407
Craig Topper3164f332014-03-11 03:39:26 +00004408 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004409 if (RegNo == 0) return 0;
4410 if (RegNo == 1) return 1;
4411 return -1;
4412 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004413
Craig Topper3164f332014-03-11 03:39:26 +00004414 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004415 switch (CC) {
4416 case CC_C:
4417 case CC_Swift:
4418 case CC_X86VectorCall:
4419 case CC_IntelOclBicc:
4420 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004421 case CC_PreserveMost:
4422 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004423 return CCCR_OK;
4424 default:
4425 return CCCR_Warning;
4426 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004427 }
4428
Craig Topper3164f332014-03-11 03:39:26 +00004429 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004430 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004431 }
4432
Pavel Chupinfd223e12014-08-04 12:39:43 +00004433 // for x32 we need it here explicitly
4434 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004435 unsigned getUnwindWordWidth() const override { return 64; }
4436 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004437
4438 bool validateGlobalRegisterVariable(StringRef RegName,
4439 unsigned RegSize,
4440 bool &HasSizeMismatch) const override {
4441 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4442 // handle.
4443 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4444 // Check that the register size is 64-bit.
4445 HasSizeMismatch = RegSize != 64;
4446 return true;
4447 }
4448
4449 // Check if the register is a 32-bit register the backend can handle.
4450 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4451 HasSizeMismatch);
4452 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004453};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004454
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004455// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004456class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004457public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004458 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4459 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004460 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004461 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004462 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004463 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004464 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004465 SizeType = UnsignedLongLong;
4466 PtrDiffType = SignedLongLong;
4467 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004468 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004469
Craig Topper3164f332014-03-11 03:39:26 +00004470 void getTargetDefines(const LangOptions &Opts,
4471 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004472 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004473 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004474 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004475
Craig Topper3164f332014-03-11 03:39:26 +00004476 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004477 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004478 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004479
Craig Topper3164f332014-03-11 03:39:26 +00004480 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004481 switch (CC) {
4482 case CC_X86StdCall:
4483 case CC_X86ThisCall:
4484 case CC_X86FastCall:
4485 return CCCR_Ignore;
4486 case CC_C:
4487 case CC_X86VectorCall:
4488 case CC_IntelOclBicc:
4489 case CC_X86_64SysV:
4490 return CCCR_OK;
4491 default:
4492 return CCCR_Warning;
4493 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004494 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004495};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004496
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004497// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004498class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004499public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004500 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4501 const TargetOptions &Opts)
4502 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004503 LongDoubleWidth = LongDoubleAlign = 64;
4504 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004505 }
Craig Topper3164f332014-03-11 03:39:26 +00004506 void getTargetDefines(const LangOptions &Opts,
4507 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004508 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4509 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004510 Builder.defineMacro("_M_X64", "100");
4511 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004512 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004513};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004514
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004515// x86-64 MinGW target
4516class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4517public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004518 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4519 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004520 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4521 // with x86 FP ops. Weird.
4522 LongDoubleWidth = LongDoubleAlign = 128;
4523 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4524 }
4525
Craig Topper3164f332014-03-11 03:39:26 +00004526 void getTargetDefines(const LangOptions &Opts,
4527 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004528 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004529 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004530 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004531 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004532
4533 // GCC defines this macro when it is using __gxx_personality_seh0.
4534 if (!Opts.SjLjExceptions)
4535 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004536 }
4537};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004538
Yaron Kerend030d112015-07-22 17:38:19 +00004539// x86-64 Cygwin target
4540class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4541public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004542 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4543 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004544 TLSSupported = false;
4545 WCharType = UnsignedShort;
4546 }
4547 void getTargetDefines(const LangOptions &Opts,
4548 MacroBuilder &Builder) const override {
4549 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4550 Builder.defineMacro("__x86_64__");
4551 Builder.defineMacro("__CYGWIN__");
4552 Builder.defineMacro("__CYGWIN64__");
4553 addCygMingDefines(Opts, Builder);
4554 DefineStd(Builder, "unix", Opts);
4555 if (Opts.CPlusPlus)
4556 Builder.defineMacro("_GNU_SOURCE");
4557
4558 // GCC defines this macro when it is using __gxx_personality_seh0.
4559 if (!Opts.SjLjExceptions)
4560 Builder.defineMacro("__SEH__");
4561 }
4562};
4563
Eli Friedman2857ccb2009-07-01 03:36:11 +00004564class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4565public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004566 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4567 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004568 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004569 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4570 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004571 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004572 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004573 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004574 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004575
4576 bool handleTargetFeatures(std::vector<std::string> &Features,
4577 DiagnosticsEngine &Diags) override {
4578 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4579 Diags))
4580 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004581 // We now know the features we have: we can decide how to align vectors.
4582 MaxVectorAlign =
4583 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004584 return true;
4585 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004586};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004587
Eli Friedman245f2292009-07-05 22:31:18 +00004588class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4589public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004590 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4591 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004592 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004593 Int64Type = SignedLongLong;
4594 }
4595};
Eli Friedman245f2292009-07-05 22:31:18 +00004596
Eli Friedman9fa28852012-08-08 23:57:20 +00004597class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4598public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004599 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4600 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004601 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004602 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004603 }
4604};
Tim Northover9bb857a2013-01-31 12:13:10 +00004605
Eli Friedmanf05b7722008-08-20 07:44:10 +00004606class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004607 // Possible FPU choices.
4608 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004609 VFP2FPU = (1 << 0),
4610 VFP3FPU = (1 << 1),
4611 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004612 NeonFPU = (1 << 3),
4613 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004614 };
4615
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004616 // Possible HWDiv features.
4617 enum HWDivMode {
4618 HWDivThumb = (1 << 0),
4619 HWDivARM = (1 << 1)
4620 };
4621
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004622 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004623 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004624 }
4625
4626 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4627 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004628
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004629 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004630
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004631 StringRef CPUProfile;
4632 StringRef CPUAttr;
4633
Rafael Espindolaeb265472013-08-21 21:59:03 +00004634 enum {
4635 FP_Default,
4636 FP_VFP,
4637 FP_Neon
4638 } FPMath;
4639
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004640 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004641 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004642 unsigned ArchProfile;
4643 unsigned ArchVersion;
4644
Bernard Ogdenda13af32013-10-24 18:32:51 +00004645 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004646
Logan Chien57086ce2012-10-10 06:56:20 +00004647 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004648 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004649
4650 // Initialized via features.
4651 unsigned SoftFloat : 1;
4652 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004653
Bernard Ogden18b57012013-10-29 09:47:51 +00004654 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004655 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004656 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004657 unsigned Unaligned : 1;
4658
4659 enum {
4660 LDREX_B = (1 << 0), /// byte (8-bit)
4661 LDREX_H = (1 << 1), /// half (16-bit)
4662 LDREX_W = (1 << 2), /// word (32-bit)
4663 LDREX_D = (1 << 3), /// double (64-bit)
4664 };
4665
4666 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004667
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004668 // ACLE 6.5.1 Hardware floating point
4669 enum {
4670 HW_FP_HP = (1 << 1), /// half (16-bit)
4671 HW_FP_SP = (1 << 2), /// single (32-bit)
4672 HW_FP_DP = (1 << 3), /// double (64-bit)
4673 };
4674 uint32_t HW_FP;
4675
Chris Lattner5cc15e02010-03-03 19:03:45 +00004676 static const Builtin::Info BuiltinInfo[];
4677
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004678 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004679 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004680
4681 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004682 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004683
Renato Golin9ba39232015-02-27 16:35:48 +00004684 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4685 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4686 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004687 SizeType = UnsignedLong;
4688 else
4689 SizeType = UnsignedInt;
4690
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004691 switch (T.getOS()) {
4692 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004693 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004694 break;
4695 case llvm::Triple::Win32:
4696 WCharType = UnsignedShort;
4697 break;
4698 case llvm::Triple::Linux:
4699 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004700 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4701 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004702 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004703 }
4704
4705 UseBitFieldTypeAlignment = true;
4706
4707 ZeroLengthBitfieldBoundary = 0;
4708
Tim Northover147cd2f2014-10-14 22:12:21 +00004709 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4710 // so set preferred for small types to 32.
4711 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004712 resetDataLayout(BigEndian
4713 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4714 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004715 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004716 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004717 resetDataLayout("e"
4718 "-m:w"
4719 "-p:32:32"
4720 "-i64:64"
4721 "-v128:64:128"
4722 "-a:0:32"
4723 "-n32"
4724 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004725 } else if (T.isOSNaCl()) {
4726 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004727 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004728 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004729 resetDataLayout(BigEndian
4730 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4731 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004732 }
4733
4734 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004735 }
4736
Tim Northover5627d392015-10-30 16:30:45 +00004737 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004738 const llvm::Triple &T = getTriple();
4739
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004740 IsAAPCS = false;
4741
Tim Northover5627d392015-10-30 16:30:45 +00004742 if (IsAAPCS16)
4743 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4744 else
4745 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004746
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004747 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004748 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004749 SizeType = UnsignedInt;
4750 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004751 SizeType = UnsignedLong;
4752
4753 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4754 WCharType = SignedInt;
4755
4756 // Do not respect the alignment of bit-field types when laying out
4757 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4758 UseBitFieldTypeAlignment = false;
4759
4760 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4761 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4762 /// gcc.
4763 ZeroLengthBitfieldBoundary = 32;
4764
Tim Northover5627d392015-10-30 16:30:45 +00004765 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4766 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004767 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004768 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004769 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004770 BigEndian
4771 ? "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 +00004772 : "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 +00004773 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004774 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004775 BigEndian
4776 ? "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 +00004777 : "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 +00004778
4779 // FIXME: Override "preferred align" for double and long long.
4780 }
4781
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004782 void setArchInfo() {
4783 StringRef ArchName = getTriple().getArchName();
4784
Renato Goline84b0002015-10-08 16:43:26 +00004785 ArchISA = llvm::ARM::parseArchISA(ArchName);
4786 CPU = llvm::ARM::getDefaultCPU(ArchName);
4787 unsigned AK = llvm::ARM::parseArch(ArchName);
4788 if (AK != llvm::ARM::AK_INVALID)
4789 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004790 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791 }
4792
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004793 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004794 StringRef SubArch;
4795
4796 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004797 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004798 SubArch = llvm::ARM::getSubArch(ArchKind);
4799 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4800 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004801
4802 // cache CPU related strings
4803 CPUAttr = getCPUAttr();
4804 CPUProfile = getCPUProfile();
4805 }
4806
4807 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004808 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004809 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004810 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004811 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4812 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004813 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004814 if (ArchProfile == llvm::ARM::PK_M) {
4815 MaxAtomicPromoteWidth = 32;
4816 if (ShouldUseInlineAtomic)
4817 MaxAtomicInlineWidth = 32;
4818 }
4819 else {
4820 MaxAtomicPromoteWidth = 64;
4821 if (ShouldUseInlineAtomic)
4822 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004823 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004824 }
4825
4826 bool isThumb() const {
4827 return (ArchISA == llvm::ARM::IK_THUMB);
4828 }
4829
4830 bool supportsThumb() const {
4831 return CPUAttr.count('T') || ArchVersion >= 6;
4832 }
4833
4834 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004835 return CPUAttr.equals("6T2") ||
4836 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 }
4838
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004839 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004840 // For most sub-arches, the build attribute CPU name is enough.
4841 // For Cortex variants, it's slightly different.
4842 switch(ArchKind) {
4843 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004844 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004847 case llvm::ARM::AK_ARMV7S:
4848 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004849 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004850 return "7A";
4851 case llvm::ARM::AK_ARMV7R:
4852 return "7R";
4853 case llvm::ARM::AK_ARMV7M:
4854 return "7M";
4855 case llvm::ARM::AK_ARMV7EM:
4856 return "7EM";
4857 case llvm::ARM::AK_ARMV8A:
4858 return "8A";
4859 case llvm::ARM::AK_ARMV8_1A:
4860 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004861 case llvm::ARM::AK_ARMV8_2A:
4862 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004863 case llvm::ARM::AK_ARMV8MBaseline:
4864 return "8M_BASE";
4865 case llvm::ARM::AK_ARMV8MMainline:
4866 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004867 }
4868 }
4869
4870 StringRef getCPUProfile() const {
4871 switch(ArchProfile) {
4872 case llvm::ARM::PK_A:
4873 return "A";
4874 case llvm::ARM::PK_R:
4875 return "R";
4876 case llvm::ARM::PK_M:
4877 return "M";
4878 default:
4879 return "";
4880 }
4881 }
4882
Chris Lattner17df24e2008-04-21 18:56:49 +00004883public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004884 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004885 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4886 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004887
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004888 switch (getTriple().getOS()) {
4889 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004890 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004891 break;
4892 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004893 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004894 break;
4895 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004896
Renato Goline84b0002015-10-08 16:43:26 +00004897 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004898 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004899
Chris Lattner1a8f3942010-04-23 16:29:58 +00004900 // {} in inline assembly are neon specifiers, not assembly variant
4901 // specifiers.
4902 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004903
Eric Christopher0e261882014-12-05 01:06:59 +00004904 // FIXME: This duplicates code from the driver that sets the -target-abi
4905 // option - this code is used if -target-abi isn't passed and should
4906 // be unified in some way.
4907 if (Triple.isOSBinFormatMachO()) {
4908 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4909 // the frontend matches that.
4910 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4911 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004912 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004913 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004914 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004915 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004916 } else {
4917 setABI("apcs-gnu");
4918 }
4919 } else if (Triple.isOSWindows()) {
4920 // FIXME: this is invalid for WindowsCE
4921 setABI("aapcs");
4922 } else {
4923 // Select the default based on the platform.
4924 switch (Triple.getEnvironment()) {
4925 case llvm::Triple::Android:
4926 case llvm::Triple::GNUEABI:
4927 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004928 case llvm::Triple::MuslEABI:
4929 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004930 setABI("aapcs-linux");
4931 break;
4932 case llvm::Triple::EABIHF:
4933 case llvm::Triple::EABI:
4934 setABI("aapcs");
4935 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004936 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004937 setABI("apcs-gnu");
4938 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004939 default:
4940 if (Triple.getOS() == llvm::Triple::NetBSD)
4941 setABI("apcs-gnu");
4942 else
4943 setABI("aapcs");
4944 break;
4945 }
4946 }
John McCall86353412010-08-21 22:46:04 +00004947
4948 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004949 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004950
Renato Golin15b86152015-07-03 16:41:13 +00004951 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004952 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004953
James Molloya7139222012-03-12 09:14:10 +00004954 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004955 // the alignment of the zero-length bitfield is greater than the member
4956 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004957 // zero length bitfield.
4958 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004959
4960 if (Triple.getOS() == llvm::Triple::Linux ||
4961 Triple.getOS() == llvm::Triple::UnknownOS)
4962 this->MCountName =
4963 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004964 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004965
Alp Toker4925ba72014-06-07 23:30:42 +00004966 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004967
Craig Topper3164f332014-03-11 03:39:26 +00004968 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004969 ABI = Name;
4970
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004971 // The defaults (above) are for AAPCS, check if we need to change them.
4972 //
4973 // FIXME: We need support for -meabi... we could just mangle it into the
4974 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004975 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004976 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004977 return true;
4978 }
4979 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4980 setABIAAPCS();
4981 return true;
4982 }
4983 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004984 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004985
Renato Golinf5c4dec2015-05-27 13:33:00 +00004986 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004987 bool
4988 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4989 StringRef CPU,
4990 const std::vector<std::string> &FeaturesVec) const override {
4991
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004992 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004993 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004994
4995 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004996 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004997 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4998
4999 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005000 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005001 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5002
5003 for (const char *Feature : TargetFeatures)
5004 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005005 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005006
Eric Christopher007b0a02015-08-28 22:32:01 +00005007 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005008 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005009
Craig Topper3164f332014-03-11 03:39:26 +00005010 bool handleTargetFeatures(std::vector<std::string> &Features,
5011 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005012 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005013 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005014 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005015 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005016 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005017 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005018 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005019
Ranjeet Singhac08e532015-06-24 23:39:25 +00005020 // This does not diagnose illegal cases like having both
5021 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5022 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005023 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005024 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005025 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005026 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005027 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005028 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005029 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005030 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005031 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005032 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005033 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005034 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005035 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005036 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005037 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005038 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005039 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005040 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005041 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005042 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005043 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005044 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005045 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005046 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005047 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005048 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005049 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005050 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005051 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005052 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005053 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005054 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005055 } else if (Feature == "+strict-align") {
5056 Unaligned = 0;
5057 } else if (Feature == "+fp16") {
5058 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005059 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005060 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005061 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005062
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005063 switch (ArchVersion) {
5064 case 6:
5065 if (ArchProfile == llvm::ARM::PK_M)
5066 LDREX = 0;
5067 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5068 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5069 else
5070 LDREX = LDREX_W;
5071 break;
5072 case 7:
5073 if (ArchProfile == llvm::ARM::PK_M)
5074 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5075 else
5076 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5077 break;
5078 case 8:
5079 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5080 }
5081
Rafael Espindolaeb265472013-08-21 21:59:03 +00005082 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5083 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5084 return false;
5085 }
5086
5087 if (FPMath == FP_Neon)
5088 Features.push_back("+neonfp");
5089 else if (FPMath == FP_VFP)
5090 Features.push_back("-neonfp");
5091
Daniel Dunbar893d4752009-12-19 04:15:38 +00005092 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005093 auto Feature =
5094 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5095 if (Feature != Features.end())
5096 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005097
Rafael Espindolaeb265472013-08-21 21:59:03 +00005098 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005099 }
5100
Craig Topper3164f332014-03-11 03:39:26 +00005101 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005102 return llvm::StringSwitch<bool>(Feature)
5103 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005104 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005105 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005106 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005107 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005108 .Case("hwdiv", HWDiv & HWDivThumb)
5109 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005110 .Default(false);
5111 }
Renato Golin15b86152015-07-03 16:41:13 +00005112
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005113 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005114 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005115 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005116
Renato Golin15b86152015-07-03 16:41:13 +00005117 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005118 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005119 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005120 CPU = Name;
5121 return true;
5122 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005123
Craig Topper3164f332014-03-11 03:39:26 +00005124 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005125
Craig Topper3164f332014-03-11 03:39:26 +00005126 void getTargetDefines(const LangOptions &Opts,
5127 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005128 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005129 Builder.defineMacro("__arm");
5130 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005131 // For bare-metal none-eabi.
5132 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5133 getTriple().getEnvironment() == llvm::Triple::EABI)
5134 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005135
Chris Lattnerecd49032009-03-02 22:27:17 +00005136 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005137 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005138
5139 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5140 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005141 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005142 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5143
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005144 if (!CPUAttr.empty())
5145 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005146
5147 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005148 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005149 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005150
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005151 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005152 // ACLE 6.5.7 Crypto Extension
5153 if (Crypto)
5154 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5155 // ACLE 6.5.8 CRC32 Extension
5156 if (CRC)
5157 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5158 // ACLE 6.5.10 Numeric Maximum and Minimum
5159 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5160 // ACLE 6.5.9 Directed Rounding
5161 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005162 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005163
5164 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5165 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005166 // NOTE that the default profile is assumed to be 'A'
5167 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005168 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5169
Bradley Smithf4affc12016-03-03 13:52:22 +00005170 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5171 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5172 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5173 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005174 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005175 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005176 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005177 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5178
5179 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5180 // instruction set such as ARM or Thumb.
5181 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5182
5183 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5184
5185 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005186 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005187 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005188
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005189 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005190 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005191 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005192
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005193 // ACLE 6.4.4 LDREX/STREX
5194 if (LDREX)
5195 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5196
5197 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005198 if (ArchVersion == 5 ||
5199 (ArchVersion == 6 && CPUProfile != "M") ||
5200 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005201 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5202
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005203 // ACLE 6.5.1 Hardware Floating Point
5204 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005205 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005206
Yi Konga44c4d72014-06-27 21:25:42 +00005207 // ACLE predefines.
5208 Builder.defineMacro("__ARM_ACLE", "200");
5209
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005210 // FP16 support (we currently only support IEEE format).
5211 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5212 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5213
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005214 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005215 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005216 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5217
Mike Stump9d54bd72009-04-08 02:07:04 +00005218 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005219
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005220 // FIXME: It's more complicated than this and we don't really support
5221 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005222 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005223 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005224 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005225
David Tweed8f676532012-10-25 13:33:01 +00005226 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005227 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005228 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005229 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005230 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005231 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005232 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005233
Tim Northover28fc0e12016-04-28 13:59:55 +00005234 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5235 ABI == "aapcs16")
5236 Builder.defineMacro("__ARM_PCS_VFP", "1");
5237
Daniel Dunbar893d4752009-12-19 04:15:38 +00005238 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005239 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005240
Zijiao Ma56a83722016-08-17 02:13:33 +00005241 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005242 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005243
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005244 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005245 Builder.defineMacro("__THUMBEL__");
5246 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005247 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005248 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005249 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005250
5251 // ACLE 6.4.9 32-bit SIMD instructions
5252 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5253 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5254
5255 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005256 if (((HWDiv & HWDivThumb) && isThumb()) ||
5257 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005258 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005259 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005261
5262 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005263 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005264
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005265 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005266 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005267 if (FPU & VFP2FPU)
5268 Builder.defineMacro("__ARM_VFPV2__");
5269 if (FPU & VFP3FPU)
5270 Builder.defineMacro("__ARM_VFPV3__");
5271 if (FPU & VFP4FPU)
5272 Builder.defineMacro("__ARM_VFPV4__");
5273 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005274
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005275 // This only gets set when Neon instructions are actually available, unlike
5276 // the VFP define, hence the soft float and arch check. This is subtly
5277 // different from gcc, we follow the intent which was that it should be set
5278 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005279 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005281 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005282 // current AArch32 NEON implementations do not support double-precision
5283 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005284 Builder.defineMacro("__ARM_NEON_FP",
5285 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005286 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005287
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005288 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5289 Opts.ShortWChar ? "2" : "4");
5290
5291 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5292 Opts.ShortEnums ? "1" : "4");
5293
Bradley Smithf4affc12016-03-03 13:52:22 +00005294 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5297 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5298 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5299 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005300
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005301 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005302 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005303 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005304 }
5305
5306 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005307 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005308 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5309 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005310 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005311 }
5312
5313 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005314 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005315 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005316
5317 if (Opts.UnsafeFPMath)
5318 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005319
5320 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5321 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005322 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005323
Craig Topper6c03a542015-10-19 04:51:35 +00005324 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5325 return llvm::makeArrayRef(BuiltinInfo,
5326 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005327 }
Craig Topper3164f332014-03-11 03:39:26 +00005328 bool isCLZForZeroUndef() const override { return false; }
5329 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005330 return IsAAPCS
5331 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005332 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5333 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005334 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005335 ArrayRef<const char *> getGCCRegNames() const override;
5336 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005337 bool validateAsmConstraint(const char *&Name,
5338 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005339 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005340 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005341 case 'l': // r0-r7
5342 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005343 case 't': // VFP Floating point register single precision
5344 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005345 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005346 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005347 case 'I':
5348 case 'J':
5349 case 'K':
5350 case 'L':
5351 case 'M':
5352 // FIXME
5353 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005354 case 'Q': // A memory address that is a single base register.
5355 Info.setAllowsMemory();
5356 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005357 case 'U': // a memory reference...
5358 switch (Name[1]) {
5359 case 'q': // ...ARMV4 ldrsb
5360 case 'v': // ...VFP load/store (reg+constant offset)
5361 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005362 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005363 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005364 case 'n': // valid address for Neon doubleword vector load/store
5365 case 'm': // valid address for Neon element and structure load/store
5366 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005367 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005368 Info.setAllowsMemory();
5369 Name++;
5370 return true;
5371 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005372 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005373 return false;
5374 }
Craig Topper3164f332014-03-11 03:39:26 +00005375 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005376 std::string R;
5377 switch (*Constraint) {
5378 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005379 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005380 Constraint++;
5381 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005382 case 'p': // 'p' should be translated to 'r' by default.
5383 R = std::string("r");
5384 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005385 default:
5386 return std::string(1, *Constraint);
5387 }
5388 return R;
5389 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005390 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005391 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005392 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005393 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005394 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005395
Bill Wendling9d1ee112012-10-25 23:28:48 +00005396 // Strip off constraint modifiers.
5397 while (Constraint[0] == '=' ||
5398 Constraint[0] == '+' ||
5399 Constraint[0] == '&')
5400 Constraint = Constraint.substr(1);
5401
5402 switch (Constraint[0]) {
5403 default: break;
5404 case 'r': {
5405 switch (Modifier) {
5406 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005407 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005408 case 'q':
5409 // A register of size 32 cannot fit a vector type.
5410 return false;
5411 }
5412 }
5413 }
5414
5415 return true;
5416 }
Craig Topper3164f332014-03-11 03:39:26 +00005417 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005418 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005419 return "";
5420 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005421
Craig Topper3164f332014-03-11 03:39:26 +00005422 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005423 switch (CC) {
5424 case CC_AAPCS:
5425 case CC_AAPCS_VFP:
5426 case CC_Swift:
5427 return CCCR_OK;
5428 default:
5429 return CCCR_Warning;
5430 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005431 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005432
Craig Topper3164f332014-03-11 03:39:26 +00005433 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005434 if (RegNo == 0) return 0;
5435 if (RegNo == 1) return 1;
5436 return -1;
5437 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005438
5439 bool hasSjLjLowering() const override {
5440 return true;
5441 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005442};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005443
Rafael Espindolaeb265472013-08-21 21:59:03 +00005444bool ARMTargetInfo::setFPMath(StringRef Name) {
5445 if (Name == "neon") {
5446 FPMath = FP_Neon;
5447 return true;
5448 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5449 Name == "vfp4") {
5450 FPMath = FP_VFP;
5451 return true;
5452 }
5453 return false;
5454}
5455
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005456const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005457 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005458 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005459 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5460
5461 // Float registers
5462 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5463 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5464 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005465 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005466
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005467 // Double registers
5468 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5469 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005470 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5471 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005472
5473 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005474 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5475 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005476};
5477
Craig Topperf054e3a2015-10-19 03:52:27 +00005478ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5479 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005480}
5481
5482const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005483 { { "a1" }, "r0" },
5484 { { "a2" }, "r1" },
5485 { { "a3" }, "r2" },
5486 { { "a4" }, "r3" },
5487 { { "v1" }, "r4" },
5488 { { "v2" }, "r5" },
5489 { { "v3" }, "r6" },
5490 { { "v4" }, "r7" },
5491 { { "v5" }, "r8" },
5492 { { "v6", "rfp" }, "r9" },
5493 { { "sl" }, "r10" },
5494 { { "fp" }, "r11" },
5495 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005496 { { "r13" }, "sp" },
5497 { { "r14" }, "lr" },
5498 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005499 // The S, D and Q registers overlap, but aren't really aliases; we
5500 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005501};
5502
Craig Topperf054e3a2015-10-19 03:52:27 +00005503ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5504 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005505}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005506
5507const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005508#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005509 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005510#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5511 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005512#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005513
Craig Topper07d3b622015-08-07 05:14:44 +00005514#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005515 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005516#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005517 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005518#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5519 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005520#include "clang/Basic/BuiltinsARM.def"
5521};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005522
5523class ARMleTargetInfo : public ARMTargetInfo {
5524public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005525 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005526 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005527 void getTargetDefines(const LangOptions &Opts,
5528 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005529 Builder.defineMacro("__ARMEL__");
5530 ARMTargetInfo::getTargetDefines(Opts, Builder);
5531 }
5532};
5533
5534class ARMbeTargetInfo : public ARMTargetInfo {
5535public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005536 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005537 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005538 void getTargetDefines(const LangOptions &Opts,
5539 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005540 Builder.defineMacro("__ARMEB__");
5541 Builder.defineMacro("__ARM_BIG_ENDIAN");
5542 ARMTargetInfo::getTargetDefines(Opts, Builder);
5543 }
5544};
Chris Lattner17df24e2008-04-21 18:56:49 +00005545
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005546class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5547 const llvm::Triple Triple;
5548public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005549 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5550 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005551 WCharType = UnsignedShort;
5552 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005553 }
5554 void getVisualStudioDefines(const LangOptions &Opts,
5555 MacroBuilder &Builder) const {
5556 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5557
5558 // FIXME: this is invalid for WindowsCE
5559 Builder.defineMacro("_M_ARM_NT", "1");
5560 Builder.defineMacro("_M_ARMT", "_M_ARM");
5561 Builder.defineMacro("_M_THUMB", "_M_ARM");
5562
5563 assert((Triple.getArch() == llvm::Triple::arm ||
5564 Triple.getArch() == llvm::Triple::thumb) &&
5565 "invalid architecture for Windows ARM target info");
5566 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5567 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5568
5569 // TODO map the complete set of values
5570 // 31: VFPv3 40: VFPv4
5571 Builder.defineMacro("_M_ARM_FP", "31");
5572 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005573 BuiltinVaListKind getBuiltinVaListKind() const override {
5574 return TargetInfo::CharPtrBuiltinVaList;
5575 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005576 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5577 switch (CC) {
5578 case CC_X86StdCall:
5579 case CC_X86ThisCall:
5580 case CC_X86FastCall:
5581 case CC_X86VectorCall:
5582 return CCCR_Ignore;
5583 case CC_C:
5584 return CCCR_OK;
5585 default:
5586 return CCCR_Warning;
5587 }
5588 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005589};
5590
5591// Windows ARM + Itanium C++ ABI Target
5592class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5593public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005594 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5595 const TargetOptions &Opts)
5596 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005597 TheCXXABI.set(TargetCXXABI::GenericARM);
5598 }
5599
5600 void getTargetDefines(const LangOptions &Opts,
5601 MacroBuilder &Builder) const override {
5602 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5603
5604 if (Opts.MSVCCompat)
5605 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5606 }
5607};
5608
5609// Windows ARM, MS (C++) ABI
5610class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5611public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005612 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5613 const TargetOptions &Opts)
5614 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005615 TheCXXABI.set(TargetCXXABI::Microsoft);
5616 }
5617
5618 void getTargetDefines(const LangOptions &Opts,
5619 MacroBuilder &Builder) const override {
5620 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5621 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5622 }
5623};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005624
Yaron Keren321249c2015-07-15 13:32:23 +00005625// ARM MinGW target
5626class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5627public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005628 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5629 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005630 TheCXXABI.set(TargetCXXABI::GenericARM);
5631 }
5632
5633 void getTargetDefines(const LangOptions &Opts,
5634 MacroBuilder &Builder) const override {
5635 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5636 DefineStd(Builder, "WIN32", Opts);
5637 DefineStd(Builder, "WINNT", Opts);
5638 Builder.defineMacro("_ARM_");
5639 addMinGWDefines(Opts, Builder);
5640 }
5641};
5642
5643// ARM Cygwin target
5644class CygwinARMTargetInfo : public ARMleTargetInfo {
5645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005646 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5647 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005648 TLSSupported = false;
5649 WCharType = UnsignedShort;
5650 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005651 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005652 }
5653 void getTargetDefines(const LangOptions &Opts,
5654 MacroBuilder &Builder) const override {
5655 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5656 Builder.defineMacro("_ARM_");
5657 Builder.defineMacro("__CYGWIN__");
5658 Builder.defineMacro("__CYGWIN32__");
5659 DefineStd(Builder, "unix", Opts);
5660 if (Opts.CPlusPlus)
5661 Builder.defineMacro("_GNU_SOURCE");
5662 }
5663};
5664
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005665class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005666protected:
Craig Topper3164f332014-03-11 03:39:26 +00005667 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5668 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005669 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005670 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005671
Torok Edwinb2b37c62009-06-30 17:10:35 +00005672public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005673 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5674 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005675 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005676 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005677 // FIXME: This should be based off of the target features in
5678 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005679 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005680
Tim Northoverd88ecb32016-01-27 19:32:40 +00005681 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005682 // Darwin on iOS uses a variant of the ARM C++ ABI.
5683 TheCXXABI.set(TargetCXXABI::WatchOS);
5684
5685 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5686 // size_t is long, it's a bit weird for it to be int.
5687 PtrDiffType = SignedLong;
5688
5689 // BOOL should be a real boolean on the new ABI
5690 UseSignedCharForObjCBool = false;
5691 } else
5692 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005693 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005694};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005695
Tim Northover573cbee2014-05-24 12:52:07 +00005696class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005697 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005698 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5699 static const char *const GCCRegNames[];
5700
James Molloy75f5f9e2014-04-16 15:33:48 +00005701 enum FPUModeEnum {
5702 FPUMode,
5703 NeonMode
5704 };
5705
5706 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005707 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005708 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005709 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005710 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005711
Tim Northovera2ee4332014-03-29 15:09:45 +00005712 static const Builtin::Info BuiltinInfo[];
5713
5714 std::string ABI;
5715
5716public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005717 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005718 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005719 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5720 WCharType = SignedInt;
5721
5722 // NetBSD apparently prefers consistency across ARM targets to consistency
5723 // across 64-bit targets.
5724 Int64Type = SignedLongLong;
5725 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005726 } else {
5727 WCharType = UnsignedInt;
5728 Int64Type = SignedLong;
5729 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005730 }
5731
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005733 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005734 MaxAtomicInlineWidth = 128;
5735 MaxAtomicPromoteWidth = 128;
5736
Tim Northovera6a19f12015-02-06 01:25:07 +00005737 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005738 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5739
Tim Northovera2ee4332014-03-29 15:09:45 +00005740 // {} in inline assembly are neon specifiers, not assembly variant
5741 // specifiers.
5742 NoAsmVariants = true;
5743
Tim Northover7ad87af2015-01-16 18:44:04 +00005744 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5745 // contributes to the alignment of the containing aggregate in the same way
5746 // a plain (non bit-field) member of that type would, without exception for
5747 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005748 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005749 UseZeroLengthBitfieldAlignment = true;
5750
Tim Northover573cbee2014-05-24 12:52:07 +00005751 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005752 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005753
5754 if (Triple.getOS() == llvm::Triple::Linux ||
5755 Triple.getOS() == llvm::Triple::UnknownOS)
5756 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005757 }
5758
Alp Toker4925ba72014-06-07 23:30:42 +00005759 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005760 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005761 if (Name != "aapcs" && Name != "darwinpcs")
5762 return false;
5763
5764 ABI = Name;
5765 return true;
5766 }
5767
David Blaikie1cbb9712014-11-14 19:09:44 +00005768 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005769 return Name == "generic" ||
5770 llvm::AArch64::parseCPUArch(Name) !=
5771 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005772 }
5773
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005774 void getTargetDefines(const LangOptions &Opts,
5775 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005776 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005777 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005778
5779 // Target properties.
5780 Builder.defineMacro("_LP64");
5781 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005782
5783 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5784 Builder.defineMacro("__ARM_ACLE", "200");
5785 Builder.defineMacro("__ARM_ARCH", "8");
5786 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5787
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005788 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005789 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005790 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005791
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005792 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5793 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5794 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5795 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005796 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005797 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5798 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005799
5800 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5801
5802 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005803 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005804
5805 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5806 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005807 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5808 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005809
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005810 if (Opts.UnsafeFPMath)
5811 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005812
5813 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5814
5815 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5816 Opts.ShortEnums ? "1" : "4");
5817
James Molloy75f5f9e2014-04-16 15:33:48 +00005818 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005819 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005820 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005821 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005822 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005823
Bradley Smith418c5932014-05-02 15:17:51 +00005824 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005826
James Molloy75f5f9e2014-04-16 15:33:48 +00005827 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005828 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5829
5830 if (Unaligned)
5831 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005832
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005833 if (V8_1A)
5834 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5835
Reid Klecknerd167d422015-05-06 15:31:46 +00005836 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5837 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5838 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5839 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5840 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005841 }
5842
Craig Topper6c03a542015-10-19 04:51:35 +00005843 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5844 return llvm::makeArrayRef(BuiltinInfo,
5845 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005846 }
5847
David Blaikie1cbb9712014-11-14 19:09:44 +00005848 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005849 return Feature == "aarch64" ||
5850 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005851 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005852 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005853 }
5854
James Molloy5e73df52014-04-16 15:06:20 +00005855 bool handleTargetFeatures(std::vector<std::string> &Features,
5856 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005857 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005858 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005859 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005860 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005861 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005862
Eric Christopher610fe112015-08-26 08:21:55 +00005863 for (const auto &Feature : Features) {
5864 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005865 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005866 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005867 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005868 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005869 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005870 if (Feature == "+strict-align")
5871 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005872 if (Feature == "+v8.1a")
5873 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005874 }
5875
James Y Knightb214cbc2016-03-04 19:00:41 +00005876 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005877
5878 return true;
5879 }
5880
John McCall477f2bb2016-03-03 06:39:32 +00005881 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5882 switch (CC) {
5883 case CC_C:
5884 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005885 case CC_PreserveMost:
5886 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005887 return CCCR_OK;
5888 default:
5889 return CCCR_Warning;
5890 }
5891 }
5892
David Blaikie1cbb9712014-11-14 19:09:44 +00005893 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005894
David Blaikie1cbb9712014-11-14 19:09:44 +00005895 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005896 return TargetInfo::AArch64ABIBuiltinVaList;
5897 }
5898
Craig Topperf054e3a2015-10-19 03:52:27 +00005899 ArrayRef<const char *> getGCCRegNames() const override;
5900 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005901
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005902 bool validateAsmConstraint(const char *&Name,
5903 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005904 switch (*Name) {
5905 default:
5906 return false;
5907 case 'w': // Floating point and SIMD registers (V0-V31)
5908 Info.setAllowsRegister();
5909 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005910 case 'I': // Constant that can be used with an ADD instruction
5911 case 'J': // Constant that can be used with a SUB instruction
5912 case 'K': // Constant that can be used with a 32-bit logical instruction
5913 case 'L': // Constant that can be used with a 64-bit logical instruction
5914 case 'M': // Constant that can be used as a 32-bit MOV immediate
5915 case 'N': // Constant that can be used as a 64-bit MOV immediate
5916 case 'Y': // Floating point constant zero
5917 case 'Z': // Integer constant zero
5918 return true;
5919 case 'Q': // A memory reference with base register and no offset
5920 Info.setAllowsMemory();
5921 return true;
5922 case 'S': // A symbolic address
5923 Info.setAllowsRegister();
5924 return true;
5925 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005926 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5927 // Utf: A memory address suitable for ldp/stp in TF mode.
5928 // Usa: An absolute symbolic address.
5929 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5930 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005931 case 'z': // Zero register, wzr or xzr
5932 Info.setAllowsRegister();
5933 return true;
5934 case 'x': // Floating point and SIMD registers (V0-V15)
5935 Info.setAllowsRegister();
5936 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005937 }
5938 return false;
5939 }
5940
Akira Hatanaka987f1862014-08-22 06:05:21 +00005941 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005942 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005943 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005944 // Strip off constraint modifiers.
5945 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5946 Constraint = Constraint.substr(1);
5947
5948 switch (Constraint[0]) {
5949 default:
5950 return true;
5951 case 'z':
5952 case 'r': {
5953 switch (Modifier) {
5954 case 'x':
5955 case 'w':
5956 // For now assume that the person knows what they're
5957 // doing with the modifier.
5958 return true;
5959 default:
5960 // By default an 'r' constraint will be in the 'x'
5961 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005962 if (Size == 64)
5963 return true;
5964
5965 SuggestedModifier = "w";
5966 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005967 }
5968 }
5969 }
5970 }
5971
David Blaikie1cbb9712014-11-14 19:09:44 +00005972 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005973
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005974 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005975 if (RegNo == 0)
5976 return 0;
5977 if (RegNo == 1)
5978 return 1;
5979 return -1;
5980 }
5981};
5982
Tim Northover573cbee2014-05-24 12:52:07 +00005983const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005984 // 32-bit Integer registers
5985 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5986 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5987 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5988
5989 // 64-bit Integer registers
5990 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5991 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5992 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5993
5994 // 32-bit floating point regsisters
5995 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5996 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5997 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5998
5999 // 64-bit floating point regsisters
6000 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6001 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6002 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6003
6004 // Vector registers
6005 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6006 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6007 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6008};
6009
Craig Topperf054e3a2015-10-19 03:52:27 +00006010ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6011 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006012}
6013
Tim Northover573cbee2014-05-24 12:52:07 +00006014const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006015 { { "w31" }, "wsp" },
6016 { { "x29" }, "fp" },
6017 { { "x30" }, "lr" },
6018 { { "x31" }, "sp" },
6019 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6020 // don't want to substitute one of these for a different-sized one.
6021};
6022
Craig Topperf054e3a2015-10-19 03:52:27 +00006023ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6024 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006025}
6026
Tim Northover573cbee2014-05-24 12:52:07 +00006027const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006028#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006029 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006030#include "clang/Basic/BuiltinsNEON.def"
6031
6032#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006033 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006034#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006035};
James Molloy5e73df52014-04-16 15:06:20 +00006036
Tim Northover573cbee2014-05-24 12:52:07 +00006037class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006038 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006039 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006040 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006041 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006042 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006043 }
6044
6045public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006046 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6047 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006048 }
James Molloy5e73df52014-04-16 15:06:20 +00006049 void getTargetDefines(const LangOptions &Opts,
6050 MacroBuilder &Builder) const override {
6051 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006052 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006053 }
6054};
6055
Tim Northover573cbee2014-05-24 12:52:07 +00006056class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006057 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006058 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006059 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006060 }
6061
6062public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006063 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6064 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006065 void getTargetDefines(const LangOptions &Opts,
6066 MacroBuilder &Builder) const override {
6067 Builder.defineMacro("__AARCH64EB__");
6068 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6069 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006070 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006071 }
6072};
Tim Northovera2ee4332014-03-29 15:09:45 +00006073
Tim Northover573cbee2014-05-24 12:52:07 +00006074class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006075protected:
6076 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6077 MacroBuilder &Builder) const override {
6078 Builder.defineMacro("__AARCH64_SIMD__");
6079 Builder.defineMacro("__ARM64_ARCH_8__");
6080 Builder.defineMacro("__ARM_NEON__");
6081 Builder.defineMacro("__LITTLE_ENDIAN__");
6082 Builder.defineMacro("__REGISTER_PREFIX__", "");
6083 Builder.defineMacro("__arm64", "1");
6084 Builder.defineMacro("__arm64__", "1");
6085
6086 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6087 }
6088
Tim Northovera2ee4332014-03-29 15:09:45 +00006089public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006090 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6091 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006092 Int64Type = SignedLongLong;
6093 WCharType = SignedInt;
6094 UseSignedCharForObjCBool = false;
6095
Tim Northovera6a19f12015-02-06 01:25:07 +00006096 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006097 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6098
6099 TheCXXABI.set(TargetCXXABI::iOS64);
6100 }
6101
David Blaikie1cbb9712014-11-14 19:09:44 +00006102 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006103 return TargetInfo::CharPtrBuiltinVaList;
6104 }
6105};
Tim Northovera2ee4332014-03-29 15:09:45 +00006106
Tony Linthicum76329bf2011-12-12 21:14:55 +00006107// Hexagon abstract base class
6108class HexagonTargetInfo : public TargetInfo {
6109 static const Builtin::Info BuiltinInfo[];
6110 static const char * const GCCRegNames[];
6111 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6112 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006113 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006114 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006115
Tony Linthicum76329bf2011-12-12 21:14:55 +00006116public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006117 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6118 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006119 // Specify the vector alignment explicitly. For v512x1, the calculated
6120 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6121 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006122 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006123 "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 +00006124 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006125 SizeType = UnsignedInt;
6126 PtrDiffType = SignedInt;
6127 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006128
6129 // {} in inline assembly are packet specifiers, not assembly variant
6130 // specifiers.
6131 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006132
6133 LargeArrayMinWidth = 64;
6134 LargeArrayAlign = 64;
6135 UseBitFieldTypeAlignment = true;
6136 ZeroLengthBitfieldBoundary = 32;
6137 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006138 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006139 }
6140
Craig Topper6c03a542015-10-19 04:51:35 +00006141 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6142 return llvm::makeArrayRef(BuiltinInfo,
6143 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006144 }
6145
Craig Topper3164f332014-03-11 03:39:26 +00006146 bool validateAsmConstraint(const char *&Name,
6147 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006148 switch (*Name) {
6149 case 'v':
6150 case 'q':
6151 if (HasHVX) {
6152 Info.setAllowsRegister();
6153 return true;
6154 }
6155 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006156 case 's':
6157 // Relocatable constant.
6158 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006159 }
6160 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006161 }
6162
Craig Topper3164f332014-03-11 03:39:26 +00006163 void getTargetDefines(const LangOptions &Opts,
6164 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006165
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006166 bool isCLZForZeroUndef() const override { return false; }
6167
Craig Topper3164f332014-03-11 03:39:26 +00006168 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006169 return llvm::StringSwitch<bool>(Feature)
6170 .Case("hexagon", true)
6171 .Case("hvx", HasHVX)
6172 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006173 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006174 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006175 }
Craig Topper3164f332014-03-11 03:39:26 +00006176
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006177 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6178 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6179 const override;
6180
6181 bool handleTargetFeatures(std::vector<std::string> &Features,
6182 DiagnosticsEngine &Diags) override;
6183
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006184 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6185 bool Enabled) const override;
6186
Craig Topper3164f332014-03-11 03:39:26 +00006187 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006188 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006189 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006190 ArrayRef<const char *> getGCCRegNames() const override;
6191 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006192 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006193 return "";
6194 }
Sebastian Pop86500282012-01-13 20:37:10 +00006195
6196 static const char *getHexagonCPUSuffix(StringRef Name) {
6197 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006198 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006199 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006200 .Case("hexagonv55", "55")
6201 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006202 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006203 }
6204
Craig Topper3164f332014-03-11 03:39:26 +00006205 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006206 if (!getHexagonCPUSuffix(Name))
6207 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006208 CPU = Name;
6209 return true;
6210 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006211
6212 int getEHDataRegisterNumber(unsigned RegNo) const override {
6213 return RegNo < 2 ? RegNo : -1;
6214 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006215};
6216
6217void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006218 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006219 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006220 Builder.defineMacro("__hexagon__", "1");
6221
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006222 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006223 Builder.defineMacro("__HEXAGON_V4__");
6224 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006225 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006226 Builder.defineMacro("__QDSP6_V4__");
6227 Builder.defineMacro("__QDSP6_ARCH__", "4");
6228 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006229 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006230 Builder.defineMacro("__HEXAGON_V5__");
6231 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6232 if(Opts.HexagonQdsp6Compat) {
6233 Builder.defineMacro("__QDSP6_V5__");
6234 Builder.defineMacro("__QDSP6_ARCH__", "5");
6235 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006236 } else if (CPU == "hexagonv55") {
6237 Builder.defineMacro("__HEXAGON_V55__");
6238 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6239 Builder.defineMacro("__QDSP6_V55__");
6240 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006241 } else if (CPU == "hexagonv60") {
6242 Builder.defineMacro("__HEXAGON_V60__");
6243 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6244 Builder.defineMacro("__QDSP6_V60__");
6245 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006246 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006247
6248 if (hasFeature("hvx")) {
6249 Builder.defineMacro("__HVX__");
6250 if (hasFeature("hvx-double"))
6251 Builder.defineMacro("__HVXDBL__");
6252 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006253}
6254
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006255bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6256 DiagnosticsEngine &Diags, StringRef CPU,
6257 const std::vector<std::string> &FeaturesVec) const {
6258 // Default for v60: -hvx, -hvx-double.
6259 Features["hvx"] = false;
6260 Features["hvx-double"] = false;
6261 Features["long-calls"] = false;
6262
6263 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6264}
6265
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006266bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6267 DiagnosticsEngine &Diags) {
6268 for (auto &F : Features) {
6269 if (F == "+hvx")
6270 HasHVX = true;
6271 else if (F == "-hvx")
6272 HasHVX = HasHVXDouble = false;
6273 else if (F == "+hvx-double")
6274 HasHVX = HasHVXDouble = true;
6275 else if (F == "-hvx-double")
6276 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006277
6278 if (F == "+long-calls")
6279 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006280 else if (F == "-long-calls")
6281 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006282 }
6283 return true;
6284}
6285
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006286void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6287 StringRef Name, bool Enabled) const {
6288 if (Enabled) {
6289 if (Name == "hvx-double")
6290 Features["hvx"] = true;
6291 } else {
6292 if (Name == "hvx")
6293 Features["hvx-double"] = false;
6294 }
6295 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006296}
6297
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006298const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006299 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6300 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6301 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6302 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6303 "p0", "p1", "p2", "p3",
6304 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6305};
6306
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006307ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006308 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006309}
6310
Tony Linthicum76329bf2011-12-12 21:14:55 +00006311const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6312 { { "sp" }, "r29" },
6313 { { "fp" }, "r30" },
6314 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006315};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006316
Craig Topperf054e3a2015-10-19 03:52:27 +00006317ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6318 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006319}
6320
6321
6322const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006323#define BUILTIN(ID, TYPE, ATTRS) \
6324 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6325#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6326 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006327#include "clang/Basic/BuiltinsHexagon.def"
6328};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006329
Jacques Pienaard964cc22016-03-28 21:02:54 +00006330class LanaiTargetInfo : public TargetInfo {
6331 // Class for Lanai (32-bit).
6332 // The CPU profiles supported by the Lanai backend
6333 enum CPUKind {
6334 CK_NONE,
6335 CK_V11,
6336 } CPU;
6337
6338 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6339 static const char *const GCCRegNames[];
6340
6341public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006342 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6343 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006344 // Description string has to be kept in sync with backend.
6345 resetDataLayout("E" // Big endian
6346 "-m:e" // ELF name manging
6347 "-p:32:32" // 32 bit pointers, 32 bit aligned
6348 "-i64:64" // 64 bit integers, 64 bit aligned
6349 "-a:0:32" // 32 bit alignment of objects of aggregate type
6350 "-n32" // 32 bit native integer width
6351 "-S64" // 64 bit natural stack alignment
6352 );
6353
6354 // Setting RegParmMax equal to what mregparm was set to in the old
6355 // toolchain
6356 RegParmMax = 4;
6357
6358 // Set the default CPU to V11
6359 CPU = CK_V11;
6360
6361 // Temporary approach to make everything at least word-aligned and allow for
6362 // safely casting between pointers with different alignment requirements.
6363 // TODO: Remove this when there are no more cast align warnings on the
6364 // firmware.
6365 MinGlobalAlign = 32;
6366 }
6367
6368 void getTargetDefines(const LangOptions &Opts,
6369 MacroBuilder &Builder) const override {
6370 // Define __lanai__ when building for target lanai.
6371 Builder.defineMacro("__lanai__");
6372
6373 // Set define for the CPU specified.
6374 switch (CPU) {
6375 case CK_V11:
6376 Builder.defineMacro("__LANAI_V11__");
6377 break;
6378 case CK_NONE:
6379 llvm_unreachable("Unhandled target CPU");
6380 }
6381 }
6382
6383 bool setCPU(const std::string &Name) override {
6384 CPU = llvm::StringSwitch<CPUKind>(Name)
6385 .Case("v11", CK_V11)
6386 .Default(CK_NONE);
6387
6388 return CPU != CK_NONE;
6389 }
6390
6391 bool hasFeature(StringRef Feature) const override {
6392 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6393 }
6394
6395 ArrayRef<const char *> getGCCRegNames() const override;
6396
6397 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6398
6399 BuiltinVaListKind getBuiltinVaListKind() const override {
6400 return TargetInfo::VoidPtrBuiltinVaList;
6401 }
6402
6403 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6404
6405 bool validateAsmConstraint(const char *&Name,
6406 TargetInfo::ConstraintInfo &info) const override {
6407 return false;
6408 }
6409
6410 const char *getClobbers() const override { return ""; }
6411};
6412
6413const char *const LanaiTargetInfo::GCCRegNames[] = {
6414 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6415 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6416 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6417
6418ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6419 return llvm::makeArrayRef(GCCRegNames);
6420}
6421
6422const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6423 {{"pc"}, "r2"},
6424 {{"sp"}, "r4"},
6425 {{"fp"}, "r5"},
6426 {{"rv"}, "r8"},
6427 {{"rr1"}, "r10"},
6428 {{"rr2"}, "r11"},
6429 {{"rca"}, "r15"},
6430};
6431
6432ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6433 return llvm::makeArrayRef(GCCRegAliases);
6434}
6435
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006436// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6437class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006438 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6439 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006440 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006441public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006442 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006443 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006444
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006445 int getEHDataRegisterNumber(unsigned RegNo) const override {
6446 if (RegNo == 0) return 24;
6447 if (RegNo == 1) return 25;
6448 return -1;
6449 }
6450
Craig Topper3164f332014-03-11 03:39:26 +00006451 bool handleTargetFeatures(std::vector<std::string> &Features,
6452 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006453 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006454 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6455 if (Feature != Features.end()) {
6456 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006457 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006458 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006459 }
Craig Topper3164f332014-03-11 03:39:26 +00006460 void getTargetDefines(const LangOptions &Opts,
6461 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006462 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006463 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006464
6465 if (SoftFloat)
6466 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006467 }
Craig Topper3164f332014-03-11 03:39:26 +00006468
6469 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006470 return llvm::StringSwitch<bool>(Feature)
6471 .Case("softfloat", SoftFloat)
6472 .Case("sparc", true)
6473 .Default(false);
6474 }
Craig Topper3164f332014-03-11 03:39:26 +00006475
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006476 bool hasSjLjLowering() const override {
6477 return true;
6478 }
6479
Craig Topper6c03a542015-10-19 04:51:35 +00006480 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006481 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006482 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006483 }
Craig Topper3164f332014-03-11 03:39:26 +00006484 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006485 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006486 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006487 ArrayRef<const char *> getGCCRegNames() const override;
6488 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006489 bool validateAsmConstraint(const char *&Name,
6490 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006491 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006492 switch (*Name) {
6493 case 'I': // Signed 13-bit constant
6494 case 'J': // Zero
6495 case 'K': // 32-bit constant with the low 12 bits clear
6496 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6497 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6498 case 'N': // Same as 'K' but zext (required for SIMode)
6499 case 'O': // The constant 4096
6500 return true;
6501 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006502 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006503 }
Craig Topper3164f332014-03-11 03:39:26 +00006504 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006505 // FIXME: Implement!
6506 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006507 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006508
6509 // No Sparc V7 for now, the backend doesn't support it anyway.
6510 enum CPUKind {
6511 CK_GENERIC,
6512 CK_V8,
6513 CK_SUPERSPARC,
6514 CK_SPARCLITE,
6515 CK_F934,
6516 CK_HYPERSPARC,
6517 CK_SPARCLITE86X,
6518 CK_SPARCLET,
6519 CK_TSC701,
6520 CK_V9,
6521 CK_ULTRASPARC,
6522 CK_ULTRASPARC3,
6523 CK_NIAGARA,
6524 CK_NIAGARA2,
6525 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006526 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006527 CK_MYRIAD2100,
6528 CK_MYRIAD2150,
6529 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006530 CK_LEON2,
6531 CK_LEON2_AT697E,
6532 CK_LEON2_AT697F,
6533 CK_LEON3,
6534 CK_LEON3_UT699,
6535 CK_LEON3_GR712RC,
6536 CK_LEON4,
6537 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006538 } CPU = CK_GENERIC;
6539
6540 enum CPUGeneration {
6541 CG_V8,
6542 CG_V9,
6543 };
6544
6545 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6546 switch (Kind) {
6547 case CK_GENERIC:
6548 case CK_V8:
6549 case CK_SUPERSPARC:
6550 case CK_SPARCLITE:
6551 case CK_F934:
6552 case CK_HYPERSPARC:
6553 case CK_SPARCLITE86X:
6554 case CK_SPARCLET:
6555 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006556 case CK_MYRIAD2100:
6557 case CK_MYRIAD2150:
6558 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006559 case CK_LEON2:
6560 case CK_LEON2_AT697E:
6561 case CK_LEON2_AT697F:
6562 case CK_LEON3:
6563 case CK_LEON3_UT699:
6564 case CK_LEON3_GR712RC:
6565 case CK_LEON4:
6566 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006567 return CG_V8;
6568 case CK_V9:
6569 case CK_ULTRASPARC:
6570 case CK_ULTRASPARC3:
6571 case CK_NIAGARA:
6572 case CK_NIAGARA2:
6573 case CK_NIAGARA3:
6574 case CK_NIAGARA4:
6575 return CG_V9;
6576 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006577 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006578 }
6579
6580 CPUKind getCPUKind(StringRef Name) const {
6581 return llvm::StringSwitch<CPUKind>(Name)
6582 .Case("v8", CK_V8)
6583 .Case("supersparc", CK_SUPERSPARC)
6584 .Case("sparclite", CK_SPARCLITE)
6585 .Case("f934", CK_F934)
6586 .Case("hypersparc", CK_HYPERSPARC)
6587 .Case("sparclite86x", CK_SPARCLITE86X)
6588 .Case("sparclet", CK_SPARCLET)
6589 .Case("tsc701", CK_TSC701)
6590 .Case("v9", CK_V9)
6591 .Case("ultrasparc", CK_ULTRASPARC)
6592 .Case("ultrasparc3", CK_ULTRASPARC3)
6593 .Case("niagara", CK_NIAGARA)
6594 .Case("niagara2", CK_NIAGARA2)
6595 .Case("niagara3", CK_NIAGARA3)
6596 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006597 .Case("ma2100", CK_MYRIAD2100)
6598 .Case("ma2150", CK_MYRIAD2150)
6599 .Case("ma2450", CK_MYRIAD2450)
6600 // FIXME: the myriad2[.n] spellings are obsolete,
6601 // but a grace period is needed to allow updating dependent builds.
6602 .Case("myriad2", CK_MYRIAD2100)
6603 .Case("myriad2.1", CK_MYRIAD2100)
6604 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006605 .Case("leon2", CK_LEON2)
6606 .Case("at697e", CK_LEON2_AT697E)
6607 .Case("at697f", CK_LEON2_AT697F)
6608 .Case("leon3", CK_LEON3)
6609 .Case("ut699", CK_LEON3_UT699)
6610 .Case("gr712rc", CK_LEON3_GR712RC)
6611 .Case("leon4", CK_LEON4)
6612 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006613 .Default(CK_GENERIC);
6614 }
6615
6616 bool setCPU(const std::string &Name) override {
6617 CPU = getCPUKind(Name);
6618 return CPU != CK_GENERIC;
6619 }
Gabor Greif49991682008-02-21 16:29:08 +00006620};
6621
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006622const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006623 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6624 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6625 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6626 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6627};
6628
Craig Topperf054e3a2015-10-19 03:52:27 +00006629ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6630 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006631}
6632
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006633const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006634 { { "g0" }, "r0" },
6635 { { "g1" }, "r1" },
6636 { { "g2" }, "r2" },
6637 { { "g3" }, "r3" },
6638 { { "g4" }, "r4" },
6639 { { "g5" }, "r5" },
6640 { { "g6" }, "r6" },
6641 { { "g7" }, "r7" },
6642 { { "o0" }, "r8" },
6643 { { "o1" }, "r9" },
6644 { { "o2" }, "r10" },
6645 { { "o3" }, "r11" },
6646 { { "o4" }, "r12" },
6647 { { "o5" }, "r13" },
6648 { { "o6", "sp" }, "r14" },
6649 { { "o7" }, "r15" },
6650 { { "l0" }, "r16" },
6651 { { "l1" }, "r17" },
6652 { { "l2" }, "r18" },
6653 { { "l3" }, "r19" },
6654 { { "l4" }, "r20" },
6655 { { "l5" }, "r21" },
6656 { { "l6" }, "r22" },
6657 { { "l7" }, "r23" },
6658 { { "i0" }, "r24" },
6659 { { "i1" }, "r25" },
6660 { { "i2" }, "r26" },
6661 { { "i3" }, "r27" },
6662 { { "i4" }, "r28" },
6663 { { "i5" }, "r29" },
6664 { { "i6", "fp" }, "r30" },
6665 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006666};
6667
Craig Topperf054e3a2015-10-19 03:52:27 +00006668ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6669 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006670}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006671
6672// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6673class SparcV8TargetInfo : public SparcTargetInfo {
6674public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006675 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6676 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006677 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006678 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6679 switch (getTriple().getOS()) {
6680 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006681 SizeType = UnsignedInt;
6682 IntPtrType = SignedInt;
6683 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006684 break;
6685 case llvm::Triple::NetBSD:
6686 case llvm::Triple::OpenBSD:
6687 SizeType = UnsignedLong;
6688 IntPtrType = SignedLong;
6689 PtrDiffType = SignedLong;
6690 break;
Brad Smith56495d52015-08-13 22:00:53 +00006691 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006692 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006693 }
6694
Craig Topper3164f332014-03-11 03:39:26 +00006695 void getTargetDefines(const LangOptions &Opts,
6696 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006697 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006698 switch (getCPUGeneration(CPU)) {
6699 case CG_V8:
6700 Builder.defineMacro("__sparcv8");
6701 if (getTriple().getOS() != llvm::Triple::Solaris)
6702 Builder.defineMacro("__sparcv8__");
6703 break;
6704 case CG_V9:
6705 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006706 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006707 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006708 Builder.defineMacro("__sparc_v9__");
6709 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006710 break;
6711 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006712 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006713 std::string MyriadArchValue, Myriad2Value;
6714 Builder.defineMacro("__sparc_v8__");
6715 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006716 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006717 case CK_MYRIAD2150:
6718 MyriadArchValue = "__ma2150";
6719 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006720 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006721 case CK_MYRIAD2450:
6722 MyriadArchValue = "__ma2450";
6723 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006724 break;
6725 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006726 MyriadArchValue = "__ma2100";
6727 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006728 break;
6729 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006730 Builder.defineMacro(MyriadArchValue, "1");
6731 Builder.defineMacro(MyriadArchValue+"__", "1");
6732 Builder.defineMacro("__myriad2__", Myriad2Value);
6733 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006734 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006735 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006736
6737 bool hasSjLjLowering() const override {
6738 return true;
6739 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006740};
6741
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006742// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6743class SparcV8elTargetInfo : public SparcV8TargetInfo {
6744 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006745 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6746 : SparcV8TargetInfo(Triple, Opts) {
6747 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006748 }
6749};
6750
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006751// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6752class SparcV9TargetInfo : public SparcTargetInfo {
6753public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006754 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6755 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006756 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006757 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006758 // This is an LP64 platform.
6759 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006760
6761 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006762 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006763 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006764 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006765 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006766 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006767
6768 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6769 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6770 LongDoubleWidth = 128;
6771 LongDoubleAlign = 128;
6772 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006773 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006774 }
6775
Craig Topper3164f332014-03-11 03:39:26 +00006776 void getTargetDefines(const LangOptions &Opts,
6777 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006778 SparcTargetInfo::getTargetDefines(Opts, Builder);
6779 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006780 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006781 // Solaris doesn't need these variants, but the BSDs do.
6782 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006783 Builder.defineMacro("__sparc64__");
6784 Builder.defineMacro("__sparc_v9__");
6785 Builder.defineMacro("__sparcv9__");
6786 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006787 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006788
Craig Topper3164f332014-03-11 03:39:26 +00006789 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006790 if (!SparcTargetInfo::setCPU(Name))
6791 return false;
6792 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006793 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006794};
6795
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006796class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006797 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006798 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006799 std::string CPU;
6800 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006801 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006802
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006803public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006804 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006805 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6806 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006807 IntMaxType = SignedLong;
6808 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006809 TLSSupported = true;
6810 IntWidth = IntAlign = 32;
6811 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6812 PointerWidth = PointerAlign = 64;
6813 LongDoubleWidth = 128;
6814 LongDoubleAlign = 64;
6815 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006816 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006817 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006818 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 +00006819 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6820 }
6821 void getTargetDefines(const LangOptions &Opts,
6822 MacroBuilder &Builder) const override {
6823 Builder.defineMacro("__s390__");
6824 Builder.defineMacro("__s390x__");
6825 Builder.defineMacro("__zarch__");
6826 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006827
6828 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6829 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6830 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6831 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6832
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006833 if (HasTransactionalExecution)
6834 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006835 if (Opts.ZVector)
6836 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006837 }
Craig Topper6c03a542015-10-19 04:51:35 +00006838 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6839 return llvm::makeArrayRef(BuiltinInfo,
6840 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006841 }
6842
Craig Topperf054e3a2015-10-19 03:52:27 +00006843 ArrayRef<const char *> getGCCRegNames() const override;
6844 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006845 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006846 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006847 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006848 bool validateAsmConstraint(const char *&Name,
6849 TargetInfo::ConstraintInfo &info) const override;
6850 const char *getClobbers() const override {
6851 // FIXME: Is this really right?
6852 return "";
6853 }
6854 BuiltinVaListKind getBuiltinVaListKind() const override {
6855 return TargetInfo::SystemZBuiltinVaList;
6856 }
6857 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006858 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006859 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6860 .Case("z10", true)
6861 .Case("z196", true)
6862 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006863 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006864 .Default(false);
6865
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006866 return CPUKnown;
6867 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006868 bool
6869 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6870 StringRef CPU,
6871 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006872 if (CPU == "zEC12")
6873 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006874 if (CPU == "z13") {
6875 Features["transactional-execution"] = true;
6876 Features["vector"] = true;
6877 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006878 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006879 }
6880
6881 bool handleTargetFeatures(std::vector<std::string> &Features,
6882 DiagnosticsEngine &Diags) override {
6883 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006884 for (const auto &Feature : Features) {
6885 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006886 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006887 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006888 HasVector = true;
6889 }
6890 // If we use the vector ABI, vector types are 64-bit aligned.
6891 if (HasVector) {
6892 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006893 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6894 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006895 }
6896 return true;
6897 }
6898
6899 bool hasFeature(StringRef Feature) const override {
6900 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006901 .Case("systemz", true)
6902 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006903 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006904 .Default(false);
6905 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006906
Bryan Chane3f1ed52016-04-28 13:56:43 +00006907 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6908 switch (CC) {
6909 case CC_C:
6910 case CC_Swift:
6911 return CCCR_OK;
6912 default:
6913 return CCCR_Warning;
6914 }
6915 }
6916
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006917 StringRef getABI() const override {
6918 if (HasVector)
6919 return "vector";
6920 return "";
6921 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006922
6923 bool useFloat128ManglingForLongDouble() const override {
6924 return true;
6925 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006926};
6927
6928const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6929#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006930 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006931#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6932 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006933#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006934};
6935
6936const char *const SystemZTargetInfo::GCCRegNames[] = {
6937 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6938 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6939 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6940 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6941};
6942
Craig Topperf054e3a2015-10-19 03:52:27 +00006943ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6944 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006945}
6946
6947bool SystemZTargetInfo::
6948validateAsmConstraint(const char *&Name,
6949 TargetInfo::ConstraintInfo &Info) const {
6950 switch (*Name) {
6951 default:
6952 return false;
6953
6954 case 'a': // Address register
6955 case 'd': // Data register (equivalent to 'r')
6956 case 'f': // Floating-point register
6957 Info.setAllowsRegister();
6958 return true;
6959
6960 case 'I': // Unsigned 8-bit constant
6961 case 'J': // Unsigned 12-bit constant
6962 case 'K': // Signed 16-bit constant
6963 case 'L': // Signed 20-bit displacement (on all targets we support)
6964 case 'M': // 0x7fffffff
6965 return true;
6966
6967 case 'Q': // Memory with base and unsigned 12-bit displacement
6968 case 'R': // Likewise, plus an index
6969 case 'S': // Memory with base and signed 20-bit displacement
6970 case 'T': // Likewise, plus an index
6971 Info.setAllowsMemory();
6972 return true;
6973 }
6974}
Ulrich Weigand47445072013-05-06 16:26:41 +00006975
Eric Christopherc48497a2015-09-18 21:26:24 +00006976class MSP430TargetInfo : public TargetInfo {
6977 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006978
Eric Christopherc48497a2015-09-18 21:26:24 +00006979public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006980 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6981 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006982 TLSSupported = false;
6983 IntWidth = 16;
6984 IntAlign = 16;
6985 LongWidth = 32;
6986 LongLongWidth = 64;
6987 LongAlign = LongLongAlign = 16;
6988 PointerWidth = 16;
6989 PointerAlign = 16;
6990 SuitableAlign = 16;
6991 SizeType = UnsignedInt;
6992 IntMaxType = SignedLongLong;
6993 IntPtrType = SignedInt;
6994 PtrDiffType = SignedInt;
6995 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006996 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006997 }
Eric Christopherc48497a2015-09-18 21:26:24 +00006998 void getTargetDefines(const LangOptions &Opts,
6999 MacroBuilder &Builder) const override {
7000 Builder.defineMacro("MSP430");
7001 Builder.defineMacro("__MSP430__");
7002 // FIXME: defines for different 'flavours' of MCU
7003 }
Craig Topper6c03a542015-10-19 04:51:35 +00007004 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007005 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007006 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007007 }
7008 bool hasFeature(StringRef Feature) const override {
7009 return Feature == "msp430";
7010 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007011 ArrayRef<const char *> getGCCRegNames() const override;
7012 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007013 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007014 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007015 }
7016 bool validateAsmConstraint(const char *&Name,
7017 TargetInfo::ConstraintInfo &info) const override {
7018 // FIXME: implement
7019 switch (*Name) {
7020 case 'K': // the constant 1
7021 case 'L': // constant -1^20 .. 1^19
7022 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007023 return true;
7024 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007025 // No target constraints for now.
7026 return false;
7027 }
7028 const char *getClobbers() const override {
7029 // FIXME: Is this really right?
7030 return "";
7031 }
7032 BuiltinVaListKind getBuiltinVaListKind() const override {
7033 // FIXME: implement
7034 return TargetInfo::CharPtrBuiltinVaList;
7035 }
7036};
7037
7038const char *const MSP430TargetInfo::GCCRegNames[] = {
7039 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7040 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7041
Craig Topperf054e3a2015-10-19 03:52:27 +00007042ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7043 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007044}
7045
7046// LLVM and Clang cannot be used directly to output native binaries for
7047// target, but is used to compile C code to llvm bitcode with correct
7048// type and alignment information.
7049//
7050// TCE uses the llvm bitcode as input and uses it for generating customized
7051// target processor and program binary. TCE co-design environment is
7052// publicly available in http://tce.cs.tut.fi
7053
7054static const unsigned TCEOpenCLAddrSpaceMap[] = {
7055 3, // opencl_global
7056 4, // opencl_local
7057 5, // opencl_constant
7058 // FIXME: generic has to be added to the target
7059 0, // opencl_generic
7060 0, // cuda_device
7061 0, // cuda_constant
7062 0 // cuda_shared
7063};
7064
7065class TCETargetInfo : public TargetInfo {
7066public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007067 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7068 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007069 TLSSupported = false;
7070 IntWidth = 32;
7071 LongWidth = LongLongWidth = 32;
7072 PointerWidth = 32;
7073 IntAlign = 32;
7074 LongAlign = LongLongAlign = 32;
7075 PointerAlign = 32;
7076 SuitableAlign = 32;
7077 SizeType = UnsignedInt;
7078 IntMaxType = SignedLong;
7079 IntPtrType = SignedInt;
7080 PtrDiffType = SignedInt;
7081 FloatWidth = 32;
7082 FloatAlign = 32;
7083 DoubleWidth = 32;
7084 DoubleAlign = 32;
7085 LongDoubleWidth = 32;
7086 LongDoubleAlign = 32;
7087 FloatFormat = &llvm::APFloat::IEEEsingle;
7088 DoubleFormat = &llvm::APFloat::IEEEsingle;
7089 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007090 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7091 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007092 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7093 UseAddrSpaceMapMangling = true;
7094 }
7095
7096 void getTargetDefines(const LangOptions &Opts,
7097 MacroBuilder &Builder) const override {
7098 DefineStd(Builder, "tce", Opts);
7099 Builder.defineMacro("__TCE__");
7100 Builder.defineMacro("__TCE_V1__");
7101 }
7102 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7103
Craig Topper6c03a542015-10-19 04:51:35 +00007104 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007105 const char *getClobbers() const override { return ""; }
7106 BuiltinVaListKind getBuiltinVaListKind() const override {
7107 return TargetInfo::VoidPtrBuiltinVaList;
7108 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007109 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007110 bool validateAsmConstraint(const char *&Name,
7111 TargetInfo::ConstraintInfo &info) const override {
7112 return true;
7113 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007114 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7115 return None;
7116 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007117};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007118
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007119class BPFTargetInfo : public TargetInfo {
7120public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007121 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7122 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007123 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7124 SizeType = UnsignedLong;
7125 PtrDiffType = SignedLong;
7126 IntPtrType = SignedLong;
7127 IntMaxType = SignedLong;
7128 Int64Type = SignedLong;
7129 RegParmMax = 5;
7130 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007131 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007132 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007133 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007134 }
7135 MaxAtomicPromoteWidth = 64;
7136 MaxAtomicInlineWidth = 64;
7137 TLSSupported = false;
7138 }
7139 void getTargetDefines(const LangOptions &Opts,
7140 MacroBuilder &Builder) const override {
7141 DefineStd(Builder, "bpf", Opts);
7142 Builder.defineMacro("__BPF__");
7143 }
7144 bool hasFeature(StringRef Feature) const override {
7145 return Feature == "bpf";
7146 }
7147
Craig Topper6c03a542015-10-19 04:51:35 +00007148 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007149 const char *getClobbers() const override {
7150 return "";
7151 }
7152 BuiltinVaListKind getBuiltinVaListKind() const override {
7153 return TargetInfo::VoidPtrBuiltinVaList;
7154 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007155 ArrayRef<const char *> getGCCRegNames() const override {
7156 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007157 }
7158 bool validateAsmConstraint(const char *&Name,
7159 TargetInfo::ConstraintInfo &info) const override {
7160 return true;
7161 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007162 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7163 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007164 }
7165};
7166
Daniel Sanders4672af62016-05-27 11:51:02 +00007167class MipsTargetInfo : public TargetInfo {
7168 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007169 StringRef Layout;
7170
7171 if (ABI == "o32")
7172 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7173 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007174 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007175 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007176 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007177 else
7178 llvm_unreachable("Invalid ABI");
7179
7180 if (BigEndian)
7181 resetDataLayout(("E-" + Layout).str());
7182 else
7183 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007184 }
7185
Akira Hatanaka9064e362013-10-29 18:30:33 +00007186
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007187 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007188 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007189 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007190 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007191 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007192 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007193 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007194 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007195 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007196 enum DspRevEnum {
7197 NoDSP, DSP1, DSP2
7198 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007199 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007200
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007201protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007202 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007203 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007204
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007205public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007206 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007207 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7208 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7209 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007210 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007211
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007212 setABI((getTriple().getArch() == llvm::Triple::mips ||
7213 getTriple().getArch() == llvm::Triple::mipsel)
7214 ? "o32"
7215 : "n64");
7216
7217 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007218 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007219
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007220 bool isNaN2008Default() const {
7221 return CPU == "mips32r6" || CPU == "mips64r6";
7222 }
7223
7224 bool isFP64Default() const {
7225 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7226 }
7227
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007228 bool isNan2008() const override {
7229 return IsNan2008;
7230 }
7231
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007232 bool processorSupportsGPR64() const {
7233 return llvm::StringSwitch<bool>(CPU)
7234 .Case("mips3", true)
7235 .Case("mips4", true)
7236 .Case("mips5", true)
7237 .Case("mips64", true)
7238 .Case("mips64r2", true)
7239 .Case("mips64r3", true)
7240 .Case("mips64r5", true)
7241 .Case("mips64r6", true)
7242 .Case("octeon", true)
7243 .Default(false);
7244 return false;
7245 }
7246
Alp Toker4925ba72014-06-07 23:30:42 +00007247 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007248 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007249 if (Name == "o32") {
7250 setO32ABITypes();
7251 ABI = Name;
7252 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007253 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007254
7255 if (Name == "n32") {
7256 setN32ABITypes();
7257 ABI = Name;
7258 return true;
7259 }
7260 if (Name == "n64") {
7261 setN64ABITypes();
7262 ABI = Name;
7263 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007264 }
7265 return false;
7266 }
7267
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007268 void setO32ABITypes() {
7269 Int64Type = SignedLongLong;
7270 IntMaxType = Int64Type;
7271 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7272 LongDoubleWidth = LongDoubleAlign = 64;
7273 LongWidth = LongAlign = 32;
7274 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7275 PointerWidth = PointerAlign = 32;
7276 PtrDiffType = SignedInt;
7277 SizeType = UnsignedInt;
7278 SuitableAlign = 64;
7279 }
7280
7281 void setN32N64ABITypes() {
7282 LongDoubleWidth = LongDoubleAlign = 128;
7283 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7284 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7285 LongDoubleWidth = LongDoubleAlign = 64;
7286 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7287 }
7288 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7289 SuitableAlign = 128;
7290 }
7291
Daniel Sanders4672af62016-05-27 11:51:02 +00007292 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007293 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007294 Int64Type = SignedLong;
7295 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007296 LongWidth = LongAlign = 64;
7297 PointerWidth = PointerAlign = 64;
7298 PtrDiffType = SignedLong;
7299 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007300 }
7301
7302 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007303 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007304 Int64Type = SignedLongLong;
7305 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007306 LongWidth = LongAlign = 32;
7307 PointerWidth = PointerAlign = 32;
7308 PtrDiffType = SignedInt;
7309 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007310 }
7311
Craig Topper3164f332014-03-11 03:39:26 +00007312 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007313 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007314 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007315 .Case("mips1", true)
7316 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007317 .Case("mips3", true)
7318 .Case("mips4", true)
7319 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007320 .Case("mips32", true)
7321 .Case("mips32r2", true)
7322 .Case("mips32r3", true)
7323 .Case("mips32r5", true)
7324 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007325 .Case("mips64", true)
7326 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007327 .Case("mips64r3", true)
7328 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007329 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007330 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007331 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007332 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007333 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007334 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007335 bool
7336 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7337 StringRef CPU,
7338 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007339 if (CPU.empty())
7340 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007341 if (CPU == "octeon")
7342 Features["mips64r2"] = Features["cnmips"] = true;
7343 else
7344 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007345 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007346 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007347
Craig Topper3164f332014-03-11 03:39:26 +00007348 void getTargetDefines(const LangOptions &Opts,
7349 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007350 if (BigEndian) {
7351 DefineStd(Builder, "MIPSEB", Opts);
7352 Builder.defineMacro("_MIPSEB");
7353 } else {
7354 DefineStd(Builder, "MIPSEL", Opts);
7355 Builder.defineMacro("_MIPSEL");
7356 }
7357
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007358 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007359 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007360 if (Opts.GNUMode)
7361 Builder.defineMacro("mips");
7362
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007363 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007364 Builder.defineMacro("__mips", "32");
7365 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7366 } else {
7367 Builder.defineMacro("__mips", "64");
7368 Builder.defineMacro("__mips64");
7369 Builder.defineMacro("__mips64__");
7370 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7371 }
7372
7373 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7374 .Cases("mips32", "mips64", "1")
7375 .Cases("mips32r2", "mips64r2", "2")
7376 .Cases("mips32r3", "mips64r3", "3")
7377 .Cases("mips32r5", "mips64r5", "5")
7378 .Cases("mips32r6", "mips64r6", "6")
7379 .Default("");
7380 if (!ISARev.empty())
7381 Builder.defineMacro("__mips_isa_rev", ISARev);
7382
7383 if (ABI == "o32") {
7384 Builder.defineMacro("__mips_o32");
7385 Builder.defineMacro("_ABIO32", "1");
7386 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007387 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007388 Builder.defineMacro("__mips_n32");
7389 Builder.defineMacro("_ABIN32", "2");
7390 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7391 } else if (ABI == "n64") {
7392 Builder.defineMacro("__mips_n64");
7393 Builder.defineMacro("_ABI64", "3");
7394 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7395 } else
7396 llvm_unreachable("Invalid ABI.");
7397
Simon Atanasyan683535b2012-08-29 19:14:58 +00007398 Builder.defineMacro("__REGISTER_PREFIX__", "");
7399
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007400 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007401 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007402 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007403 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007404 case SoftFloat:
7405 Builder.defineMacro("__mips_soft_float", Twine(1));
7406 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007407 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007408
Simon Atanasyan16071912013-04-14 14:07:30 +00007409 if (IsSingleFloat)
7410 Builder.defineMacro("__mips_single_float", Twine(1));
7411
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007412 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7413 Builder.defineMacro("_MIPS_FPSET",
7414 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7415
Simon Atanasyan72244b62012-07-05 16:06:06 +00007416 if (IsMips16)
7417 Builder.defineMacro("__mips16", Twine(1));
7418
Simon Atanasyan60777612013-04-14 14:07:51 +00007419 if (IsMicromips)
7420 Builder.defineMacro("__mips_micromips", Twine(1));
7421
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007422 if (IsNan2008)
7423 Builder.defineMacro("__mips_nan2008", Twine(1));
7424
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007425 switch (DspRev) {
7426 default:
7427 break;
7428 case DSP1:
7429 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7430 Builder.defineMacro("__mips_dsp", Twine(1));
7431 break;
7432 case DSP2:
7433 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7434 Builder.defineMacro("__mips_dspr2", Twine(1));
7435 Builder.defineMacro("__mips_dsp", Twine(1));
7436 break;
7437 }
7438
Jack Carter44ff1e52013-08-12 17:20:29 +00007439 if (HasMSA)
7440 Builder.defineMacro("__mips_msa", Twine(1));
7441
Simon Atanasyan26f19672012-04-05 19:28:31 +00007442 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7443 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7444 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007445
7446 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7447 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007448
7449 // These shouldn't be defined for MIPS-I but there's no need to check
7450 // for that since MIPS-I isn't supported.
7451 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7452 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7453 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007454
7455 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7456 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7457 // the instructions exist but using them violates the ABI since they
7458 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7459 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007460 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007461 }
7462
Craig Topper6c03a542015-10-19 04:51:35 +00007463 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7464 return llvm::makeArrayRef(BuiltinInfo,
7465 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007466 }
Craig Topper3164f332014-03-11 03:39:26 +00007467 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007468 return llvm::StringSwitch<bool>(Feature)
7469 .Case("mips", true)
7470 .Case("fp64", HasFP64)
7471 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007472 }
Craig Topper3164f332014-03-11 03:39:26 +00007473 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007474 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007475 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007476 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007477 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007478 // CPU register names
7479 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007480 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7481 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7482 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007483 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7484 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007485 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7486 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7487 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7488 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007489 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007490 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007491 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7492 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007493 // MSA register names
7494 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7495 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7496 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7497 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7498 // MSA control register names
7499 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7500 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007501 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007502 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007503 }
Craig Topper3164f332014-03-11 03:39:26 +00007504 bool validateAsmConstraint(const char *&Name,
7505 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007506 switch (*Name) {
7507 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007508 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007509 case 'r': // CPU registers.
7510 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007511 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007512 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007513 case 'c': // $25 for indirect jumps
7514 case 'l': // lo register
7515 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007516 Info.setAllowsRegister();
7517 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007518 case 'I': // Signed 16-bit constant
7519 case 'J': // Integer 0
7520 case 'K': // Unsigned 16-bit constant
7521 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7522 case 'M': // Constants not loadable via lui, addiu, or ori
7523 case 'N': // Constant -1 to -65535
7524 case 'O': // A signed 15-bit constant
7525 case 'P': // A constant between 1 go 65535
7526 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007527 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007528 Info.setAllowsMemory();
7529 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007530 case 'Z':
7531 if (Name[1] == 'C') { // An address usable by ll, and sc.
7532 Info.setAllowsMemory();
7533 Name++; // Skip over 'Z'.
7534 return true;
7535 }
7536 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007537 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007538 }
7539
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007540 std::string convertConstraint(const char *&Constraint) const override {
7541 std::string R;
7542 switch (*Constraint) {
7543 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7544 if (Constraint[1] == 'C') {
7545 R = std::string("^") + std::string(Constraint, 2);
7546 Constraint++;
7547 return R;
7548 }
7549 break;
7550 }
7551 return TargetInfo::convertConstraint(Constraint);
7552 }
7553
Craig Topper3164f332014-03-11 03:39:26 +00007554 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007555 // In GCC, $1 is not widely used in generated code (it's used only in a few
7556 // specific situations), so there is no real need for users to add it to
7557 // the clobbers list if they want to use it in their inline assembly code.
7558 //
7559 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7560 // code generation, so using it in inline assembly without adding it to the
7561 // clobbers list can cause conflicts between the inline assembly code and
7562 // the surrounding generated code.
7563 //
7564 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7565 // operands, which will conflict with the ".set at" assembler option (which
7566 // we use only for inline assembly, in order to maintain compatibility with
7567 // GCC) and will also conflict with the user's usage of $1.
7568 //
7569 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7570 // register for generated code is to automatically clobber $1 for all inline
7571 // assembly code.
7572 //
7573 // FIXME: We should automatically clobber $1 only for inline assembly code
7574 // which actually uses it. This would allow LLVM to use $1 for inline
7575 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007576 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007577 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007578
Craig Topper3164f332014-03-11 03:39:26 +00007579 bool handleTargetFeatures(std::vector<std::string> &Features,
7580 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007581 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007582 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007583 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007584 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007585 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007586 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007587 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007588
Eric Christopher610fe112015-08-26 08:21:55 +00007589 for (const auto &Feature : Features) {
7590 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007591 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007592 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007593 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007594 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007595 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007596 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007597 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007598 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007599 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007600 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007601 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007602 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007603 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007604 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007605 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007606 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007607 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007608 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007609 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007610 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007611 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007612 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007613
James Y Knightb214cbc2016-03-04 19:00:41 +00007614 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007615
Rafael Espindolaeb265472013-08-21 21:59:03 +00007616 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007617 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007618
Craig Topper3164f332014-03-11 03:39:26 +00007619 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007620 if (RegNo == 0) return 4;
7621 if (RegNo == 1) return 5;
7622 return -1;
7623 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007624
7625 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007626
7627 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7628 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7629 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7630 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7631 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7632 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7633 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7634 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7635 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7636 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7637 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7638 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7639 {{"ra"}, "$31"}};
7640 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7641 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7642 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7643 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7644 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7645 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7646 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7647 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7648 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7649 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7650 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7651 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007652 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007653 return llvm::makeArrayRef(O32RegAliases);
7654 return llvm::makeArrayRef(NewABIRegAliases);
7655 }
7656
7657 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007658 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007659 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007660
7661 bool validateTarget(DiagnosticsEngine &Diags) const override {
7662 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7663 // this yet. It's better to fail here than on the backend assertion.
7664 if (processorSupportsGPR64() && ABI == "o32") {
7665 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7666 return false;
7667 }
7668
7669 // 64-bit ABI's require 64-bit CPU's.
7670 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7671 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7672 return false;
7673 }
7674
7675 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7676 // can't handle this yet. It's better to fail here than on the
7677 // backend assertion.
7678 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7679 getTriple().getArch() == llvm::Triple::mips64el) &&
7680 ABI == "o32") {
7681 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7682 << ABI << getTriple().str();
7683 return false;
7684 }
7685
7686 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7687 // can't handle this yet. It's better to fail here than on the
7688 // backend assertion.
7689 if ((getTriple().getArch() == llvm::Triple::mips ||
7690 getTriple().getArch() == llvm::Triple::mipsel) &&
7691 (ABI == "n32" || ABI == "n64")) {
7692 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7693 << ABI << getTriple().str();
7694 return false;
7695 }
7696
7697 return true;
7698 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007699};
7700
Daniel Sanders4672af62016-05-27 11:51:02 +00007701const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007702#define BUILTIN(ID, TYPE, ATTRS) \
7703 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7704#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7705 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007706#include "clang/Basic/BuiltinsMips.def"
7707};
7708
Ivan Krasindd7403e2011-08-24 20:22:22 +00007709class PNaClTargetInfo : public TargetInfo {
7710public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007711 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7712 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007713 this->LongAlign = 32;
7714 this->LongWidth = 32;
7715 this->PointerAlign = 32;
7716 this->PointerWidth = 32;
7717 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007718 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007719 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007720 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007721 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007722 this->SizeType = TargetInfo::UnsignedInt;
7723 this->PtrDiffType = TargetInfo::SignedInt;
7724 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007725 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007726 }
7727
Craig Toppere6f17d02014-03-11 04:07:52 +00007728 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007729 Builder.defineMacro("__le32__");
7730 Builder.defineMacro("__pnacl__");
7731 }
Craig Topper3164f332014-03-11 03:39:26 +00007732 void getTargetDefines(const LangOptions &Opts,
7733 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007734 getArchDefines(Opts, Builder);
7735 }
Craig Topper3164f332014-03-11 03:39:26 +00007736 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007737 return Feature == "pnacl";
7738 }
Craig Topper6c03a542015-10-19 04:51:35 +00007739 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007740 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007741 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007742 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007743 ArrayRef<const char *> getGCCRegNames() const override;
7744 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007745 bool validateAsmConstraint(const char *&Name,
7746 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007747 return false;
7748 }
7749
Craig Topper3164f332014-03-11 03:39:26 +00007750 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007751 return "";
7752 }
7753};
7754
Craig Topperf054e3a2015-10-19 03:52:27 +00007755ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7756 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007757}
7758
Craig Topperf054e3a2015-10-19 03:52:27 +00007759ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7760 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007761}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007762
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007763// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007764class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007765public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007766 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7767 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007768
7769 BuiltinVaListKind getBuiltinVaListKind() const override {
7770 return TargetInfo::PNaClABIBuiltinVaList;
7771 }
7772};
7773
JF Bastien643817d2014-09-12 17:52:47 +00007774class Le64TargetInfo : public TargetInfo {
7775 static const Builtin::Info BuiltinInfo[];
7776
7777public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007778 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7779 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007780 NoAsmVariants = true;
7781 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7782 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007783 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007784 }
7785
7786 void getTargetDefines(const LangOptions &Opts,
7787 MacroBuilder &Builder) const override {
7788 DefineStd(Builder, "unix", Opts);
7789 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7790 Builder.defineMacro("__ELF__");
7791 }
Craig Topper6c03a542015-10-19 04:51:35 +00007792 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7793 return llvm::makeArrayRef(BuiltinInfo,
7794 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007795 }
7796 BuiltinVaListKind getBuiltinVaListKind() const override {
7797 return TargetInfo::PNaClABIBuiltinVaList;
7798 }
7799 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007800 ArrayRef<const char *> getGCCRegNames() const override {
7801 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007802 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007803 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7804 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007805 }
7806 bool validateAsmConstraint(const char *&Name,
7807 TargetInfo::ConstraintInfo &Info) const override {
7808 return false;
7809 }
7810
7811 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007812};
Dan Gohmanc2853072015-09-03 22:51:53 +00007813
7814class WebAssemblyTargetInfo : public TargetInfo {
7815 static const Builtin::Info BuiltinInfo[];
7816
7817 enum SIMDEnum {
7818 NoSIMD,
7819 SIMD128,
7820 } SIMDLevel;
7821
7822public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007823 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007824 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007825 NoAsmVariants = true;
7826 SuitableAlign = 128;
7827 LargeArrayMinWidth = 128;
7828 LargeArrayAlign = 128;
7829 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007830 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007831 LongDoubleWidth = LongDoubleAlign = 128;
7832 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007833 SizeType = UnsignedInt;
7834 PtrDiffType = SignedInt;
7835 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007836 }
7837
7838protected:
7839 void getTargetDefines(const LangOptions &Opts,
7840 MacroBuilder &Builder) const override {
7841 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7842 if (SIMDLevel >= SIMD128)
7843 Builder.defineMacro("__wasm_simd128__");
7844 }
7845
7846private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007847 bool
7848 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7849 StringRef CPU,
7850 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007851 if (CPU == "bleeding-edge")
7852 Features["simd128"] = true;
7853 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7854 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007855 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007856 return llvm::StringSwitch<bool>(Feature)
7857 .Case("simd128", SIMDLevel >= SIMD128)
7858 .Default(false);
7859 }
7860 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007861 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007862 for (const auto &Feature : Features) {
7863 if (Feature == "+simd128") {
7864 SIMDLevel = std::max(SIMDLevel, SIMD128);
7865 continue;
7866 }
7867 if (Feature == "-simd128") {
7868 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7869 continue;
7870 }
7871
7872 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7873 << "-target-feature";
7874 return false;
7875 }
7876 return true;
7877 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007878 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007879 return llvm::StringSwitch<bool>(Name)
7880 .Case("mvp", true)
7881 .Case("bleeding-edge", true)
7882 .Case("generic", true)
7883 .Default(false);
7884 }
Craig Topper6c03a542015-10-19 04:51:35 +00007885 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7886 return llvm::makeArrayRef(BuiltinInfo,
7887 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007888 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007889 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007890 return VoidPtrBuiltinVaList;
7891 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007892 ArrayRef<const char *> getGCCRegNames() const final {
7893 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007894 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007895 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7896 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007897 }
7898 bool
7899 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007900 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007901 return false;
7902 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007903 const char *getClobbers() const final { return ""; }
7904 bool isCLZForZeroUndef() const final { return false; }
7905 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007906 IntType getIntTypeByWidth(unsigned BitWidth,
7907 bool IsSigned) const final {
7908 // WebAssembly prefers long long for explicitly 64-bit integers.
7909 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7910 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7911 }
7912 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7913 bool IsSigned) const final {
7914 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7915 return BitWidth == 64
7916 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7917 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7918 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007919};
7920
7921const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7922#define BUILTIN(ID, TYPE, ATTRS) \
7923 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7924#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7925 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7926#include "clang/Basic/BuiltinsWebAssembly.def"
7927};
7928
7929class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7930public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007931 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7932 const TargetOptions &Opts)
7933 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007934 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007935 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007936 }
7937
7938protected:
7939 void getTargetDefines(const LangOptions &Opts,
7940 MacroBuilder &Builder) const override {
7941 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7942 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7943 }
7944};
7945
7946class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7947public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007948 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7949 const TargetOptions &Opts)
7950 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007951 LongAlign = LongWidth = 64;
7952 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007953 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007954 SizeType = UnsignedLong;
7955 PtrDiffType = SignedLong;
7956 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007957 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007958 }
7959
7960protected:
7961 void getTargetDefines(const LangOptions &Opts,
7962 MacroBuilder &Builder) const override {
7963 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7964 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7965 }
7966};
7967
JF Bastien643817d2014-09-12 17:52:47 +00007968const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7969#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007970 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007971#include "clang/Basic/BuiltinsLe64.def"
7972};
7973
Eric Christopherc48497a2015-09-18 21:26:24 +00007974static const unsigned SPIRAddrSpaceMap[] = {
7975 1, // opencl_global
7976 3, // opencl_local
7977 2, // opencl_constant
7978 4, // opencl_generic
7979 0, // cuda_device
7980 0, // cuda_constant
7981 0 // cuda_shared
7982};
7983class SPIRTargetInfo : public TargetInfo {
7984public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007985 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7986 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007987 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7988 "SPIR target must use unknown OS");
7989 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
7990 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00007991 TLSSupported = false;
7992 LongWidth = LongAlign = 64;
7993 AddrSpaceMap = &SPIRAddrSpaceMap;
7994 UseAddrSpaceMapMangling = true;
7995 // Define available target features
7996 // These must be defined in sorted order!
7997 NoAsmVariants = true;
7998 }
7999 void getTargetDefines(const LangOptions &Opts,
8000 MacroBuilder &Builder) const override {
8001 DefineStd(Builder, "SPIR", Opts);
8002 }
8003 bool hasFeature(StringRef Feature) const override {
8004 return Feature == "spir";
8005 }
Craig Topper3164f332014-03-11 03:39:26 +00008006
Craig Topper6c03a542015-10-19 04:51:35 +00008007 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008008 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008009 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008010 bool validateAsmConstraint(const char *&Name,
8011 TargetInfo::ConstraintInfo &info) const override {
8012 return true;
8013 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008014 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8015 return None;
8016 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008017 BuiltinVaListKind getBuiltinVaListKind() const override {
8018 return TargetInfo::VoidPtrBuiltinVaList;
8019 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008020
Eric Christopherc48497a2015-09-18 21:26:24 +00008021 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008022 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8023 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008024 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008025
Eric Christopherc48497a2015-09-18 21:26:24 +00008026 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8027 return CC_SpirFunction;
8028 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008029
8030 void setSupportedOpenCLOpts() override {
8031 // Assume all OpenCL extensions and optional core features are supported
8032 // for SPIR since it is a generic target.
8033 getSupportedOpenCLOpts().setAll();
8034 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008035};
Guy Benyeib798fc92012-12-11 21:38:14 +00008036
Eric Christopherc48497a2015-09-18 21:26:24 +00008037class SPIR32TargetInfo : public SPIRTargetInfo {
8038public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008039 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8040 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008041 PointerWidth = PointerAlign = 32;
8042 SizeType = TargetInfo::UnsignedInt;
8043 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008044 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8045 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008046 }
8047 void getTargetDefines(const LangOptions &Opts,
8048 MacroBuilder &Builder) const override {
8049 DefineStd(Builder, "SPIR32", Opts);
8050 }
8051};
Guy Benyeib798fc92012-12-11 21:38:14 +00008052
Eric Christopherc48497a2015-09-18 21:26:24 +00008053class SPIR64TargetInfo : public SPIRTargetInfo {
8054public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008055 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8056 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008057 PointerWidth = PointerAlign = 64;
8058 SizeType = TargetInfo::UnsignedLong;
8059 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008060 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8061 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008062 }
8063 void getTargetDefines(const LangOptions &Opts,
8064 MacroBuilder &Builder) const override {
8065 DefineStd(Builder, "SPIR64", Opts);
8066 }
8067};
Guy Benyeib798fc92012-12-11 21:38:14 +00008068
Robert Lytton0e076492013-08-13 09:43:10 +00008069class XCoreTargetInfo : public TargetInfo {
8070 static const Builtin::Info BuiltinInfo[];
8071public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008072 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8073 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008074 NoAsmVariants = true;
8075 LongLongAlign = 32;
8076 SuitableAlign = 32;
8077 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008078 SizeType = UnsignedInt;
8079 PtrDiffType = SignedInt;
8080 IntPtrType = SignedInt;
8081 WCharType = UnsignedChar;
8082 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008083 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008084 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8085 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008086 }
Craig Topper3164f332014-03-11 03:39:26 +00008087 void getTargetDefines(const LangOptions &Opts,
8088 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008089 Builder.defineMacro("__XS1B__");
8090 }
Craig Topper6c03a542015-10-19 04:51:35 +00008091 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8092 return llvm::makeArrayRef(BuiltinInfo,
8093 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008094 }
Craig Topper3164f332014-03-11 03:39:26 +00008095 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008096 return TargetInfo::VoidPtrBuiltinVaList;
8097 }
Craig Topper3164f332014-03-11 03:39:26 +00008098 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008099 return "";
8100 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008101 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008102 static const char * const GCCRegNames[] = {
8103 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8104 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8105 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008106 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008107 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008108 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8109 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008110 }
Craig Topper3164f332014-03-11 03:39:26 +00008111 bool validateAsmConstraint(const char *&Name,
8112 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008113 return false;
8114 }
Craig Topper3164f332014-03-11 03:39:26 +00008115 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008116 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8117 return (RegNo < 2)? RegNo : -1;
8118 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008119 bool allowsLargerPreferedTypeAlignment() const override {
8120 return false;
8121 }
Robert Lytton0e076492013-08-13 09:43:10 +00008122};
8123
8124const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008125#define BUILTIN(ID, TYPE, ATTRS) \
8126 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8127#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8128 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008129#include "clang/Basic/BuiltinsXCore.def"
8130};
Robert Lytton0e076492013-08-13 09:43:10 +00008131
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008132// x86_32 Android target
8133class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8134public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008135 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8136 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008137 SuitableAlign = 32;
8138 LongDoubleWidth = 64;
8139 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8140 }
8141};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008142
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008143// x86_64 Android target
8144class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8145public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008146 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8147 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008148 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8149 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008150
8151 bool useFloat128ManglingForLongDouble() const override {
8152 return true;
8153 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008154};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008155
8156// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8157class RenderScript32TargetInfo : public ARMleTargetInfo {
8158public:
8159 RenderScript32TargetInfo(const llvm::Triple &Triple,
8160 const TargetOptions &Opts)
8161 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8162 Triple.getOSName(),
8163 Triple.getEnvironmentName()),
8164 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008165 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008166 LongWidth = LongAlign = 64;
8167 }
8168 void getTargetDefines(const LangOptions &Opts,
8169 MacroBuilder &Builder) const override {
8170 Builder.defineMacro("__RENDERSCRIPT__");
8171 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8172 }
8173};
8174
8175// 64-bit RenderScript is aarch64
8176class RenderScript64TargetInfo : public AArch64leTargetInfo {
8177public:
8178 RenderScript64TargetInfo(const llvm::Triple &Triple,
8179 const TargetOptions &Opts)
8180 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8181 Triple.getOSName(),
8182 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008183 Opts) {
8184 IsRenderScriptTarget = true;
8185 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008186
8187 void getTargetDefines(const LangOptions &Opts,
8188 MacroBuilder &Builder) const override {
8189 Builder.defineMacro("__RENDERSCRIPT__");
8190 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8191 }
8192};
8193
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008194} // end anonymous namespace
8195
Chris Lattner5ba61f02006-10-14 07:39:34 +00008196//===----------------------------------------------------------------------===//
8197// Driver code
8198//===----------------------------------------------------------------------===//
8199
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008200static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8201 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008202 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008203
Daniel Dunbar52322032009-08-18 05:47:58 +00008204 switch (Triple.getArch()) {
8205 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008206 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008207
Tim Northover2a0783d2014-05-30 14:14:07 +00008208 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008209 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008210
8211 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008213
Jacques Pienaard964cc22016-03-28 21:02:54 +00008214 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008215 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008216
Tim Northover2a0783d2014-05-30 14:14:07 +00008217 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008218 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008219 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008220
8221 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008222 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008223 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008224 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008225 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008226 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008228 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008229 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008230 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008232 }
8233
Christian Pirker9b019ae2014-02-25 13:51:00 +00008234 case llvm::Triple::aarch64_be:
8235 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008236 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008238 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008240 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008242 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008244 }
8245
Daniel Dunbar52322032009-08-18 05:47:58 +00008246 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008247 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008248 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008250
Daniel Dunbar52322032009-08-18 05:47:58 +00008251 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008252 case llvm::Triple::CloudABI:
8253 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008254 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008256 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008257 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008258 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008260 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008262 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008264 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008266 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008268 case llvm::Triple::Win32:
8269 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008270 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008272 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008274 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008276 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008277 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008278 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008279 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008280 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008282 }
8283
8284 case llvm::Triple::armeb:
8285 case llvm::Triple::thumbeb:
8286 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008288
8289 switch (os) {
8290 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008292 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008294 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008296 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008298 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008299 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008300 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008302 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008304 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008306 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008307
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008308 case llvm::Triple::bpfeb:
8309 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008311
Daniel Dunbar52322032009-08-18 05:47:58 +00008312 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008314
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008315 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008316 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008317 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008318 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008319 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008320 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008321 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008322 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008323 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008324 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008325 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008326 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008327 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008328
8329 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008330 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008331 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008332 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008333 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008334 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008335 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008336 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008337 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008338 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008339 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008340 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008341 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008342 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008343 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008344
Akira Hatanakabef17452011-09-20 19:21:49 +00008345 case llvm::Triple::mips64:
8346 switch (os) {
8347 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008348 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008349 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008350 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008351 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008352 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008353 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008354 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008355 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008356 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008357 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008358 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008359 }
8360
8361 case llvm::Triple::mips64el:
8362 switch (os) {
8363 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008364 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008365 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008366 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008367 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008369 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008371 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008372 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008373 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008374 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008375 }
8376
Ivan Krasindd7403e2011-08-24 20:22:22 +00008377 case llvm::Triple::le32:
8378 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008379 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008380 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008381 default:
8382 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008383 }
8384
JF Bastien643817d2014-09-12 17:52:47 +00008385 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008386 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008387
Daniel Dunbar52322032009-08-18 05:47:58 +00008388 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008389 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008391 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008392 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008393 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008394 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008395 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008396 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008397 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008398 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008399 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008400 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008402 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008404 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008405
8406 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008407 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008409 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008410 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008412 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008414 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008416 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008418 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008420 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008421
Bill Schmidt778d3872013-07-26 01:36:11 +00008422 case llvm::Triple::ppc64le:
8423 switch (os) {
8424 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008426 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008428 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008430 }
8431
Peter Collingbournec947aae2012-05-20 23:28:41 +00008432 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008434 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008436
Tom Stellardd8e38a32015-01-06 20:34:47 +00008437 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008438 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008440
Daniel Dunbar52322032009-08-18 05:47:58 +00008441 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008442 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008443 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008444 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008445 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008446 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008447 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008448 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008449 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008450 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008451 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008452 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008453 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008455 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008456
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008457 // The 'sparcel' architecture copies all the above cases except for Solaris.
8458 case llvm::Triple::sparcel:
8459 switch (os) {
8460 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008462 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008463 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008464 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008465 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008466 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008467 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008468 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008469 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008470 }
8471
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008472 case llvm::Triple::sparcv9:
8473 switch (os) {
8474 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008476 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008478 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008480 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008481 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008482 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008484 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008486 }
8487
Ulrich Weigand47445072013-05-06 16:26:41 +00008488 case llvm::Triple::systemz:
8489 switch (os) {
8490 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008492 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008494 }
8495
Eli Friedmana9c3d712009-08-19 20:47:07 +00008496 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008498
Daniel Dunbar52322032009-08-18 05:47:58 +00008499 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008500 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008502
Daniel Dunbar52322032009-08-18 05:47:58 +00008503 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008504 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008506 case llvm::Triple::Linux: {
8507 switch (Triple.getEnvironment()) {
8508 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008509 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008510 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008511 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008512 }
8513 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008514 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008516 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008517 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008518 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008520 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008522 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008524 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008526 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008528 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008530 case llvm::Triple::Win32: {
8531 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008532 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008534 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008536 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008537 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008538 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008540 }
8541 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008542 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008544 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008546 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008548 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008550 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008552 }
8553
8554 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008555 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008556 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008557
Daniel Dunbar52322032009-08-18 05:47:58 +00008558 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008559 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008560 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008561 case llvm::Triple::Linux: {
8562 switch (Triple.getEnvironment()) {
8563 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008564 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008565 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008567 }
8568 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008569 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008571 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008572 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008573 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008575 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008577 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008579 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008581 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008583 case llvm::Triple::Win32: {
8584 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008585 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008587 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008588 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008589 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008590 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008591 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008592 }
8593 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008594 case llvm::Triple::Haiku:
8595 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008596 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008597 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008598 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008599 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008600 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008602 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008603
Douglas Katzman78d7c542015-05-12 21:18:10 +00008604 case llvm::Triple::spir: {
8605 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8606 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8607 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008609 }
8610 case llvm::Triple::spir64: {
8611 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8612 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8613 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008614 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008615 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008616 case llvm::Triple::wasm32:
8617 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8618 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008619 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008620 case llvm::Triple::wasm64:
8621 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8622 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008623 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008624
8625 case llvm::Triple::renderscript32:
8626 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8627 case llvm::Triple::renderscript64:
8628 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008629 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008630}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008631
8632/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008633/// options.
Alp Toker80758082014-07-06 05:26:44 +00008634TargetInfo *
8635TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008636 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008637 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008638
8639 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008640 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008641 if (!Target) {
8642 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008643 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008644 }
Alp Toker80758082014-07-06 05:26:44 +00008645 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008646
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008647 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008648 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8649 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008650 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008651 }
8652
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008653 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008654 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8655 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008656 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008657 }
8658
Rafael Espindolaeb265472013-08-21 21:59:03 +00008659 // Set the fp math unit.
8660 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8661 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008662 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008663 }
8664
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008665 // Compute the default target features, we need the target to handle this
8666 // because features may have dependencies on one another.
8667 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008668 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8669 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008670 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008671
8672 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008673 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008674 for (const auto &F : Features)
8675 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8676
Eric Christopher3ff21b32013-10-16 21:26:26 +00008677 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008678 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008679
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008680 Target->setSupportedOpenCLOpts();
8681
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008682 if (!Target->validateTarget(Diags))
8683 return nullptr;
8684
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008685 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008686}