blob: cab569da05fdd2ab44dab369b6dac44339535960 [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) {
Bill Schmidt778d3872013-07-26 01:36:11 +0000882 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Kit Barton8246f282015-03-25 19:41:41 +00001161 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001162 // TODO: Finish this list and add an assert that we've handled them
1163 // all.
1164 }
Eric Christopher02c33352015-08-25 00:59:11 +00001165
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001166 return true;
1167}
1168
Chris Lattnerecd49032009-03-02 22:27:17 +00001169/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1170/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001171void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001172 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001173 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001175 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001177 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001179 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001181 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001183 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001184 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001185
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001187 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1188 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 } else {
1190 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1191 getTriple().getOS() != llvm::Triple::OpenBSD)
1192 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001193 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001194
Ulrich Weigand8afad612014-07-28 13:17:52 +00001195 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001196 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 Builder.defineMacro("_CALL_ELF", "1");
1198 if (ABI == "elfv2")
1199 Builder.defineMacro("_CALL_ELF", "2");
1200
Chris Lattnerecd49032009-03-02 22:27:17 +00001201 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1203 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001204
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001206 if (LongDoubleWidth == 128)
1207 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001208
John Thompsone467e192009-11-19 17:18:50 +00001209 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001210 Builder.defineMacro("__VEC__", "10206");
1211 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001212 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001213
1214 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001215 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1216 .Case("440", ArchDefineName)
1217 .Case("450", ArchDefineName | ArchDefine440)
1218 .Case("601", ArchDefineName)
1219 .Case("602", ArchDefineName | ArchDefinePpcgr)
1220 .Case("603", ArchDefineName | ArchDefinePpcgr)
1221 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1222 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1223 .Case("604", ArchDefineName | ArchDefinePpcgr)
1224 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1225 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001226 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001227 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1228 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1229 .Case("750", ArchDefineName | ArchDefinePpcgr)
1230 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1231 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001232 .Case("a2", ArchDefineA2)
1233 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001234 .Case("pwr3", ArchDefinePpcgr)
1235 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1236 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1237 | ArchDefinePpcsq)
1238 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1239 | ArchDefinePpcgr | ArchDefinePpcsq)
1240 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1241 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1243 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1244 | ArchDefinePpcsq)
1245 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1246 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001247 | ArchDefinePpcgr | ArchDefinePpcsq)
1248 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1249 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1250 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001251 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1252 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1253 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1254 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001255 .Case("power3", ArchDefinePpcgr)
1256 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1257 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1258 | ArchDefinePpcsq)
1259 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1260 | ArchDefinePpcgr | ArchDefinePpcsq)
1261 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1262 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1264 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1265 | ArchDefinePpcsq)
1266 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1267 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001268 | ArchDefinePpcgr | ArchDefinePpcsq)
1269 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1270 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1271 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001272 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1273 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1274 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1275 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001276 .Default(ArchDefineNone);
1277
1278 if (defs & ArchDefineName)
1279 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1280 if (defs & ArchDefinePpcgr)
1281 Builder.defineMacro("_ARCH_PPCGR");
1282 if (defs & ArchDefinePpcsq)
1283 Builder.defineMacro("_ARCH_PPCSQ");
1284 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001285 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001286 if (defs & ArchDefine603)
1287 Builder.defineMacro("_ARCH_603");
1288 if (defs & ArchDefine604)
1289 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001290 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001291 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5x)
1295 Builder.defineMacro("_ARCH_PWR5X");
1296 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001297 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001298 if (defs & ArchDefinePwr6x)
1299 Builder.defineMacro("_ARCH_PWR6X");
1300 if (defs & ArchDefinePwr7)
1301 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001302 if (defs & ArchDefinePwr8)
1303 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001304 if (defs & ArchDefinePwr9)
1305 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001306 if (defs & ArchDefineA2)
1307 Builder.defineMacro("_ARCH_A2");
1308 if (defs & ArchDefineA2q) {
1309 Builder.defineMacro("_ARCH_A2Q");
1310 Builder.defineMacro("_ARCH_QP");
1311 }
1312
1313 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1314 Builder.defineMacro("__bg__");
1315 Builder.defineMacro("__THW_BLUEGENE__");
1316 Builder.defineMacro("__bgq__");
1317 Builder.defineMacro("__TOS_BGQ__");
1318 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001319
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001320 if (HasVSX)
1321 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001322 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001323 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001324 if (HasP8Crypto)
1325 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001326 if (HasHTM)
1327 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001328 if (HasFloat128)
1329 Builder.defineMacro("__FLOAT128__");
Hal Finkela57b8902015-10-01 13:39:49 +00001330
1331 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1332 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1333 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1334 if (PointerWidth == 64)
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001336
Bill Schmidt38378a02013-02-01 20:23:10 +00001337 // FIXME: The following are not yet generated here by Clang, but are
1338 // generated by GCC:
1339 //
1340 // _SOFT_FLOAT_
1341 // __RECIP_PRECISION__
1342 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001343 // __RECIP__
1344 // __RECIPF__
1345 // __RSQRTE__
1346 // __RSQRTEF__
1347 // _SOFT_DOUBLE_
1348 // __NO_LWSYNC__
1349 // __HAVE_BSWAP__
1350 // __LONGDOUBLE128
1351 // __CMODEL_MEDIUM__
1352 // __CMODEL_LARGE__
1353 // _CALL_SYSV
1354 // _CALL_DARWIN
1355 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001356}
1357
Eric Christophera8a14c32015-08-31 18:39:16 +00001358// Handle explicit options being passed to the compiler here: if we've
1359// explicitly turned off vsx and turned on power8-vector or direct-move then
1360// go ahead and error since the customer has expressed a somewhat incompatible
1361// set of options.
1362static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001363 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001364
1365 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1366 FeaturesVec.end()) {
1367 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1368 FeaturesVec.end()) {
1369 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1370 << "-mno-vsx";
1371 return false;
1372 }
1373
1374 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1375 FeaturesVec.end()) {
1376 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1377 << "-mno-vsx";
1378 return false;
1379 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001380
1381 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1382 FeaturesVec.end()) {
1383 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1384 << "-mno-vsx";
1385 return false;
1386 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001387 }
1388
1389 return true;
1390}
1391
Eric Christopher8c47b422015-10-09 18:39:55 +00001392bool PPCTargetInfo::initFeatureMap(
1393 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1394 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001395 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1396 .Case("7400", true)
1397 .Case("g4", true)
1398 .Case("7450", true)
1399 .Case("g4+", true)
1400 .Case("970", true)
1401 .Case("g5", true)
1402 .Case("pwr6", true)
1403 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001404 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001405 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001406 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001407 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001408 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001409
1410 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001411 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1412 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001413 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001414 .Case("pwr8", true)
1415 .Default(false);
1416 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1417 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001418 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001419 .Case("pwr8", true)
1420 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001421 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1422 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001423 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001424 .Case("pwr8", true)
1425 .Case("pwr7", true)
1426 .Default(false);
1427 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001430 .Case("pwr8", true)
1431 .Case("pwr7", true)
1432 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001433 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1434 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001435 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001436 .Case("pwr8", true)
1437 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001438 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1439 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001440 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001441 .Case("pwr8", true)
1442 .Case("pwr7", true)
1443 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001444
Eric Christophera8a14c32015-08-31 18:39:16 +00001445 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1446 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001447
Eric Christopher007b0a02015-08-28 22:32:01 +00001448 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001449}
1450
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001451bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001452 return llvm::StringSwitch<bool>(Feature)
1453 .Case("powerpc", true)
1454 .Case("vsx", HasVSX)
1455 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001456 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001457 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001458 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001459 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001460 .Case("bpermd", HasBPERMD)
1461 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001462 .Case("float128", HasFloat128)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001463 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001464}
Chris Lattner17df24e2008-04-21 18:56:49 +00001465
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001466void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1467 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001468 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1469 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1470 // incompatible options.
1471 if (Enabled) {
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001472 if (Name == "direct-move") {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001473 Features[Name] = Features["vsx"] = true;
1474 } else if (Name == "power8-vector") {
1475 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001476 } else if (Name == "float128") {
1477 Features[Name] = Features["vsx"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001478 } else {
1479 Features[Name] = true;
1480 }
1481 } else {
1482 if (Name == "vsx") {
1483 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001484 Features["float128"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 } else {
1486 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001487 }
1488 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001489}
1490
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001491const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001492 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1493 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1494 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1495 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1496 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1497 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1498 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1499 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001500 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001501 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001502 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001503 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1504 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1505 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1506 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001507 "vrsave", "vscr",
1508 "spe_acc", "spefscr",
1509 "sfp"
1510};
Chris Lattner10a5b382007-01-29 05:24:35 +00001511
Craig Topperf054e3a2015-10-19 03:52:27 +00001512ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1513 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001514}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001515
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001516const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1517 // While some of these aliases do map to different registers
1518 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001519 { { "0" }, "r0" },
1520 { { "1"}, "r1" },
1521 { { "2" }, "r2" },
1522 { { "3" }, "r3" },
1523 { { "4" }, "r4" },
1524 { { "5" }, "r5" },
1525 { { "6" }, "r6" },
1526 { { "7" }, "r7" },
1527 { { "8" }, "r8" },
1528 { { "9" }, "r9" },
1529 { { "10" }, "r10" },
1530 { { "11" }, "r11" },
1531 { { "12" }, "r12" },
1532 { { "13" }, "r13" },
1533 { { "14" }, "r14" },
1534 { { "15" }, "r15" },
1535 { { "16" }, "r16" },
1536 { { "17" }, "r17" },
1537 { { "18" }, "r18" },
1538 { { "19" }, "r19" },
1539 { { "20" }, "r20" },
1540 { { "21" }, "r21" },
1541 { { "22" }, "r22" },
1542 { { "23" }, "r23" },
1543 { { "24" }, "r24" },
1544 { { "25" }, "r25" },
1545 { { "26" }, "r26" },
1546 { { "27" }, "r27" },
1547 { { "28" }, "r28" },
1548 { { "29" }, "r29" },
1549 { { "30" }, "r30" },
1550 { { "31" }, "r31" },
1551 { { "fr0" }, "f0" },
1552 { { "fr1" }, "f1" },
1553 { { "fr2" }, "f2" },
1554 { { "fr3" }, "f3" },
1555 { { "fr4" }, "f4" },
1556 { { "fr5" }, "f5" },
1557 { { "fr6" }, "f6" },
1558 { { "fr7" }, "f7" },
1559 { { "fr8" }, "f8" },
1560 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001561 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "fr11" }, "f11" },
1563 { { "fr12" }, "f12" },
1564 { { "fr13" }, "f13" },
1565 { { "fr14" }, "f14" },
1566 { { "fr15" }, "f15" },
1567 { { "fr16" }, "f16" },
1568 { { "fr17" }, "f17" },
1569 { { "fr18" }, "f18" },
1570 { { "fr19" }, "f19" },
1571 { { "fr20" }, "f20" },
1572 { { "fr21" }, "f21" },
1573 { { "fr22" }, "f22" },
1574 { { "fr23" }, "f23" },
1575 { { "fr24" }, "f24" },
1576 { { "fr25" }, "f25" },
1577 { { "fr26" }, "f26" },
1578 { { "fr27" }, "f27" },
1579 { { "fr28" }, "f28" },
1580 { { "fr29" }, "f29" },
1581 { { "fr30" }, "f30" },
1582 { { "fr31" }, "f31" },
1583 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001584};
1585
Craig Topperf054e3a2015-10-19 03:52:27 +00001586ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1587 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001588}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001589
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001590class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001591public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001592 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1593 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001594 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001595
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001596 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001597 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001598 case llvm::Triple::FreeBSD:
1599 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001600 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001601 PtrDiffType = SignedInt;
1602 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001603 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001604 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001605 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001606 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001607
Roman Divacky3ffe7462012-03-13 19:20:17 +00001608 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1609 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001610 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001611 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001612
1613 // PPC32 supports atomics up to 4 bytes.
1614 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001615 }
1616
Craig Topper3164f332014-03-11 03:39:26 +00001617 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001618 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001619 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001620 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001621};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001622
Bill Schmidt778d3872013-07-26 01:36:11 +00001623// Note: ABI differences may eventually require us to have a separate
1624// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001625class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001626public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001627 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1628 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001629 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001630 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001631 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001632
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001633 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001634 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001635 ABI = "elfv2";
1636 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001638 ABI = "elfv1";
1639 }
1640
1641 switch (getTriple().getOS()) {
1642 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001643 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001644 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001645 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001646 case llvm::Triple::NetBSD:
1647 IntMaxType = SignedLongLong;
1648 Int64Type = SignedLongLong;
1649 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001650 default:
1651 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001652 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001653
1654 // PPC64 supports atomics up to 8 bytes.
1655 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001656 }
Craig Topper3164f332014-03-11 03:39:26 +00001657 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001658 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001659 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001660 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001661 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001662 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001663 ABI = Name;
1664 return true;
1665 }
1666 return false;
1667 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001669
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001672 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1673 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001674 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001675 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001676 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001677 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001678 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001679 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001680 }
Craig Topper3164f332014-03-11 03:39:26 +00001681 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001682 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001683 }
1684};
1685
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001686class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001687public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001688 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1689 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001691 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001692 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 }
1694};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001695
Eric Christopherc48497a2015-09-18 21:26:24 +00001696static const unsigned NVPTXAddrSpaceMap[] = {
1697 1, // opencl_global
1698 3, // opencl_local
1699 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001700 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001701 0, // opencl_generic
1702 1, // cuda_device
1703 4, // cuda_constant
1704 3, // cuda_shared
1705};
1706
1707class NVPTXTargetInfo : public TargetInfo {
1708 static const char *const GCCRegNames[];
1709 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001710 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001711
Eric Christopherc48497a2015-09-18 21:26:24 +00001712public:
Justin Lebar76945b22016-04-29 23:05:19 +00001713 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001714 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001715 BigEndian = false;
1716 TLSSupported = false;
1717 LongWidth = LongAlign = 64;
1718 AddrSpaceMap = &NVPTXAddrSpaceMap;
1719 UseAddrSpaceMapMangling = true;
1720 // Define available target features
1721 // These must be defined in sorted order!
1722 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001723 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001724
1725 // If possible, get a TargetInfo for our host triple, so we can match its
1726 // types.
1727 llvm::Triple HostTriple(Opts.HostTriple);
1728 if (HostTriple.isNVPTX())
1729 return;
1730 std::unique_ptr<TargetInfo> HostTarget(
1731 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1732 if (!HostTarget) {
1733 return;
1734 }
1735
1736 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1737 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1738 BoolWidth = HostTarget->getBoolWidth();
1739 BoolAlign = HostTarget->getBoolAlign();
1740 IntWidth = HostTarget->getIntWidth();
1741 IntAlign = HostTarget->getIntAlign();
1742 HalfWidth = HostTarget->getHalfWidth();
1743 HalfAlign = HostTarget->getHalfAlign();
1744 FloatWidth = HostTarget->getFloatWidth();
1745 FloatAlign = HostTarget->getFloatAlign();
1746 DoubleWidth = HostTarget->getDoubleWidth();
1747 DoubleAlign = HostTarget->getDoubleAlign();
1748 LongWidth = HostTarget->getLongWidth();
1749 LongAlign = HostTarget->getLongAlign();
1750 LongLongWidth = HostTarget->getLongLongWidth();
1751 LongLongAlign = HostTarget->getLongLongAlign();
1752 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1753 DefaultAlignForAttributeAligned =
1754 HostTarget->getDefaultAlignForAttributeAligned();
1755 SizeType = HostTarget->getSizeType();
1756 IntMaxType = HostTarget->getIntMaxType();
1757 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1758 IntPtrType = HostTarget->getIntPtrType();
1759 WCharType = HostTarget->getWCharType();
1760 WIntType = HostTarget->getWIntType();
1761 Char16Type = HostTarget->getChar16Type();
1762 Char32Type = HostTarget->getChar32Type();
1763 Int64Type = HostTarget->getInt64Type();
1764 SigAtomicType = HostTarget->getSigAtomicType();
1765 ProcessIDType = HostTarget->getProcessIDType();
1766
1767 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1768 UseZeroLengthBitfieldAlignment =
1769 HostTarget->useZeroLengthBitfieldAlignment();
1770 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1771 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1772
1773 // Properties intentionally not copied from host:
1774 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1775 // host/device boundary.
1776 // - SuitableAlign: Not visible across the host/device boundary, and may
1777 // correctly be different on host/device, e.g. if host has wider vector
1778 // types than device.
1779 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1780 // as its double type, but that's not necessarily true on the host.
1781 // TODO: nvcc emits a warning when using long double on device; we should
1782 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001783 }
1784 void getTargetDefines(const LangOptions &Opts,
1785 MacroBuilder &Builder) const override {
1786 Builder.defineMacro("__PTX__");
1787 Builder.defineMacro("__NVPTX__");
1788 if (Opts.CUDAIsDevice) {
1789 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001790 std::string CUDAArchCode = [this] {
1791 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001792 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001793 assert(false && "No GPU arch when compiling CUDA device code.");
1794 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001795 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001796 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001797 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001798 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001799 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001800 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001801 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001802 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001803 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001804 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001805 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001806 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001807 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001808 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001809 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001810 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001811 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001812 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001813 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001815 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001816 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001817 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001818 return "620";
1819 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001820 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001821 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001822 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001823 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001824 }
Craig Topper6c03a542015-10-19 04:51:35 +00001825 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1826 return llvm::makeArrayRef(BuiltinInfo,
1827 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001828 }
1829 bool hasFeature(StringRef Feature) const override {
1830 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001831 }
1832
Craig Topperf054e3a2015-10-19 03:52:27 +00001833 ArrayRef<const char *> getGCCRegNames() const override;
1834 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001835 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001836 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001837 }
1838 bool validateAsmConstraint(const char *&Name,
1839 TargetInfo::ConstraintInfo &Info) const override {
1840 switch (*Name) {
1841 default:
1842 return false;
1843 case 'c':
1844 case 'h':
1845 case 'r':
1846 case 'l':
1847 case 'f':
1848 case 'd':
1849 Info.setAllowsRegister();
1850 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001851 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
1853 const char *getClobbers() const override {
1854 // FIXME: Is this really right?
1855 return "";
1856 }
1857 BuiltinVaListKind getBuiltinVaListKind() const override {
1858 // FIXME: implement
1859 return TargetInfo::CharPtrBuiltinVaList;
1860 }
1861 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001862 GPU = StringToCudaArch(Name);
1863 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001864 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001865 void setSupportedOpenCLOpts() override {
1866 auto &Opts = getSupportedOpenCLOpts();
1867 Opts.cl_clang_storage_class_specifiers = 1;
1868 Opts.cl_khr_gl_sharing = 1;
1869 Opts.cl_khr_icd = 1;
1870
1871 Opts.cl_khr_fp64 = 1;
1872 Opts.cl_khr_byte_addressable_store = 1;
1873 Opts.cl_khr_global_int32_base_atomics = 1;
1874 Opts.cl_khr_global_int32_extended_atomics = 1;
1875 Opts.cl_khr_local_int32_base_atomics = 1;
1876 Opts.cl_khr_local_int32_extended_atomics = 1;
1877 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001878};
1879
1880const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1881#define BUILTIN(ID, TYPE, ATTRS) \
1882 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1883#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1884 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1885#include "clang/Basic/BuiltinsNVPTX.def"
1886};
1887
1888const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1889
Craig Topperf054e3a2015-10-19 03:52:27 +00001890ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1891 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001892}
1893
1894class NVPTX32TargetInfo : public NVPTXTargetInfo {
1895public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001896 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1897 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001898 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001899 PointerWidth = PointerAlign = 32;
1900 SizeType = TargetInfo::UnsignedInt;
1901 PtrDiffType = TargetInfo::SignedInt;
1902 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001903 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
1905};
1906
1907class NVPTX64TargetInfo : public NVPTXTargetInfo {
1908public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001909 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1910 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001911 PointerWidth = PointerAlign = 64;
1912 SizeType = TargetInfo::UnsignedLong;
1913 PtrDiffType = TargetInfo::SignedLong;
1914 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001915 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001916 }
1917};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001918
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001919static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001920 1, // opencl_global
1921 3, // opencl_local
1922 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001923 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001924 1, // cuda_device
1925 2, // cuda_constant
1926 3 // cuda_shared
1927};
1928
Tom Stellarda96344b2014-08-21 13:58:40 +00001929// If you edit the description strings, make sure you update
1930// getPointerWidthV().
1931
Craig Topper273dbc62015-10-18 05:29:26 +00001932static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001933 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1934 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001935
Craig Topper273dbc62015-10-18 05:29:26 +00001936static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001937 "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 +00001938 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1939 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001940
Matt Arsenault250024f2016-06-08 01:56:42 +00001941class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001942 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001943 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001944
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001945 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001946 enum GPUKind {
1947 GK_NONE,
1948 GK_R600,
1949 GK_R600_DOUBLE_OPS,
1950 GK_R700,
1951 GK_R700_DOUBLE_OPS,
1952 GK_EVERGREEN,
1953 GK_EVERGREEN_DOUBLE_OPS,
1954 GK_NORTHERN_ISLANDS,
1955 GK_CAYMAN,
Tom Stellard08ded122013-10-29 16:38:29 +00001956 GK_SOUTHERN_ISLANDS,
Tom Stellard5c384402015-06-18 19:14:15 +00001957 GK_SEA_ISLANDS,
1958 GK_VOLCANIC_ISLANDS
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959 } GPU;
1960
Jan Veselyeebeaea2015-05-04 19:53:36 +00001961 bool hasFP64:1;
1962 bool hasFMAF:1;
1963 bool hasLDEXPF:1;
Yaxun Liu2c17e822016-08-09 19:43:38 +00001964 bool hasDenormSupport:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001965
Matt Arsenault250024f2016-06-08 01:56:42 +00001966 static bool isAMDGCN(const llvm::Triple &TT) {
1967 return TT.getArch() == llvm::Triple::amdgcn;
1968 }
1969
Eli Friedmand13b41e2012-10-12 23:32:00 +00001970public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001971 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001972 : TargetInfo(Triple) ,
1973 GPU(isAMDGCN(Triple) ? GK_SOUTHERN_ISLANDS : GK_R600),
1974 hasFP64(false),
1975 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00001976 hasLDEXPF(false),
1977 hasDenormSupport(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00001978 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00001979 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00001980 hasFMAF = true;
1981 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00001982 }
Yaxun Liu2c17e822016-08-09 19:43:38 +00001983 if (Opts.CPU == "fiji")
1984 hasDenormSupport = true;
Matt Arsenault250024f2016-06-08 01:56:42 +00001985
1986 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
1987 DataLayoutStringSI : DataLayoutStringR600);
1988
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001989 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00001990 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00001991 }
1992
Tom Stellarda96344b2014-08-21 13:58:40 +00001993 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1994 if (GPU <= GK_CAYMAN)
1995 return 32;
1996
1997 switch(AddrSpace) {
1998 default:
1999 return 64;
2000 case 0:
2001 case 3:
2002 case 5:
2003 return 32;
2004 }
2005 }
2006
Yaxun Liu26f75662016-08-19 05:17:25 +00002007 uint64_t getMaxPointerWidth() const override {
2008 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2009 }
2010
Craig Topper3164f332014-03-11 03:39:26 +00002011 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002012 return "";
2013 }
2014
Craig Topperf054e3a2015-10-19 03:52:27 +00002015 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002016
Craig Topperf054e3a2015-10-19 03:52:27 +00002017 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2018 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002019 }
2020
Craig Topper3164f332014-03-11 03:39:26 +00002021 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002022 TargetInfo::ConstraintInfo &Info) const override {
2023 switch (*Name) {
2024 default: break;
2025 case 'v': // vgpr
2026 case 's': // sgpr
2027 Info.setAllowsRegister();
2028 return true;
2029 }
2030 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002031 }
2032
Matt Arsenault250024f2016-06-08 01:56:42 +00002033 bool initFeatureMap(llvm::StringMap<bool> &Features,
2034 DiagnosticsEngine &Diags, StringRef CPU,
2035 const std::vector<std::string> &FeatureVec) const override;
2036
Yaxun Liu2c17e822016-08-09 19:43:38 +00002037 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2038 TargetOptions &TargetOpts) const override {
2039 if (!hasDenormSupport)
2040 return;
2041 bool hasFP32Denormals = false;
2042 bool hasFP64Denormals = false;
2043 for (auto &I : TargetOpts.FeaturesAsWritten) {
2044 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2045 hasFP32Denormals = true;
2046 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2047 hasFP64Denormals = true;
2048 }
2049 if (!hasFP32Denormals)
2050 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2051 Twine("fp32-denormals")).str());
2052 if (!hasFP64Denormals && hasFP64)
2053 TargetOpts.Features.push_back((Twine(CGOpts.FlushDenorm ? '-' : '+') +
2054 Twine("fp64-denormals")).str());
2055 }
2056
Craig Topper6c03a542015-10-19 04:51:35 +00002057 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2058 return llvm::makeArrayRef(BuiltinInfo,
2059 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002060 }
2061
Craig Topper3164f332014-03-11 03:39:26 +00002062 void getTargetDefines(const LangOptions &Opts,
2063 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002064 if (getTriple().getArch() == llvm::Triple::amdgcn)
2065 Builder.defineMacro("__AMDGCN__");
2066 else
2067 Builder.defineMacro("__R600__");
2068
Jan Veselyeebeaea2015-05-04 19:53:36 +00002069 if (hasFMAF)
2070 Builder.defineMacro("__HAS_FMAF__");
2071 if (hasLDEXPF)
2072 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002073 if (hasFP64)
2074 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002075 }
2076
Craig Topper3164f332014-03-11 03:39:26 +00002077 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002078 return TargetInfo::CharPtrBuiltinVaList;
2079 }
2080
Matt Arsenault250024f2016-06-08 01:56:42 +00002081 static GPUKind parseR600Name(StringRef Name) {
2082 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002083 .Case("r600" , GK_R600)
2084 .Case("rv610", GK_R600)
2085 .Case("rv620", GK_R600)
2086 .Case("rv630", GK_R600)
2087 .Case("rv635", GK_R600)
2088 .Case("rs780", GK_R600)
2089 .Case("rs880", GK_R600)
2090 .Case("rv670", GK_R600_DOUBLE_OPS)
2091 .Case("rv710", GK_R700)
2092 .Case("rv730", GK_R700)
2093 .Case("rv740", GK_R700_DOUBLE_OPS)
2094 .Case("rv770", GK_R700_DOUBLE_OPS)
2095 .Case("palm", GK_EVERGREEN)
2096 .Case("cedar", GK_EVERGREEN)
2097 .Case("sumo", GK_EVERGREEN)
2098 .Case("sumo2", GK_EVERGREEN)
2099 .Case("redwood", GK_EVERGREEN)
2100 .Case("juniper", GK_EVERGREEN)
2101 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2102 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2103 .Case("barts", GK_NORTHERN_ISLANDS)
2104 .Case("turks", GK_NORTHERN_ISLANDS)
2105 .Case("caicos", GK_NORTHERN_ISLANDS)
2106 .Case("cayman", GK_CAYMAN)
2107 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002108 .Default(GK_NONE);
2109 }
2110
2111 static GPUKind parseAMDGCNName(StringRef Name) {
2112 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderc37d69f2016-08-30 18:00:22 +00002113 .Case("tahiti", GK_SOUTHERN_ISLANDS)
2114 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
2115 .Case("verde", GK_SOUTHERN_ISLANDS)
2116 .Case("oland", GK_SOUTHERN_ISLANDS)
2117 .Case("hainan", GK_SOUTHERN_ISLANDS)
2118 .Case("bonaire", GK_SEA_ISLANDS)
2119 .Case("kabini", GK_SEA_ISLANDS)
2120 .Case("kaveri", GK_SEA_ISLANDS)
2121 .Case("hawaii", GK_SEA_ISLANDS)
2122 .Case("mullins", GK_SEA_ISLANDS)
2123 .Case("tonga", GK_VOLCANIC_ISLANDS)
2124 .Case("iceland", GK_VOLCANIC_ISLANDS)
2125 .Case("carrizo", GK_VOLCANIC_ISLANDS)
2126 .Case("fiji", GK_VOLCANIC_ISLANDS)
2127 .Case("stoney", GK_VOLCANIC_ISLANDS)
2128 .Case("polaris10", GK_VOLCANIC_ISLANDS)
2129 .Case("polaris11", GK_VOLCANIC_ISLANDS)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002130 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002131 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002132
Matt Arsenault250024f2016-06-08 01:56:42 +00002133 bool setCPU(const std::string &Name) override {
2134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 GPU = parseAMDGCNName(Name);
2136 else
2137 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002138
Matt Arsenault250024f2016-06-08 01:56:42 +00002139 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002140 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002141
Jan Vesely211ba782016-06-17 02:25:03 +00002142 void setSupportedOpenCLOpts() override {
2143 auto &Opts = getSupportedOpenCLOpts();
2144 Opts.cl_clang_storage_class_specifiers = 1;
2145 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002146
Jan Vesely211ba782016-06-17 02:25:03 +00002147 if (hasFP64)
2148 Opts.cl_khr_fp64 = 1;
2149 if (GPU >= GK_EVERGREEN) {
2150 Opts.cl_khr_byte_addressable_store = 1;
2151 Opts.cl_khr_global_int32_base_atomics = 1;
2152 Opts.cl_khr_global_int32_extended_atomics = 1;
2153 Opts.cl_khr_local_int32_base_atomics = 1;
2154 Opts.cl_khr_local_int32_extended_atomics = 1;
2155 }
2156 if (GPU >= GK_SOUTHERN_ISLANDS) {
2157 Opts.cl_khr_fp16 = 1;
2158 Opts.cl_khr_int64_base_atomics = 1;
2159 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002160 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002161 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002162 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002163 Opts.cl_amd_media_ops = 1;
2164 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002165 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002166 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002167
Yaxun Liu99444cb2016-08-03 20:38:06 +00002168 LangAS::ID getOpenCLImageAddrSpace() const override {
2169 return LangAS::opencl_constant;
2170 }
2171
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002172 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2173 switch (CC) {
2174 default:
2175 return CCCR_Warning;
2176 case CC_C:
2177 case CC_OpenCLKernel:
2178 return CCCR_OK;
2179 }
2180 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002181};
2182
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002183const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002184#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002185 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002186#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2187 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002188#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002189};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002190const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002191 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2192 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2193 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2194 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2195 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2196 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2197 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2198 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2199 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2200 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2201 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2202 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2203 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2204 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2205 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2206 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2207 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2208 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2209 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2210 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2211 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2212 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2213 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2214 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2215 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2216 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2217 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2218 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2219 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2220 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2221 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2222 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2223 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2224 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2225 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2226 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2227 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2228 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2229 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2230 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2231 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2232 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2233 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2234 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2235 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2236 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2237 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002238 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002239 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2240 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002241};
2242
Craig Topperf054e3a2015-10-19 03:52:27 +00002243ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2244 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002245}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002246
Matt Arsenault250024f2016-06-08 01:56:42 +00002247bool AMDGPUTargetInfo::initFeatureMap(
2248 llvm::StringMap<bool> &Features,
2249 DiagnosticsEngine &Diags, StringRef CPU,
2250 const std::vector<std::string> &FeatureVec) const {
2251
2252 // XXX - What does the member GPU mean if device name string passed here?
2253 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2254 if (CPU.empty())
2255 CPU = "tahiti";
2256
2257 switch (parseAMDGCNName(CPU)) {
2258 case GK_SOUTHERN_ISLANDS:
2259 case GK_SEA_ISLANDS:
2260 break;
2261
2262 case GK_VOLCANIC_ISLANDS:
2263 Features["s-memrealtime"] = true;
2264 Features["16-bit-insts"] = true;
2265 break;
2266
2267 case GK_NONE:
2268 return false;
2269 default:
2270 llvm_unreachable("unhandled subtarget");
2271 }
2272 } else {
2273 if (CPU.empty())
2274 CPU = "r600";
2275
2276 switch (parseR600Name(CPU)) {
2277 case GK_R600:
2278 case GK_R700:
2279 case GK_EVERGREEN:
2280 case GK_NORTHERN_ISLANDS:
2281 break;
2282 case GK_R600_DOUBLE_OPS:
2283 case GK_R700_DOUBLE_OPS:
2284 case GK_EVERGREEN_DOUBLE_OPS:
2285 case GK_CAYMAN:
2286 Features["fp64"] = true;
2287 break;
2288 case GK_NONE:
2289 return false;
2290 default:
2291 llvm_unreachable("unhandled subtarget");
2292 }
2293 }
2294
2295 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2296}
2297
Eli Friedman3fd920a2008-08-20 02:34:37 +00002298// Namespace for x86 abstract base class
2299const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002300#define BUILTIN(ID, TYPE, ATTRS) \
2301 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002302#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002303 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002304#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002305 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002306#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002307};
Eli Friedmanb5366062008-05-20 14:21:01 +00002308
Nuno Lopescfca1f02009-12-23 17:49:57 +00002309static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002310 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2311 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002312 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002313 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2314 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2315 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002316 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002317 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2318 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002319 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2320 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2321 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2322 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2323 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2324 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2325 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2326 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002327};
2328
Eric Christophercdd36352011-06-21 00:05:20 +00002329const TargetInfo::AddlRegName AddlRegNames[] = {
2330 { { "al", "ah", "eax", "rax" }, 0 },
2331 { { "bl", "bh", "ebx", "rbx" }, 3 },
2332 { { "cl", "ch", "ecx", "rcx" }, 2 },
2333 { { "dl", "dh", "edx", "rdx" }, 1 },
2334 { { "esi", "rsi" }, 4 },
2335 { { "edi", "rdi" }, 5 },
2336 { { "esp", "rsp" }, 7 },
2337 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002338 { { "r8d", "r8w", "r8b" }, 38 },
2339 { { "r9d", "r9w", "r9b" }, 39 },
2340 { { "r10d", "r10w", "r10b" }, 40 },
2341 { { "r11d", "r11w", "r11b" }, 41 },
2342 { { "r12d", "r12w", "r12b" }, 42 },
2343 { { "r13d", "r13w", "r13b" }, 43 },
2344 { { "r14d", "r14w", "r14b" }, 44 },
2345 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002346};
2347
2348// X86 target abstract base class; x86-32 and x86-64 are very close, so
2349// most of the implementation can be shared.
2350class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002351 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002352 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002353 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002354 enum MMX3DNowEnum {
2355 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002356 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002357 enum XOPEnum {
2358 NoXOP,
2359 SSE4A,
2360 FMA4,
2361 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002362 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002363
Craig Topper543f3bd2015-10-14 23:47:57 +00002364 bool HasAES = false;
2365 bool HasPCLMUL = false;
2366 bool HasLZCNT = false;
2367 bool HasRDRND = false;
2368 bool HasFSGSBASE = false;
2369 bool HasBMI = false;
2370 bool HasBMI2 = false;
2371 bool HasPOPCNT = false;
2372 bool HasRTM = false;
2373 bool HasPRFCHW = false;
2374 bool HasRDSEED = false;
2375 bool HasADX = false;
2376 bool HasTBM = false;
2377 bool HasFMA = false;
2378 bool HasF16C = false;
2379 bool HasAVX512CD = false;
2380 bool HasAVX512ER = false;
2381 bool HasAVX512PF = false;
2382 bool HasAVX512DQ = false;
2383 bool HasAVX512BW = false;
2384 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002385 bool HasAVX512VBMI = false;
2386 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002387 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002388 bool HasMPX = false;
2389 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002390 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002391 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002392 bool HasXSAVE = false;
2393 bool HasXSAVEOPT = false;
2394 bool HasXSAVEC = false;
2395 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002396 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002397 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002398 bool HasCLFLUSHOPT = false;
2399 bool HasPCOMMIT = false;
2400 bool HasCLWB = false;
2401 bool HasUMIP = false;
2402 bool HasMOVBE = false;
2403 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002404
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002405 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2406 ///
2407 /// Each enumeration represents a particular CPU supported by Clang. These
2408 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2409 enum CPUKind {
2410 CK_Generic,
2411
2412 /// \name i386
2413 /// i386-generation processors.
2414 //@{
2415 CK_i386,
2416 //@}
2417
2418 /// \name i486
2419 /// i486-generation processors.
2420 //@{
2421 CK_i486,
2422 CK_WinChipC6,
2423 CK_WinChip2,
2424 CK_C3,
2425 //@}
2426
2427 /// \name i586
2428 /// i586-generation processors, P5 microarchitecture based.
2429 //@{
2430 CK_i586,
2431 CK_Pentium,
2432 CK_PentiumMMX,
2433 //@}
2434
2435 /// \name i686
2436 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2437 //@{
2438 CK_i686,
2439 CK_PentiumPro,
2440 CK_Pentium2,
2441 CK_Pentium3,
2442 CK_Pentium3M,
2443 CK_PentiumM,
2444 CK_C3_2,
2445
2446 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2447 /// Clang however has some logic to suport this.
2448 // FIXME: Warn, deprecate, and potentially remove this.
2449 CK_Yonah,
2450 //@}
2451
2452 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002453 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002454 //@{
2455 CK_Pentium4,
2456 CK_Pentium4M,
2457 CK_Prescott,
2458 CK_Nocona,
2459 //@}
2460
2461 /// \name Core
2462 /// Core microarchitecture based processors.
2463 //@{
2464 CK_Core2,
2465
2466 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2467 /// codename which GCC no longer accepts as an option to -march, but Clang
2468 /// has some logic for recognizing it.
2469 // FIXME: Warn, deprecate, and potentially remove this.
2470 CK_Penryn,
2471 //@}
2472
2473 /// \name Atom
2474 /// Atom processors
2475 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002476 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002477 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002478 //@}
2479
2480 /// \name Nehalem
2481 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002482 CK_Nehalem,
2483
2484 /// \name Westmere
2485 /// Westmere microarchitecture based processors.
2486 CK_Westmere,
2487
2488 /// \name Sandy Bridge
2489 /// Sandy Bridge microarchitecture based processors.
2490 CK_SandyBridge,
2491
2492 /// \name Ivy Bridge
2493 /// Ivy Bridge microarchitecture based processors.
2494 CK_IvyBridge,
2495
2496 /// \name Haswell
2497 /// Haswell microarchitecture based processors.
2498 CK_Haswell,
2499
2500 /// \name Broadwell
2501 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002502 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002503
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002504 /// \name Skylake Client
2505 /// Skylake client microarchitecture based processors.
2506 CK_SkylakeClient,
2507
2508 /// \name Skylake Server
2509 /// Skylake server microarchitecture based processors.
2510 CK_SkylakeServer,
2511
2512 /// \name Cannonlake Client
2513 /// Cannonlake client microarchitecture based processors.
2514 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002515
Craig Topper449314e2013-08-20 07:09:39 +00002516 /// \name Knights Landing
2517 /// Knights Landing processor.
2518 CK_KNL,
2519
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002520 /// \name Lakemont
2521 /// Lakemont microarchitecture based processors.
2522 CK_Lakemont,
2523
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002524 /// \name K6
2525 /// K6 architecture processors.
2526 //@{
2527 CK_K6,
2528 CK_K6_2,
2529 CK_K6_3,
2530 //@}
2531
2532 /// \name K7
2533 /// K7 architecture processors.
2534 //@{
2535 CK_Athlon,
2536 CK_AthlonThunderbird,
2537 CK_Athlon4,
2538 CK_AthlonXP,
2539 CK_AthlonMP,
2540 //@}
2541
2542 /// \name K8
2543 /// K8 architecture processors.
2544 //@{
2545 CK_Athlon64,
2546 CK_Athlon64SSE3,
2547 CK_AthlonFX,
2548 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002549 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002550 CK_Opteron,
2551 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002552 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002553 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002554
Benjamin Kramer569f2152012-01-10 11:50:18 +00002555 /// \name Bobcat
2556 /// Bobcat architecture processors.
2557 //@{
2558 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002559 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002560 //@}
2561
2562 /// \name Bulldozer
2563 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002564 //@{
2565 CK_BDVER1,
2566 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002567 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002568 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002569 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002570
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002571 /// This specification is deprecated and will be removed in the future.
2572 /// Users should prefer \see CK_K8.
2573 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002574 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002575 CK_x86_64,
2576 //@}
2577
2578 /// \name Geode
2579 /// Geode processors.
2580 //@{
2581 CK_Geode
2582 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002583 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002584
Eric Christopherc50738f2015-08-27 00:05:50 +00002585 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002586 return llvm::StringSwitch<CPUKind>(CPU)
2587 .Case("i386", CK_i386)
2588 .Case("i486", CK_i486)
2589 .Case("winchip-c6", CK_WinChipC6)
2590 .Case("winchip2", CK_WinChip2)
2591 .Case("c3", CK_C3)
2592 .Case("i586", CK_i586)
2593 .Case("pentium", CK_Pentium)
2594 .Case("pentium-mmx", CK_PentiumMMX)
2595 .Case("i686", CK_i686)
2596 .Case("pentiumpro", CK_PentiumPro)
2597 .Case("pentium2", CK_Pentium2)
2598 .Case("pentium3", CK_Pentium3)
2599 .Case("pentium3m", CK_Pentium3M)
2600 .Case("pentium-m", CK_PentiumM)
2601 .Case("c3-2", CK_C3_2)
2602 .Case("yonah", CK_Yonah)
2603 .Case("pentium4", CK_Pentium4)
2604 .Case("pentium4m", CK_Pentium4M)
2605 .Case("prescott", CK_Prescott)
2606 .Case("nocona", CK_Nocona)
2607 .Case("core2", CK_Core2)
2608 .Case("penryn", CK_Penryn)
2609 .Case("bonnell", CK_Bonnell)
2610 .Case("atom", CK_Bonnell) // Legacy name.
2611 .Case("silvermont", CK_Silvermont)
2612 .Case("slm", CK_Silvermont) // Legacy name.
2613 .Case("nehalem", CK_Nehalem)
2614 .Case("corei7", CK_Nehalem) // Legacy name.
2615 .Case("westmere", CK_Westmere)
2616 .Case("sandybridge", CK_SandyBridge)
2617 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2618 .Case("ivybridge", CK_IvyBridge)
2619 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2620 .Case("haswell", CK_Haswell)
2621 .Case("core-avx2", CK_Haswell) // Legacy name.
2622 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002623 .Case("skylake", CK_SkylakeClient)
2624 .Case("skylake-avx512", CK_SkylakeServer)
2625 .Case("skx", CK_SkylakeServer) // Legacy name.
2626 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002627 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002628 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002629 .Case("k6", CK_K6)
2630 .Case("k6-2", CK_K6_2)
2631 .Case("k6-3", CK_K6_3)
2632 .Case("athlon", CK_Athlon)
2633 .Case("athlon-tbird", CK_AthlonThunderbird)
2634 .Case("athlon-4", CK_Athlon4)
2635 .Case("athlon-xp", CK_AthlonXP)
2636 .Case("athlon-mp", CK_AthlonMP)
2637 .Case("athlon64", CK_Athlon64)
2638 .Case("athlon64-sse3", CK_Athlon64SSE3)
2639 .Case("athlon-fx", CK_AthlonFX)
2640 .Case("k8", CK_K8)
2641 .Case("k8-sse3", CK_K8SSE3)
2642 .Case("opteron", CK_Opteron)
2643 .Case("opteron-sse3", CK_OpteronSSE3)
2644 .Case("barcelona", CK_AMDFAM10)
2645 .Case("amdfam10", CK_AMDFAM10)
2646 .Case("btver1", CK_BTVER1)
2647 .Case("btver2", CK_BTVER2)
2648 .Case("bdver1", CK_BDVER1)
2649 .Case("bdver2", CK_BDVER2)
2650 .Case("bdver3", CK_BDVER3)
2651 .Case("bdver4", CK_BDVER4)
2652 .Case("x86-64", CK_x86_64)
2653 .Case("geode", CK_Geode)
2654 .Default(CK_Generic);
2655 }
2656
Rafael Espindolaeb265472013-08-21 21:59:03 +00002657 enum FPMathKind {
2658 FP_Default,
2659 FP_SSE,
2660 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002661 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002662
Eli Friedman3fd920a2008-08-20 02:34:37 +00002663public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002664 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2665 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00002666 BigEndian = false;
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002667 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002668 }
Craig Topper3164f332014-03-11 03:39:26 +00002669 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002670 // X87 evaluates with 80 bits "long double" precision.
2671 return SSELevel == NoSSE ? 2 : 0;
2672 }
Craig Topper6c03a542015-10-19 04:51:35 +00002673 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2674 return llvm::makeArrayRef(BuiltinInfo,
2675 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002676 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002677 ArrayRef<const char *> getGCCRegNames() const override {
2678 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002679 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002680 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2681 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002682 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002683 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2684 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002685 }
Eric Christopherd9832702015-06-29 21:00:05 +00002686 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002687 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002688 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002689
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002690 bool validateGlobalRegisterVariable(StringRef RegName,
2691 unsigned RegSize,
2692 bool &HasSizeMismatch) const override {
2693 // esp and ebp are the only 32-bit registers the x86 backend can currently
2694 // handle.
2695 if (RegName.equals("esp") || RegName.equals("ebp")) {
2696 // Check that the register size is 32-bit.
2697 HasSizeMismatch = RegSize != 32;
2698 return true;
2699 }
2700
2701 return false;
2702 }
2703
Akira Hatanaka974131e2014-09-18 18:17:18 +00002704 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2705
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002706 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2707
Akira Hatanaka974131e2014-09-18 18:17:18 +00002708 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2709
Craig Topper3164f332014-03-11 03:39:26 +00002710 std::string convertConstraint(const char *&Constraint) const override;
2711 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002712 return "~{dirflag},~{fpsr},~{flags}";
2713 }
Craig Topper3164f332014-03-11 03:39:26 +00002714 void getTargetDefines(const LangOptions &Opts,
2715 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002716 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2717 bool Enabled);
2718 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2719 bool Enabled);
2720 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2721 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002722 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2723 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002724 setFeatureEnabledImpl(Features, Name, Enabled);
2725 }
2726 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002727 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002728 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2729 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002730 bool
2731 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2732 StringRef CPU,
2733 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002734 bool hasFeature(StringRef Feature) const override;
2735 bool handleTargetFeatures(std::vector<std::string> &Features,
2736 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002737 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002738 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2739 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002740 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002741 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002742 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002743 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002744 return "no-mmx";
2745 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002746 }
Craig Topper3164f332014-03-11 03:39:26 +00002747 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002748 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002749
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002750 // Perform any per-CPU checks necessary to determine if this CPU is
2751 // acceptable.
2752 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2753 // invalid without explaining *why*.
2754 switch (CPU) {
2755 case CK_Generic:
2756 // No processor selected!
2757 return false;
2758
2759 case CK_i386:
2760 case CK_i486:
2761 case CK_WinChipC6:
2762 case CK_WinChip2:
2763 case CK_C3:
2764 case CK_i586:
2765 case CK_Pentium:
2766 case CK_PentiumMMX:
2767 case CK_i686:
2768 case CK_PentiumPro:
2769 case CK_Pentium2:
2770 case CK_Pentium3:
2771 case CK_Pentium3M:
2772 case CK_PentiumM:
2773 case CK_Yonah:
2774 case CK_C3_2:
2775 case CK_Pentium4:
2776 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002777 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002778 case CK_Prescott:
2779 case CK_K6:
2780 case CK_K6_2:
2781 case CK_K6_3:
2782 case CK_Athlon:
2783 case CK_AthlonThunderbird:
2784 case CK_Athlon4:
2785 case CK_AthlonXP:
2786 case CK_AthlonMP:
2787 case CK_Geode:
2788 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002789 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002790 return false;
2791
2792 // Fallthrough
2793 case CK_Nocona:
2794 case CK_Core2:
2795 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002796 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002797 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002798 case CK_Nehalem:
2799 case CK_Westmere:
2800 case CK_SandyBridge:
2801 case CK_IvyBridge:
2802 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002803 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002804 case CK_SkylakeClient:
2805 case CK_SkylakeServer:
2806 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002807 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002808 case CK_Athlon64:
2809 case CK_Athlon64SSE3:
2810 case CK_AthlonFX:
2811 case CK_K8:
2812 case CK_K8SSE3:
2813 case CK_Opteron:
2814 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002815 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002816 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002817 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002818 case CK_BDVER1:
2819 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002820 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002821 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002822 case CK_x86_64:
2823 return true;
2824 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002825 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002826 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002827
Craig Topper3164f332014-03-11 03:39:26 +00002828 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002829
Craig Topper3164f332014-03-11 03:39:26 +00002830 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002831 // Most of the non-ARM calling conventions are i386 conventions.
2832 switch (CC) {
2833 case CC_X86ThisCall:
2834 case CC_X86FastCall:
2835 case CC_X86StdCall:
2836 case CC_X86VectorCall:
2837 case CC_C:
2838 case CC_Swift:
2839 case CC_X86Pascal:
2840 case CC_IntelOclBicc:
2841 return CCCR_OK;
2842 default:
2843 return CCCR_Warning;
2844 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002845 }
2846
Craig Topper3164f332014-03-11 03:39:26 +00002847 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002848 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002849 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002850
2851 bool hasSjLjLowering() const override {
2852 return true;
2853 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002854
2855 void setSupportedOpenCLOpts() override {
2856 getSupportedOpenCLOpts().setAll();
2857 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002858};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002859
Rafael Espindolaeb265472013-08-21 21:59:03 +00002860bool X86TargetInfo::setFPMath(StringRef Name) {
2861 if (Name == "387") {
2862 FPMath = FP_387;
2863 return true;
2864 }
2865 if (Name == "sse") {
2866 FPMath = FP_SSE;
2867 return true;
2868 }
2869 return false;
2870}
2871
Eric Christopher007b0a02015-08-28 22:32:01 +00002872bool X86TargetInfo::initFeatureMap(
2873 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002874 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002875 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002876 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002877 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002878 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002879
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002880 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002881
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002882 // Enable X87 for all X86 processors but Lakemont.
2883 if (Kind != CK_Lakemont)
2884 setFeatureEnabledImpl(Features, "x87", true);
2885
2886 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002887 case CK_Generic:
2888 case CK_i386:
2889 case CK_i486:
2890 case CK_i586:
2891 case CK_Pentium:
2892 case CK_i686:
2893 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002894 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002895 break;
2896 case CK_PentiumMMX:
2897 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002898 case CK_K6:
2899 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002900 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002901 break;
2902 case CK_Pentium3:
2903 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002904 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002905 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002906 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002907 break;
2908 case CK_PentiumM:
2909 case CK_Pentium4:
2910 case CK_Pentium4M:
2911 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002912 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002913 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002914 break;
2915 case CK_Yonah:
2916 case CK_Prescott:
2917 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002918 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002919 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002920 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002921 break;
2922 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002923 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002924 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002925 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002926 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002927 break;
2928 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002929 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002930 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002931 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002932 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002933 case CK_Cannonlake:
2934 setFeatureEnabledImpl(Features, "avx512ifma", true);
2935 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2936 setFeatureEnabledImpl(Features, "sha", true);
2937 setFeatureEnabledImpl(Features, "umip", true);
2938 // FALLTHROUGH
2939 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002940 setFeatureEnabledImpl(Features, "avx512f", true);
2941 setFeatureEnabledImpl(Features, "avx512cd", true);
2942 setFeatureEnabledImpl(Features, "avx512dq", true);
2943 setFeatureEnabledImpl(Features, "avx512bw", true);
2944 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002945 setFeatureEnabledImpl(Features, "pku", true);
2946 setFeatureEnabledImpl(Features, "pcommit", true);
2947 setFeatureEnabledImpl(Features, "clwb", true);
2948 // FALLTHROUGH
2949 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002950 setFeatureEnabledImpl(Features, "xsavec", true);
2951 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002952 setFeatureEnabledImpl(Features, "mpx", true);
2953 setFeatureEnabledImpl(Features, "sgx", true);
2954 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002955 // FALLTHROUGH
2956 case CK_Broadwell:
2957 setFeatureEnabledImpl(Features, "rdseed", true);
2958 setFeatureEnabledImpl(Features, "adx", true);
2959 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002960 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002961 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002962 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002963 setFeatureEnabledImpl(Features, "bmi", true);
2964 setFeatureEnabledImpl(Features, "bmi2", true);
2965 setFeatureEnabledImpl(Features, "rtm", true);
2966 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002967 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002968 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002969 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002970 setFeatureEnabledImpl(Features, "rdrnd", true);
2971 setFeatureEnabledImpl(Features, "f16c", true);
2972 setFeatureEnabledImpl(Features, "fsgsbase", true);
2973 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002974 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002975 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002976 setFeatureEnabledImpl(Features, "xsave", true);
2977 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002978 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002979 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00002980 case CK_Silvermont:
2981 setFeatureEnabledImpl(Features, "aes", true);
2982 setFeatureEnabledImpl(Features, "pclmul", true);
2983 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002984 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00002985 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002986 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002987 setFeatureEnabledImpl(Features, "cx16", true);
2988 break;
2989 case CK_KNL:
2990 setFeatureEnabledImpl(Features, "avx512f", true);
2991 setFeatureEnabledImpl(Features, "avx512cd", true);
2992 setFeatureEnabledImpl(Features, "avx512er", true);
2993 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002994 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002995 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00002996 setFeatureEnabledImpl(Features, "rdseed", true);
2997 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002998 setFeatureEnabledImpl(Features, "lzcnt", true);
2999 setFeatureEnabledImpl(Features, "bmi", true);
3000 setFeatureEnabledImpl(Features, "bmi2", true);
3001 setFeatureEnabledImpl(Features, "rtm", true);
3002 setFeatureEnabledImpl(Features, "fma", true);
3003 setFeatureEnabledImpl(Features, "rdrnd", true);
3004 setFeatureEnabledImpl(Features, "f16c", true);
3005 setFeatureEnabledImpl(Features, "fsgsbase", true);
3006 setFeatureEnabledImpl(Features, "aes", true);
3007 setFeatureEnabledImpl(Features, "pclmul", true);
3008 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003009 setFeatureEnabledImpl(Features, "xsaveopt", true);
3010 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003011 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003012 break;
3013 case CK_K6_2:
3014 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003015 case CK_WinChip2:
3016 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003017 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003018 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003019 case CK_Athlon:
3020 case CK_AthlonThunderbird:
3021 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003022 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003023 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003024 case CK_Athlon4:
3025 case CK_AthlonXP:
3026 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003027 setFeatureEnabledImpl(Features, "sse", true);
3028 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003029 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003030 break;
3031 case CK_K8:
3032 case CK_Opteron:
3033 case CK_Athlon64:
3034 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003035 setFeatureEnabledImpl(Features, "sse2", true);
3036 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003037 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003038 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003039 case CK_AMDFAM10:
3040 setFeatureEnabledImpl(Features, "sse4a", true);
3041 setFeatureEnabledImpl(Features, "lzcnt", true);
3042 setFeatureEnabledImpl(Features, "popcnt", true);
3043 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003044 case CK_K8SSE3:
3045 case CK_OpteronSSE3:
3046 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003047 setFeatureEnabledImpl(Features, "sse3", true);
3048 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003049 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003050 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003051 case CK_BTVER2:
3052 setFeatureEnabledImpl(Features, "avx", true);
3053 setFeatureEnabledImpl(Features, "aes", true);
3054 setFeatureEnabledImpl(Features, "pclmul", true);
3055 setFeatureEnabledImpl(Features, "bmi", true);
3056 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003057 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003058 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003059 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003060 setFeatureEnabledImpl(Features, "ssse3", true);
3061 setFeatureEnabledImpl(Features, "sse4a", true);
3062 setFeatureEnabledImpl(Features, "lzcnt", true);
3063 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003064 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003065 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003066 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003067 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003068 case CK_BDVER4:
3069 setFeatureEnabledImpl(Features, "avx2", true);
3070 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003071 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003072 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003073 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003074 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003075 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003076 // FALLTHROUGH
3077 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003078 setFeatureEnabledImpl(Features, "bmi", true);
3079 setFeatureEnabledImpl(Features, "fma", true);
3080 setFeatureEnabledImpl(Features, "f16c", true);
3081 setFeatureEnabledImpl(Features, "tbm", true);
3082 // FALLTHROUGH
3083 case CK_BDVER1:
3084 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003085 setFeatureEnabledImpl(Features, "xop", true);
3086 setFeatureEnabledImpl(Features, "lzcnt", true);
3087 setFeatureEnabledImpl(Features, "aes", true);
3088 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003089 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003090 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003091 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003092 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003093 break;
Eli Friedman33465822011-07-08 23:31:17 +00003094 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003095 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3096 return false;
3097
3098 // Can't do this earlier because we need to be able to explicitly enable
3099 // or disable these features and the things that they depend upon.
3100
3101 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3102 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003103 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003104 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3105 FeaturesVec.end())
3106 Features["popcnt"] = true;
3107
3108 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3109 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003110 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003111 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3112 FeaturesVec.end())
3113 Features["prfchw"] = true;
3114
Eric Christophera7260af2015-10-08 20:10:18 +00003115 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3116 // then enable MMX.
3117 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003118 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003119 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3120 FeaturesVec.end())
3121 Features["mmx"] = true;
3122
Eric Christopherbbd746d2015-10-08 20:10:14 +00003123 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003124}
3125
Rafael Espindolae62e2792013-08-20 13:44:29 +00003126void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003127 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003128 if (Enabled) {
3129 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003130 case AVX512F:
3131 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003132 case AVX2:
3133 Features["avx2"] = true;
3134 case AVX:
3135 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003136 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003137 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003138 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003139 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003140 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003141 case SSSE3:
3142 Features["ssse3"] = true;
3143 case SSE3:
3144 Features["sse3"] = true;
3145 case SSE2:
3146 Features["sse2"] = true;
3147 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003148 Features["sse"] = true;
3149 case NoSSE:
3150 break;
3151 }
3152 return;
3153 }
3154
3155 switch (Level) {
3156 case NoSSE:
3157 case SSE1:
3158 Features["sse"] = false;
3159 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003160 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3161 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 case SSE3:
3163 Features["sse3"] = false;
3164 setXOPLevel(Features, NoXOP, false);
3165 case SSSE3:
3166 Features["ssse3"] = false;
3167 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003168 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003169 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003170 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003171 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003172 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3173 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003174 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003175 case AVX2:
3176 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003177 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003178 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003179 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003180 Features["avx512vl"] = Features["avx512vbmi"] =
3181 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003182 }
3183}
3184
3185void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003186 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003187 if (Enabled) {
3188 switch (Level) {
3189 case AMD3DNowAthlon:
3190 Features["3dnowa"] = true;
3191 case AMD3DNow:
3192 Features["3dnow"] = true;
3193 case MMX:
3194 Features["mmx"] = true;
3195 case NoMMX3DNow:
3196 break;
3197 }
3198 return;
3199 }
3200
3201 switch (Level) {
3202 case NoMMX3DNow:
3203 case MMX:
3204 Features["mmx"] = false;
3205 case AMD3DNow:
3206 Features["3dnow"] = false;
3207 case AMD3DNowAthlon:
3208 Features["3dnowa"] = false;
3209 }
3210}
3211
3212void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003213 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003214 if (Enabled) {
3215 switch (Level) {
3216 case XOP:
3217 Features["xop"] = true;
3218 case FMA4:
3219 Features["fma4"] = true;
3220 setSSELevel(Features, AVX, true);
3221 case SSE4A:
3222 Features["sse4a"] = true;
3223 setSSELevel(Features, SSE3, true);
3224 case NoXOP:
3225 break;
3226 }
3227 return;
3228 }
3229
3230 switch (Level) {
3231 case NoXOP:
3232 case SSE4A:
3233 Features["sse4a"] = false;
3234 case FMA4:
3235 Features["fma4"] = false;
3236 case XOP:
3237 Features["xop"] = false;
3238 }
3239}
3240
Craig Topper86d79ef2013-09-17 04:51:29 +00003241void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3242 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003243 // This is a bit of a hack to deal with the sse4 target feature when used
3244 // as part of the target attribute. We handle sse4 correctly everywhere
3245 // else. See below for more information on how we handle the sse4 options.
3246 if (Name != "sse4")
3247 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003248
Craig Topper29561122013-09-19 01:13:07 +00003249 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003250 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003251 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003252 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003253 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003254 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003255 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003256 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003257 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003258 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003259 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003260 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003261 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003262 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003263 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003264 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003265 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003266 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003267 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003268 if (Enabled)
3269 setSSELevel(Features, SSE2, Enabled);
3270 } else if (Name == "pclmul") {
3271 if (Enabled)
3272 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003273 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003274 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003275 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003276 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003277 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003278 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003279 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3280 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3281 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003282 if (Enabled)
3283 setSSELevel(Features, AVX512F, Enabled);
3284 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003285 if (Enabled)
3286 setSSELevel(Features, AVX, Enabled);
3287 } else if (Name == "fma4") {
3288 setXOPLevel(Features, FMA4, Enabled);
3289 } else if (Name == "xop") {
3290 setXOPLevel(Features, XOP, Enabled);
3291 } else if (Name == "sse4a") {
3292 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003293 } else if (Name == "f16c") {
3294 if (Enabled)
3295 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003296 } else if (Name == "sha") {
3297 if (Enabled)
3298 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003299 } else if (Name == "sse4") {
3300 // We can get here via the __target__ attribute since that's not controlled
3301 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3302 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3303 // disabled.
3304 if (Enabled)
3305 setSSELevel(Features, SSE42, Enabled);
3306 else
3307 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003308 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003309 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003310 Features["xsaveopt"] = false;
3311 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003312 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003313 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003314 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003315}
3316
Eric Christopher3ff21b32013-10-16 21:26:26 +00003317/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003318/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003319bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003320 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003321 for (const auto &Feature : Features) {
3322 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003323 continue;
3324
Eric Christopher610fe112015-08-26 08:21:55 +00003325 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003326 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003327 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003328 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003329 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003330 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003331 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003332 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003333 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003334 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003335 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003336 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003337 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003338 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003339 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003340 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003341 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003342 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003343 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003344 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003345 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003346 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003347 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003348 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003349 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003350 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003351 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003352 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003353 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003354 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003355 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003356 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003357 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003358 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003359 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003360 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003361 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003362 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003363 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003364 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003365 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003366 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003367 } else if (Feature == "+avx512vbmi") {
3368 HasAVX512VBMI = true;
3369 } else if (Feature == "+avx512ifma") {
3370 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003371 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003372 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003373 } else if (Feature == "+mpx") {
3374 HasMPX = true;
3375 } else if (Feature == "+movbe") {
3376 HasMOVBE = true;
3377 } else if (Feature == "+sgx") {
3378 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003379 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003380 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003381 } else if (Feature == "+fxsr") {
3382 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003383 } else if (Feature == "+xsave") {
3384 HasXSAVE = true;
3385 } else if (Feature == "+xsaveopt") {
3386 HasXSAVEOPT = true;
3387 } else if (Feature == "+xsavec") {
3388 HasXSAVEC = true;
3389 } else if (Feature == "+xsaves") {
3390 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003391 } else if (Feature == "+mwaitx") {
3392 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003393 } else if (Feature == "+pku") {
3394 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003395 } else if (Feature == "+clflushopt") {
3396 HasCLFLUSHOPT = true;
3397 } else if (Feature == "+pcommit") {
3398 HasPCOMMIT = true;
3399 } else if (Feature == "+clwb") {
3400 HasCLWB = true;
3401 } else if (Feature == "+umip") {
3402 HasUMIP = true;
3403 } else if (Feature == "+prefetchwt1") {
3404 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003405 }
3406
Benjamin Kramer27402c62012-03-05 15:10:44 +00003407 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003408 .Case("+avx512f", AVX512F)
3409 .Case("+avx2", AVX2)
3410 .Case("+avx", AVX)
3411 .Case("+sse4.2", SSE42)
3412 .Case("+sse4.1", SSE41)
3413 .Case("+ssse3", SSSE3)
3414 .Case("+sse3", SSE3)
3415 .Case("+sse2", SSE2)
3416 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003417 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003418 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003419
Eli Friedman33465822011-07-08 23:31:17 +00003420 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003421 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003422 .Case("+3dnowa", AMD3DNowAthlon)
3423 .Case("+3dnow", AMD3DNow)
3424 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003425 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003426 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003427
3428 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003429 .Case("+xop", XOP)
3430 .Case("+fma4", FMA4)
3431 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003432 .Default(NoXOP);
3433 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003434 }
Eli Friedman33465822011-07-08 23:31:17 +00003435
Rafael Espindolaeb265472013-08-21 21:59:03 +00003436 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3437 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003438 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3439 (FPMath == FP_387 && SSELevel >= SSE1)) {
3440 Diags.Report(diag::err_target_unsupported_fpmath) <<
3441 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003442 return false;
3443 }
3444
Alexey Bataev00396512015-07-02 03:40:19 +00003445 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003446 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003447 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003448}
Chris Lattnerecd49032009-03-02 22:27:17 +00003449
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003450/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3451/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003452void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003453 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003454 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003455 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003456 Builder.defineMacro("__amd64__");
3457 Builder.defineMacro("__amd64");
3458 Builder.defineMacro("__x86_64");
3459 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003460 if (getTriple().getArchName() == "x86_64h") {
3461 Builder.defineMacro("__x86_64h");
3462 Builder.defineMacro("__x86_64h__");
3463 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003464 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003465 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003466 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003467
Chris Lattnerecd49032009-03-02 22:27:17 +00003468 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003469 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3470 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003471 switch (CPU) {
3472 case CK_Generic:
3473 break;
3474 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003475 // The rest are coming from the i386 define above.
3476 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003477 break;
3478 case CK_i486:
3479 case CK_WinChipC6:
3480 case CK_WinChip2:
3481 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003482 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003483 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003484 case CK_PentiumMMX:
3485 Builder.defineMacro("__pentium_mmx__");
3486 Builder.defineMacro("__tune_pentium_mmx__");
3487 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003488 case CK_i586:
3489 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003490 defineCPUMacros(Builder, "i586");
3491 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003492 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003493 case CK_Pentium3:
3494 case CK_Pentium3M:
3495 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003496 Builder.defineMacro("__tune_pentium3__");
3497 // Fallthrough
3498 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003499 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003500 Builder.defineMacro("__tune_pentium2__");
3501 // Fallthrough
3502 case CK_PentiumPro:
3503 Builder.defineMacro("__tune_i686__");
3504 Builder.defineMacro("__tune_pentiumpro__");
3505 // Fallthrough
3506 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003507 Builder.defineMacro("__i686");
3508 Builder.defineMacro("__i686__");
3509 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3510 Builder.defineMacro("__pentiumpro");
3511 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003512 break;
3513 case CK_Pentium4:
3514 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003515 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003516 break;
3517 case CK_Yonah:
3518 case CK_Prescott:
3519 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003520 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003521 break;
3522 case CK_Core2:
3523 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003524 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003525 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003526 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003527 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003528 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003529 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003530 defineCPUMacros(Builder, "slm");
3531 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003532 case CK_Nehalem:
3533 case CK_Westmere:
3534 case CK_SandyBridge:
3535 case CK_IvyBridge:
3536 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003537 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003538 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003539 // FIXME: Historically, we defined this legacy name, it would be nice to
3540 // remove it at some point. We've never exposed fine-grained names for
3541 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003542 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003543 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003544 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003545 defineCPUMacros(Builder, "skx");
3546 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003547 case CK_Cannonlake:
3548 break;
Craig Topper449314e2013-08-20 07:09:39 +00003549 case CK_KNL:
3550 defineCPUMacros(Builder, "knl");
3551 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003552 case CK_Lakemont:
3553 Builder.defineMacro("__tune_lakemont__");
3554 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003555 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003556 Builder.defineMacro("__k6_2__");
3557 Builder.defineMacro("__tune_k6_2__");
3558 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003559 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003560 if (CPU != CK_K6_2) { // In case of fallthrough
3561 // FIXME: GCC may be enabling these in cases where some other k6
3562 // architecture is specified but -m3dnow is explicitly provided. The
3563 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003564 Builder.defineMacro("__k6_3__");
3565 Builder.defineMacro("__tune_k6_3__");
3566 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003567 // Fallthrough
3568 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003569 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003570 break;
3571 case CK_Athlon:
3572 case CK_AthlonThunderbird:
3573 case CK_Athlon4:
3574 case CK_AthlonXP:
3575 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003576 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003577 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003578 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003579 Builder.defineMacro("__tune_athlon_sse__");
3580 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003581 break;
3582 case CK_K8:
3583 case CK_K8SSE3:
3584 case CK_x86_64:
3585 case CK_Opteron:
3586 case CK_OpteronSSE3:
3587 case CK_Athlon64:
3588 case CK_Athlon64SSE3:
3589 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003590 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003591 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003592 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003593 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003594 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003595 case CK_BTVER1:
3596 defineCPUMacros(Builder, "btver1");
3597 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003598 case CK_BTVER2:
3599 defineCPUMacros(Builder, "btver2");
3600 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003601 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003602 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003603 break;
3604 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003605 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003606 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003607 case CK_BDVER3:
3608 defineCPUMacros(Builder, "bdver3");
3609 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003610 case CK_BDVER4:
3611 defineCPUMacros(Builder, "bdver4");
3612 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003613 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003614 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003615 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003616 }
Chris Lattner96e43572009-03-02 22:40:39 +00003617
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003618 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003619 Builder.defineMacro("__REGISTER_PREFIX__", "");
3620
Chris Lattner6df41af2009-04-19 17:32:33 +00003621 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3622 // functions in glibc header files that use FP Stack inline asm which the
3623 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003624 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003625
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003626 if (HasAES)
3627 Builder.defineMacro("__AES__");
3628
Craig Topper3f122a72012-05-31 05:18:48 +00003629 if (HasPCLMUL)
3630 Builder.defineMacro("__PCLMUL__");
3631
Craig Topper22967d42011-12-25 05:06:45 +00003632 if (HasLZCNT)
3633 Builder.defineMacro("__LZCNT__");
3634
Benjamin Kramer1e250392012-07-07 09:39:18 +00003635 if (HasRDRND)
3636 Builder.defineMacro("__RDRND__");
3637
Craig Topper8c7f2512014-11-03 06:51:41 +00003638 if (HasFSGSBASE)
3639 Builder.defineMacro("__FSGSBASE__");
3640
Craig Topper22967d42011-12-25 05:06:45 +00003641 if (HasBMI)
3642 Builder.defineMacro("__BMI__");
3643
3644 if (HasBMI2)
3645 Builder.defineMacro("__BMI2__");
3646
Craig Topper1de83482011-12-29 16:10:46 +00003647 if (HasPOPCNT)
3648 Builder.defineMacro("__POPCNT__");
3649
Michael Liao625a8752012-11-10 05:17:46 +00003650 if (HasRTM)
3651 Builder.defineMacro("__RTM__");
3652
Michael Liao74f4eaf2013-03-26 17:52:08 +00003653 if (HasPRFCHW)
3654 Builder.defineMacro("__PRFCHW__");
3655
Michael Liaoffaae352013-03-29 05:17:55 +00003656 if (HasRDSEED)
3657 Builder.defineMacro("__RDSEED__");
3658
Robert Khasanov50e6f582014-09-19 09:53:48 +00003659 if (HasADX)
3660 Builder.defineMacro("__ADX__");
3661
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003662 if (HasTBM)
3663 Builder.defineMacro("__TBM__");
3664
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003665 if (HasMWAITX)
3666 Builder.defineMacro("__MWAITX__");
3667
Rafael Espindolae62e2792013-08-20 13:44:29 +00003668 switch (XOPLevel) {
3669 case XOP:
3670 Builder.defineMacro("__XOP__");
3671 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003672 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003673 case SSE4A:
3674 Builder.defineMacro("__SSE4A__");
3675 case NoXOP:
3676 break;
3677 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003678
Craig Topperbba778b2012-06-03 21:46:30 +00003679 if (HasFMA)
3680 Builder.defineMacro("__FMA__");
3681
Manman Rena45358c2012-10-11 00:59:55 +00003682 if (HasF16C)
3683 Builder.defineMacro("__F16C__");
3684
Craig Topper679b53a2013-08-21 05:29:10 +00003685 if (HasAVX512CD)
3686 Builder.defineMacro("__AVX512CD__");
3687 if (HasAVX512ER)
3688 Builder.defineMacro("__AVX512ER__");
3689 if (HasAVX512PF)
3690 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003691 if (HasAVX512DQ)
3692 Builder.defineMacro("__AVX512DQ__");
3693 if (HasAVX512BW)
3694 Builder.defineMacro("__AVX512BW__");
3695 if (HasAVX512VL)
3696 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003697 if (HasAVX512VBMI)
3698 Builder.defineMacro("__AVX512VBMI__");
3699 if (HasAVX512IFMA)
3700 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003701
Ben Langmuir58078d02013-09-19 13:22:04 +00003702 if (HasSHA)
3703 Builder.defineMacro("__SHA__");
3704
Craig Toppere33f51f2015-10-16 06:22:36 +00003705 if (HasFXSR)
3706 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003707 if (HasXSAVE)
3708 Builder.defineMacro("__XSAVE__");
3709 if (HasXSAVEOPT)
3710 Builder.defineMacro("__XSAVEOPT__");
3711 if (HasXSAVEC)
3712 Builder.defineMacro("__XSAVEC__");
3713 if (HasXSAVES)
3714 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003715 if (HasPKU)
3716 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003717 if (HasCX16)
3718 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3719
Chris Lattner96e43572009-03-02 22:40:39 +00003720 // Each case falls through to the previous one here.
3721 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003722 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003723 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003724 case AVX2:
3725 Builder.defineMacro("__AVX2__");
3726 case AVX:
3727 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003728 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003729 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003730 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003731 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003732 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003733 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003734 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003735 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003736 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003737 Builder.defineMacro("__SSE2__");
3738 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003739 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003740 Builder.defineMacro("__SSE__");
3741 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003742 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003743 break;
3744 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003745
Derek Schuffc7dd7222012-10-11 15:52:22 +00003746 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003747 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003748 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003749 case AVX2:
3750 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003751 case SSE42:
3752 case SSE41:
3753 case SSSE3:
3754 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003755 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003756 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003757 break;
3758 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003759 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003760 break;
3761 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003762 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003763 }
3764 }
3765
Anders Carlssone437c682010-01-27 03:47:49 +00003766 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003767 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003768 case AMD3DNowAthlon:
3769 Builder.defineMacro("__3dNOW_A__");
3770 case AMD3DNow:
3771 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003772 case MMX:
3773 Builder.defineMacro("__MMX__");
3774 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003775 break;
3776 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003777
3778 if (CPU >= CK_i486) {
3779 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3780 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3781 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3782 }
3783 if (CPU >= CK_i586)
3784 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003785}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003786
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003787bool X86TargetInfo::hasFeature(StringRef Feature) const {
3788 return llvm::StringSwitch<bool>(Feature)
3789 .Case("aes", HasAES)
3790 .Case("avx", SSELevel >= AVX)
3791 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003792 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003793 .Case("avx512cd", HasAVX512CD)
3794 .Case("avx512er", HasAVX512ER)
3795 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003796 .Case("avx512dq", HasAVX512DQ)
3797 .Case("avx512bw", HasAVX512BW)
3798 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003799 .Case("avx512vbmi", HasAVX512VBMI)
3800 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003801 .Case("bmi", HasBMI)
3802 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003803 .Case("clflushopt", HasCLFLUSHOPT)
3804 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003805 .Case("cx16", HasCX16)
3806 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003807 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003808 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003809 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003810 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003811 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003812 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3813 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3814 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003815 .Case("movbe", HasMOVBE)
3816 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003817 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003818 .Case("pcommit", HasPCOMMIT)
3819 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003820 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003821 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003822 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003823 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003824 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003825 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003826 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003827 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003828 .Case("sse", SSELevel >= SSE1)
3829 .Case("sse2", SSELevel >= SSE2)
3830 .Case("sse3", SSELevel >= SSE3)
3831 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003832 .Case("sse4.1", SSELevel >= SSE41)
3833 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003834 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003835 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003836 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003837 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003838 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3839 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003840 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003841 .Case("xsave", HasXSAVE)
3842 .Case("xsavec", HasXSAVEC)
3843 .Case("xsaves", HasXSAVES)
3844 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003845 .Default(false);
3846}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003847
Eric Christopherd9832702015-06-29 21:00:05 +00003848// We can't use a generic validation scheme for the features accepted here
3849// versus subtarget features accepted in the target attribute because the
3850// bitfield structure that's initialized in the runtime only supports the
3851// below currently rather than the full range of subtarget features. (See
3852// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3853bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3854 return llvm::StringSwitch<bool>(FeatureStr)
3855 .Case("cmov", true)
3856 .Case("mmx", true)
3857 .Case("popcnt", true)
3858 .Case("sse", true)
3859 .Case("sse2", true)
3860 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003861 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003862 .Case("sse4.1", true)
3863 .Case("sse4.2", true)
3864 .Case("avx", true)
3865 .Case("avx2", true)
3866 .Case("sse4a", true)
3867 .Case("fma4", true)
3868 .Case("xop", true)
3869 .Case("fma", true)
3870 .Case("avx512f", true)
3871 .Case("bmi", true)
3872 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003873 .Case("aes", true)
3874 .Case("pclmul", true)
3875 .Case("avx512vl", true)
3876 .Case("avx512bw", true)
3877 .Case("avx512dq", true)
3878 .Case("avx512cd", true)
3879 .Case("avx512er", true)
3880 .Case("avx512pf", true)
3881 .Case("avx512vbmi", true)
3882 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003883 .Default(false);
3884}
3885
Eli Friedman3fd920a2008-08-20 02:34:37 +00003886bool
Anders Carlsson58436352009-02-28 17:11:49 +00003887X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003888 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003889 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003890 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003891 // Constant constraints.
3892 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3893 // instructions.
3894 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3895 // x86_64 instructions.
3896 case 's':
3897 Info.setRequiresImmediate();
3898 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003899 case 'I':
3900 Info.setRequiresImmediate(0, 31);
3901 return true;
3902 case 'J':
3903 Info.setRequiresImmediate(0, 63);
3904 return true;
3905 case 'K':
3906 Info.setRequiresImmediate(-128, 127);
3907 return true;
3908 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003909 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003910 return true;
3911 case 'M':
3912 Info.setRequiresImmediate(0, 3);
3913 return true;
3914 case 'N':
3915 Info.setRequiresImmediate(0, 255);
3916 return true;
3917 case 'O':
3918 Info.setRequiresImmediate(0, 127);
3919 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003920 // Register constraints.
3921 case 'Y': // 'Y' is the first character for several 2-character constraints.
3922 // Shift the pointer to the second character of the constraint.
3923 Name++;
3924 switch (*Name) {
3925 default:
3926 return false;
3927 case '0': // First SSE register.
3928 case 't': // Any SSE register, when SSE2 is enabled.
3929 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3930 case 'm': // Any MMX register, when inter-unit moves enabled.
3931 Info.setAllowsRegister();
3932 return true;
3933 }
3934 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003935 // Constraint 'f' cannot be used for output operands.
3936 if (Info.ConstraintStr[0] == '=')
3937 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003938 Info.setAllowsRegister();
3939 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003940 case 'a': // eax.
3941 case 'b': // ebx.
3942 case 'c': // ecx.
3943 case 'd': // edx.
3944 case 'S': // esi.
3945 case 'D': // edi.
3946 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003947 case 't': // Top of floating point stack.
3948 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003949 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003950 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003951 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003952 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003953 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3954 case 'l': // "Index" registers: any general register that can be used as an
3955 // index in a base+index memory access.
3956 Info.setAllowsRegister();
3957 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003958 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003959 case 'C': // SSE floating point constant.
3960 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003961 return true;
3962 }
3963}
3964
Akira Hatanaka974131e2014-09-18 18:17:18 +00003965bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3966 unsigned Size) const {
3967 // Strip off constraint modifiers.
3968 while (Constraint[0] == '=' ||
3969 Constraint[0] == '+' ||
3970 Constraint[0] == '&')
3971 Constraint = Constraint.substr(1);
3972
3973 return validateOperandSize(Constraint, Size);
3974}
3975
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003976bool X86TargetInfo::validateInputSize(StringRef Constraint,
3977 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003978 return validateOperandSize(Constraint, Size);
3979}
3980
3981bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3982 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003983 switch (Constraint[0]) {
3984 default: break;
3985 case 'y':
3986 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003987 case 'f':
3988 case 't':
3989 case 'u':
3990 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00003991 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00003992 if (SSELevel >= AVX512F)
3993 // 512-bit zmm registers can be used if target supports AVX512F.
3994 return Size <= 512U;
3995 else if (SSELevel >= AVX)
3996 // 256-bit ymm registers can be used if target supports AVX.
3997 return Size <= 256U;
3998 return Size <= 128U;
3999 case 'Y':
4000 // 'Y' is the first character for several 2-character constraints.
4001 switch (Constraint[1]) {
4002 default: break;
4003 case 'm':
4004 // 'Ym' is synonymous with 'y'.
4005 return Size <= 64;
4006 case 'i':
4007 case 't':
4008 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4009 if (SSELevel >= AVX512F)
4010 return Size <= 512U;
4011 else if (SSELevel >= AVX)
4012 return Size <= 256U;
4013 return SSELevel >= SSE2 && Size <= 128U;
4014 }
4015
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004016 }
4017
4018 return true;
4019}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004020
Eli Friedman3fd920a2008-08-20 02:34:37 +00004021std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004022X86TargetInfo::convertConstraint(const char *&Constraint) const {
4023 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004024 case 'a': return std::string("{ax}");
4025 case 'b': return std::string("{bx}");
4026 case 'c': return std::string("{cx}");
4027 case 'd': return std::string("{dx}");
4028 case 'S': return std::string("{si}");
4029 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004030 case 'p': // address
4031 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004032 case 't': // top of floating point stack.
4033 return std::string("{st}");
4034 case 'u': // second from top of floating point stack.
4035 return std::string("{st(1)}"); // second from top of floating point stack.
4036 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004037 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004038 }
4039}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004040
Eli Friedman3fd920a2008-08-20 02:34:37 +00004041// X86-32 generic target
4042class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004043public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004044 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4045 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004046 DoubleAlign = LongLongAlign = 32;
4047 LongDoubleWidth = 96;
4048 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004049 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004050 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004051 SizeType = UnsignedInt;
4052 PtrDiffType = SignedInt;
4053 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004054 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004055
4056 // Use fpret for all types.
4057 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4058 (1 << TargetInfo::Double) |
4059 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004060
4061 // x86-32 has atomics up to 8 bytes
4062 // FIXME: Check that we actually have cmpxchg8b before setting
4063 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4064 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004065 }
Craig Topper3164f332014-03-11 03:39:26 +00004066 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004067 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004068 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004069
Craig Topper3164f332014-03-11 03:39:26 +00004070 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004071 if (RegNo == 0) return 0;
4072 if (RegNo == 1) return 2;
4073 return -1;
4074 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004075 bool validateOperandSize(StringRef Constraint,
4076 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004077 switch (Constraint[0]) {
4078 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004079 case 'R':
4080 case 'q':
4081 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004082 case 'a':
4083 case 'b':
4084 case 'c':
4085 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004086 case 'S':
4087 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004088 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004089 case 'A':
4090 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004091 }
4092
Akira Hatanaka974131e2014-09-18 18:17:18 +00004093 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004094 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004095};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004096
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004097class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4098public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004099 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4100 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004101
Craig Topper3164f332014-03-11 03:39:26 +00004102 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004103 unsigned Major, Minor, Micro;
4104 getTriple().getOSVersion(Major, Minor, Micro);
4105 // New NetBSD uses the default rounding mode.
4106 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4107 return X86_32TargetInfo::getFloatEvalMethod();
4108 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004109 return 1;
4110 }
4111};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004112
Eli Friedmane3aa4542009-07-05 18:47:56 +00004113class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4114public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004115 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4116 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004117 SizeType = UnsignedLong;
4118 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004119 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004120 }
4121};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004122
Eli Friedman9fa28852012-08-08 23:57:20 +00004123class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4124public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004125 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4126 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004127 SizeType = UnsignedLong;
4128 IntPtrType = SignedLong;
4129 PtrDiffType = SignedLong;
4130 }
4131};
Eli Friedman9fa28852012-08-08 23:57:20 +00004132
Torok Edwinb2b37c62009-06-30 17:10:35 +00004133class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004134public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004135 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4136 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004137 LongDoubleWidth = 128;
4138 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004139 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004140 MaxVectorAlign = 256;
4141 // The watchOS simulator uses the builtin bool type for Objective-C.
4142 llvm::Triple T = llvm::Triple(Triple);
4143 if (T.isWatchOS())
4144 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004145 SizeType = UnsignedLong;
4146 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004147 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004148 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004149 }
4150
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004151 bool handleTargetFeatures(std::vector<std::string> &Features,
4152 DiagnosticsEngine &Diags) override {
4153 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4154 Diags))
4155 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004156 // We now know the features we have: we can decide how to align vectors.
4157 MaxVectorAlign =
4158 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004159 return true;
4160 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004161};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004162
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004163// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004164class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004165public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004166 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4167 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004168 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004169 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004170 bool IsWinCOFF =
4171 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004172 resetDataLayout(IsWinCOFF
4173 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4174 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004175 }
Craig Topper3164f332014-03-11 03:39:26 +00004176 void getTargetDefines(const LangOptions &Opts,
4177 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004178 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4179 }
4180};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004181
4182// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004183class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004184public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004185 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4186 const TargetOptions &Opts)
4187 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004188 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004189 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4190 }
Craig Topper3164f332014-03-11 03:39:26 +00004191 void getTargetDefines(const LangOptions &Opts,
4192 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004193 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4194 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4195 // The value of the following reflects processor type.
4196 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4197 // We lost the original triple, so we use the default.
4198 Builder.defineMacro("_M_IX86", "600");
4199 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004200};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004201
David Majnemerae1ed0e2015-05-28 04:36:18 +00004202static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004203 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4204 // supports __declspec natively under -fms-extensions, but we define a no-op
4205 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004206 if (Opts.MicrosoftExt)
4207 Builder.defineMacro("__declspec", "__declspec");
4208 else
4209 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4210
4211 if (!Opts.MicrosoftExt) {
4212 // Provide macros for all the calling convention keywords. Provide both
4213 // single and double underscore prefixed variants. These are available on
4214 // x64 as well as x86, even though they have no effect.
4215 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4216 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004217 std::string GCCSpelling = "__attribute__((__";
4218 GCCSpelling += CC;
4219 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004220 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4221 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4222 }
4223 }
4224}
4225
David Majnemerae1ed0e2015-05-28 04:36:18 +00004226static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4227 Builder.defineMacro("__MSVCRT__");
4228 Builder.defineMacro("__MINGW32__");
4229 addCygMingDefines(Opts, Builder);
4230}
4231
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004232// x86-32 MinGW target
4233class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4234public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004235 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4236 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004237 void getTargetDefines(const LangOptions &Opts,
4238 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004239 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004240 DefineStd(Builder, "WIN32", Opts);
4241 DefineStd(Builder, "WINNT", Opts);
4242 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004243 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004244 }
4245};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004246
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004247// x86-32 Cygwin target
4248class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4249public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004250 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4251 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004252 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004253 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004254 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 +00004255 }
Craig Topper3164f332014-03-11 03:39:26 +00004256 void getTargetDefines(const LangOptions &Opts,
4257 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004258 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004259 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004260 Builder.defineMacro("__CYGWIN__");
4261 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004262 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004263 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004264 if (Opts.CPlusPlus)
4265 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004266 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004267};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004268
Chris Lattnerb986aba2010-04-11 19:29:39 +00004269// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004270class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004272 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004273 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004274 }
Craig Topper3164f332014-03-11 03:39:26 +00004275 void getTargetDefines(const LangOptions &Opts,
4276 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004277 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004278 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004279 }
4280};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004281
Alexey Bataevc99b0492015-11-25 09:24:26 +00004282// X86-32 MCU target
4283class MCUX86_32TargetInfo : public X86_32TargetInfo {
4284public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004285 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4286 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004287 LongDoubleWidth = 64;
4288 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004289 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 +00004290 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004291 }
4292
4293 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4294 // On MCU we support only C calling convention.
4295 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4296 }
4297
4298 void getTargetDefines(const LangOptions &Opts,
4299 MacroBuilder &Builder) const override {
4300 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4301 Builder.defineMacro("__iamcu");
4302 Builder.defineMacro("__iamcu__");
4303 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004304
4305 bool allowsLargerPreferedTypeAlignment() const override {
4306 return false;
4307 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004308};
4309
Douglas Gregor9fabd852011-07-01 22:41:14 +00004310// RTEMS Target
4311template<typename Target>
4312class RTEMSTargetInfo : public OSTargetInfo<Target> {
4313protected:
Craig Topper3164f332014-03-11 03:39:26 +00004314 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4315 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004316 // RTEMS defines; list based off of gcc output
4317
Douglas Gregor9fabd852011-07-01 22:41:14 +00004318 Builder.defineMacro("__rtems__");
4319 Builder.defineMacro("__ELF__");
4320 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004321
Douglas Gregor9fabd852011-07-01 22:41:14 +00004322public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004323 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4324 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004325 switch (Triple.getArch()) {
4326 default:
4327 case llvm::Triple::x86:
4328 // this->MCountName = ".mcount";
4329 break;
4330 case llvm::Triple::mips:
4331 case llvm::Triple::mipsel:
4332 case llvm::Triple::ppc:
4333 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004334 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004335 // this->MCountName = "_mcount";
4336 break;
4337 case llvm::Triple::arm:
4338 // this->MCountName = "__mcount";
4339 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004340 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004341 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004342};
4343
Douglas Gregor9fabd852011-07-01 22:41:14 +00004344// x86-32 RTEMS target
4345class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4346public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004347 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4348 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004349 SizeType = UnsignedLong;
4350 IntPtrType = SignedLong;
4351 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004352 }
Craig Topper3164f332014-03-11 03:39:26 +00004353 void getTargetDefines(const LangOptions &Opts,
4354 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004355 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4356 Builder.defineMacro("__INTEL__");
4357 Builder.defineMacro("__rtems__");
4358 }
4359};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004360
Eli Friedman3fd920a2008-08-20 02:34:37 +00004361// x86-64 generic target
4362class X86_64TargetInfo : public X86TargetInfo {
4363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004364 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4365 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004366 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004367 bool IsWinCOFF =
4368 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004369 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004370 LongDoubleWidth = 128;
4371 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004372 LargeArrayMinWidth = 128;
4373 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004374 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004375 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4376 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4377 IntPtrType = IsX32 ? SignedInt : SignedLong;
4378 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004379 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004380 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004381
Eric Christopher917e9522014-11-18 22:36:15 +00004382 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004383 resetDataLayout(IsX32
4384 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4385 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4386 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004387
4388 // Use fpret only for long double.
4389 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004390
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004391 // Use fp2ret for _Complex long double.
4392 ComplexLongDoubleUsesFP2Ret = true;
4393
Charles Davisc7d5c942015-09-17 20:55:33 +00004394 // Make __builtin_ms_va_list available.
4395 HasBuiltinMSVaList = true;
4396
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004397 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004398 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004399 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004400 }
Craig Topper3164f332014-03-11 03:39:26 +00004401 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004402 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004403 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004404
Craig Topper3164f332014-03-11 03:39:26 +00004405 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004406 if (RegNo == 0) return 0;
4407 if (RegNo == 1) return 1;
4408 return -1;
4409 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004410
Craig Topper3164f332014-03-11 03:39:26 +00004411 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004412 switch (CC) {
4413 case CC_C:
4414 case CC_Swift:
4415 case CC_X86VectorCall:
4416 case CC_IntelOclBicc:
4417 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004418 case CC_PreserveMost:
4419 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004420 return CCCR_OK;
4421 default:
4422 return CCCR_Warning;
4423 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004424 }
4425
Craig Topper3164f332014-03-11 03:39:26 +00004426 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004427 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004428 }
4429
Pavel Chupinfd223e12014-08-04 12:39:43 +00004430 // for x32 we need it here explicitly
4431 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004432 unsigned getUnwindWordWidth() const override { return 64; }
4433 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004434
4435 bool validateGlobalRegisterVariable(StringRef RegName,
4436 unsigned RegSize,
4437 bool &HasSizeMismatch) const override {
4438 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4439 // handle.
4440 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4441 // Check that the register size is 64-bit.
4442 HasSizeMismatch = RegSize != 64;
4443 return true;
4444 }
4445
4446 // Check if the register is a 32-bit register the backend can handle.
4447 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4448 HasSizeMismatch);
4449 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004450};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004451
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004452// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004453class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004454public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004455 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4456 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004457 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004458 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004459 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004460 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004461 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004462 SizeType = UnsignedLongLong;
4463 PtrDiffType = SignedLongLong;
4464 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004465 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004466
Craig Topper3164f332014-03-11 03:39:26 +00004467 void getTargetDefines(const LangOptions &Opts,
4468 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004469 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004470 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004471 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004472
Craig Topper3164f332014-03-11 03:39:26 +00004473 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004474 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004475 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004476
Craig Topper3164f332014-03-11 03:39:26 +00004477 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004478 switch (CC) {
4479 case CC_X86StdCall:
4480 case CC_X86ThisCall:
4481 case CC_X86FastCall:
4482 return CCCR_Ignore;
4483 case CC_C:
4484 case CC_X86VectorCall:
4485 case CC_IntelOclBicc:
4486 case CC_X86_64SysV:
4487 return CCCR_OK;
4488 default:
4489 return CCCR_Warning;
4490 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004491 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004492};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004493
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004494// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004495class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004496public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004497 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4498 const TargetOptions &Opts)
4499 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004500 LongDoubleWidth = LongDoubleAlign = 64;
4501 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004502 }
Craig Topper3164f332014-03-11 03:39:26 +00004503 void getTargetDefines(const LangOptions &Opts,
4504 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004505 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4506 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004507 Builder.defineMacro("_M_X64", "100");
4508 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004509 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004510};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004511
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004512// x86-64 MinGW target
4513class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4514public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004515 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4516 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004517 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4518 // with x86 FP ops. Weird.
4519 LongDoubleWidth = LongDoubleAlign = 128;
4520 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4521 }
4522
Craig Topper3164f332014-03-11 03:39:26 +00004523 void getTargetDefines(const LangOptions &Opts,
4524 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004525 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004526 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004527 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004528 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004529
4530 // GCC defines this macro when it is using __gxx_personality_seh0.
4531 if (!Opts.SjLjExceptions)
4532 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004533 }
4534};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004535
Yaron Kerend030d112015-07-22 17:38:19 +00004536// x86-64 Cygwin target
4537class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4538public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004539 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4540 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004541 TLSSupported = false;
4542 WCharType = UnsignedShort;
4543 }
4544 void getTargetDefines(const LangOptions &Opts,
4545 MacroBuilder &Builder) const override {
4546 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4547 Builder.defineMacro("__x86_64__");
4548 Builder.defineMacro("__CYGWIN__");
4549 Builder.defineMacro("__CYGWIN64__");
4550 addCygMingDefines(Opts, Builder);
4551 DefineStd(Builder, "unix", Opts);
4552 if (Opts.CPlusPlus)
4553 Builder.defineMacro("_GNU_SOURCE");
4554
4555 // GCC defines this macro when it is using __gxx_personality_seh0.
4556 if (!Opts.SjLjExceptions)
4557 Builder.defineMacro("__SEH__");
4558 }
4559};
4560
Eli Friedman2857ccb2009-07-01 03:36:11 +00004561class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4562public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004563 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4564 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004565 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004566 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4567 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004568 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004569 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004570 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004571 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004572
4573 bool handleTargetFeatures(std::vector<std::string> &Features,
4574 DiagnosticsEngine &Diags) override {
4575 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4576 Diags))
4577 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004578 // We now know the features we have: we can decide how to align vectors.
4579 MaxVectorAlign =
4580 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004581 return true;
4582 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004583};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004584
Eli Friedman245f2292009-07-05 22:31:18 +00004585class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4586public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004587 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4588 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004589 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004590 Int64Type = SignedLongLong;
4591 }
4592};
Eli Friedman245f2292009-07-05 22:31:18 +00004593
Eli Friedman9fa28852012-08-08 23:57:20 +00004594class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004596 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4597 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004598 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004599 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004600 }
4601};
Tim Northover9bb857a2013-01-31 12:13:10 +00004602
Eli Friedmanf05b7722008-08-20 07:44:10 +00004603class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004604 // Possible FPU choices.
4605 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004606 VFP2FPU = (1 << 0),
4607 VFP3FPU = (1 << 1),
4608 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004609 NeonFPU = (1 << 3),
4610 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004611 };
4612
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004613 // Possible HWDiv features.
4614 enum HWDivMode {
4615 HWDivThumb = (1 << 0),
4616 HWDivARM = (1 << 1)
4617 };
4618
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004619 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004620 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004621 }
4622
4623 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4624 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004625
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004626 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004627
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004628 StringRef CPUProfile;
4629 StringRef CPUAttr;
4630
Rafael Espindolaeb265472013-08-21 21:59:03 +00004631 enum {
4632 FP_Default,
4633 FP_VFP,
4634 FP_Neon
4635 } FPMath;
4636
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004637 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004638 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004639 unsigned ArchProfile;
4640 unsigned ArchVersion;
4641
Bernard Ogdenda13af32013-10-24 18:32:51 +00004642 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004643
Logan Chien57086ce2012-10-10 06:56:20 +00004644 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004645 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004646
4647 // Initialized via features.
4648 unsigned SoftFloat : 1;
4649 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004650
Bernard Ogden18b57012013-10-29 09:47:51 +00004651 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004652 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004653 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004654 unsigned Unaligned : 1;
4655
4656 enum {
4657 LDREX_B = (1 << 0), /// byte (8-bit)
4658 LDREX_H = (1 << 1), /// half (16-bit)
4659 LDREX_W = (1 << 2), /// word (32-bit)
4660 LDREX_D = (1 << 3), /// double (64-bit)
4661 };
4662
4663 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004664
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004665 // ACLE 6.5.1 Hardware floating point
4666 enum {
4667 HW_FP_HP = (1 << 1), /// half (16-bit)
4668 HW_FP_SP = (1 << 2), /// single (32-bit)
4669 HW_FP_DP = (1 << 3), /// double (64-bit)
4670 };
4671 uint32_t HW_FP;
4672
Chris Lattner5cc15e02010-03-03 19:03:45 +00004673 static const Builtin::Info BuiltinInfo[];
4674
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004675 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004676 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004677
4678 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004679 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004680
Renato Golin9ba39232015-02-27 16:35:48 +00004681 // size_t is unsigned long on MachO-derived environments, NetBSD and Bitrig.
4682 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
4683 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004684 SizeType = UnsignedLong;
4685 else
4686 SizeType = UnsignedInt;
4687
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004688 switch (T.getOS()) {
4689 case llvm::Triple::NetBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004690 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004691 break;
4692 case llvm::Triple::Win32:
4693 WCharType = UnsignedShort;
4694 break;
4695 case llvm::Triple::Linux:
4696 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004697 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4698 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004699 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004700 }
4701
4702 UseBitFieldTypeAlignment = true;
4703
4704 ZeroLengthBitfieldBoundary = 0;
4705
Tim Northover147cd2f2014-10-14 22:12:21 +00004706 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4707 // so set preferred for small types to 32.
4708 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004709 resetDataLayout(BigEndian
4710 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4711 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004712 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004713 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004714 resetDataLayout("e"
4715 "-m:w"
4716 "-p:32:32"
4717 "-i64:64"
4718 "-v128:64:128"
4719 "-a:0:32"
4720 "-n32"
4721 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004722 } else if (T.isOSNaCl()) {
4723 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004724 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004725 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004726 resetDataLayout(BigEndian
4727 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4728 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004729 }
4730
4731 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004732 }
4733
Tim Northover5627d392015-10-30 16:30:45 +00004734 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004735 const llvm::Triple &T = getTriple();
4736
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004737 IsAAPCS = false;
4738
Tim Northover5627d392015-10-30 16:30:45 +00004739 if (IsAAPCS16)
4740 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4741 else
4742 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004743
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004744 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004745 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004746 SizeType = UnsignedInt;
4747 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004748 SizeType = UnsignedLong;
4749
4750 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4751 WCharType = SignedInt;
4752
4753 // Do not respect the alignment of bit-field types when laying out
4754 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4755 UseBitFieldTypeAlignment = false;
4756
4757 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4758 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4759 /// gcc.
4760 ZeroLengthBitfieldBoundary = 32;
4761
Tim Northover5627d392015-10-30 16:30:45 +00004762 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4763 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004764 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004765 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004766 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004767 BigEndian
4768 ? "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 +00004769 : "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 +00004770 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004771 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004772 BigEndian
4773 ? "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 +00004774 : "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 +00004775
4776 // FIXME: Override "preferred align" for double and long long.
4777 }
4778
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004779 void setArchInfo() {
4780 StringRef ArchName = getTriple().getArchName();
4781
Renato Goline84b0002015-10-08 16:43:26 +00004782 ArchISA = llvm::ARM::parseArchISA(ArchName);
4783 CPU = llvm::ARM::getDefaultCPU(ArchName);
4784 unsigned AK = llvm::ARM::parseArch(ArchName);
4785 if (AK != llvm::ARM::AK_INVALID)
4786 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004787 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004788 }
4789
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004790 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004791 StringRef SubArch;
4792
4793 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004794 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004795 SubArch = llvm::ARM::getSubArch(ArchKind);
4796 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4797 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004798
4799 // cache CPU related strings
4800 CPUAttr = getCPUAttr();
4801 CPUProfile = getCPUProfile();
4802 }
4803
4804 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004805 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004806 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004807 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004808 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4809 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004810 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004811 if (ArchProfile == llvm::ARM::PK_M) {
4812 MaxAtomicPromoteWidth = 32;
4813 if (ShouldUseInlineAtomic)
4814 MaxAtomicInlineWidth = 32;
4815 }
4816 else {
4817 MaxAtomicPromoteWidth = 64;
4818 if (ShouldUseInlineAtomic)
4819 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004820 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004821 }
4822
4823 bool isThumb() const {
4824 return (ArchISA == llvm::ARM::IK_THUMB);
4825 }
4826
4827 bool supportsThumb() const {
4828 return CPUAttr.count('T') || ArchVersion >= 6;
4829 }
4830
4831 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004832 return CPUAttr.equals("6T2") ||
4833 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004834 }
4835
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004836 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004837 // For most sub-arches, the build attribute CPU name is enough.
4838 // For Cortex variants, it's slightly different.
4839 switch(ArchKind) {
4840 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004841 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004842 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004843 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004844 case llvm::ARM::AK_ARMV7S:
4845 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004846 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004847 return "7A";
4848 case llvm::ARM::AK_ARMV7R:
4849 return "7R";
4850 case llvm::ARM::AK_ARMV7M:
4851 return "7M";
4852 case llvm::ARM::AK_ARMV7EM:
4853 return "7EM";
4854 case llvm::ARM::AK_ARMV8A:
4855 return "8A";
4856 case llvm::ARM::AK_ARMV8_1A:
4857 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004858 case llvm::ARM::AK_ARMV8_2A:
4859 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004860 case llvm::ARM::AK_ARMV8MBaseline:
4861 return "8M_BASE";
4862 case llvm::ARM::AK_ARMV8MMainline:
4863 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004864 }
4865 }
4866
4867 StringRef getCPUProfile() const {
4868 switch(ArchProfile) {
4869 case llvm::ARM::PK_A:
4870 return "A";
4871 case llvm::ARM::PK_R:
4872 return "R";
4873 case llvm::ARM::PK_M:
4874 return "M";
4875 default:
4876 return "";
4877 }
4878 }
4879
Chris Lattner17df24e2008-04-21 18:56:49 +00004880public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004881 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
4882 bool IsBigEndian)
4883 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4884 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004885 BigEndian = IsBigEndian;
4886
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004887 switch (getTriple().getOS()) {
4888 case llvm::Triple::NetBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004889 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004890 break;
4891 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004892 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004893 break;
4894 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004895
Renato Goline84b0002015-10-08 16:43:26 +00004896 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004897 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004898
Chris Lattner1a8f3942010-04-23 16:29:58 +00004899 // {} in inline assembly are neon specifiers, not assembly variant
4900 // specifiers.
4901 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004902
Eric Christopher0e261882014-12-05 01:06:59 +00004903 // FIXME: This duplicates code from the driver that sets the -target-abi
4904 // option - this code is used if -target-abi isn't passed and should
4905 // be unified in some way.
4906 if (Triple.isOSBinFormatMachO()) {
4907 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4908 // the frontend matches that.
4909 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4910 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004911 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004912 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004913 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004914 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004915 } else {
4916 setABI("apcs-gnu");
4917 }
4918 } else if (Triple.isOSWindows()) {
4919 // FIXME: this is invalid for WindowsCE
4920 setABI("aapcs");
4921 } else {
4922 // Select the default based on the platform.
4923 switch (Triple.getEnvironment()) {
4924 case llvm::Triple::Android:
4925 case llvm::Triple::GNUEABI:
4926 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004927 case llvm::Triple::MuslEABI:
4928 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004929 setABI("aapcs-linux");
4930 break;
4931 case llvm::Triple::EABIHF:
4932 case llvm::Triple::EABI:
4933 setABI("aapcs");
4934 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004935 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004936 setABI("apcs-gnu");
4937 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004938 default:
4939 if (Triple.getOS() == llvm::Triple::NetBSD)
4940 setABI("apcs-gnu");
4941 else
4942 setABI("aapcs");
4943 break;
4944 }
4945 }
John McCall86353412010-08-21 22:46:04 +00004946
4947 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004948 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004949
Renato Golin15b86152015-07-03 16:41:13 +00004950 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004951 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004952
James Molloya7139222012-03-12 09:14:10 +00004953 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004954 // the alignment of the zero-length bitfield is greater than the member
4955 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004956 // zero length bitfield.
4957 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004958
4959 if (Triple.getOS() == llvm::Triple::Linux ||
4960 Triple.getOS() == llvm::Triple::UnknownOS)
4961 this->MCountName =
4962 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004963 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004964
Alp Toker4925ba72014-06-07 23:30:42 +00004965 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004966
Craig Topper3164f332014-03-11 03:39:26 +00004967 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004968 ABI = Name;
4969
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004970 // The defaults (above) are for AAPCS, check if we need to change them.
4971 //
4972 // FIXME: We need support for -meabi... we could just mangle it into the
4973 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004974 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004975 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004976 return true;
4977 }
4978 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
4979 setABIAAPCS();
4980 return true;
4981 }
4982 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004983 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00004984
Renato Golinf5c4dec2015-05-27 13:33:00 +00004985 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00004986 bool
4987 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
4988 StringRef CPU,
4989 const std::vector<std::string> &FeaturesVec) const override {
4990
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004991 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00004992 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004993
4994 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00004995 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00004996 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
4997
4998 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00004999 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005000 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5001
5002 for (const char *Feature : TargetFeatures)
5003 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005004 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005005
Eric Christopher007b0a02015-08-28 22:32:01 +00005006 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005007 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005008
Craig Topper3164f332014-03-11 03:39:26 +00005009 bool handleTargetFeatures(std::vector<std::string> &Features,
5010 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005011 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005012 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005013 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005014 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005015 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005016 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005017 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005018
Ranjeet Singhac08e532015-06-24 23:39:25 +00005019 // This does not diagnose illegal cases like having both
5020 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5021 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005022 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005023 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005024 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005025 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005026 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005027 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005028 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005029 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005030 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005031 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005032 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005033 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005034 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005035 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005036 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005037 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005038 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005039 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005040 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005041 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005042 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005043 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005044 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005045 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005046 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005047 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005048 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005049 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005050 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005051 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005052 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005053 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005054 } else if (Feature == "+strict-align") {
5055 Unaligned = 0;
5056 } else if (Feature == "+fp16") {
5057 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005058 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005059 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005060 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005061
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005062 switch (ArchVersion) {
5063 case 6:
5064 if (ArchProfile == llvm::ARM::PK_M)
5065 LDREX = 0;
5066 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5067 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5068 else
5069 LDREX = LDREX_W;
5070 break;
5071 case 7:
5072 if (ArchProfile == llvm::ARM::PK_M)
5073 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5074 else
5075 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5076 break;
5077 case 8:
5078 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5079 }
5080
Rafael Espindolaeb265472013-08-21 21:59:03 +00005081 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5082 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5083 return false;
5084 }
5085
5086 if (FPMath == FP_Neon)
5087 Features.push_back("+neonfp");
5088 else if (FPMath == FP_VFP)
5089 Features.push_back("-neonfp");
5090
Daniel Dunbar893d4752009-12-19 04:15:38 +00005091 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005092 auto Feature =
5093 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5094 if (Feature != Features.end())
5095 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005096
Rafael Espindolaeb265472013-08-21 21:59:03 +00005097 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005098 }
5099
Craig Topper3164f332014-03-11 03:39:26 +00005100 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005101 return llvm::StringSwitch<bool>(Feature)
5102 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005103 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005104 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005105 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005106 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005107 .Case("hwdiv", HWDiv & HWDivThumb)
5108 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005109 .Default(false);
5110 }
Renato Golin15b86152015-07-03 16:41:13 +00005111
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005112 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005113 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005114 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005115
Renato Golin15b86152015-07-03 16:41:13 +00005116 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005117 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005118 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005119 CPU = Name;
5120 return true;
5121 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005122
Craig Topper3164f332014-03-11 03:39:26 +00005123 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005124
Craig Topper3164f332014-03-11 03:39:26 +00005125 void getTargetDefines(const LangOptions &Opts,
5126 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005127 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005128 Builder.defineMacro("__arm");
5129 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005130 // For bare-metal none-eabi.
5131 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5132 getTriple().getEnvironment() == llvm::Triple::EABI)
5133 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005134
Chris Lattnerecd49032009-03-02 22:27:17 +00005135 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005136 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005137
5138 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5139 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005140 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005141 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5142
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005143 if (!CPUAttr.empty())
5144 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005145
5146 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005147 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005148 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005149
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005150 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005151 // ACLE 6.5.7 Crypto Extension
5152 if (Crypto)
5153 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5154 // ACLE 6.5.8 CRC32 Extension
5155 if (CRC)
5156 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5157 // ACLE 6.5.10 Numeric Maximum and Minimum
5158 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5159 // ACLE 6.5.9 Directed Rounding
5160 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005161 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005162
5163 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5164 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005165 // NOTE that the default profile is assumed to be 'A'
5166 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005167 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5168
Bradley Smithf4affc12016-03-03 13:52:22 +00005169 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5170 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5171 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5172 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005173 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005174 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005175 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005176 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5177
5178 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5179 // instruction set such as ARM or Thumb.
5180 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5181
5182 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5183
5184 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005185 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005186 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005187
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005188 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005189 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005190 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005191
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005192 // ACLE 6.4.4 LDREX/STREX
5193 if (LDREX)
5194 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5195
5196 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005197 if (ArchVersion == 5 ||
5198 (ArchVersion == 6 && CPUProfile != "M") ||
5199 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005200 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5201
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005202 // ACLE 6.5.1 Hardware Floating Point
5203 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005204 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005205
Yi Konga44c4d72014-06-27 21:25:42 +00005206 // ACLE predefines.
5207 Builder.defineMacro("__ARM_ACLE", "200");
5208
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005209 // FP16 support (we currently only support IEEE format).
5210 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5211 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5212
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005213 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005214 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005215 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5216
Mike Stump9d54bd72009-04-08 02:07:04 +00005217 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005218
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005219 // FIXME: It's more complicated than this and we don't really support
5220 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005221 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005222 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005223 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005224
David Tweed8f676532012-10-25 13:33:01 +00005225 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005226 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005227 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005228 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005229 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005230 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005231 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005232
Tim Northover28fc0e12016-04-28 13:59:55 +00005233 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5234 ABI == "aapcs16")
5235 Builder.defineMacro("__ARM_PCS_VFP", "1");
5236
Daniel Dunbar893d4752009-12-19 04:15:38 +00005237 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005238 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005239
Zijiao Ma56a83722016-08-17 02:13:33 +00005240 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005241 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005242
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005243 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005244 Builder.defineMacro("__THUMBEL__");
5245 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005246 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005247 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005248 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005249
5250 // ACLE 6.4.9 32-bit SIMD instructions
5251 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5252 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5253
5254 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005255 if (((HWDiv & HWDivThumb) && isThumb()) ||
5256 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005257 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005258 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005259 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005260
5261 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005262 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005263
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005264 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005265 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005266 if (FPU & VFP2FPU)
5267 Builder.defineMacro("__ARM_VFPV2__");
5268 if (FPU & VFP3FPU)
5269 Builder.defineMacro("__ARM_VFPV3__");
5270 if (FPU & VFP4FPU)
5271 Builder.defineMacro("__ARM_VFPV4__");
5272 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005273
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005274 // This only gets set when Neon instructions are actually available, unlike
5275 // the VFP define, hence the soft float and arch check. This is subtly
5276 // different from gcc, we follow the intent which was that it should be set
5277 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005278 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005279 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005280 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005281 // current AArch32 NEON implementations do not support double-precision
5282 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005283 Builder.defineMacro("__ARM_NEON_FP",
5284 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005285 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005286
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005287 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5288 Opts.ShortWChar ? "2" : "4");
5289
5290 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5291 Opts.ShortEnums ? "1" : "4");
5292
Bradley Smithf4affc12016-03-03 13:52:22 +00005293 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005294 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5295 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5297 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5298 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005299
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005300 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005301 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005302 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005303 }
5304
5305 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005306 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005307 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5308 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005309 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005310 }
5311
5312 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005313 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005314 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005315
5316 if (Opts.UnsafeFPMath)
5317 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005318
5319 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5320 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005321 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005322
Craig Topper6c03a542015-10-19 04:51:35 +00005323 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5324 return llvm::makeArrayRef(BuiltinInfo,
5325 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005326 }
Craig Topper3164f332014-03-11 03:39:26 +00005327 bool isCLZForZeroUndef() const override { return false; }
5328 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005329 return IsAAPCS
5330 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005331 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5332 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005333 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005334 ArrayRef<const char *> getGCCRegNames() const override;
5335 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005336 bool validateAsmConstraint(const char *&Name,
5337 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005338 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005339 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005340 case 'l': // r0-r7
5341 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005342 case 't': // VFP Floating point register single precision
5343 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005344 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005345 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005346 case 'I':
5347 case 'J':
5348 case 'K':
5349 case 'L':
5350 case 'M':
5351 // FIXME
5352 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005353 case 'Q': // A memory address that is a single base register.
5354 Info.setAllowsMemory();
5355 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005356 case 'U': // a memory reference...
5357 switch (Name[1]) {
5358 case 'q': // ...ARMV4 ldrsb
5359 case 'v': // ...VFP load/store (reg+constant offset)
5360 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005361 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005362 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005363 case 'n': // valid address for Neon doubleword vector load/store
5364 case 'm': // valid address for Neon element and structure load/store
5365 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005366 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005367 Info.setAllowsMemory();
5368 Name++;
5369 return true;
5370 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005371 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005372 return false;
5373 }
Craig Topper3164f332014-03-11 03:39:26 +00005374 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005375 std::string R;
5376 switch (*Constraint) {
5377 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005378 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005379 Constraint++;
5380 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005381 case 'p': // 'p' should be translated to 'r' by default.
5382 R = std::string("r");
5383 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005384 default:
5385 return std::string(1, *Constraint);
5386 }
5387 return R;
5388 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005389 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005390 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005391 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005392 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005393 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005394
Bill Wendling9d1ee112012-10-25 23:28:48 +00005395 // Strip off constraint modifiers.
5396 while (Constraint[0] == '=' ||
5397 Constraint[0] == '+' ||
5398 Constraint[0] == '&')
5399 Constraint = Constraint.substr(1);
5400
5401 switch (Constraint[0]) {
5402 default: break;
5403 case 'r': {
5404 switch (Modifier) {
5405 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005406 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005407 case 'q':
5408 // A register of size 32 cannot fit a vector type.
5409 return false;
5410 }
5411 }
5412 }
5413
5414 return true;
5415 }
Craig Topper3164f332014-03-11 03:39:26 +00005416 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005417 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005418 return "";
5419 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005420
Craig Topper3164f332014-03-11 03:39:26 +00005421 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005422 switch (CC) {
5423 case CC_AAPCS:
5424 case CC_AAPCS_VFP:
5425 case CC_Swift:
5426 return CCCR_OK;
5427 default:
5428 return CCCR_Warning;
5429 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005430 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005431
Craig Topper3164f332014-03-11 03:39:26 +00005432 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005433 if (RegNo == 0) return 0;
5434 if (RegNo == 1) return 1;
5435 return -1;
5436 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005437
5438 bool hasSjLjLowering() const override {
5439 return true;
5440 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005441};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005442
Rafael Espindolaeb265472013-08-21 21:59:03 +00005443bool ARMTargetInfo::setFPMath(StringRef Name) {
5444 if (Name == "neon") {
5445 FPMath = FP_Neon;
5446 return true;
5447 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5448 Name == "vfp4") {
5449 FPMath = FP_VFP;
5450 return true;
5451 }
5452 return false;
5453}
5454
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005455const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005456 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005457 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005458 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5459
5460 // Float registers
5461 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5462 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5463 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005464 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005465
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005466 // Double registers
5467 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5468 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005469 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5470 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005471
5472 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005473 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5474 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005475};
5476
Craig Topperf054e3a2015-10-19 03:52:27 +00005477ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5478 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005479}
5480
5481const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005482 { { "a1" }, "r0" },
5483 { { "a2" }, "r1" },
5484 { { "a3" }, "r2" },
5485 { { "a4" }, "r3" },
5486 { { "v1" }, "r4" },
5487 { { "v2" }, "r5" },
5488 { { "v3" }, "r6" },
5489 { { "v4" }, "r7" },
5490 { { "v5" }, "r8" },
5491 { { "v6", "rfp" }, "r9" },
5492 { { "sl" }, "r10" },
5493 { { "fp" }, "r11" },
5494 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005495 { { "r13" }, "sp" },
5496 { { "r14" }, "lr" },
5497 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005498 // The S, D and Q registers overlap, but aren't really aliases; we
5499 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005500};
5501
Craig Topperf054e3a2015-10-19 03:52:27 +00005502ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5503 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005504}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005505
5506const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005507#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005508 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005509#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5510 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005511#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005512
Craig Topper07d3b622015-08-07 05:14:44 +00005513#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005514 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005515#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005516 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005517#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5518 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005519#include "clang/Basic/BuiltinsARM.def"
5520};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005521
5522class ARMleTargetInfo : public ARMTargetInfo {
5523public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005524 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5525 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/false) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005526 void getTargetDefines(const LangOptions &Opts,
5527 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005528 Builder.defineMacro("__ARMEL__");
5529 ARMTargetInfo::getTargetDefines(Opts, Builder);
5530 }
5531};
5532
5533class ARMbeTargetInfo : public ARMTargetInfo {
5534public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005535 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5536 : ARMTargetInfo(Triple, Opts, /*BigEndian=*/true) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005537 void getTargetDefines(const LangOptions &Opts,
5538 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005539 Builder.defineMacro("__ARMEB__");
5540 Builder.defineMacro("__ARM_BIG_ENDIAN");
5541 ARMTargetInfo::getTargetDefines(Opts, Builder);
5542 }
5543};
Chris Lattner17df24e2008-04-21 18:56:49 +00005544
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005545class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5546 const llvm::Triple Triple;
5547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005548 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5549 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005550 WCharType = UnsignedShort;
5551 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005552 }
5553 void getVisualStudioDefines(const LangOptions &Opts,
5554 MacroBuilder &Builder) const {
5555 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5556
5557 // FIXME: this is invalid for WindowsCE
5558 Builder.defineMacro("_M_ARM_NT", "1");
5559 Builder.defineMacro("_M_ARMT", "_M_ARM");
5560 Builder.defineMacro("_M_THUMB", "_M_ARM");
5561
5562 assert((Triple.getArch() == llvm::Triple::arm ||
5563 Triple.getArch() == llvm::Triple::thumb) &&
5564 "invalid architecture for Windows ARM target info");
5565 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5566 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5567
5568 // TODO map the complete set of values
5569 // 31: VFPv3 40: VFPv4
5570 Builder.defineMacro("_M_ARM_FP", "31");
5571 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005572 BuiltinVaListKind getBuiltinVaListKind() const override {
5573 return TargetInfo::CharPtrBuiltinVaList;
5574 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005575 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5576 switch (CC) {
5577 case CC_X86StdCall:
5578 case CC_X86ThisCall:
5579 case CC_X86FastCall:
5580 case CC_X86VectorCall:
5581 return CCCR_Ignore;
5582 case CC_C:
5583 return CCCR_OK;
5584 default:
5585 return CCCR_Warning;
5586 }
5587 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005588};
5589
5590// Windows ARM + Itanium C++ ABI Target
5591class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5592public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005593 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5594 const TargetOptions &Opts)
5595 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005596 TheCXXABI.set(TargetCXXABI::GenericARM);
5597 }
5598
5599 void getTargetDefines(const LangOptions &Opts,
5600 MacroBuilder &Builder) const override {
5601 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5602
5603 if (Opts.MSVCCompat)
5604 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5605 }
5606};
5607
5608// Windows ARM, MS (C++) ABI
5609class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5610public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005611 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5612 const TargetOptions &Opts)
5613 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005614 TheCXXABI.set(TargetCXXABI::Microsoft);
5615 }
5616
5617 void getTargetDefines(const LangOptions &Opts,
5618 MacroBuilder &Builder) const override {
5619 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5620 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5621 }
5622};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005623
Yaron Keren321249c2015-07-15 13:32:23 +00005624// ARM MinGW target
5625class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5626public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005627 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5628 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005629 TheCXXABI.set(TargetCXXABI::GenericARM);
5630 }
5631
5632 void getTargetDefines(const LangOptions &Opts,
5633 MacroBuilder &Builder) const override {
5634 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5635 DefineStd(Builder, "WIN32", Opts);
5636 DefineStd(Builder, "WINNT", Opts);
5637 Builder.defineMacro("_ARM_");
5638 addMinGWDefines(Opts, Builder);
5639 }
5640};
5641
5642// ARM Cygwin target
5643class CygwinARMTargetInfo : public ARMleTargetInfo {
5644public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005645 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5646 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005647 TLSSupported = false;
5648 WCharType = UnsignedShort;
5649 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005650 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005651 }
5652 void getTargetDefines(const LangOptions &Opts,
5653 MacroBuilder &Builder) const override {
5654 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5655 Builder.defineMacro("_ARM_");
5656 Builder.defineMacro("__CYGWIN__");
5657 Builder.defineMacro("__CYGWIN32__");
5658 DefineStd(Builder, "unix", Opts);
5659 if (Opts.CPlusPlus)
5660 Builder.defineMacro("_GNU_SOURCE");
5661 }
5662};
5663
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005664class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005665protected:
Craig Topper3164f332014-03-11 03:39:26 +00005666 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5667 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005668 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005669 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005670
Torok Edwinb2b37c62009-06-30 17:10:35 +00005671public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005672 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5673 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005674 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005675 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005676 // FIXME: This should be based off of the target features in
5677 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005678 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005679
Tim Northoverd88ecb32016-01-27 19:32:40 +00005680 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005681 // Darwin on iOS uses a variant of the ARM C++ ABI.
5682 TheCXXABI.set(TargetCXXABI::WatchOS);
5683
5684 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5685 // size_t is long, it's a bit weird for it to be int.
5686 PtrDiffType = SignedLong;
5687
5688 // BOOL should be a real boolean on the new ABI
5689 UseSignedCharForObjCBool = false;
5690 } else
5691 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005692 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005693};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005694
Tim Northover573cbee2014-05-24 12:52:07 +00005695class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005696 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005697 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5698 static const char *const GCCRegNames[];
5699
James Molloy75f5f9e2014-04-16 15:33:48 +00005700 enum FPUModeEnum {
5701 FPUMode,
5702 NeonMode
5703 };
5704
5705 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005706 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005707 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005708 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005709 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005710
Tim Northovera2ee4332014-03-29 15:09:45 +00005711 static const Builtin::Info BuiltinInfo[];
5712
5713 std::string ABI;
5714
5715public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005716 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005717 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005718 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5719 WCharType = SignedInt;
5720
5721 // NetBSD apparently prefers consistency across ARM targets to consistency
5722 // across 64-bit targets.
5723 Int64Type = SignedLongLong;
5724 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005725 } else {
5726 WCharType = UnsignedInt;
5727 Int64Type = SignedLong;
5728 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005729 }
5730
Tim Northovera2ee4332014-03-29 15:09:45 +00005731 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005732 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005733 MaxAtomicInlineWidth = 128;
5734 MaxAtomicPromoteWidth = 128;
5735
Tim Northovera6a19f12015-02-06 01:25:07 +00005736 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005737 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5738
Tim Northovera2ee4332014-03-29 15:09:45 +00005739 // {} in inline assembly are neon specifiers, not assembly variant
5740 // specifiers.
5741 NoAsmVariants = true;
5742
Tim Northover7ad87af2015-01-16 18:44:04 +00005743 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5744 // contributes to the alignment of the containing aggregate in the same way
5745 // a plain (non bit-field) member of that type would, without exception for
5746 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005747 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005748 UseZeroLengthBitfieldAlignment = true;
5749
Tim Northover573cbee2014-05-24 12:52:07 +00005750 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005751 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005752
5753 if (Triple.getOS() == llvm::Triple::Linux ||
5754 Triple.getOS() == llvm::Triple::UnknownOS)
5755 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005756 }
5757
Alp Toker4925ba72014-06-07 23:30:42 +00005758 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005759 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005760 if (Name != "aapcs" && Name != "darwinpcs")
5761 return false;
5762
5763 ABI = Name;
5764 return true;
5765 }
5766
David Blaikie1cbb9712014-11-14 19:09:44 +00005767 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005768 return Name == "generic" ||
5769 llvm::AArch64::parseCPUArch(Name) !=
5770 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005771 }
5772
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005773 void getTargetDefines(const LangOptions &Opts,
5774 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005775 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005776 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005777
5778 // Target properties.
5779 Builder.defineMacro("_LP64");
5780 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005781
5782 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5783 Builder.defineMacro("__ARM_ACLE", "200");
5784 Builder.defineMacro("__ARM_ARCH", "8");
5785 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5786
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005787 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005788 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005789 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005790
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005791 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5792 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5793 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5794 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005795 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005796 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5797 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005798
5799 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5800
5801 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005802 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005803
5804 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5805 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005806 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5807 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005808
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005809 if (Opts.UnsafeFPMath)
5810 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005811
5812 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5813
5814 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5815 Opts.ShortEnums ? "1" : "4");
5816
James Molloy75f5f9e2014-04-16 15:33:48 +00005817 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005818 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005819 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005820 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005821 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005822
Bradley Smith418c5932014-05-02 15:17:51 +00005823 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005824 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005825
James Molloy75f5f9e2014-04-16 15:33:48 +00005826 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005827 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5828
5829 if (Unaligned)
5830 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005831
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005832 if (V8_1A)
5833 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5834
Reid Klecknerd167d422015-05-06 15:31:46 +00005835 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5836 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5837 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5838 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5839 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005840 }
5841
Craig Topper6c03a542015-10-19 04:51:35 +00005842 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5843 return llvm::makeArrayRef(BuiltinInfo,
5844 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005845 }
5846
David Blaikie1cbb9712014-11-14 19:09:44 +00005847 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005848 return Feature == "aarch64" ||
5849 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005850 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005851 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005852 }
5853
James Molloy5e73df52014-04-16 15:06:20 +00005854 bool handleTargetFeatures(std::vector<std::string> &Features,
5855 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005856 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005857 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005858 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005859 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005860 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005861
Eric Christopher610fe112015-08-26 08:21:55 +00005862 for (const auto &Feature : Features) {
5863 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005864 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005865 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005866 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005867 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005868 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005869 if (Feature == "+strict-align")
5870 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005871 if (Feature == "+v8.1a")
5872 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005873 }
5874
James Y Knightb214cbc2016-03-04 19:00:41 +00005875 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005876
5877 return true;
5878 }
5879
John McCall477f2bb2016-03-03 06:39:32 +00005880 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5881 switch (CC) {
5882 case CC_C:
5883 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005884 case CC_PreserveMost:
5885 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005886 return CCCR_OK;
5887 default:
5888 return CCCR_Warning;
5889 }
5890 }
5891
David Blaikie1cbb9712014-11-14 19:09:44 +00005892 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005893
David Blaikie1cbb9712014-11-14 19:09:44 +00005894 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005895 return TargetInfo::AArch64ABIBuiltinVaList;
5896 }
5897
Craig Topperf054e3a2015-10-19 03:52:27 +00005898 ArrayRef<const char *> getGCCRegNames() const override;
5899 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005900
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005901 bool validateAsmConstraint(const char *&Name,
5902 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005903 switch (*Name) {
5904 default:
5905 return false;
5906 case 'w': // Floating point and SIMD registers (V0-V31)
5907 Info.setAllowsRegister();
5908 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005909 case 'I': // Constant that can be used with an ADD instruction
5910 case 'J': // Constant that can be used with a SUB instruction
5911 case 'K': // Constant that can be used with a 32-bit logical instruction
5912 case 'L': // Constant that can be used with a 64-bit logical instruction
5913 case 'M': // Constant that can be used as a 32-bit MOV immediate
5914 case 'N': // Constant that can be used as a 64-bit MOV immediate
5915 case 'Y': // Floating point constant zero
5916 case 'Z': // Integer constant zero
5917 return true;
5918 case 'Q': // A memory reference with base register and no offset
5919 Info.setAllowsMemory();
5920 return true;
5921 case 'S': // A symbolic address
5922 Info.setAllowsRegister();
5923 return true;
5924 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005925 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5926 // Utf: A memory address suitable for ldp/stp in TF mode.
5927 // Usa: An absolute symbolic address.
5928 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5929 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005930 case 'z': // Zero register, wzr or xzr
5931 Info.setAllowsRegister();
5932 return true;
5933 case 'x': // Floating point and SIMD registers (V0-V15)
5934 Info.setAllowsRegister();
5935 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005936 }
5937 return false;
5938 }
5939
Akira Hatanaka987f1862014-08-22 06:05:21 +00005940 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005941 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005942 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005943 // Strip off constraint modifiers.
5944 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5945 Constraint = Constraint.substr(1);
5946
5947 switch (Constraint[0]) {
5948 default:
5949 return true;
5950 case 'z':
5951 case 'r': {
5952 switch (Modifier) {
5953 case 'x':
5954 case 'w':
5955 // For now assume that the person knows what they're
5956 // doing with the modifier.
5957 return true;
5958 default:
5959 // By default an 'r' constraint will be in the 'x'
5960 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005961 if (Size == 64)
5962 return true;
5963
5964 SuggestedModifier = "w";
5965 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005966 }
5967 }
5968 }
5969 }
5970
David Blaikie1cbb9712014-11-14 19:09:44 +00005971 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005972
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005973 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005974 if (RegNo == 0)
5975 return 0;
5976 if (RegNo == 1)
5977 return 1;
5978 return -1;
5979 }
5980};
5981
Tim Northover573cbee2014-05-24 12:52:07 +00005982const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00005983 // 32-bit Integer registers
5984 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
5985 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
5986 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
5987
5988 // 64-bit Integer registers
5989 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
5990 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
5991 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
5992
5993 // 32-bit floating point regsisters
5994 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
5995 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
5996 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
5997
5998 // 64-bit floating point regsisters
5999 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6000 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6001 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6002
6003 // Vector registers
6004 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6005 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6006 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6007};
6008
Craig Topperf054e3a2015-10-19 03:52:27 +00006009ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6010 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006011}
6012
Tim Northover573cbee2014-05-24 12:52:07 +00006013const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006014 { { "w31" }, "wsp" },
6015 { { "x29" }, "fp" },
6016 { { "x30" }, "lr" },
6017 { { "x31" }, "sp" },
6018 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6019 // don't want to substitute one of these for a different-sized one.
6020};
6021
Craig Topperf054e3a2015-10-19 03:52:27 +00006022ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6023 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006024}
6025
Tim Northover573cbee2014-05-24 12:52:07 +00006026const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006027#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006028 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006029#include "clang/Basic/BuiltinsNEON.def"
6030
6031#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006032 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006033#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006034};
James Molloy5e73df52014-04-16 15:06:20 +00006035
Tim Northover573cbee2014-05-24 12:52:07 +00006036class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006037 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006038 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006039 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006040 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006041 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006042 }
6043
6044public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006045 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6046 : AArch64TargetInfo(Triple, Opts) {
James Molloy5e73df52014-04-16 15:06:20 +00006047 BigEndian = false;
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) {
Eli Friedman803acb32011-12-22 03:51:45 +00006119 BigEndian = false;
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006120 // Specify the vector alignment explicitly. For v512x1, the calculated
6121 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6122 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006123 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006124 "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 +00006125 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006126 SizeType = UnsignedInt;
6127 PtrDiffType = SignedInt;
6128 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006129
6130 // {} in inline assembly are packet specifiers, not assembly variant
6131 // specifiers.
6132 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006133
6134 LargeArrayMinWidth = 64;
6135 LargeArrayAlign = 64;
6136 UseBitFieldTypeAlignment = true;
6137 ZeroLengthBitfieldBoundary = 32;
6138 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006139 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140 }
6141
Craig Topper6c03a542015-10-19 04:51:35 +00006142 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6143 return llvm::makeArrayRef(BuiltinInfo,
6144 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006145 }
6146
Craig Topper3164f332014-03-11 03:39:26 +00006147 bool validateAsmConstraint(const char *&Name,
6148 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006149 switch (*Name) {
6150 case 'v':
6151 case 'q':
6152 if (HasHVX) {
6153 Info.setAllowsRegister();
6154 return true;
6155 }
6156 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006157 case 's':
6158 // Relocatable constant.
6159 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006160 }
6161 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006162 }
6163
Craig Topper3164f332014-03-11 03:39:26 +00006164 void getTargetDefines(const LangOptions &Opts,
6165 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006166
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006167 bool isCLZForZeroUndef() const override { return false; }
6168
Craig Topper3164f332014-03-11 03:39:26 +00006169 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006170 return llvm::StringSwitch<bool>(Feature)
6171 .Case("hexagon", true)
6172 .Case("hvx", HasHVX)
6173 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006174 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006175 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006176 }
Craig Topper3164f332014-03-11 03:39:26 +00006177
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006178 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6179 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6180 const override;
6181
6182 bool handleTargetFeatures(std::vector<std::string> &Features,
6183 DiagnosticsEngine &Diags) override;
6184
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006185 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6186 bool Enabled) const override;
6187
Craig Topper3164f332014-03-11 03:39:26 +00006188 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006189 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006190 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006191 ArrayRef<const char *> getGCCRegNames() const override;
6192 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006193 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006194 return "";
6195 }
Sebastian Pop86500282012-01-13 20:37:10 +00006196
6197 static const char *getHexagonCPUSuffix(StringRef Name) {
6198 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006199 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006200 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006201 .Case("hexagonv55", "55")
6202 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006203 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006204 }
6205
Craig Topper3164f332014-03-11 03:39:26 +00006206 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006207 if (!getHexagonCPUSuffix(Name))
6208 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006209 CPU = Name;
6210 return true;
6211 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006212
6213 int getEHDataRegisterNumber(unsigned RegNo) const override {
6214 return RegNo < 2 ? RegNo : -1;
6215 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006216};
6217
6218void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006219 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006220 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006221 Builder.defineMacro("__hexagon__", "1");
6222
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006223 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006224 Builder.defineMacro("__HEXAGON_V4__");
6225 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006226 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006227 Builder.defineMacro("__QDSP6_V4__");
6228 Builder.defineMacro("__QDSP6_ARCH__", "4");
6229 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006230 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006231 Builder.defineMacro("__HEXAGON_V5__");
6232 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6233 if(Opts.HexagonQdsp6Compat) {
6234 Builder.defineMacro("__QDSP6_V5__");
6235 Builder.defineMacro("__QDSP6_ARCH__", "5");
6236 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006237 } else if (CPU == "hexagonv55") {
6238 Builder.defineMacro("__HEXAGON_V55__");
6239 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6240 Builder.defineMacro("__QDSP6_V55__");
6241 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006242 } else if (CPU == "hexagonv60") {
6243 Builder.defineMacro("__HEXAGON_V60__");
6244 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6245 Builder.defineMacro("__QDSP6_V60__");
6246 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006247 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006248
6249 if (hasFeature("hvx")) {
6250 Builder.defineMacro("__HVX__");
6251 if (hasFeature("hvx-double"))
6252 Builder.defineMacro("__HVXDBL__");
6253 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006254}
6255
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006256bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6257 DiagnosticsEngine &Diags, StringRef CPU,
6258 const std::vector<std::string> &FeaturesVec) const {
6259 // Default for v60: -hvx, -hvx-double.
6260 Features["hvx"] = false;
6261 Features["hvx-double"] = false;
6262 Features["long-calls"] = false;
6263
6264 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6265}
6266
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006267bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6268 DiagnosticsEngine &Diags) {
6269 for (auto &F : Features) {
6270 if (F == "+hvx")
6271 HasHVX = true;
6272 else if (F == "-hvx")
6273 HasHVX = HasHVXDouble = false;
6274 else if (F == "+hvx-double")
6275 HasHVX = HasHVXDouble = true;
6276 else if (F == "-hvx-double")
6277 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006278
6279 if (F == "+long-calls")
6280 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006281 else if (F == "-long-calls")
6282 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006283 }
6284 return true;
6285}
6286
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006287void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6288 StringRef Name, bool Enabled) const {
6289 if (Enabled) {
6290 if (Name == "hvx-double")
6291 Features["hvx"] = true;
6292 } else {
6293 if (Name == "hvx")
6294 Features["hvx-double"] = false;
6295 }
6296 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006297}
6298
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006299const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006300 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6301 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6302 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6303 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6304 "p0", "p1", "p2", "p3",
6305 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6306};
6307
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006308ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006309 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006310}
6311
Tony Linthicum76329bf2011-12-12 21:14:55 +00006312const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6313 { { "sp" }, "r29" },
6314 { { "fp" }, "r30" },
6315 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006316};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006317
Craig Topperf054e3a2015-10-19 03:52:27 +00006318ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6319 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006320}
6321
6322
6323const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006324#define BUILTIN(ID, TYPE, ATTRS) \
6325 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6326#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6327 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006328#include "clang/Basic/BuiltinsHexagon.def"
6329};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006330
Jacques Pienaard964cc22016-03-28 21:02:54 +00006331class LanaiTargetInfo : public TargetInfo {
6332 // Class for Lanai (32-bit).
6333 // The CPU profiles supported by the Lanai backend
6334 enum CPUKind {
6335 CK_NONE,
6336 CK_V11,
6337 } CPU;
6338
6339 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6340 static const char *const GCCRegNames[];
6341
6342public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006343 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6344 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006345 // Description string has to be kept in sync with backend.
6346 resetDataLayout("E" // Big endian
6347 "-m:e" // ELF name manging
6348 "-p:32:32" // 32 bit pointers, 32 bit aligned
6349 "-i64:64" // 64 bit integers, 64 bit aligned
6350 "-a:0:32" // 32 bit alignment of objects of aggregate type
6351 "-n32" // 32 bit native integer width
6352 "-S64" // 64 bit natural stack alignment
6353 );
6354
6355 // Setting RegParmMax equal to what mregparm was set to in the old
6356 // toolchain
6357 RegParmMax = 4;
6358
6359 // Set the default CPU to V11
6360 CPU = CK_V11;
6361
6362 // Temporary approach to make everything at least word-aligned and allow for
6363 // safely casting between pointers with different alignment requirements.
6364 // TODO: Remove this when there are no more cast align warnings on the
6365 // firmware.
6366 MinGlobalAlign = 32;
6367 }
6368
6369 void getTargetDefines(const LangOptions &Opts,
6370 MacroBuilder &Builder) const override {
6371 // Define __lanai__ when building for target lanai.
6372 Builder.defineMacro("__lanai__");
6373
6374 // Set define for the CPU specified.
6375 switch (CPU) {
6376 case CK_V11:
6377 Builder.defineMacro("__LANAI_V11__");
6378 break;
6379 case CK_NONE:
6380 llvm_unreachable("Unhandled target CPU");
6381 }
6382 }
6383
6384 bool setCPU(const std::string &Name) override {
6385 CPU = llvm::StringSwitch<CPUKind>(Name)
6386 .Case("v11", CK_V11)
6387 .Default(CK_NONE);
6388
6389 return CPU != CK_NONE;
6390 }
6391
6392 bool hasFeature(StringRef Feature) const override {
6393 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6394 }
6395
6396 ArrayRef<const char *> getGCCRegNames() const override;
6397
6398 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6399
6400 BuiltinVaListKind getBuiltinVaListKind() const override {
6401 return TargetInfo::VoidPtrBuiltinVaList;
6402 }
6403
6404 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6405
6406 bool validateAsmConstraint(const char *&Name,
6407 TargetInfo::ConstraintInfo &info) const override {
6408 return false;
6409 }
6410
6411 const char *getClobbers() const override { return ""; }
6412};
6413
6414const char *const LanaiTargetInfo::GCCRegNames[] = {
6415 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6416 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6417 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6418
6419ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6420 return llvm::makeArrayRef(GCCRegNames);
6421}
6422
6423const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6424 {{"pc"}, "r2"},
6425 {{"sp"}, "r4"},
6426 {{"fp"}, "r5"},
6427 {{"rv"}, "r8"},
6428 {{"rr1"}, "r10"},
6429 {{"rr2"}, "r11"},
6430 {{"rca"}, "r15"},
6431};
6432
6433ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6434 return llvm::makeArrayRef(GCCRegAliases);
6435}
6436
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006437// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6438class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006439 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6440 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006441 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006442public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006443 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006444 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006445
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006446 int getEHDataRegisterNumber(unsigned RegNo) const override {
6447 if (RegNo == 0) return 24;
6448 if (RegNo == 1) return 25;
6449 return -1;
6450 }
6451
Craig Topper3164f332014-03-11 03:39:26 +00006452 bool handleTargetFeatures(std::vector<std::string> &Features,
6453 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006454 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006455 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6456 if (Feature != Features.end()) {
6457 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006458 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006459 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006460 }
Craig Topper3164f332014-03-11 03:39:26 +00006461 void getTargetDefines(const LangOptions &Opts,
6462 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006463 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006464 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006465
6466 if (SoftFloat)
6467 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006468 }
Craig Topper3164f332014-03-11 03:39:26 +00006469
6470 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006471 return llvm::StringSwitch<bool>(Feature)
6472 .Case("softfloat", SoftFloat)
6473 .Case("sparc", true)
6474 .Default(false);
6475 }
Craig Topper3164f332014-03-11 03:39:26 +00006476
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006477 bool hasSjLjLowering() const override {
6478 return true;
6479 }
6480
Craig Topper6c03a542015-10-19 04:51:35 +00006481 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006482 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006483 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006484 }
Craig Topper3164f332014-03-11 03:39:26 +00006485 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006486 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006487 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006488 ArrayRef<const char *> getGCCRegNames() const override;
6489 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006490 bool validateAsmConstraint(const char *&Name,
6491 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006492 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006493 switch (*Name) {
6494 case 'I': // Signed 13-bit constant
6495 case 'J': // Zero
6496 case 'K': // 32-bit constant with the low 12 bits clear
6497 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6498 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6499 case 'N': // Same as 'K' but zext (required for SIMode)
6500 case 'O': // The constant 4096
6501 return true;
6502 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006503 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006504 }
Craig Topper3164f332014-03-11 03:39:26 +00006505 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006506 // FIXME: Implement!
6507 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006508 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006509
6510 // No Sparc V7 for now, the backend doesn't support it anyway.
6511 enum CPUKind {
6512 CK_GENERIC,
6513 CK_V8,
6514 CK_SUPERSPARC,
6515 CK_SPARCLITE,
6516 CK_F934,
6517 CK_HYPERSPARC,
6518 CK_SPARCLITE86X,
6519 CK_SPARCLET,
6520 CK_TSC701,
6521 CK_V9,
6522 CK_ULTRASPARC,
6523 CK_ULTRASPARC3,
6524 CK_NIAGARA,
6525 CK_NIAGARA2,
6526 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006527 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006528 CK_MYRIAD2100,
6529 CK_MYRIAD2150,
6530 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006531 CK_LEON2,
6532 CK_LEON2_AT697E,
6533 CK_LEON2_AT697F,
6534 CK_LEON3,
6535 CK_LEON3_UT699,
6536 CK_LEON3_GR712RC,
6537 CK_LEON4,
6538 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006539 } CPU = CK_GENERIC;
6540
6541 enum CPUGeneration {
6542 CG_V8,
6543 CG_V9,
6544 };
6545
6546 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6547 switch (Kind) {
6548 case CK_GENERIC:
6549 case CK_V8:
6550 case CK_SUPERSPARC:
6551 case CK_SPARCLITE:
6552 case CK_F934:
6553 case CK_HYPERSPARC:
6554 case CK_SPARCLITE86X:
6555 case CK_SPARCLET:
6556 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006557 case CK_MYRIAD2100:
6558 case CK_MYRIAD2150:
6559 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006560 case CK_LEON2:
6561 case CK_LEON2_AT697E:
6562 case CK_LEON2_AT697F:
6563 case CK_LEON3:
6564 case CK_LEON3_UT699:
6565 case CK_LEON3_GR712RC:
6566 case CK_LEON4:
6567 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006568 return CG_V8;
6569 case CK_V9:
6570 case CK_ULTRASPARC:
6571 case CK_ULTRASPARC3:
6572 case CK_NIAGARA:
6573 case CK_NIAGARA2:
6574 case CK_NIAGARA3:
6575 case CK_NIAGARA4:
6576 return CG_V9;
6577 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006578 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006579 }
6580
6581 CPUKind getCPUKind(StringRef Name) const {
6582 return llvm::StringSwitch<CPUKind>(Name)
6583 .Case("v8", CK_V8)
6584 .Case("supersparc", CK_SUPERSPARC)
6585 .Case("sparclite", CK_SPARCLITE)
6586 .Case("f934", CK_F934)
6587 .Case("hypersparc", CK_HYPERSPARC)
6588 .Case("sparclite86x", CK_SPARCLITE86X)
6589 .Case("sparclet", CK_SPARCLET)
6590 .Case("tsc701", CK_TSC701)
6591 .Case("v9", CK_V9)
6592 .Case("ultrasparc", CK_ULTRASPARC)
6593 .Case("ultrasparc3", CK_ULTRASPARC3)
6594 .Case("niagara", CK_NIAGARA)
6595 .Case("niagara2", CK_NIAGARA2)
6596 .Case("niagara3", CK_NIAGARA3)
6597 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006598 .Case("ma2100", CK_MYRIAD2100)
6599 .Case("ma2150", CK_MYRIAD2150)
6600 .Case("ma2450", CK_MYRIAD2450)
6601 // FIXME: the myriad2[.n] spellings are obsolete,
6602 // but a grace period is needed to allow updating dependent builds.
6603 .Case("myriad2", CK_MYRIAD2100)
6604 .Case("myriad2.1", CK_MYRIAD2100)
6605 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006606 .Case("leon2", CK_LEON2)
6607 .Case("at697e", CK_LEON2_AT697E)
6608 .Case("at697f", CK_LEON2_AT697F)
6609 .Case("leon3", CK_LEON3)
6610 .Case("ut699", CK_LEON3_UT699)
6611 .Case("gr712rc", CK_LEON3_GR712RC)
6612 .Case("leon4", CK_LEON4)
6613 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006614 .Default(CK_GENERIC);
6615 }
6616
6617 bool setCPU(const std::string &Name) override {
6618 CPU = getCPUKind(Name);
6619 return CPU != CK_GENERIC;
6620 }
Gabor Greif49991682008-02-21 16:29:08 +00006621};
6622
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006623const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006624 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6625 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6626 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6627 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6628};
6629
Craig Topperf054e3a2015-10-19 03:52:27 +00006630ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6631 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006632}
6633
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006634const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006635 { { "g0" }, "r0" },
6636 { { "g1" }, "r1" },
6637 { { "g2" }, "r2" },
6638 { { "g3" }, "r3" },
6639 { { "g4" }, "r4" },
6640 { { "g5" }, "r5" },
6641 { { "g6" }, "r6" },
6642 { { "g7" }, "r7" },
6643 { { "o0" }, "r8" },
6644 { { "o1" }, "r9" },
6645 { { "o2" }, "r10" },
6646 { { "o3" }, "r11" },
6647 { { "o4" }, "r12" },
6648 { { "o5" }, "r13" },
6649 { { "o6", "sp" }, "r14" },
6650 { { "o7" }, "r15" },
6651 { { "l0" }, "r16" },
6652 { { "l1" }, "r17" },
6653 { { "l2" }, "r18" },
6654 { { "l3" }, "r19" },
6655 { { "l4" }, "r20" },
6656 { { "l5" }, "r21" },
6657 { { "l6" }, "r22" },
6658 { { "l7" }, "r23" },
6659 { { "i0" }, "r24" },
6660 { { "i1" }, "r25" },
6661 { { "i2" }, "r26" },
6662 { { "i3" }, "r27" },
6663 { { "i4" }, "r28" },
6664 { { "i5" }, "r29" },
6665 { { "i6", "fp" }, "r30" },
6666 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006667};
6668
Craig Topperf054e3a2015-10-19 03:52:27 +00006669ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6670 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006671}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006672
6673// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6674class SparcV8TargetInfo : public SparcTargetInfo {
6675public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006676 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6677 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006678 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006679 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6680 switch (getTriple().getOS()) {
6681 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006682 SizeType = UnsignedInt;
6683 IntPtrType = SignedInt;
6684 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006685 break;
6686 case llvm::Triple::NetBSD:
6687 case llvm::Triple::OpenBSD:
6688 SizeType = UnsignedLong;
6689 IntPtrType = SignedLong;
6690 PtrDiffType = SignedLong;
6691 break;
Brad Smith56495d52015-08-13 22:00:53 +00006692 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006693 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006694 }
6695
Craig Topper3164f332014-03-11 03:39:26 +00006696 void getTargetDefines(const LangOptions &Opts,
6697 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006698 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006699 switch (getCPUGeneration(CPU)) {
6700 case CG_V8:
6701 Builder.defineMacro("__sparcv8");
6702 if (getTriple().getOS() != llvm::Triple::Solaris)
6703 Builder.defineMacro("__sparcv8__");
6704 break;
6705 case CG_V9:
6706 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006707 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006708 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006709 Builder.defineMacro("__sparc_v9__");
6710 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006711 break;
6712 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006713 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006714 std::string MyriadArchValue, Myriad2Value;
6715 Builder.defineMacro("__sparc_v8__");
6716 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006717 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006718 case CK_MYRIAD2150:
6719 MyriadArchValue = "__ma2150";
6720 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006721 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006722 case CK_MYRIAD2450:
6723 MyriadArchValue = "__ma2450";
6724 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006725 break;
6726 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006727 MyriadArchValue = "__ma2100";
6728 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006729 break;
6730 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006731 Builder.defineMacro(MyriadArchValue, "1");
6732 Builder.defineMacro(MyriadArchValue+"__", "1");
6733 Builder.defineMacro("__myriad2__", Myriad2Value);
6734 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006735 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006736 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006737
6738 bool hasSjLjLowering() const override {
6739 return true;
6740 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006741};
6742
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006743// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6744class SparcV8elTargetInfo : public SparcV8TargetInfo {
6745 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006746 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6747 : SparcV8TargetInfo(Triple, Opts) {
6748 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
6749 BigEndian = false;
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006750 }
6751};
6752
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006753// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6754class SparcV9TargetInfo : public SparcTargetInfo {
6755public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006756 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6757 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006758 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006759 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006760 // This is an LP64 platform.
6761 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006762
6763 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006764 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006765 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006766 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006767 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006768 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006769
6770 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6771 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6772 LongDoubleWidth = 128;
6773 LongDoubleAlign = 128;
6774 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006775 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006776 }
6777
Craig Topper3164f332014-03-11 03:39:26 +00006778 void getTargetDefines(const LangOptions &Opts,
6779 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006780 SparcTargetInfo::getTargetDefines(Opts, Builder);
6781 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006782 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006783 // Solaris doesn't need these variants, but the BSDs do.
6784 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006785 Builder.defineMacro("__sparc64__");
6786 Builder.defineMacro("__sparc_v9__");
6787 Builder.defineMacro("__sparcv9__");
6788 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006789 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006790
Craig Topper3164f332014-03-11 03:39:26 +00006791 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006792 if (!SparcTargetInfo::setCPU(Name))
6793 return false;
6794 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006795 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006796};
6797
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006798class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006799 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006800 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006801 std::string CPU;
6802 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006803 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006804
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006805public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006806 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006807 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6808 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006809 IntMaxType = SignedLong;
6810 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006811 TLSSupported = true;
6812 IntWidth = IntAlign = 32;
6813 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6814 PointerWidth = PointerAlign = 64;
6815 LongDoubleWidth = 128;
6816 LongDoubleAlign = 64;
6817 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006818 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006819 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006820 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 +00006821 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6822 }
6823 void getTargetDefines(const LangOptions &Opts,
6824 MacroBuilder &Builder) const override {
6825 Builder.defineMacro("__s390__");
6826 Builder.defineMacro("__s390x__");
6827 Builder.defineMacro("__zarch__");
6828 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006829
6830 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6831 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6832 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6833 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6834
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006835 if (HasTransactionalExecution)
6836 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006837 if (Opts.ZVector)
6838 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839 }
Craig Topper6c03a542015-10-19 04:51:35 +00006840 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6841 return llvm::makeArrayRef(BuiltinInfo,
6842 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006843 }
6844
Craig Topperf054e3a2015-10-19 03:52:27 +00006845 ArrayRef<const char *> getGCCRegNames() const override;
6846 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006847 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006848 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006849 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006850 bool validateAsmConstraint(const char *&Name,
6851 TargetInfo::ConstraintInfo &info) const override;
6852 const char *getClobbers() const override {
6853 // FIXME: Is this really right?
6854 return "";
6855 }
6856 BuiltinVaListKind getBuiltinVaListKind() const override {
6857 return TargetInfo::SystemZBuiltinVaList;
6858 }
6859 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006860 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006861 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6862 .Case("z10", true)
6863 .Case("z196", true)
6864 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006865 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006866 .Default(false);
6867
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006868 return CPUKnown;
6869 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006870 bool
6871 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6872 StringRef CPU,
6873 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006874 if (CPU == "zEC12")
6875 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006876 if (CPU == "z13") {
6877 Features["transactional-execution"] = true;
6878 Features["vector"] = true;
6879 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006880 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006881 }
6882
6883 bool handleTargetFeatures(std::vector<std::string> &Features,
6884 DiagnosticsEngine &Diags) override {
6885 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006886 for (const auto &Feature : Features) {
6887 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006888 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006889 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006890 HasVector = true;
6891 }
6892 // If we use the vector ABI, vector types are 64-bit aligned.
6893 if (HasVector) {
6894 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006895 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6896 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006897 }
6898 return true;
6899 }
6900
6901 bool hasFeature(StringRef Feature) const override {
6902 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006903 .Case("systemz", true)
6904 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006905 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006906 .Default(false);
6907 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006908
Bryan Chane3f1ed52016-04-28 13:56:43 +00006909 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6910 switch (CC) {
6911 case CC_C:
6912 case CC_Swift:
6913 return CCCR_OK;
6914 default:
6915 return CCCR_Warning;
6916 }
6917 }
6918
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006919 StringRef getABI() const override {
6920 if (HasVector)
6921 return "vector";
6922 return "";
6923 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006924
6925 bool useFloat128ManglingForLongDouble() const override {
6926 return true;
6927 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006928};
6929
6930const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6931#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006932 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006933#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6934 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006935#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006936};
6937
6938const char *const SystemZTargetInfo::GCCRegNames[] = {
6939 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6940 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6941 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6942 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6943};
6944
Craig Topperf054e3a2015-10-19 03:52:27 +00006945ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6946 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006947}
6948
6949bool SystemZTargetInfo::
6950validateAsmConstraint(const char *&Name,
6951 TargetInfo::ConstraintInfo &Info) const {
6952 switch (*Name) {
6953 default:
6954 return false;
6955
6956 case 'a': // Address register
6957 case 'd': // Data register (equivalent to 'r')
6958 case 'f': // Floating-point register
6959 Info.setAllowsRegister();
6960 return true;
6961
6962 case 'I': // Unsigned 8-bit constant
6963 case 'J': // Unsigned 12-bit constant
6964 case 'K': // Signed 16-bit constant
6965 case 'L': // Signed 20-bit displacement (on all targets we support)
6966 case 'M': // 0x7fffffff
6967 return true;
6968
6969 case 'Q': // Memory with base and unsigned 12-bit displacement
6970 case 'R': // Likewise, plus an index
6971 case 'S': // Memory with base and signed 20-bit displacement
6972 case 'T': // Likewise, plus an index
6973 Info.setAllowsMemory();
6974 return true;
6975 }
6976}
Ulrich Weigand47445072013-05-06 16:26:41 +00006977
Eric Christopherc48497a2015-09-18 21:26:24 +00006978class MSP430TargetInfo : public TargetInfo {
6979 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00006980
Eric Christopherc48497a2015-09-18 21:26:24 +00006981public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006982 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6983 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00006984 BigEndian = false;
6985 TLSSupported = false;
6986 IntWidth = 16;
6987 IntAlign = 16;
6988 LongWidth = 32;
6989 LongLongWidth = 64;
6990 LongAlign = LongLongAlign = 16;
6991 PointerWidth = 16;
6992 PointerAlign = 16;
6993 SuitableAlign = 16;
6994 SizeType = UnsignedInt;
6995 IntMaxType = SignedLongLong;
6996 IntPtrType = SignedInt;
6997 PtrDiffType = SignedInt;
6998 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00006999 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007000 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007001 void getTargetDefines(const LangOptions &Opts,
7002 MacroBuilder &Builder) const override {
7003 Builder.defineMacro("MSP430");
7004 Builder.defineMacro("__MSP430__");
7005 // FIXME: defines for different 'flavours' of MCU
7006 }
Craig Topper6c03a542015-10-19 04:51:35 +00007007 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007008 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007009 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007010 }
7011 bool hasFeature(StringRef Feature) const override {
7012 return Feature == "msp430";
7013 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007014 ArrayRef<const char *> getGCCRegNames() const override;
7015 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007016 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007017 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007018 }
7019 bool validateAsmConstraint(const char *&Name,
7020 TargetInfo::ConstraintInfo &info) const override {
7021 // FIXME: implement
7022 switch (*Name) {
7023 case 'K': // the constant 1
7024 case 'L': // constant -1^20 .. 1^19
7025 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007026 return true;
7027 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007028 // No target constraints for now.
7029 return false;
7030 }
7031 const char *getClobbers() const override {
7032 // FIXME: Is this really right?
7033 return "";
7034 }
7035 BuiltinVaListKind getBuiltinVaListKind() const override {
7036 // FIXME: implement
7037 return TargetInfo::CharPtrBuiltinVaList;
7038 }
7039};
7040
7041const char *const MSP430TargetInfo::GCCRegNames[] = {
7042 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7043 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7044
Craig Topperf054e3a2015-10-19 03:52:27 +00007045ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7046 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007047}
7048
7049// LLVM and Clang cannot be used directly to output native binaries for
7050// target, but is used to compile C code to llvm bitcode with correct
7051// type and alignment information.
7052//
7053// TCE uses the llvm bitcode as input and uses it for generating customized
7054// target processor and program binary. TCE co-design environment is
7055// publicly available in http://tce.cs.tut.fi
7056
7057static const unsigned TCEOpenCLAddrSpaceMap[] = {
7058 3, // opencl_global
7059 4, // opencl_local
7060 5, // opencl_constant
7061 // FIXME: generic has to be added to the target
7062 0, // opencl_generic
7063 0, // cuda_device
7064 0, // cuda_constant
7065 0 // cuda_shared
7066};
7067
7068class TCETargetInfo : public TargetInfo {
7069public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007070 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7071 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007072 TLSSupported = false;
7073 IntWidth = 32;
7074 LongWidth = LongLongWidth = 32;
7075 PointerWidth = 32;
7076 IntAlign = 32;
7077 LongAlign = LongLongAlign = 32;
7078 PointerAlign = 32;
7079 SuitableAlign = 32;
7080 SizeType = UnsignedInt;
7081 IntMaxType = SignedLong;
7082 IntPtrType = SignedInt;
7083 PtrDiffType = SignedInt;
7084 FloatWidth = 32;
7085 FloatAlign = 32;
7086 DoubleWidth = 32;
7087 DoubleAlign = 32;
7088 LongDoubleWidth = 32;
7089 LongDoubleAlign = 32;
7090 FloatFormat = &llvm::APFloat::IEEEsingle;
7091 DoubleFormat = &llvm::APFloat::IEEEsingle;
7092 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007093 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7094 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007095 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7096 UseAddrSpaceMapMangling = true;
7097 }
7098
7099 void getTargetDefines(const LangOptions &Opts,
7100 MacroBuilder &Builder) const override {
7101 DefineStd(Builder, "tce", Opts);
7102 Builder.defineMacro("__TCE__");
7103 Builder.defineMacro("__TCE_V1__");
7104 }
7105 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7106
Craig Topper6c03a542015-10-19 04:51:35 +00007107 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007108 const char *getClobbers() const override { return ""; }
7109 BuiltinVaListKind getBuiltinVaListKind() const override {
7110 return TargetInfo::VoidPtrBuiltinVaList;
7111 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007112 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007113 bool validateAsmConstraint(const char *&Name,
7114 TargetInfo::ConstraintInfo &info) const override {
7115 return true;
7116 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007117 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7118 return None;
7119 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007120};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007121
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007122class BPFTargetInfo : public TargetInfo {
7123public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007124 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7125 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007126 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7127 SizeType = UnsignedLong;
7128 PtrDiffType = SignedLong;
7129 IntPtrType = SignedLong;
7130 IntMaxType = SignedLong;
7131 Int64Type = SignedLong;
7132 RegParmMax = 5;
7133 if (Triple.getArch() == llvm::Triple::bpfeb) {
7134 BigEndian = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00007135 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007136 } else {
7137 BigEndian = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00007138 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007139 }
7140 MaxAtomicPromoteWidth = 64;
7141 MaxAtomicInlineWidth = 64;
7142 TLSSupported = false;
7143 }
7144 void getTargetDefines(const LangOptions &Opts,
7145 MacroBuilder &Builder) const override {
7146 DefineStd(Builder, "bpf", Opts);
7147 Builder.defineMacro("__BPF__");
7148 }
7149 bool hasFeature(StringRef Feature) const override {
7150 return Feature == "bpf";
7151 }
7152
Craig Topper6c03a542015-10-19 04:51:35 +00007153 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007154 const char *getClobbers() const override {
7155 return "";
7156 }
7157 BuiltinVaListKind getBuiltinVaListKind() const override {
7158 return TargetInfo::VoidPtrBuiltinVaList;
7159 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007160 ArrayRef<const char *> getGCCRegNames() const override {
7161 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007162 }
7163 bool validateAsmConstraint(const char *&Name,
7164 TargetInfo::ConstraintInfo &info) const override {
7165 return true;
7166 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007167 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7168 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007169 }
7170};
7171
Daniel Sanders4672af62016-05-27 11:51:02 +00007172class MipsTargetInfo : public TargetInfo {
7173 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007174 StringRef Layout;
7175
7176 if (ABI == "o32")
7177 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7178 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007179 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007180 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007181 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007182 else
7183 llvm_unreachable("Invalid ABI");
7184
7185 if (BigEndian)
7186 resetDataLayout(("E-" + Layout).str());
7187 else
7188 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007189 }
7190
Akira Hatanaka9064e362013-10-29 18:30:33 +00007191
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007192 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007193 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007194 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007195 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007196 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007197 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007198 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007199 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007200 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007201 enum DspRevEnum {
7202 NoDSP, DSP1, DSP2
7203 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007204 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007205
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007206protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007207 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007208 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007209
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007210public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007211 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007212 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7213 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7214 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007215 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007216 BigEndian = getTriple().getArch() == llvm::Triple::mips ||
7217 getTriple().getArch() == llvm::Triple::mips64;
7218
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007219 setABI((getTriple().getArch() == llvm::Triple::mips ||
7220 getTriple().getArch() == llvm::Triple::mipsel)
7221 ? "o32"
7222 : "n64");
7223
7224 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007225 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007226
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007227 bool isNaN2008Default() const {
7228 return CPU == "mips32r6" || CPU == "mips64r6";
7229 }
7230
7231 bool isFP64Default() const {
7232 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7233 }
7234
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007235 bool isNan2008() const override {
7236 return IsNan2008;
7237 }
7238
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007239 bool processorSupportsGPR64() const {
7240 return llvm::StringSwitch<bool>(CPU)
7241 .Case("mips3", true)
7242 .Case("mips4", true)
7243 .Case("mips5", true)
7244 .Case("mips64", true)
7245 .Case("mips64r2", true)
7246 .Case("mips64r3", true)
7247 .Case("mips64r5", true)
7248 .Case("mips64r6", true)
7249 .Case("octeon", true)
7250 .Default(false);
7251 return false;
7252 }
7253
Alp Toker4925ba72014-06-07 23:30:42 +00007254 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007255 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007256 if (Name == "o32") {
7257 setO32ABITypes();
7258 ABI = Name;
7259 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007260 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007261
7262 if (Name == "n32") {
7263 setN32ABITypes();
7264 ABI = Name;
7265 return true;
7266 }
7267 if (Name == "n64") {
7268 setN64ABITypes();
7269 ABI = Name;
7270 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007271 }
7272 return false;
7273 }
7274
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007275 void setO32ABITypes() {
7276 Int64Type = SignedLongLong;
7277 IntMaxType = Int64Type;
7278 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7279 LongDoubleWidth = LongDoubleAlign = 64;
7280 LongWidth = LongAlign = 32;
7281 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7282 PointerWidth = PointerAlign = 32;
7283 PtrDiffType = SignedInt;
7284 SizeType = UnsignedInt;
7285 SuitableAlign = 64;
7286 }
7287
7288 void setN32N64ABITypes() {
7289 LongDoubleWidth = LongDoubleAlign = 128;
7290 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7291 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7292 LongDoubleWidth = LongDoubleAlign = 64;
7293 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7294 }
7295 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7296 SuitableAlign = 128;
7297 }
7298
Daniel Sanders4672af62016-05-27 11:51:02 +00007299 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007300 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007301 Int64Type = SignedLong;
7302 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007303 LongWidth = LongAlign = 64;
7304 PointerWidth = PointerAlign = 64;
7305 PtrDiffType = SignedLong;
7306 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007307 }
7308
7309 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007310 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007311 Int64Type = SignedLongLong;
7312 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007313 LongWidth = LongAlign = 32;
7314 PointerWidth = PointerAlign = 32;
7315 PtrDiffType = SignedInt;
7316 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007317 }
7318
Craig Topper3164f332014-03-11 03:39:26 +00007319 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007320 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007321 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007322 .Case("mips1", true)
7323 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007324 .Case("mips3", true)
7325 .Case("mips4", true)
7326 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007327 .Case("mips32", true)
7328 .Case("mips32r2", true)
7329 .Case("mips32r3", true)
7330 .Case("mips32r5", true)
7331 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007332 .Case("mips64", true)
7333 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007334 .Case("mips64r3", true)
7335 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007336 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007337 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007338 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007339 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007340 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007341 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007342 bool
7343 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7344 StringRef CPU,
7345 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007346 if (CPU.empty())
7347 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007348 if (CPU == "octeon")
7349 Features["mips64r2"] = Features["cnmips"] = true;
7350 else
7351 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007352 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007353 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007354
Craig Topper3164f332014-03-11 03:39:26 +00007355 void getTargetDefines(const LangOptions &Opts,
7356 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007357 if (BigEndian) {
7358 DefineStd(Builder, "MIPSEB", Opts);
7359 Builder.defineMacro("_MIPSEB");
7360 } else {
7361 DefineStd(Builder, "MIPSEL", Opts);
7362 Builder.defineMacro("_MIPSEL");
7363 }
7364
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007365 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007366 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007367 if (Opts.GNUMode)
7368 Builder.defineMacro("mips");
7369
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007370 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007371 Builder.defineMacro("__mips", "32");
7372 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7373 } else {
7374 Builder.defineMacro("__mips", "64");
7375 Builder.defineMacro("__mips64");
7376 Builder.defineMacro("__mips64__");
7377 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7378 }
7379
7380 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7381 .Cases("mips32", "mips64", "1")
7382 .Cases("mips32r2", "mips64r2", "2")
7383 .Cases("mips32r3", "mips64r3", "3")
7384 .Cases("mips32r5", "mips64r5", "5")
7385 .Cases("mips32r6", "mips64r6", "6")
7386 .Default("");
7387 if (!ISARev.empty())
7388 Builder.defineMacro("__mips_isa_rev", ISARev);
7389
7390 if (ABI == "o32") {
7391 Builder.defineMacro("__mips_o32");
7392 Builder.defineMacro("_ABIO32", "1");
7393 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007394 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007395 Builder.defineMacro("__mips_n32");
7396 Builder.defineMacro("_ABIN32", "2");
7397 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7398 } else if (ABI == "n64") {
7399 Builder.defineMacro("__mips_n64");
7400 Builder.defineMacro("_ABI64", "3");
7401 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7402 } else
7403 llvm_unreachable("Invalid ABI.");
7404
Simon Atanasyan683535b2012-08-29 19:14:58 +00007405 Builder.defineMacro("__REGISTER_PREFIX__", "");
7406
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007407 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007408 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007409 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007410 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007411 case SoftFloat:
7412 Builder.defineMacro("__mips_soft_float", Twine(1));
7413 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007414 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007415
Simon Atanasyan16071912013-04-14 14:07:30 +00007416 if (IsSingleFloat)
7417 Builder.defineMacro("__mips_single_float", Twine(1));
7418
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007419 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7420 Builder.defineMacro("_MIPS_FPSET",
7421 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7422
Simon Atanasyan72244b62012-07-05 16:06:06 +00007423 if (IsMips16)
7424 Builder.defineMacro("__mips16", Twine(1));
7425
Simon Atanasyan60777612013-04-14 14:07:51 +00007426 if (IsMicromips)
7427 Builder.defineMacro("__mips_micromips", Twine(1));
7428
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007429 if (IsNan2008)
7430 Builder.defineMacro("__mips_nan2008", Twine(1));
7431
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007432 switch (DspRev) {
7433 default:
7434 break;
7435 case DSP1:
7436 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7437 Builder.defineMacro("__mips_dsp", Twine(1));
7438 break;
7439 case DSP2:
7440 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7441 Builder.defineMacro("__mips_dspr2", Twine(1));
7442 Builder.defineMacro("__mips_dsp", Twine(1));
7443 break;
7444 }
7445
Jack Carter44ff1e52013-08-12 17:20:29 +00007446 if (HasMSA)
7447 Builder.defineMacro("__mips_msa", Twine(1));
7448
Simon Atanasyan26f19672012-04-05 19:28:31 +00007449 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7450 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7451 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007452
7453 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7454 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007455
7456 // These shouldn't be defined for MIPS-I but there's no need to check
7457 // for that since MIPS-I isn't supported.
7458 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7459 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7460 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007461
7462 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7463 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7464 // the instructions exist but using them violates the ABI since they
7465 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7466 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007467 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007468 }
7469
Craig Topper6c03a542015-10-19 04:51:35 +00007470 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7471 return llvm::makeArrayRef(BuiltinInfo,
7472 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007473 }
Craig Topper3164f332014-03-11 03:39:26 +00007474 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007475 return llvm::StringSwitch<bool>(Feature)
7476 .Case("mips", true)
7477 .Case("fp64", HasFP64)
7478 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007479 }
Craig Topper3164f332014-03-11 03:39:26 +00007480 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007481 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007482 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007483 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007484 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007485 // CPU register names
7486 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007487 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7488 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7489 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007490 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7491 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007492 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7493 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7494 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7495 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007496 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007497 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007498 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7499 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007500 // MSA register names
7501 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7502 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7503 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7504 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7505 // MSA control register names
7506 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7507 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007508 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007509 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007510 }
Craig Topper3164f332014-03-11 03:39:26 +00007511 bool validateAsmConstraint(const char *&Name,
7512 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007513 switch (*Name) {
7514 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007515 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007516 case 'r': // CPU registers.
7517 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007518 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007519 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007520 case 'c': // $25 for indirect jumps
7521 case 'l': // lo register
7522 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007523 Info.setAllowsRegister();
7524 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007525 case 'I': // Signed 16-bit constant
7526 case 'J': // Integer 0
7527 case 'K': // Unsigned 16-bit constant
7528 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7529 case 'M': // Constants not loadable via lui, addiu, or ori
7530 case 'N': // Constant -1 to -65535
7531 case 'O': // A signed 15-bit constant
7532 case 'P': // A constant between 1 go 65535
7533 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007534 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007535 Info.setAllowsMemory();
7536 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007537 case 'Z':
7538 if (Name[1] == 'C') { // An address usable by ll, and sc.
7539 Info.setAllowsMemory();
7540 Name++; // Skip over 'Z'.
7541 return true;
7542 }
7543 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007544 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007545 }
7546
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007547 std::string convertConstraint(const char *&Constraint) const override {
7548 std::string R;
7549 switch (*Constraint) {
7550 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7551 if (Constraint[1] == 'C') {
7552 R = std::string("^") + std::string(Constraint, 2);
7553 Constraint++;
7554 return R;
7555 }
7556 break;
7557 }
7558 return TargetInfo::convertConstraint(Constraint);
7559 }
7560
Craig Topper3164f332014-03-11 03:39:26 +00007561 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007562 // In GCC, $1 is not widely used in generated code (it's used only in a few
7563 // specific situations), so there is no real need for users to add it to
7564 // the clobbers list if they want to use it in their inline assembly code.
7565 //
7566 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7567 // code generation, so using it in inline assembly without adding it to the
7568 // clobbers list can cause conflicts between the inline assembly code and
7569 // the surrounding generated code.
7570 //
7571 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7572 // operands, which will conflict with the ".set at" assembler option (which
7573 // we use only for inline assembly, in order to maintain compatibility with
7574 // GCC) and will also conflict with the user's usage of $1.
7575 //
7576 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7577 // register for generated code is to automatically clobber $1 for all inline
7578 // assembly code.
7579 //
7580 // FIXME: We should automatically clobber $1 only for inline assembly code
7581 // which actually uses it. This would allow LLVM to use $1 for inline
7582 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007583 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007584 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007585
Craig Topper3164f332014-03-11 03:39:26 +00007586 bool handleTargetFeatures(std::vector<std::string> &Features,
7587 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007588 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007589 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007590 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007591 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007592 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007593 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007594 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007595
Eric Christopher610fe112015-08-26 08:21:55 +00007596 for (const auto &Feature : Features) {
7597 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007598 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007599 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007600 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007601 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007602 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007603 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007604 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007605 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007606 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007607 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007608 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007609 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007610 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007611 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007612 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007613 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007614 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007615 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007616 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007617 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007618 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007619 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007620
James Y Knightb214cbc2016-03-04 19:00:41 +00007621 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007622
Rafael Espindolaeb265472013-08-21 21:59:03 +00007623 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007624 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007625
Craig Topper3164f332014-03-11 03:39:26 +00007626 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007627 if (RegNo == 0) return 4;
7628 if (RegNo == 1) return 5;
7629 return -1;
7630 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007631
7632 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007633
7634 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7635 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7636 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7637 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7638 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7639 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7640 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7641 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7642 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7643 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7644 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7645 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7646 {{"ra"}, "$31"}};
7647 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7648 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7649 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7650 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7651 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7652 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7653 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7654 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7655 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7656 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7657 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7658 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007659 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007660 return llvm::makeArrayRef(O32RegAliases);
7661 return llvm::makeArrayRef(NewABIRegAliases);
7662 }
7663
7664 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007665 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007666 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007667
7668 bool validateTarget(DiagnosticsEngine &Diags) const override {
7669 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7670 // this yet. It's better to fail here than on the backend assertion.
7671 if (processorSupportsGPR64() && ABI == "o32") {
7672 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7673 return false;
7674 }
7675
7676 // 64-bit ABI's require 64-bit CPU's.
7677 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7678 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7679 return false;
7680 }
7681
7682 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7683 // can't handle this yet. It's better to fail here than on the
7684 // backend assertion.
7685 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7686 getTriple().getArch() == llvm::Triple::mips64el) &&
7687 ABI == "o32") {
7688 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7689 << ABI << getTriple().str();
7690 return false;
7691 }
7692
7693 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7694 // can't handle this yet. It's better to fail here than on the
7695 // backend assertion.
7696 if ((getTriple().getArch() == llvm::Triple::mips ||
7697 getTriple().getArch() == llvm::Triple::mipsel) &&
7698 (ABI == "n32" || ABI == "n64")) {
7699 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7700 << ABI << getTriple().str();
7701 return false;
7702 }
7703
7704 return true;
7705 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007706};
7707
Daniel Sanders4672af62016-05-27 11:51:02 +00007708const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007709#define BUILTIN(ID, TYPE, ATTRS) \
7710 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7711#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7712 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007713#include "clang/Basic/BuiltinsMips.def"
7714};
7715
Ivan Krasindd7403e2011-08-24 20:22:22 +00007716class PNaClTargetInfo : public TargetInfo {
7717public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007718 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7719 : TargetInfo(Triple) {
Eli Friedman803acb32011-12-22 03:51:45 +00007720 BigEndian = false;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007721 this->LongAlign = 32;
7722 this->LongWidth = 32;
7723 this->PointerAlign = 32;
7724 this->PointerWidth = 32;
7725 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007726 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007727 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007728 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007729 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007730 this->SizeType = TargetInfo::UnsignedInt;
7731 this->PtrDiffType = TargetInfo::SignedInt;
7732 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007733 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007734 }
7735
Craig Toppere6f17d02014-03-11 04:07:52 +00007736 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007737 Builder.defineMacro("__le32__");
7738 Builder.defineMacro("__pnacl__");
7739 }
Craig Topper3164f332014-03-11 03:39:26 +00007740 void getTargetDefines(const LangOptions &Opts,
7741 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007742 getArchDefines(Opts, Builder);
7743 }
Craig Topper3164f332014-03-11 03:39:26 +00007744 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007745 return Feature == "pnacl";
7746 }
Craig Topper6c03a542015-10-19 04:51:35 +00007747 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007748 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007749 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007750 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007751 ArrayRef<const char *> getGCCRegNames() const override;
7752 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007753 bool validateAsmConstraint(const char *&Name,
7754 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007755 return false;
7756 }
7757
Craig Topper3164f332014-03-11 03:39:26 +00007758 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007759 return "";
7760 }
7761};
7762
Craig Topperf054e3a2015-10-19 03:52:27 +00007763ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7764 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007765}
7766
Craig Topperf054e3a2015-10-19 03:52:27 +00007767ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7768 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007769}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007770
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007771// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007772class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007773public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007774 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7775 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007776
7777 BuiltinVaListKind getBuiltinVaListKind() const override {
7778 return TargetInfo::PNaClABIBuiltinVaList;
7779 }
7780};
7781
JF Bastien643817d2014-09-12 17:52:47 +00007782class Le64TargetInfo : public TargetInfo {
7783 static const Builtin::Info BuiltinInfo[];
7784
7785public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007786 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7787 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007788 BigEndian = false;
7789 NoAsmVariants = true;
7790 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7791 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007792 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007793 }
7794
7795 void getTargetDefines(const LangOptions &Opts,
7796 MacroBuilder &Builder) const override {
7797 DefineStd(Builder, "unix", Opts);
7798 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7799 Builder.defineMacro("__ELF__");
7800 }
Craig Topper6c03a542015-10-19 04:51:35 +00007801 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7802 return llvm::makeArrayRef(BuiltinInfo,
7803 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007804 }
7805 BuiltinVaListKind getBuiltinVaListKind() const override {
7806 return TargetInfo::PNaClABIBuiltinVaList;
7807 }
7808 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007809 ArrayRef<const char *> getGCCRegNames() const override {
7810 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007811 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007812 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7813 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007814 }
7815 bool validateAsmConstraint(const char *&Name,
7816 TargetInfo::ConstraintInfo &Info) const override {
7817 return false;
7818 }
7819
7820 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007821};
Dan Gohmanc2853072015-09-03 22:51:53 +00007822
7823class WebAssemblyTargetInfo : public TargetInfo {
7824 static const Builtin::Info BuiltinInfo[];
7825
7826 enum SIMDEnum {
7827 NoSIMD,
7828 SIMD128,
7829 } SIMDLevel;
7830
7831public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007832 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007833 : TargetInfo(T), SIMDLevel(NoSIMD) {
7834 BigEndian = false;
7835 NoAsmVariants = true;
7836 SuitableAlign = 128;
7837 LargeArrayMinWidth = 128;
7838 LargeArrayAlign = 128;
7839 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007840 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007841 LongDoubleWidth = LongDoubleAlign = 128;
7842 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007843 SizeType = UnsignedInt;
7844 PtrDiffType = SignedInt;
7845 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007846 }
7847
7848protected:
7849 void getTargetDefines(const LangOptions &Opts,
7850 MacroBuilder &Builder) const override {
7851 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7852 if (SIMDLevel >= SIMD128)
7853 Builder.defineMacro("__wasm_simd128__");
7854 }
7855
7856private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007857 bool
7858 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7859 StringRef CPU,
7860 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007861 if (CPU == "bleeding-edge")
7862 Features["simd128"] = true;
7863 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7864 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007865 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007866 return llvm::StringSwitch<bool>(Feature)
7867 .Case("simd128", SIMDLevel >= SIMD128)
7868 .Default(false);
7869 }
7870 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007871 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007872 for (const auto &Feature : Features) {
7873 if (Feature == "+simd128") {
7874 SIMDLevel = std::max(SIMDLevel, SIMD128);
7875 continue;
7876 }
7877 if (Feature == "-simd128") {
7878 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7879 continue;
7880 }
7881
7882 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7883 << "-target-feature";
7884 return false;
7885 }
7886 return true;
7887 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007888 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007889 return llvm::StringSwitch<bool>(Name)
7890 .Case("mvp", true)
7891 .Case("bleeding-edge", true)
7892 .Case("generic", true)
7893 .Default(false);
7894 }
Craig Topper6c03a542015-10-19 04:51:35 +00007895 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7896 return llvm::makeArrayRef(BuiltinInfo,
7897 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007898 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007899 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007900 return VoidPtrBuiltinVaList;
7901 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007902 ArrayRef<const char *> getGCCRegNames() const final {
7903 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007904 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007905 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7906 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007907 }
7908 bool
7909 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007910 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007911 return false;
7912 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007913 const char *getClobbers() const final { return ""; }
7914 bool isCLZForZeroUndef() const final { return false; }
7915 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007916 IntType getIntTypeByWidth(unsigned BitWidth,
7917 bool IsSigned) const final {
7918 // WebAssembly prefers long long for explicitly 64-bit integers.
7919 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7920 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7921 }
7922 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7923 bool IsSigned) const final {
7924 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7925 return BitWidth == 64
7926 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7927 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7928 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007929};
7930
7931const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7932#define BUILTIN(ID, TYPE, ATTRS) \
7933 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7934#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7935 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7936#include "clang/Basic/BuiltinsWebAssembly.def"
7937};
7938
7939class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7940public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007941 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7942 const TargetOptions &Opts)
7943 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007944 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007945 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007946 }
7947
7948protected:
7949 void getTargetDefines(const LangOptions &Opts,
7950 MacroBuilder &Builder) const override {
7951 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7952 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7953 }
7954};
7955
7956class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7957public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007958 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7959 const TargetOptions &Opts)
7960 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007961 LongAlign = LongWidth = 64;
7962 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007963 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007964 SizeType = UnsignedLong;
7965 PtrDiffType = SignedLong;
7966 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007967 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007968 }
7969
7970protected:
7971 void getTargetDefines(const LangOptions &Opts,
7972 MacroBuilder &Builder) const override {
7973 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7974 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7975 }
7976};
7977
JF Bastien643817d2014-09-12 17:52:47 +00007978const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7979#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007980 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007981#include "clang/Basic/BuiltinsLe64.def"
7982};
7983
Eric Christopherc48497a2015-09-18 21:26:24 +00007984static const unsigned SPIRAddrSpaceMap[] = {
7985 1, // opencl_global
7986 3, // opencl_local
7987 2, // opencl_constant
7988 4, // opencl_generic
7989 0, // cuda_device
7990 0, // cuda_constant
7991 0 // cuda_shared
7992};
7993class SPIRTargetInfo : public TargetInfo {
7994public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007995 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7996 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007997 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
7998 "SPIR target must use unknown OS");
7999 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8000 "SPIR target must use unknown environment type");
8001 BigEndian = false;
8002 TLSSupported = false;
8003 LongWidth = LongAlign = 64;
8004 AddrSpaceMap = &SPIRAddrSpaceMap;
8005 UseAddrSpaceMapMangling = true;
8006 // Define available target features
8007 // These must be defined in sorted order!
8008 NoAsmVariants = true;
8009 }
8010 void getTargetDefines(const LangOptions &Opts,
8011 MacroBuilder &Builder) const override {
8012 DefineStd(Builder, "SPIR", Opts);
8013 }
8014 bool hasFeature(StringRef Feature) const override {
8015 return Feature == "spir";
8016 }
Craig Topper3164f332014-03-11 03:39:26 +00008017
Craig Topper6c03a542015-10-19 04:51:35 +00008018 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008019 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008020 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008021 bool validateAsmConstraint(const char *&Name,
8022 TargetInfo::ConstraintInfo &info) const override {
8023 return true;
8024 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008025 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8026 return None;
8027 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008028 BuiltinVaListKind getBuiltinVaListKind() const override {
8029 return TargetInfo::VoidPtrBuiltinVaList;
8030 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008031
Eric Christopherc48497a2015-09-18 21:26:24 +00008032 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008033 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8034 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008035 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008036
Eric Christopherc48497a2015-09-18 21:26:24 +00008037 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8038 return CC_SpirFunction;
8039 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008040
8041 void setSupportedOpenCLOpts() override {
8042 // Assume all OpenCL extensions and optional core features are supported
8043 // for SPIR since it is a generic target.
8044 getSupportedOpenCLOpts().setAll();
8045 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008046};
Guy Benyeib798fc92012-12-11 21:38:14 +00008047
Eric Christopherc48497a2015-09-18 21:26:24 +00008048class SPIR32TargetInfo : public SPIRTargetInfo {
8049public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008050 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8051 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008052 PointerWidth = PointerAlign = 32;
8053 SizeType = TargetInfo::UnsignedInt;
8054 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008055 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8056 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008057 }
8058 void getTargetDefines(const LangOptions &Opts,
8059 MacroBuilder &Builder) const override {
8060 DefineStd(Builder, "SPIR32", Opts);
8061 }
8062};
Guy Benyeib798fc92012-12-11 21:38:14 +00008063
Eric Christopherc48497a2015-09-18 21:26:24 +00008064class SPIR64TargetInfo : public SPIRTargetInfo {
8065public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008066 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8067 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008068 PointerWidth = PointerAlign = 64;
8069 SizeType = TargetInfo::UnsignedLong;
8070 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008071 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8072 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008073 }
8074 void getTargetDefines(const LangOptions &Opts,
8075 MacroBuilder &Builder) const override {
8076 DefineStd(Builder, "SPIR64", Opts);
8077 }
8078};
Guy Benyeib798fc92012-12-11 21:38:14 +00008079
Robert Lytton0e076492013-08-13 09:43:10 +00008080class XCoreTargetInfo : public TargetInfo {
8081 static const Builtin::Info BuiltinInfo[];
8082public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008083 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8084 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008085 BigEndian = false;
8086 NoAsmVariants = true;
8087 LongLongAlign = 32;
8088 SuitableAlign = 32;
8089 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008090 SizeType = UnsignedInt;
8091 PtrDiffType = SignedInt;
8092 IntPtrType = SignedInt;
8093 WCharType = UnsignedChar;
8094 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008095 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008096 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8097 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008098 }
Craig Topper3164f332014-03-11 03:39:26 +00008099 void getTargetDefines(const LangOptions &Opts,
8100 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008101 Builder.defineMacro("__XS1B__");
8102 }
Craig Topper6c03a542015-10-19 04:51:35 +00008103 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8104 return llvm::makeArrayRef(BuiltinInfo,
8105 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008106 }
Craig Topper3164f332014-03-11 03:39:26 +00008107 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008108 return TargetInfo::VoidPtrBuiltinVaList;
8109 }
Craig Topper3164f332014-03-11 03:39:26 +00008110 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008111 return "";
8112 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008113 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008114 static const char * const GCCRegNames[] = {
8115 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8116 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8117 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008118 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008119 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008120 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8121 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008122 }
Craig Topper3164f332014-03-11 03:39:26 +00008123 bool validateAsmConstraint(const char *&Name,
8124 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008125 return false;
8126 }
Craig Topper3164f332014-03-11 03:39:26 +00008127 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008128 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8129 return (RegNo < 2)? RegNo : -1;
8130 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008131 bool allowsLargerPreferedTypeAlignment() const override {
8132 return false;
8133 }
Robert Lytton0e076492013-08-13 09:43:10 +00008134};
8135
8136const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008137#define BUILTIN(ID, TYPE, ATTRS) \
8138 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8139#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8140 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008141#include "clang/Basic/BuiltinsXCore.def"
8142};
Robert Lytton0e076492013-08-13 09:43:10 +00008143
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008144// x86_32 Android target
8145class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8146public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008147 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8148 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008149 SuitableAlign = 32;
8150 LongDoubleWidth = 64;
8151 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8152 }
8153};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008154
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008155// x86_64 Android target
8156class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8157public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008158 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8159 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008160 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8161 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008162
8163 bool useFloat128ManglingForLongDouble() const override {
8164 return true;
8165 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008166};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008167
8168// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8169class RenderScript32TargetInfo : public ARMleTargetInfo {
8170public:
8171 RenderScript32TargetInfo(const llvm::Triple &Triple,
8172 const TargetOptions &Opts)
8173 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8174 Triple.getOSName(),
8175 Triple.getEnvironmentName()),
8176 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008177 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008178 LongWidth = LongAlign = 64;
8179 }
8180 void getTargetDefines(const LangOptions &Opts,
8181 MacroBuilder &Builder) const override {
8182 Builder.defineMacro("__RENDERSCRIPT__");
8183 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8184 }
8185};
8186
8187// 64-bit RenderScript is aarch64
8188class RenderScript64TargetInfo : public AArch64leTargetInfo {
8189public:
8190 RenderScript64TargetInfo(const llvm::Triple &Triple,
8191 const TargetOptions &Opts)
8192 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8193 Triple.getOSName(),
8194 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008195 Opts) {
8196 IsRenderScriptTarget = true;
8197 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008198
8199 void getTargetDefines(const LangOptions &Opts,
8200 MacroBuilder &Builder) const override {
8201 Builder.defineMacro("__RENDERSCRIPT__");
8202 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8203 }
8204};
8205
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008206} // end anonymous namespace
8207
Chris Lattner5ba61f02006-10-14 07:39:34 +00008208//===----------------------------------------------------------------------===//
8209// Driver code
8210//===----------------------------------------------------------------------===//
8211
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008212static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8213 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008214 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008215
Daniel Dunbar52322032009-08-18 05:47:58 +00008216 switch (Triple.getArch()) {
8217 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008218 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008219
Tim Northover2a0783d2014-05-30 14:14:07 +00008220 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008221 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008222
8223 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008224 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008225
Jacques Pienaard964cc22016-03-28 21:02:54 +00008226 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008227 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008228
Tim Northover2a0783d2014-05-30 14:14:07 +00008229 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008230 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008232
8233 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008234 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008235 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008236 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008238 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008239 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008240 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008242 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008243 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008244 }
8245
Christian Pirker9b019ae2014-02-25 13:51:00 +00008246 case llvm::Triple::aarch64_be:
8247 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008248 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008250 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008252 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008254 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008255 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008256 }
8257
Daniel Dunbar52322032009-08-18 05:47:58 +00008258 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008259 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008260 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008262
Daniel Dunbar52322032009-08-18 05:47:58 +00008263 switch (os) {
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008264 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008266 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008267 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008268 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008269 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008270 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008272 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008273 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008274 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008275 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008276 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008278 case llvm::Triple::Win32:
8279 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008280 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008282 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008284 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008286 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008287 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008288 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008289 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008290 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008291 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008292 }
8293
8294 case llvm::Triple::armeb:
8295 case llvm::Triple::thumbeb:
8296 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008298
8299 switch (os) {
8300 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008301 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008302 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008304 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008305 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008306 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008307 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008308 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008310 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008311 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008312 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008314 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008316 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008317
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008318 case llvm::Triple::bpfeb:
8319 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008320 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008321
Daniel Dunbar52322032009-08-18 05:47:58 +00008322 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008324
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008325 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008326 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008327 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008328 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008329 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008330 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008331 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008332 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008333 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008334 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008335 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008336 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008337 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008338
8339 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008340 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008341 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008342 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008343 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008344 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008345 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008346 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008347 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008348 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008349 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008350 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008351 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008352 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008353 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008354
Akira Hatanakabef17452011-09-20 19:21:49 +00008355 case llvm::Triple::mips64:
8356 switch (os) {
8357 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008358 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008359 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008360 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008361 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008362 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008363 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008364 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008365 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008366 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008367 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008368 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008369 }
8370
8371 case llvm::Triple::mips64el:
8372 switch (os) {
8373 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008374 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008375 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008376 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008377 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008378 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008379 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008380 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008381 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008382 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008383 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008384 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008385 }
8386
Ivan Krasindd7403e2011-08-24 20:22:22 +00008387 case llvm::Triple::le32:
8388 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008389 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008391 default:
8392 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008393 }
8394
JF Bastien643817d2014-09-12 17:52:47 +00008395 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008396 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008397
Daniel Dunbar52322032009-08-18 05:47:58 +00008398 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008399 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008400 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008401 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008402 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008403 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008404 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008405 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008406 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008407 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008408 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008409 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008410 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008411 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008412 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008413 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008414 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008415
8416 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008417 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008418 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008419 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008420 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008422 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008424 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008426 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008427 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008428 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008429 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008430 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008431
Bill Schmidt778d3872013-07-26 01:36:11 +00008432 case llvm::Triple::ppc64le:
8433 switch (os) {
8434 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008436 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008438 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008440 }
8441
Peter Collingbournec947aae2012-05-20 23:28:41 +00008442 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008443 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008444 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008445 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008446
Tom Stellardd8e38a32015-01-06 20:34:47 +00008447 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008448 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008450
Daniel Dunbar52322032009-08-18 05:47:58 +00008451 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008452 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008453 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008454 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008455 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008456 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008457 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008458 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008459 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008460 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008461 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008462 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008463 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008464 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008465 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008466
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008467 // The 'sparcel' architecture copies all the above cases except for Solaris.
8468 case llvm::Triple::sparcel:
8469 switch (os) {
8470 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008471 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008472 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008473 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008474 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008475 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008476 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008477 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008478 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008479 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008480 }
8481
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008482 case llvm::Triple::sparcv9:
8483 switch (os) {
8484 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008486 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008488 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008490 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008492 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008493 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008494 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008495 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008496 }
8497
Ulrich Weigand47445072013-05-06 16:26:41 +00008498 case llvm::Triple::systemz:
8499 switch (os) {
8500 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008502 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008504 }
8505
Eli Friedmana9c3d712009-08-19 20:47:07 +00008506 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008508
Daniel Dunbar52322032009-08-18 05:47:58 +00008509 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008510 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008511 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008512
Daniel Dunbar52322032009-08-18 05:47:58 +00008513 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008514 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008516 case llvm::Triple::Linux: {
8517 switch (Triple.getEnvironment()) {
8518 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008520 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008521 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008522 }
8523 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008524 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008525 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008526 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008528 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008529 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008530 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008532 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008534 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008535 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008536 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008538 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008540 case llvm::Triple::Win32: {
8541 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008542 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008544 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008546 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008547 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008548 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008550 }
8551 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008552 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008553 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008554 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008556 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008558 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008559 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008560 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008562 }
8563
8564 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008565 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008566 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008567
Daniel Dunbar52322032009-08-18 05:47:58 +00008568 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008569 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008570 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008571 case llvm::Triple::Linux: {
8572 switch (Triple.getEnvironment()) {
8573 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008574 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008575 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008576 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008577 }
8578 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008579 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008580 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008581 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008583 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008584 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008585 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008587 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008588 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008589 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008590 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008591 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008592 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008593 case llvm::Triple::Win32: {
8594 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008595 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008596 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008597 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008599 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008600 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008601 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008602 }
8603 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008604 case llvm::Triple::Haiku:
8605 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008606 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008607 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008608 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008609 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008610 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008611 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008612 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008613
Douglas Katzman78d7c542015-05-12 21:18:10 +00008614 case llvm::Triple::spir: {
8615 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8616 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8617 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008618 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008619 }
8620 case llvm::Triple::spir64: {
8621 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8622 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8623 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008624 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008625 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008626 case llvm::Triple::wasm32:
8627 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8628 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008629 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008630 case llvm::Triple::wasm64:
8631 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8632 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008633 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008634
8635 case llvm::Triple::renderscript32:
8636 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8637 case llvm::Triple::renderscript64:
8638 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008639 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008640}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008641
8642/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008643/// options.
Alp Toker80758082014-07-06 05:26:44 +00008644TargetInfo *
8645TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008646 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008647 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008648
8649 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008650 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008651 if (!Target) {
8652 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008653 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008654 }
Alp Toker80758082014-07-06 05:26:44 +00008655 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008656
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008657 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008658 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8659 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008660 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008661 }
8662
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008663 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008664 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8665 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008666 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008667 }
8668
Rafael Espindolaeb265472013-08-21 21:59:03 +00008669 // Set the fp math unit.
8670 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8671 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008672 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008673 }
8674
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008675 // Compute the default target features, we need the target to handle this
8676 // because features may have dependencies on one another.
8677 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008678 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8679 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008680 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008681
8682 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008683 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008684 for (const auto &F : Features)
8685 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8686
Eric Christopher3ff21b32013-10-16 21:26:26 +00008687 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008688 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008689
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008690 Target->setSupportedOpenCLOpts();
8691
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008692 if (!Target->validateTarget(Diags))
8693 return nullptr;
8694
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008695 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008696}