blob: 96c10bcdd7058c5be84a1a895ec2057becb7f533 [file] [log] [blame]
Eric Christopherb39156d2015-08-26 04:23:11 +00001//===--- Targets.cpp - Implement target feature support -------------------===//
Chris Lattner5ba61f02006-10-14 07:39:34 +00002//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner5b12ab82007-12-29 19:59:25 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Chris Lattner5ba61f02006-10-14 07:39:34 +00007//
8//===----------------------------------------------------------------------===//
9//
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000010// This file implements construction of a TargetInfo object from a
Ted Kremenek6f6ff372007-12-12 18:05:32 +000011// target triple.
Chris Lattner5ba61f02006-10-14 07:39:34 +000012//
13//===----------------------------------------------------------------------===//
14
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000015#include "clang/Basic/Builtins.h"
Justin Lebar62907612016-07-06 21:21:39 +000016#include "clang/Basic/Cuda.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000017#include "clang/Basic/Diagnostic.h"
Chris Lattnerc7c6dd42008-12-04 22:54:33 +000018#include "clang/Basic/LangOptions.h"
Chandler Carruth26b29a02010-01-20 06:13:02 +000019#include "clang/Basic/MacroBuilder.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000020#include "clang/Basic/TargetBuiltins.h"
Justin Lebar62907612016-07-06 21:21:39 +000021#include "clang/Basic/TargetInfo.h"
Daniel Dunbarb9bbd542009-11-15 06:48:46 +000022#include "clang/Basic/TargetOptions.h"
Tim Northover756447a2015-10-30 16:30:36 +000023#include "clang/Basic/Version.h"
Yaxun Liu2c17e822016-08-09 19:43:38 +000024#include "clang/Frontend/CodeGenOptions.h"
Eli Friedman7cef49e2008-05-20 14:27:34 +000025#include "llvm/ADT/APFloat.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000026#include "llvm/ADT/STLExtras.h"
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +000027#include "llvm/ADT/StringExtras.h"
Daniel Dunbar58bc48c2009-08-19 20:04:03 +000028#include "llvm/ADT/StringRef.h"
Daniel Dunbar979586e2009-11-11 09:38:56 +000029#include "llvm/ADT/StringSwitch.h"
Chris Lattner859c37a2009-08-12 06:24:27 +000030#include "llvm/ADT/Triple.h"
Chris Lattner30ba6742009-08-10 19:03:04 +000031#include "llvm/MC/MCSectionMachO.h"
David Blaikie76bd3c82011-09-23 05:35:21 +000032#include "llvm/Support/ErrorHandling.h"
Renato Golinf5c4dec2015-05-27 13:33:00 +000033#include "llvm/Support/TargetParser.h"
Benjamin Kramerdc2f0062010-01-09 18:20:57 +000034#include <algorithm>
Ahmed Charlesdfca6f92014-03-09 11:36:40 +000035#include <memory>
Hans Wennborg7eb54642015-09-10 17:07:54 +000036
Chris Lattner5ba61f02006-10-14 07:39:34 +000037using namespace clang;
38
Chris Lattner5ba61f02006-10-14 07:39:34 +000039//===----------------------------------------------------------------------===//
Chris Lattner1f5ad112006-10-14 18:32:12 +000040// Common code shared among targets.
Chris Lattner5ba61f02006-10-14 07:39:34 +000041//===----------------------------------------------------------------------===//
42
Chris Lattner1e1c0b92009-03-20 16:06:38 +000043/// DefineStd - Define a macro name and standard variants. For example if
44/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
45/// when in GNU mode.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000046static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
Chris Lattner1e1c0b92009-03-20 16:06:38 +000047 const LangOptions &Opts) {
48 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000049
Chris Lattner1e1c0b92009-03-20 16:06:38 +000050 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
51 // in the user's namespace.
52 if (Opts.GNUMode)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000053 Builder.defineMacro(MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000054
Chris Lattner1e1c0b92009-03-20 16:06:38 +000055 // Define __unix.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000056 Builder.defineMacro("__" + MacroName);
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +000057
Chris Lattner1e1c0b92009-03-20 16:06:38 +000058 // Define __unix__.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000059 Builder.defineMacro("__" + MacroName + "__");
Chris Lattner1e1c0b92009-03-20 16:06:38 +000060}
61
Benjamin Kramere3b442d2012-01-10 11:50:09 +000062static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
63 bool Tuning = true) {
64 Builder.defineMacro("__" + CPUName);
65 Builder.defineMacro("__" + CPUName + "__");
66 if (Tuning)
67 Builder.defineMacro("__tune_" + CPUName + "__");
68}
69
Justin Lebar76945b22016-04-29 23:05:19 +000070static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
71 const TargetOptions &Opts);
72
Chris Lattner09d98f52008-10-05 21:50:58 +000073//===----------------------------------------------------------------------===//
74// Defines specific to certain operating systems.
75//===----------------------------------------------------------------------===//
Chris Lattner30ba6742009-08-10 19:03:04 +000076
Torok Edwinb2b37c62009-06-30 17:10:35 +000077namespace {
Douglas Gregorc05d2a12009-07-01 15:12:53 +000078template<typename TgtInfo>
79class OSTargetInfo : public TgtInfo {
Torok Edwinb2b37c62009-06-30 17:10:35 +000080protected:
Daniel Dunbar40165182009-08-24 09:10:05 +000081 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000082 MacroBuilder &Builder) const=0;
Torok Edwinb2b37c62009-06-30 17:10:35 +000083public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +000084 OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
85 : TgtInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +000086 void getTargetDefines(const LangOptions &Opts,
87 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +000088 TgtInfo::getTargetDefines(Opts, Builder);
89 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
Torok Edwin4e054162009-06-30 17:00:25 +000090 }
Torok Edwinb2b37c62009-06-30 17:10:35 +000091
92};
Chris Lattner30ba6742009-08-10 19:03:04 +000093
Eric Christopher7d0c7252015-09-24 21:17:04 +000094// CloudABI Target
95template <typename Target>
96class CloudABITargetInfo : public OSTargetInfo<Target> {
97protected:
98 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
99 MacroBuilder &Builder) const override {
100 Builder.defineMacro("__CloudABI__");
101 Builder.defineMacro("__ELF__");
102
103 // CloudABI uses ISO/IEC 10646:2012 for wchar_t, char16_t and char32_t.
104 Builder.defineMacro("__STDC_ISO_10646__", "201206L");
105 Builder.defineMacro("__STDC_UTF_16__");
106 Builder.defineMacro("__STDC_UTF_32__");
107 }
108
109public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000110 CloudABITargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
111 : OSTargetInfo<Target>(Triple, Opts) {}
Eric Christopher7d0c7252015-09-24 21:17:04 +0000112};
113
Daniel Dunbard86666f2010-01-26 01:44:04 +0000114static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000115 const llvm::Triple &Triple,
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000116 StringRef &PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000117 VersionTuple &PlatformMinVersion) {
Bob Wilson834400b2013-08-19 20:23:37 +0000118 Builder.defineMacro("__APPLE_CC__", "6000");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000119 Builder.defineMacro("__APPLE__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000120 Builder.defineMacro("OBJC_NEW_PROPERTIES");
Alexander Potapenkob4f81902012-09-20 10:10:01 +0000121 // AddressSanitizer doesn't play well with source fortification, which is on
122 // by default on Darwin.
Alexey Samsonovedf99a92014-11-07 22:29:38 +0000123 if (Opts.Sanitize.has(SanitizerKind::Address))
124 Builder.defineMacro("_FORTIFY_SOURCE", "0");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000125
John McCall460ce582015-10-22 18:38:17 +0000126 // Darwin defines __weak, __strong, and __unsafe_unretained even in C mode.
127 if (!Opts.ObjC1) {
John McCall31168b02011-06-15 23:02:42 +0000128 // __weak is always defined, for use in blocks and with objc pointers.
129 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
John McCall460ce582015-10-22 18:38:17 +0000130 Builder.defineMacro("__strong", "");
John McCall31168b02011-06-15 23:02:42 +0000131 Builder.defineMacro("__unsafe_unretained", "");
John McCall31168b02011-06-15 23:02:42 +0000132 }
Eric Christopher0c912c52011-07-07 22:55:26 +0000133
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000134 if (Opts.Static)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000135 Builder.defineMacro("__STATIC__");
Eli Friedmanfd4b1552009-06-04 23:00:29 +0000136 else
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000137 Builder.defineMacro("__DYNAMIC__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000138
139 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000140 Builder.defineMacro("_REENTRANT");
Daniel Dunbar497ff132009-04-10 19:52:24 +0000141
Daniel Dunbarecf13562011-04-19 21:40:34 +0000142 // Get the platform type and version number from the triple.
Daniel Dunbar497ff132009-04-10 19:52:24 +0000143 unsigned Maj, Min, Rev;
Bob Wilson8e5acc52012-01-31 23:52:58 +0000144 if (Triple.isMacOSX()) {
145 Triple.getMacOSXVersion(Maj, Min, Rev);
Manman Renccf25bb2016-06-28 20:55:30 +0000146 PlatformName = "macos";
Daniel Dunbarecf13562011-04-19 21:40:34 +0000147 } else {
Bob Wilson8e5acc52012-01-31 23:52:58 +0000148 Triple.getOSVersion(Maj, Min, Rev);
149 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
Daniel Dunbarecf13562011-04-19 21:40:34 +0000150 }
Daniel Dunbard86666f2010-01-26 01:44:04 +0000151
Sebastian Pop422377c2012-01-20 22:01:23 +0000152 // If -target arch-pc-win32-macho option specified, we're
Eric Christopherb081ba62011-07-29 21:20:35 +0000153 // generating code for Win32 ABI. No need to emit
Chad Rosierb90e4022011-07-19 20:00:06 +0000154 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
155 if (PlatformName == "win32") {
156 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
157 return;
158 }
159
Evan Cheng31dd9a62014-01-26 23:12:43 +0000160 // Set the appropriate OS version define.
161 if (Triple.isiOS()) {
Bob Wilson4cf27c42016-07-18 20:29:14 +0000162 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
163 char Str[7];
164 if (Maj < 10) {
165 Str[0] = '0' + Maj;
166 Str[1] = '0' + (Min / 10);
167 Str[2] = '0' + (Min % 10);
168 Str[3] = '0' + (Rev / 10);
169 Str[4] = '0' + (Rev % 10);
170 Str[5] = '\0';
171 } else {
172 // Handle versions >= 10.
173 Str[0] = '0' + (Maj / 10);
174 Str[1] = '0' + (Maj % 10);
175 Str[2] = '0' + (Min / 10);
176 Str[3] = '0' + (Min % 10);
177 Str[4] = '0' + (Rev / 10);
178 Str[5] = '0' + (Rev % 10);
179 Str[6] = '\0';
180 }
Tim Northover67465f82015-10-30 16:30:30 +0000181 if (Triple.isTvOS())
182 Builder.defineMacro("__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__", Str);
183 else
184 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
185 Str);
186
187 } else if (Triple.isWatchOS()) {
188 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
189 char Str[6];
190 Str[0] = '0' + Maj;
191 Str[1] = '0' + (Min / 10);
192 Str[2] = '0' + (Min % 10);
193 Str[3] = '0' + (Rev / 10);
194 Str[4] = '0' + (Rev % 10);
195 Str[5] = '\0';
196 Builder.defineMacro("__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__", Str);
Evan Cheng31dd9a62014-01-26 23:12:43 +0000197 } else if (Triple.isMacOSX()) {
198 // Note that the Driver allows versions which aren't representable in the
199 // define (because we only get a single digit for the minor and micro
200 // revision numbers). So, we limit them to the maximum representable
201 // version.
202 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
Bob Wilson2a3710e2014-08-08 21:45:53 +0000203 char Str[7];
204 if (Maj < 10 || (Maj == 10 && Min < 10)) {
205 Str[0] = '0' + (Maj / 10);
206 Str[1] = '0' + (Maj % 10);
207 Str[2] = '0' + std::min(Min, 9U);
208 Str[3] = '0' + std::min(Rev, 9U);
209 Str[4] = '\0';
210 } else {
211 // Handle versions > 10.9.
212 Str[0] = '0' + (Maj / 10);
213 Str[1] = '0' + (Maj % 10);
214 Str[2] = '0' + (Min / 10);
215 Str[3] = '0' + (Min % 10);
216 Str[4] = '0' + (Rev / 10);
217 Str[5] = '0' + (Rev % 10);
218 Str[6] = '\0';
219 }
Evan Cheng31dd9a62014-01-26 23:12:43 +0000220 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
Daniel Dunbar497ff132009-04-10 19:52:24 +0000221 }
Daniel Dunbarecf13562011-04-19 21:40:34 +0000222
Tim Northover157d9112014-01-16 08:48:16 +0000223 // Tell users about the kernel if there is one.
224 if (Triple.isOSDarwin())
225 Builder.defineMacro("__MACH__");
226
Chris Bieneman46977b62016-04-29 17:53:00 +0000227 // The Watch ABI uses Dwarf EH.
228 if(Triple.isWatchABI())
229 Builder.defineMacro("__ARM_DWARF_EH__");
230
Daniel Dunbarecf13562011-04-19 21:40:34 +0000231 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Eli Friedman3fd920a2008-08-20 02:34:37 +0000232}
Chris Lattner5ba61f02006-10-14 07:39:34 +0000233
Torok Edwinb2b37c62009-06-30 17:10:35 +0000234template<typename Target>
235class DarwinTargetInfo : public OSTargetInfo<Target> {
236protected:
Craig Topper3164f332014-03-11 03:39:26 +0000237 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
238 MacroBuilder &Builder) const override {
Eric Christopher0c912c52011-07-07 22:55:26 +0000239 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
Douglas Gregor20b2ebd2011-03-23 00:50:03 +0000240 this->PlatformMinVersion);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000241 }
Mike Stump11289f42009-09-09 15:08:12 +0000242
Torok Edwinb2b37c62009-06-30 17:10:35 +0000243public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000244 DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
245 : OSTargetInfo<Target>(Triple, Opts) {
Tim Northovera12d0a92016-01-07 09:04:46 +0000246 // By default, no TLS, and we whitelist permitted architecture/OS
247 // combinations.
248 this->TLSSupported = false;
249
250 if (Triple.isMacOSX())
251 this->TLSSupported = !Triple.isMacOSXVersionLT(10, 7);
252 else if (Triple.isiOS()) {
253 // 64-bit iOS supported it from 8 onwards, 32-bit from 9 onwards.
254 if (Triple.getArch() == llvm::Triple::x86_64 ||
255 Triple.getArch() == llvm::Triple::aarch64)
256 this->TLSSupported = !Triple.isOSVersionLT(8);
257 else if (Triple.getArch() == llvm::Triple::x86 ||
258 Triple.getArch() == llvm::Triple::arm ||
259 Triple.getArch() == llvm::Triple::thumb)
260 this->TLSSupported = !Triple.isOSVersionLT(9);
261 } else if (Triple.isWatchOS())
262 this->TLSSupported = !Triple.isOSVersionLT(2);
263
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000264 this->MCountName = "\01mcount";
265 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000266
Craig Topper3164f332014-03-11 03:39:26 +0000267 std::string isValidSectionSpecifier(StringRef SR) const override {
Chris Lattner30ba6742009-08-10 19:03:04 +0000268 // Let MCSectionMachO validate this.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000269 StringRef Segment, Section;
Chris Lattner30ba6742009-08-10 19:03:04 +0000270 unsigned TAA, StubSize;
Daniel Dunbar75942372011-03-19 02:06:21 +0000271 bool HasTAA;
Chris Lattner30ba6742009-08-10 19:03:04 +0000272 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
Daniel Dunbar75942372011-03-19 02:06:21 +0000273 TAA, HasTAA, StubSize);
Chris Lattner30ba6742009-08-10 19:03:04 +0000274 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000275
Craig Topper3164f332014-03-11 03:39:26 +0000276 const char *getStaticInitSectionSpecifier() const override {
Anders Carlsson851318a2010-06-08 22:47:50 +0000277 // FIXME: We should return 0 when building kexts.
278 return "__TEXT,__StaticInit,regular,pure_instructions";
279 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +0000280
John McCalleed64c72012-01-29 01:20:30 +0000281 /// Darwin does not support protected visibility. Darwin's "default"
282 /// is very similar to ELF's "protected"; Darwin requires a "weak"
283 /// attribute on declarations that can be dynamically replaced.
Craig Topper3164f332014-03-11 03:39:26 +0000284 bool hasProtectedVisibility() const override {
John McCalleed64c72012-01-29 01:20:30 +0000285 return false;
286 }
Akira Hatanaka68ab7fe2016-03-31 06:36:07 +0000287
288 unsigned getExnObjectAlignment() const override {
289 // The alignment of an exception object is 8-bytes for darwin since
290 // libc++abi doesn't declare _Unwind_Exception with __attribute__((aligned))
291 // and therefore doesn't guarantee 16-byte alignment.
292 return 64;
293 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000294};
295
Chris Lattner30ba6742009-08-10 19:03:04 +0000296
Torok Edwinb2b37c62009-06-30 17:10:35 +0000297// DragonFlyBSD Target
298template<typename Target>
299class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
300protected:
Craig Topper3164f332014-03-11 03:39:26 +0000301 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
302 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000303 // DragonFly defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000304 Builder.defineMacro("__DragonFly__");
305 Builder.defineMacro("__DragonFly_cc_version", "100001");
306 Builder.defineMacro("__ELF__");
307 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
308 Builder.defineMacro("__tune_i386__");
309 DefineStd(Builder, "unix", Opts);
Torok Edwinb2b37c62009-06-30 17:10:35 +0000310 }
311public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000312 DragonFlyBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
313 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000314 switch (Triple.getArch()) {
315 default:
316 case llvm::Triple::x86:
317 case llvm::Triple::x86_64:
318 this->MCountName = ".mcount";
319 break;
320 }
Eli Friedman4286fba2012-02-10 23:02:29 +0000321 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000322};
323
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000324#ifndef FREEBSD_CC_VERSION
325#define FREEBSD_CC_VERSION 0U
326#endif
327
Torok Edwinb2b37c62009-06-30 17:10:35 +0000328// FreeBSD Target
329template<typename Target>
330class FreeBSDTargetInfo : public OSTargetInfo<Target> {
331protected:
Craig Topper3164f332014-03-11 03:39:26 +0000332 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
333 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000334 // FreeBSD defines; list based off of gcc output
335
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000336 unsigned Release = Triple.getOSMajorVersion();
337 if (Release == 0U)
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000338 Release = 8U;
339 unsigned CCVersion = FREEBSD_CC_VERSION;
340 if (CCVersion == 0U)
341 CCVersion = Release * 100000U + 1U;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000342
Benjamin Kramer80ca4072011-10-18 10:10:08 +0000343 Builder.defineMacro("__FreeBSD__", Twine(Release));
Dimitry Andricc6d924c2016-05-20 17:27:22 +0000344 Builder.defineMacro("__FreeBSD_cc_version", Twine(CCVersion));
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000345 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
346 DefineStd(Builder, "unix", Opts);
347 Builder.defineMacro("__ELF__");
Ed Schoutend0621462013-09-29 07:54:52 +0000348
349 // On FreeBSD, wchar_t contains the number of the code point as
350 // used by the character set of the locale. These character sets are
351 // not necessarily a superset of ASCII.
Richard Smith00a4a852015-01-13 01:47:45 +0000352 //
353 // FIXME: This is wrong; the macro refers to the numerical values
354 // of wchar_t *literals*, which are not locale-dependent. However,
355 // FreeBSD systems apparently depend on us getting this wrong, and
356 // setting this to 1 is conforming even if all the basic source
357 // character literals have the same encoding as char and wchar_t.
Ed Schoutend0621462013-09-29 07:54:52 +0000358 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000359 }
360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000361 FreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
362 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000363 switch (Triple.getArch()) {
364 default:
365 case llvm::Triple::x86:
366 case llvm::Triple::x86_64:
367 this->MCountName = ".mcount";
368 break;
369 case llvm::Triple::mips:
370 case llvm::Triple::mipsel:
371 case llvm::Triple::ppc:
372 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +0000373 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000374 this->MCountName = "_mcount";
375 break;
376 case llvm::Triple::arm:
377 this->MCountName = "__mcount";
378 break;
Duncan Sands9cb27e92009-07-08 13:55:08 +0000379 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000380 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000381};
382
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000383// GNU/kFreeBSD Target
384template<typename Target>
385class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
386protected:
Craig Topper3164f332014-03-11 03:39:26 +0000387 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
388 MacroBuilder &Builder) const override {
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000389 // GNU/kFreeBSD defines; list based off of gcc output
390
391 DefineStd(Builder, "unix", Opts);
392 Builder.defineMacro("__FreeBSD_kernel__");
393 Builder.defineMacro("__GLIBC__");
394 Builder.defineMacro("__ELF__");
395 if (Opts.POSIXThreads)
396 Builder.defineMacro("_REENTRANT");
397 if (Opts.CPlusPlus)
398 Builder.defineMacro("_GNU_SOURCE");
399 }
400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000401 KFreeBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
402 : OSTargetInfo<Target>(Triple, Opts) {}
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000403};
404
Reid Kleckner330fb172016-05-11 16:19:05 +0000405// Haiku Target
406template<typename Target>
407class HaikuTargetInfo : public OSTargetInfo<Target> {
408protected:
409 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
410 MacroBuilder &Builder) const override {
411 // Haiku defines; list based off of gcc output
412 Builder.defineMacro("__HAIKU__");
413 Builder.defineMacro("__ELF__");
414 DefineStd(Builder, "unix", Opts);
415 }
416public:
417 HaikuTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
418 : OSTargetInfo<Target>(Triple, Opts) {
419 this->SizeType = TargetInfo::UnsignedLong;
420 this->IntPtrType = TargetInfo::SignedLong;
421 this->PtrDiffType = TargetInfo::SignedLong;
422 this->ProcessIDType = TargetInfo::SignedLong;
423 this->TLSSupported = false;
424
425 }
426};
427
Chris Lattner3e2ee142010-07-07 16:01:42 +0000428// Minix Target
429template<typename Target>
430class MinixTargetInfo : public OSTargetInfo<Target> {
431protected:
Craig Topper3164f332014-03-11 03:39:26 +0000432 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
433 MacroBuilder &Builder) const override {
Chris Lattner3e2ee142010-07-07 16:01:42 +0000434 // Minix defines
435
436 Builder.defineMacro("__minix", "3");
437 Builder.defineMacro("_EM_WSIZE", "4");
438 Builder.defineMacro("_EM_PSIZE", "4");
439 Builder.defineMacro("_EM_SSIZE", "2");
440 Builder.defineMacro("_EM_LSIZE", "4");
441 Builder.defineMacro("_EM_FSIZE", "4");
442 Builder.defineMacro("_EM_DSIZE", "8");
Eli Friedman83de5132011-12-08 23:54:21 +0000443 Builder.defineMacro("__ELF__");
Chris Lattner3e2ee142010-07-07 16:01:42 +0000444 DefineStd(Builder, "unix", Opts);
445 }
446public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000447 MinixTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
448 : OSTargetInfo<Target>(Triple, Opts) {}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000449};
450
Torok Edwinb2b37c62009-06-30 17:10:35 +0000451// Linux target
452template<typename Target>
453class LinuxTargetInfo : public OSTargetInfo<Target> {
454protected:
Craig Topper3164f332014-03-11 03:39:26 +0000455 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
456 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000457 // Linux defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000458 DefineStd(Builder, "unix", Opts);
459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
468 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000469 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000470 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000471 if (Opts.CPlusPlus)
472 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000473 if (this->HasFloat128)
474 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000475 }
476public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000477 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
478 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000479 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000480
481 switch (Triple.getArch()) {
482 default:
483 break;
484 case llvm::Triple::ppc:
485 case llvm::Triple::ppc64:
486 case llvm::Triple::ppc64le:
487 this->MCountName = "_mcount";
488 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000489 case llvm::Triple::x86:
490 case llvm::Triple::x86_64:
491 case llvm::Triple::systemz:
492 this->HasFloat128 = true;
493 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000494 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000495 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000496
Craig Topper3164f332014-03-11 03:39:26 +0000497 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000498 return ".text.startup";
499 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000500};
501
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000502// NetBSD Target
503template<typename Target>
504class NetBSDTargetInfo : public OSTargetInfo<Target> {
505protected:
Craig Topper3164f332014-03-11 03:39:26 +0000506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000508 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000509 Builder.defineMacro("__NetBSD__");
510 Builder.defineMacro("__unix__");
511 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000512 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000513 Builder.defineMacro("_POSIX_THREADS");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000514
515 switch (Triple.getArch()) {
516 default:
517 break;
518 case llvm::Triple::arm:
519 case llvm::Triple::armeb:
520 case llvm::Triple::thumb:
521 case llvm::Triple::thumbeb:
522 Builder.defineMacro("__ARM_DWARF_EH__");
523 break;
524 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000525 }
526public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000527 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
528 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000529 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000530 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000531};
532
Torok Edwinb2b37c62009-06-30 17:10:35 +0000533// OpenBSD Target
534template<typename Target>
535class OpenBSDTargetInfo : public OSTargetInfo<Target> {
536protected:
Craig Topper3164f332014-03-11 03:39:26 +0000537 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
538 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000539 // OpenBSD defines; list based off of gcc output
540
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000541 Builder.defineMacro("__OpenBSD__");
542 DefineStd(Builder, "unix", Opts);
543 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000544 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000545 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000546 }
547public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000548 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
549 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000550 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000551
Eli Friedman3715d1f2011-12-15 02:15:56 +0000552 switch (Triple.getArch()) {
553 default:
554 case llvm::Triple::x86:
555 case llvm::Triple::x86_64:
556 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000557 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000558 this->MCountName = "__mcount";
559 break;
560 case llvm::Triple::mips64:
561 case llvm::Triple::mips64el:
562 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000563 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000564 this->MCountName = "_mcount";
565 break;
566 }
567 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000568};
569
Eli Friedman9fa28852012-08-08 23:57:20 +0000570// Bitrig Target
571template<typename Target>
572class BitrigTargetInfo : public OSTargetInfo<Target> {
573protected:
Craig Topper3164f332014-03-11 03:39:26 +0000574 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
575 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000576 // Bitrig defines; list based off of gcc output
577
578 Builder.defineMacro("__Bitrig__");
579 DefineStd(Builder, "unix", Opts);
580 Builder.defineMacro("__ELF__");
581 if (Opts.POSIXThreads)
582 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000583
584 switch (Triple.getArch()) {
585 default:
586 break;
587 case llvm::Triple::arm:
588 case llvm::Triple::armeb:
589 case llvm::Triple::thumb:
590 case llvm::Triple::thumbeb:
591 Builder.defineMacro("__ARM_DWARF_EH__");
592 break;
593 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000594 }
595public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000596 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
597 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000598 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000599 }
600};
601
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000602// PSP Target
603template<typename Target>
604class PSPTargetInfo : public OSTargetInfo<Target> {
605protected:
Craig Topper3164f332014-03-11 03:39:26 +0000606 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
607 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000608 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000609 Builder.defineMacro("PSP");
610 Builder.defineMacro("_PSP");
611 Builder.defineMacro("__psp__");
612 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000613 }
614public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000615 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000616};
617
John Thompsone467e192009-11-19 17:18:50 +0000618// PS3 PPU Target
619template<typename Target>
620class PS3PPUTargetInfo : public OSTargetInfo<Target> {
621protected:
Craig Topper3164f332014-03-11 03:39:26 +0000622 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
623 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000624 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000625 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000626 Builder.defineMacro("__PPU__");
627 Builder.defineMacro("__CELLOS_LV2__");
628 Builder.defineMacro("__ELF__");
629 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000630 Builder.defineMacro("_ARCH_PPC64");
631 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000632 }
633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000634 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
635 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000636 this->LongWidth = this->LongAlign = 32;
637 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000638 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000639 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000640 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000641 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000642 }
643};
644
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000645template <typename Target>
646class PS4OSTargetInfo : public OSTargetInfo<Target> {
647protected:
648 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
649 MacroBuilder &Builder) const override {
650 Builder.defineMacro("__FreeBSD__", "9");
651 Builder.defineMacro("__FreeBSD_cc_version", "900001");
652 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
653 DefineStd(Builder, "unix", Opts);
654 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000655 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 }
657public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000658 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
659 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000660 this->WCharType = this->UnsignedShort;
661
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000662 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
663 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000664
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000665 // On PS4, do not honor explicit bit field alignment,
666 // as in "__attribute__((aligned(2))) int b : 1;".
667 this->UseExplicitBitFieldAlignment = false;
668
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000669 switch (Triple.getArch()) {
670 default:
671 case llvm::Triple::x86_64:
672 this->MCountName = ".mcount";
673 break;
674 }
675 }
676};
677
Torok Edwinb2b37c62009-06-30 17:10:35 +0000678// Solaris target
679template<typename Target>
680class SolarisTargetInfo : public OSTargetInfo<Target> {
681protected:
Craig Topper3164f332014-03-11 03:39:26 +0000682 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
683 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000684 DefineStd(Builder, "sun", Opts);
685 DefineStd(Builder, "unix", Opts);
686 Builder.defineMacro("__ELF__");
687 Builder.defineMacro("__svr4__");
688 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000689 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
690 // newer, but to 500 for everything else. feature_test.h has a check to
691 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000692 // with a new version.
693 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000694 Builder.defineMacro("_XOPEN_SOURCE", "600");
695 else
696 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000697 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000698 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000699 Builder.defineMacro("_LARGEFILE_SOURCE");
700 Builder.defineMacro("_LARGEFILE64_SOURCE");
701 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000702 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000703 }
704public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000705 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
706 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000707 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000708 // FIXME: WIntType should be SignedLong
709 }
710};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000711
712// Windows target
713template<typename Target>
714class WindowsTargetInfo : public OSTargetInfo<Target> {
715protected:
Craig Topper3164f332014-03-11 03:39:26 +0000716 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
717 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000718 Builder.defineMacro("_WIN32");
719 }
720 void getVisualStudioDefines(const LangOptions &Opts,
721 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000722 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000723 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 Builder.defineMacro("_CPPRTTI");
725
Reid Kleckner16514352015-01-30 21:42:55 +0000726 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000727 Builder.defineMacro("_CPPUNWIND");
728 }
729
David Majnemer6a658902015-07-22 22:36:26 +0000730 if (Opts.Bool)
731 Builder.defineMacro("__BOOL_DEFINED");
732
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000733 if (!Opts.CharIsSigned)
734 Builder.defineMacro("_CHAR_UNSIGNED");
735
736 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
737 // but it works for now.
738 if (Opts.POSIXThreads)
739 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000740
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000741 if (Opts.MSCompatibilityVersion) {
742 Builder.defineMacro("_MSC_VER",
743 Twine(Opts.MSCompatibilityVersion / 100000));
744 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000745 // FIXME We cannot encode the revision information into 32-bits
746 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000747
David Majnemerb710a932015-05-11 03:57:49 +0000748 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000749 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000750
751 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
752 if (Opts.CPlusPlus1z)
753 Builder.defineMacro("_MSVC_LANG", "201403L");
754 else if (Opts.CPlusPlus14)
755 Builder.defineMacro("_MSVC_LANG", "201402L");
756 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000757 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000758
759 if (Opts.MicrosoftExt) {
760 Builder.defineMacro("_MSC_EXTENSIONS");
761
762 if (Opts.CPlusPlus11) {
763 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
764 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
765 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
766 }
767 }
768
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000769 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000770 }
771
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000773 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
774 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000775};
776
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000777template <typename Target>
778class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000779protected:
Craig Topper3164f332014-03-11 03:39:26 +0000780 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
781 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000782 if (Opts.POSIXThreads)
783 Builder.defineMacro("_REENTRANT");
784 if (Opts.CPlusPlus)
785 Builder.defineMacro("_GNU_SOURCE");
786
787 DefineStd(Builder, "unix", Opts);
788 Builder.defineMacro("__ELF__");
789 Builder.defineMacro("__native_client__");
790 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000791
792public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000793 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
794 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000795 this->LongAlign = 32;
796 this->LongWidth = 32;
797 this->PointerAlign = 32;
798 this->PointerWidth = 32;
799 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000800 this->Int64Type = TargetInfo::SignedLongLong;
801 this->DoubleAlign = 64;
802 this->LongDoubleWidth = 64;
803 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000804 this->LongLongWidth = 64;
805 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000806 this->SizeType = TargetInfo::UnsignedInt;
807 this->PtrDiffType = TargetInfo::SignedInt;
808 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000809 // RegParmMax is inherited from the underlying architecture.
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000810 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Rafael Espindola1c09b262013-12-18 23:41:04 +0000811 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000812 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000814 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else {
820 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000821 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000822 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000823 }
824};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000825
Dan Gohmanc2853072015-09-03 22:51:53 +0000826// WebAssembly target
827template <typename Target>
828class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
829 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000830 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000831 // A common platform macro.
832 if (Opts.POSIXThreads)
833 Builder.defineMacro("_REENTRANT");
834 // Follow g++ convention and predefine _GNU_SOURCE for C++.
835 if (Opts.CPlusPlus)
836 Builder.defineMacro("_GNU_SOURCE");
837 }
838
839 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000840 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000841 return ".text.__startup";
842 }
843
844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000845 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
846 const TargetOptions &Opts)
847 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000848 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000849 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
850 }
851};
Dan Gohmanc2853072015-09-03 22:51:53 +0000852
Chris Lattner09d98f52008-10-05 21:50:58 +0000853//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000854// Specific target implementations.
855//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000856
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000857// PPC abstract base class
858class PPCTargetInfo : public TargetInfo {
859 static const Builtin::Info BuiltinInfo[];
860 static const char * const GCCRegNames[];
861 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000862 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000863
864 // Target cpu features.
865 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000866 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000867 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000868 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000869 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000870 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000871 bool HasBPERMD;
872 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000873 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000874
Ulrich Weigand8afad612014-07-28 13:17:52 +0000875protected:
876 std::string ABI;
877
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000879 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000880 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
881 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000882 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000883 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000884 LongDoubleWidth = LongDoubleAlign = 128;
885 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
886 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000887
Hal Finkel6b984f02012-07-03 16:51:04 +0000888 /// \brief Flags for architecture specific defines.
889 typedef enum {
890 ArchDefineNone = 0,
891 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
892 ArchDefinePpcgr = 1 << 1,
893 ArchDefinePpcsq = 1 << 2,
894 ArchDefine440 = 1 << 3,
895 ArchDefine603 = 1 << 4,
896 ArchDefine604 = 1 << 5,
897 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000898 ArchDefinePwr5 = 1 << 7,
899 ArchDefinePwr5x = 1 << 8,
900 ArchDefinePwr6 = 1 << 9,
901 ArchDefinePwr6x = 1 << 10,
902 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000903 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000904 ArchDefinePwr9 = 1 << 13,
905 ArchDefineA2 = 1 << 14,
906 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000907 } ArchDefineTypes;
908
Bill Schmidt38378a02013-02-01 20:23:10 +0000909 // Note: GCC recognizes the following additional cpus:
910 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
911 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
912 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000913 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000914 bool CPUKnown = llvm::StringSwitch<bool>(Name)
915 .Case("generic", true)
916 .Case("440", true)
917 .Case("450", true)
918 .Case("601", true)
919 .Case("602", true)
920 .Case("603", true)
921 .Case("603e", true)
922 .Case("603ev", true)
923 .Case("604", true)
924 .Case("604e", true)
925 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000926 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000927 .Case("g3", true)
928 .Case("7400", true)
929 .Case("g4", true)
930 .Case("7450", true)
931 .Case("g4+", true)
932 .Case("750", true)
933 .Case("970", true)
934 .Case("g5", true)
935 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000936 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000937 .Case("e500mc", true)
938 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000939 .Case("power3", true)
940 .Case("pwr3", true)
941 .Case("power4", true)
942 .Case("pwr4", true)
943 .Case("power5", true)
944 .Case("pwr5", true)
945 .Case("power5x", true)
946 .Case("pwr5x", true)
947 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000948 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000949 .Case("power6x", true)
950 .Case("pwr6x", true)
951 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000952 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000953 .Case("power8", true)
954 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000955 .Case("power9", true)
956 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000957 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000958 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000959 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000960 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000961 .Case("powerpc64le", true)
962 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000963 .Default(false);
964
965 if (CPUKnown)
966 CPU = Name;
967
968 return CPUKnown;
969 }
970
Ulrich Weigand8afad612014-07-28 13:17:52 +0000971
972 StringRef getABI() const override { return ABI; }
973
Craig Topper6c03a542015-10-19 04:51:35 +0000974 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
975 return llvm::makeArrayRef(BuiltinInfo,
976 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +0000977 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000978
Craig Topper3164f332014-03-11 03:39:26 +0000979 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +0000980
Craig Topper3164f332014-03-11 03:39:26 +0000981 void getTargetDefines(const LangOptions &Opts,
982 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +0000983
Eric Christopher8c47b422015-10-09 18:39:55 +0000984 bool
985 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
986 StringRef CPU,
987 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +0000988
Craig Topper3164f332014-03-11 03:39:26 +0000989 bool handleTargetFeatures(std::vector<std::string> &Features,
990 DiagnosticsEngine &Diags) override;
991 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +0000992 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
993 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +0000994
Craig Topperf054e3a2015-10-19 03:52:27 +0000995 ArrayRef<const char *> getGCCRegNames() const override;
996 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +0000997 bool validateAsmConstraint(const char *&Name,
998 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +0000999 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001000 default: return false;
1001 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001002 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001003 case 'b': // Base register
1004 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001005 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001006 break;
1007 // FIXME: The following are added to allow parsing.
1008 // I just took a guess at what the actions should be.
1009 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001010 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001011 case 'v': // Altivec vector register
1012 Info.setAllowsRegister();
1013 break;
1014 case 'w':
1015 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001016 case 'd':// VSX vector register to hold vector double data
1017 case 'f':// VSX vector register to hold vector float data
1018 case 's':// VSX vector register to hold scalar float data
1019 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001020 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001021 break;
1022 default:
1023 return false;
1024 }
1025 Info.setAllowsRegister();
1026 Name++; // Skip over 'w'.
1027 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001028 case 'h': // `MQ', `CTR', or `LINK' register
1029 case 'q': // `MQ' register
1030 case 'c': // `CTR' register
1031 case 'l': // `LINK' register
1032 case 'x': // `CR' register (condition register) number 0
1033 case 'y': // `CR' register (condition register)
1034 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001035 Info.setAllowsRegister();
1036 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001037 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001038 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001039 // (use `L' instead for SImode constants)
1040 case 'K': // Unsigned 16-bit constant
1041 case 'L': // Signed 16-bit constant shifted left 16 bits
1042 case 'M': // Constant larger than 31
1043 case 'N': // Exact power of 2
1044 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001045 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001046 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001047 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001048 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001049 break;
1050 case 'm': // Memory operand. Note that on PowerPC targets, m can
1051 // include addresses that update the base register. It
1052 // is therefore only safe to use `m' in an asm statement
1053 // if that asm statement accesses the operand exactly once.
1054 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001055 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001056 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001057 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001058 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001059 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1060 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 // register to be updated.
1062 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001063 if (Name[1] != 's')
1064 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001065 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001066 // include any automodification of the base register. Unlike
1067 // `m', this constraint can be used in asm statements that
1068 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001069 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001070 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001071 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001072 break;
1073 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001074 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001075 case 'Z': // Memory operand that is an indexed or indirect from a
1076 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001077 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001078 Info.setAllowsMemory();
1079 Info.setAllowsRegister();
1080 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001081 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001082 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001083 // register (`p' is preferable for asm statements)
1084 case 'S': // Constant suitable as a 64-bit mask operand
1085 case 'T': // Constant suitable as a 32-bit mask operand
1086 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001087 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001088 // instructions
1089 case 'W': // Vector constant that does not require memory
1090 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001091 break;
1092 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001093 }
John Thompson07a61a42010-06-24 22:44:13 +00001094 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001095 }
Craig Topper3164f332014-03-11 03:39:26 +00001096 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001097 std::string R;
1098 switch (*Constraint) {
1099 case 'e':
1100 case 'w':
1101 // Two-character constraint; add "^" hint for later parsing.
1102 R = std::string("^") + std::string(Constraint, 2);
1103 Constraint++;
1104 break;
1105 default:
1106 return TargetInfo::convertConstraint(Constraint);
1107 }
1108 return R;
1109 }
Craig Topper3164f332014-03-11 03:39:26 +00001110 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001111 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001112 }
Craig Topper3164f332014-03-11 03:39:26 +00001113 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001114 if (RegNo == 0) return 3;
1115 if (RegNo == 1) return 4;
1116 return -1;
1117 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001118
1119 bool hasSjLjLowering() const override {
1120 return true;
1121 }
David Majnemer2617ea62015-06-09 18:05:33 +00001122
1123 bool useFloat128ManglingForLongDouble() const override {
1124 return LongDoubleWidth == 128 &&
1125 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble &&
1126 getTriple().isOSBinFormatELF();
1127 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001128};
Anders Carlssonf511f642007-11-27 04:11:28 +00001129
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001130const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001131#define BUILTIN(ID, TYPE, ATTRS) \
1132 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1133#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1134 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001135#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001136};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001137
Eric Christopher917e9522014-11-18 22:36:15 +00001138/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001139/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001140bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001141 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001142 for (const auto &Feature : Features) {
1143 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001144 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001145 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001146 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001147 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001148 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001149 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001150 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001151 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001152 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001153 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001154 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001155 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001156 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001157 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001158 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001159 } else if (Feature == "+float128") {
1160 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001161 } else if (Feature == "+power9-vector") {
1162 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001163 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001164 // TODO: Finish this list and add an assert that we've handled them
1165 // all.
1166 }
Eric Christopher02c33352015-08-25 00:59:11 +00001167
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001168 return true;
1169}
1170
Chris Lattnerecd49032009-03-02 22:27:17 +00001171/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1172/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001173void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001174 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001175 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001176 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001177 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001178 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001179 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001180 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001181 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001182 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001183 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001184 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001185 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001186 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001187
Chris Lattnerecd49032009-03-02 22:27:17 +00001188 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001189 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1190 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001191 } else {
1192 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1193 getTriple().getOS() != llvm::Triple::OpenBSD)
1194 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001195 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001196
Ulrich Weigand8afad612014-07-28 13:17:52 +00001197 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001198 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001199 Builder.defineMacro("_CALL_ELF", "1");
1200 if (ABI == "elfv2")
1201 Builder.defineMacro("_CALL_ELF", "2");
1202
Chris Lattnerecd49032009-03-02 22:27:17 +00001203 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1205 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001206
Chris Lattnerecd49032009-03-02 22:27:17 +00001207 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001208 if (LongDoubleWidth == 128)
1209 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001210
John Thompsone467e192009-11-19 17:18:50 +00001211 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001212 Builder.defineMacro("__VEC__", "10206");
1213 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001214 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001215
1216 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001217 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1218 .Case("440", ArchDefineName)
1219 .Case("450", ArchDefineName | ArchDefine440)
1220 .Case("601", ArchDefineName)
1221 .Case("602", ArchDefineName | ArchDefinePpcgr)
1222 .Case("603", ArchDefineName | ArchDefinePpcgr)
1223 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1224 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1225 .Case("604", ArchDefineName | ArchDefinePpcgr)
1226 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1227 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001228 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001229 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1230 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1231 .Case("750", ArchDefineName | ArchDefinePpcgr)
1232 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1233 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001234 .Case("a2", ArchDefineA2)
1235 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001236 .Case("pwr3", ArchDefinePpcgr)
1237 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1238 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1239 | ArchDefinePpcsq)
1240 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1241 | ArchDefinePpcgr | ArchDefinePpcsq)
1242 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1243 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1244 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1245 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1246 | ArchDefinePpcsq)
1247 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1248 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001249 | ArchDefinePpcgr | ArchDefinePpcsq)
1250 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1251 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1252 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001253 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1254 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1255 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1256 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001257 .Case("power3", ArchDefinePpcgr)
1258 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1259 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1260 | ArchDefinePpcsq)
1261 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1262 | ArchDefinePpcgr | ArchDefinePpcsq)
1263 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1264 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1265 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1266 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1267 | ArchDefinePpcsq)
1268 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1269 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001270 | ArchDefinePpcgr | ArchDefinePpcsq)
1271 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1272 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1273 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001274 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1275 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1276 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1277 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001278 .Default(ArchDefineNone);
1279
1280 if (defs & ArchDefineName)
1281 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1282 if (defs & ArchDefinePpcgr)
1283 Builder.defineMacro("_ARCH_PPCGR");
1284 if (defs & ArchDefinePpcsq)
1285 Builder.defineMacro("_ARCH_PPCSQ");
1286 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001287 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001288 if (defs & ArchDefine603)
1289 Builder.defineMacro("_ARCH_603");
1290 if (defs & ArchDefine604)
1291 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001292 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001293 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001294 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001295 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001296 if (defs & ArchDefinePwr5x)
1297 Builder.defineMacro("_ARCH_PWR5X");
1298 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001299 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001300 if (defs & ArchDefinePwr6x)
1301 Builder.defineMacro("_ARCH_PWR6X");
1302 if (defs & ArchDefinePwr7)
1303 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001304 if (defs & ArchDefinePwr8)
1305 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001306 if (defs & ArchDefinePwr9)
1307 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001308 if (defs & ArchDefineA2)
1309 Builder.defineMacro("_ARCH_A2");
1310 if (defs & ArchDefineA2q) {
1311 Builder.defineMacro("_ARCH_A2Q");
1312 Builder.defineMacro("_ARCH_QP");
1313 }
1314
1315 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1316 Builder.defineMacro("__bg__");
1317 Builder.defineMacro("__THW_BLUEGENE__");
1318 Builder.defineMacro("__bgq__");
1319 Builder.defineMacro("__TOS_BGQ__");
1320 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001321
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001322 if (HasVSX)
1323 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001324 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001325 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001326 if (HasP8Crypto)
1327 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001328 if (HasHTM)
1329 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001330 if (HasFloat128)
1331 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001332 if (HasP9Vector)
1333 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001334
1335 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1336 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1337 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1338 if (PointerWidth == 64)
1339 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001340
Bill Schmidt38378a02013-02-01 20:23:10 +00001341 // FIXME: The following are not yet generated here by Clang, but are
1342 // generated by GCC:
1343 //
1344 // _SOFT_FLOAT_
1345 // __RECIP_PRECISION__
1346 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001347 // __RECIP__
1348 // __RECIPF__
1349 // __RSQRTE__
1350 // __RSQRTEF__
1351 // _SOFT_DOUBLE_
1352 // __NO_LWSYNC__
1353 // __HAVE_BSWAP__
1354 // __LONGDOUBLE128
1355 // __CMODEL_MEDIUM__
1356 // __CMODEL_LARGE__
1357 // _CALL_SYSV
1358 // _CALL_DARWIN
1359 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001360}
1361
Eric Christophera8a14c32015-08-31 18:39:16 +00001362// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001363// explicitly turned off vsx and turned on any of:
1364// - power8-vector
1365// - direct-move
1366// - float128
1367// - power9-vector
1368// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001369// set of options.
1370static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001371 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001372
1373 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1374 FeaturesVec.end()) {
1375 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1376 FeaturesVec.end()) {
1377 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1378 << "-mno-vsx";
1379 return false;
1380 }
1381
1382 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1383 FeaturesVec.end()) {
1384 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1385 << "-mno-vsx";
1386 return false;
1387 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001388
1389 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1390 FeaturesVec.end()) {
1391 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1392 << "-mno-vsx";
1393 return false;
1394 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001395
1396 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1397 FeaturesVec.end()) {
1398 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1399 << "-mno-vsx";
1400 return false;
1401 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001402 }
1403
1404 return true;
1405}
1406
Eric Christopher8c47b422015-10-09 18:39:55 +00001407bool PPCTargetInfo::initFeatureMap(
1408 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1409 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001410 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1411 .Case("7400", true)
1412 .Case("g4", true)
1413 .Case("7450", true)
1414 .Case("g4+", true)
1415 .Case("970", true)
1416 .Case("g5", true)
1417 .Case("pwr6", true)
1418 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001419 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001420 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001421 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001422 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001423 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001424
1425 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001426 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001427 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1428 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001429 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001430 .Case("pwr8", true)
1431 .Default(false);
1432 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1433 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001434 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001435 .Case("pwr8", true)
1436 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001437 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1438 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001439 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001440 .Case("pwr8", true)
1441 .Case("pwr7", true)
1442 .Default(false);
1443 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1444 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001445 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001446 .Case("pwr8", true)
1447 .Case("pwr7", true)
1448 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001449 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1450 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001451 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001452 .Case("pwr8", true)
1453 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001454 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1455 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001456 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001457 .Case("pwr8", true)
1458 .Case("pwr7", true)
1459 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001460
Eric Christophera8a14c32015-08-31 18:39:16 +00001461 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1462 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001463
Eric Christopher007b0a02015-08-28 22:32:01 +00001464 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001465}
1466
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001467bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001468 return llvm::StringSwitch<bool>(Feature)
1469 .Case("powerpc", true)
1470 .Case("vsx", HasVSX)
1471 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001472 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001474 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001475 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001476 .Case("bpermd", HasBPERMD)
1477 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001478 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001479 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001480 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001481}
Chris Lattner17df24e2008-04-21 18:56:49 +00001482
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001483void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1484 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001485 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1486 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1487 // incompatible options.
1488 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001489 if (Name == "direct-move" ||
1490 Name == "power8-vector" ||
1491 Name == "float128" ||
1492 Name == "power9-vector") {
1493 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001494 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001495 if (Name == "power9-vector")
1496 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001497 } else {
1498 Features[Name] = true;
1499 }
1500 } else {
1501 if (Name == "vsx") {
1502 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001504 } else {
1505 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001506 }
1507 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001508}
1509
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001510const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001511 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1512 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1513 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1514 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1515 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1516 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1517 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1518 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001519 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001520 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001521 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001522 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1523 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1524 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1525 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001526 "vrsave", "vscr",
1527 "spe_acc", "spefscr",
1528 "sfp"
1529};
Chris Lattner10a5b382007-01-29 05:24:35 +00001530
Craig Topperf054e3a2015-10-19 03:52:27 +00001531ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1532 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001533}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001534
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001535const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1536 // While some of these aliases do map to different registers
1537 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001538 { { "0" }, "r0" },
1539 { { "1"}, "r1" },
1540 { { "2" }, "r2" },
1541 { { "3" }, "r3" },
1542 { { "4" }, "r4" },
1543 { { "5" }, "r5" },
1544 { { "6" }, "r6" },
1545 { { "7" }, "r7" },
1546 { { "8" }, "r8" },
1547 { { "9" }, "r9" },
1548 { { "10" }, "r10" },
1549 { { "11" }, "r11" },
1550 { { "12" }, "r12" },
1551 { { "13" }, "r13" },
1552 { { "14" }, "r14" },
1553 { { "15" }, "r15" },
1554 { { "16" }, "r16" },
1555 { { "17" }, "r17" },
1556 { { "18" }, "r18" },
1557 { { "19" }, "r19" },
1558 { { "20" }, "r20" },
1559 { { "21" }, "r21" },
1560 { { "22" }, "r22" },
1561 { { "23" }, "r23" },
1562 { { "24" }, "r24" },
1563 { { "25" }, "r25" },
1564 { { "26" }, "r26" },
1565 { { "27" }, "r27" },
1566 { { "28" }, "r28" },
1567 { { "29" }, "r29" },
1568 { { "30" }, "r30" },
1569 { { "31" }, "r31" },
1570 { { "fr0" }, "f0" },
1571 { { "fr1" }, "f1" },
1572 { { "fr2" }, "f2" },
1573 { { "fr3" }, "f3" },
1574 { { "fr4" }, "f4" },
1575 { { "fr5" }, "f5" },
1576 { { "fr6" }, "f6" },
1577 { { "fr7" }, "f7" },
1578 { { "fr8" }, "f8" },
1579 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001580 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001581 { { "fr11" }, "f11" },
1582 { { "fr12" }, "f12" },
1583 { { "fr13" }, "f13" },
1584 { { "fr14" }, "f14" },
1585 { { "fr15" }, "f15" },
1586 { { "fr16" }, "f16" },
1587 { { "fr17" }, "f17" },
1588 { { "fr18" }, "f18" },
1589 { { "fr19" }, "f19" },
1590 { { "fr20" }, "f20" },
1591 { { "fr21" }, "f21" },
1592 { { "fr22" }, "f22" },
1593 { { "fr23" }, "f23" },
1594 { { "fr24" }, "f24" },
1595 { { "fr25" }, "f25" },
1596 { { "fr26" }, "f26" },
1597 { { "fr27" }, "f27" },
1598 { { "fr28" }, "f28" },
1599 { { "fr29" }, "f29" },
1600 { { "fr30" }, "f30" },
1601 { { "fr31" }, "f31" },
1602 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001603};
1604
Craig Topperf054e3a2015-10-19 03:52:27 +00001605ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1606 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001607}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001608
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001609class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001610public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001611 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1612 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001613 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001614
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001615 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001616 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001617 case llvm::Triple::FreeBSD:
1618 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001619 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001620 PtrDiffType = SignedInt;
1621 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001622 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001623 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001624 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001625 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001626
Roman Divacky3ffe7462012-03-13 19:20:17 +00001627 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1628 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001629 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Roman Divacky3ffe7462012-03-13 19:20:17 +00001630 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001631
1632 // PPC32 supports atomics up to 4 bytes.
1633 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001634 }
1635
Craig Topper3164f332014-03-11 03:39:26 +00001636 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001637 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001638 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001639 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001640};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001641
Bill Schmidt778d3872013-07-26 01:36:11 +00001642// Note: ABI differences may eventually require us to have a separate
1643// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001644class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001645public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001646 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1647 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001648 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001649 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001650 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001651
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001652 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001653 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001654 ABI = "elfv2";
1655 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001656 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001657 ABI = "elfv1";
1658 }
1659
1660 switch (getTriple().getOS()) {
1661 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001662 LongDoubleWidth = LongDoubleAlign = 64;
Roman Divacky816dcd12012-03-13 16:53:54 +00001663 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001664 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001665 case llvm::Triple::NetBSD:
1666 IntMaxType = SignedLongLong;
1667 Int64Type = SignedLongLong;
1668 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001669 default:
1670 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001671 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001672
1673 // PPC64 supports atomics up to 8 bytes.
1674 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001675 }
Craig Topper3164f332014-03-11 03:39:26 +00001676 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001677 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001678 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001679 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001680 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001681 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001682 ABI = Name;
1683 return true;
1684 }
1685 return false;
1686 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001687};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001688
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001689class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001690public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001691 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1692 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001693 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001694 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001695 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001696 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001697 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001698 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001702 }
1703};
1704
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001705class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001707 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1708 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001709 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001710 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001711 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001712 }
1713};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714
Eric Christopherc48497a2015-09-18 21:26:24 +00001715static const unsigned NVPTXAddrSpaceMap[] = {
1716 1, // opencl_global
1717 3, // opencl_local
1718 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001719 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001720 0, // opencl_generic
1721 1, // cuda_device
1722 4, // cuda_constant
1723 3, // cuda_shared
1724};
1725
1726class NVPTXTargetInfo : public TargetInfo {
1727 static const char *const GCCRegNames[];
1728 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001729 CudaArch GPU;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001730
Eric Christopherc48497a2015-09-18 21:26:24 +00001731public:
Justin Lebar76945b22016-04-29 23:05:19 +00001732 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001733 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001734 TLSSupported = false;
1735 LongWidth = LongAlign = 64;
1736 AddrSpaceMap = &NVPTXAddrSpaceMap;
1737 UseAddrSpaceMapMangling = true;
1738 // Define available target features
1739 // These must be defined in sorted order!
1740 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001741 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001742
1743 // If possible, get a TargetInfo for our host triple, so we can match its
1744 // types.
1745 llvm::Triple HostTriple(Opts.HostTriple);
1746 if (HostTriple.isNVPTX())
1747 return;
1748 std::unique_ptr<TargetInfo> HostTarget(
1749 AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1750 if (!HostTarget) {
1751 return;
1752 }
1753
1754 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1755 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1756 BoolWidth = HostTarget->getBoolWidth();
1757 BoolAlign = HostTarget->getBoolAlign();
1758 IntWidth = HostTarget->getIntWidth();
1759 IntAlign = HostTarget->getIntAlign();
1760 HalfWidth = HostTarget->getHalfWidth();
1761 HalfAlign = HostTarget->getHalfAlign();
1762 FloatWidth = HostTarget->getFloatWidth();
1763 FloatAlign = HostTarget->getFloatAlign();
1764 DoubleWidth = HostTarget->getDoubleWidth();
1765 DoubleAlign = HostTarget->getDoubleAlign();
1766 LongWidth = HostTarget->getLongWidth();
1767 LongAlign = HostTarget->getLongAlign();
1768 LongLongWidth = HostTarget->getLongLongWidth();
1769 LongLongAlign = HostTarget->getLongLongAlign();
1770 MinGlobalAlign = HostTarget->getMinGlobalAlign();
1771 DefaultAlignForAttributeAligned =
1772 HostTarget->getDefaultAlignForAttributeAligned();
1773 SizeType = HostTarget->getSizeType();
1774 IntMaxType = HostTarget->getIntMaxType();
1775 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1776 IntPtrType = HostTarget->getIntPtrType();
1777 WCharType = HostTarget->getWCharType();
1778 WIntType = HostTarget->getWIntType();
1779 Char16Type = HostTarget->getChar16Type();
1780 Char32Type = HostTarget->getChar32Type();
1781 Int64Type = HostTarget->getInt64Type();
1782 SigAtomicType = HostTarget->getSigAtomicType();
1783 ProcessIDType = HostTarget->getProcessIDType();
1784
1785 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1786 UseZeroLengthBitfieldAlignment =
1787 HostTarget->useZeroLengthBitfieldAlignment();
1788 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1789 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1790
Justin Lebar5057f172016-09-09 20:35:43 +00001791 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1792 // we need those macros to be identical on host and device, because (among
1793 // other things) they affect which standard library classes are defined, and
1794 // we need all classes to be defined on both the host and device.
1795 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1796
Justin Lebar76945b22016-04-29 23:05:19 +00001797 // Properties intentionally not copied from host:
1798 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1799 // host/device boundary.
1800 // - SuitableAlign: Not visible across the host/device boundary, and may
1801 // correctly be different on host/device, e.g. if host has wider vector
1802 // types than device.
1803 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1804 // as its double type, but that's not necessarily true on the host.
1805 // TODO: nvcc emits a warning when using long double on device; we should
1806 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001807 }
1808 void getTargetDefines(const LangOptions &Opts,
1809 MacroBuilder &Builder) const override {
1810 Builder.defineMacro("__PTX__");
1811 Builder.defineMacro("__NVPTX__");
1812 if (Opts.CUDAIsDevice) {
1813 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001814 std::string CUDAArchCode = [this] {
1815 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001816 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001817 assert(false && "No GPU arch when compiling CUDA device code.");
1818 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001819 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001820 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001821 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001822 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001823 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001824 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001825 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001826 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001827 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001828 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001829 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001830 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001831 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001832 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001833 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001834 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001835 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001836 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001837 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001838 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001839 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001840 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001841 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001842 return "620";
1843 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001844 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001845 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001846 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001847 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001848 }
Craig Topper6c03a542015-10-19 04:51:35 +00001849 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1850 return llvm::makeArrayRef(BuiltinInfo,
1851 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001852 }
1853 bool hasFeature(StringRef Feature) const override {
1854 return Feature == "ptx" || Feature == "nvptx";
Peter Collingbournec947aae2012-05-20 23:28:41 +00001855 }
1856
Craig Topperf054e3a2015-10-19 03:52:27 +00001857 ArrayRef<const char *> getGCCRegNames() const override;
1858 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001859 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001860 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001861 }
1862 bool validateAsmConstraint(const char *&Name,
1863 TargetInfo::ConstraintInfo &Info) const override {
1864 switch (*Name) {
1865 default:
1866 return false;
1867 case 'c':
1868 case 'h':
1869 case 'r':
1870 case 'l':
1871 case 'f':
1872 case 'd':
1873 Info.setAllowsRegister();
1874 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001875 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001876 }
1877 const char *getClobbers() const override {
1878 // FIXME: Is this really right?
1879 return "";
1880 }
1881 BuiltinVaListKind getBuiltinVaListKind() const override {
1882 // FIXME: implement
1883 return TargetInfo::CharPtrBuiltinVaList;
1884 }
1885 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001886 GPU = StringToCudaArch(Name);
1887 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001888 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001889 void setSupportedOpenCLOpts() override {
1890 auto &Opts = getSupportedOpenCLOpts();
1891 Opts.cl_clang_storage_class_specifiers = 1;
1892 Opts.cl_khr_gl_sharing = 1;
1893 Opts.cl_khr_icd = 1;
1894
1895 Opts.cl_khr_fp64 = 1;
1896 Opts.cl_khr_byte_addressable_store = 1;
1897 Opts.cl_khr_global_int32_base_atomics = 1;
1898 Opts.cl_khr_global_int32_extended_atomics = 1;
1899 Opts.cl_khr_local_int32_base_atomics = 1;
1900 Opts.cl_khr_local_int32_extended_atomics = 1;
1901 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001902};
1903
1904const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1905#define BUILTIN(ID, TYPE, ATTRS) \
1906 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1907#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1908 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
1909#include "clang/Basic/BuiltinsNVPTX.def"
1910};
1911
1912const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1913
Craig Topperf054e3a2015-10-19 03:52:27 +00001914ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1915 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001916}
1917
1918class NVPTX32TargetInfo : public NVPTXTargetInfo {
1919public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001920 NVPTX32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1921 : NVPTXTargetInfo(Triple, Opts) {
Artem Belevich236cfdc2015-09-28 22:54:08 +00001922 LongWidth = LongAlign = 32;
Eric Christopherc48497a2015-09-18 21:26:24 +00001923 PointerWidth = PointerAlign = 32;
1924 SizeType = TargetInfo::UnsignedInt;
1925 PtrDiffType = TargetInfo::SignedInt;
1926 IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00001927 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001928 }
1929};
1930
1931class NVPTX64TargetInfo : public NVPTXTargetInfo {
1932public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001933 NVPTX64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1934 : NVPTXTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00001935 PointerWidth = PointerAlign = 64;
1936 SizeType = TargetInfo::UnsignedLong;
1937 PtrDiffType = TargetInfo::SignedLong;
1938 IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00001939 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
Eric Christopherc48497a2015-09-18 21:26:24 +00001940 }
1941};
Eli Friedmand13b41e2012-10-12 23:32:00 +00001942
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001943static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001944 1, // opencl_global
1945 3, // opencl_local
1946 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001947 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001948 1, // cuda_device
1949 2, // cuda_constant
1950 3 // cuda_shared
1951};
1952
Tom Stellarda96344b2014-08-21 13:58:40 +00001953// If you edit the description strings, make sure you update
1954// getPointerWidthV().
1955
Craig Topper273dbc62015-10-18 05:29:26 +00001956static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00001957 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1958 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001959
Craig Topper273dbc62015-10-18 05:29:26 +00001960static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00001961 "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 +00001962 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1963 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00001964
Matt Arsenault250024f2016-06-08 01:56:42 +00001965class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00001966 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00001967 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00001968
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001969 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00001970 enum GPUKind {
1971 GK_NONE,
1972 GK_R600,
1973 GK_R600_DOUBLE_OPS,
1974 GK_R700,
1975 GK_R700_DOUBLE_OPS,
1976 GK_EVERGREEN,
1977 GK_EVERGREEN_DOUBLE_OPS,
1978 GK_NORTHERN_ISLANDS,
1979 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001980 GK_GFX6,
1981 GK_GFX7,
1982 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00001983 } GPU;
1984
Jan Veselyeebeaea2015-05-04 19:53:36 +00001985 bool hasFP64:1;
1986 bool hasFMAF:1;
1987 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00001988 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00001989
Matt Arsenault250024f2016-06-08 01:56:42 +00001990 static bool isAMDGCN(const llvm::Triple &TT) {
1991 return TT.getArch() == llvm::Triple::amdgcn;
1992 }
1993
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00001995 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00001996 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00001997 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00001998 hasFP64(false),
1999 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002000 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002001 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002002 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002003 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002004 hasFMAF = true;
2005 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002006 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002007
2008 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2009 DataLayoutStringSI : DataLayoutStringR600);
2010
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002011 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002012 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002013 }
2014
Tom Stellarda96344b2014-08-21 13:58:40 +00002015 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2016 if (GPU <= GK_CAYMAN)
2017 return 32;
2018
2019 switch(AddrSpace) {
2020 default:
2021 return 64;
2022 case 0:
2023 case 3:
2024 case 5:
2025 return 32;
2026 }
2027 }
2028
Yaxun Liu26f75662016-08-19 05:17:25 +00002029 uint64_t getMaxPointerWidth() const override {
2030 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2031 }
2032
Craig Topper3164f332014-03-11 03:39:26 +00002033 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002034 return "";
2035 }
2036
Craig Topperf054e3a2015-10-19 03:52:27 +00002037 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002038
Craig Topperf054e3a2015-10-19 03:52:27 +00002039 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2040 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002041 }
2042
Craig Topper3164f332014-03-11 03:39:26 +00002043 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002044 TargetInfo::ConstraintInfo &Info) const override {
2045 switch (*Name) {
2046 default: break;
2047 case 'v': // vgpr
2048 case 's': // sgpr
2049 Info.setAllowsRegister();
2050 return true;
2051 }
2052 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002053 }
2054
Matt Arsenault250024f2016-06-08 01:56:42 +00002055 bool initFeatureMap(llvm::StringMap<bool> &Features,
2056 DiagnosticsEngine &Diags, StringRef CPU,
2057 const std::vector<std::string> &FeatureVec) const override;
2058
Yaxun Liu2c17e822016-08-09 19:43:38 +00002059 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2060 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002061 bool hasFP32Denormals = false;
2062 bool hasFP64Denormals = false;
2063 for (auto &I : TargetOpts.FeaturesAsWritten) {
2064 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2065 hasFP32Denormals = true;
2066 if (I == "+fp64-denormals" || I == "-fp64-denormals")
2067 hasFP64Denormals = true;
2068 }
2069 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002070 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2071 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
2072 // Always do not flush fp64 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002073 if (!hasFP64Denormals && hasFP64)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002074 TargetOpts.Features.push_back("+fp64-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002075 }
2076
Craig Topper6c03a542015-10-19 04:51:35 +00002077 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2078 return llvm::makeArrayRef(BuiltinInfo,
2079 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002080 }
2081
Craig Topper3164f332014-03-11 03:39:26 +00002082 void getTargetDefines(const LangOptions &Opts,
2083 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002084 if (getTriple().getArch() == llvm::Triple::amdgcn)
2085 Builder.defineMacro("__AMDGCN__");
2086 else
2087 Builder.defineMacro("__R600__");
2088
Jan Veselyeebeaea2015-05-04 19:53:36 +00002089 if (hasFMAF)
2090 Builder.defineMacro("__HAS_FMAF__");
2091 if (hasLDEXPF)
2092 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002093 if (hasFP64)
2094 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002095 }
2096
Craig Topper3164f332014-03-11 03:39:26 +00002097 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002098 return TargetInfo::CharPtrBuiltinVaList;
2099 }
2100
Matt Arsenault250024f2016-06-08 01:56:42 +00002101 static GPUKind parseR600Name(StringRef Name) {
2102 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002103 .Case("r600" , GK_R600)
2104 .Case("rv610", GK_R600)
2105 .Case("rv620", GK_R600)
2106 .Case("rv630", GK_R600)
2107 .Case("rv635", GK_R600)
2108 .Case("rs780", GK_R600)
2109 .Case("rs880", GK_R600)
2110 .Case("rv670", GK_R600_DOUBLE_OPS)
2111 .Case("rv710", GK_R700)
2112 .Case("rv730", GK_R700)
2113 .Case("rv740", GK_R700_DOUBLE_OPS)
2114 .Case("rv770", GK_R700_DOUBLE_OPS)
2115 .Case("palm", GK_EVERGREEN)
2116 .Case("cedar", GK_EVERGREEN)
2117 .Case("sumo", GK_EVERGREEN)
2118 .Case("sumo2", GK_EVERGREEN)
2119 .Case("redwood", GK_EVERGREEN)
2120 .Case("juniper", GK_EVERGREEN)
2121 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2122 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2123 .Case("barts", GK_NORTHERN_ISLANDS)
2124 .Case("turks", GK_NORTHERN_ISLANDS)
2125 .Case("caicos", GK_NORTHERN_ISLANDS)
2126 .Case("cayman", GK_CAYMAN)
2127 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002128 .Default(GK_NONE);
2129 }
2130
2131 static GPUKind parseAMDGCNName(StringRef Name) {
2132 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002133 .Case("tahiti", GK_GFX6)
2134 .Case("pitcairn", GK_GFX6)
2135 .Case("verde", GK_GFX6)
2136 .Case("oland", GK_GFX6)
2137 .Case("hainan", GK_GFX6)
2138 .Case("bonaire", GK_GFX7)
2139 .Case("kabini", GK_GFX7)
2140 .Case("kaveri", GK_GFX7)
2141 .Case("hawaii", GK_GFX7)
2142 .Case("mullins", GK_GFX7)
2143 .Case("tonga", GK_GFX8)
2144 .Case("iceland", GK_GFX8)
2145 .Case("carrizo", GK_GFX8)
2146 .Case("fiji", GK_GFX8)
2147 .Case("stoney", GK_GFX8)
2148 .Case("polaris10", GK_GFX8)
2149 .Case("polaris11", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002150 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002151 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002152
Matt Arsenault250024f2016-06-08 01:56:42 +00002153 bool setCPU(const std::string &Name) override {
2154 if (getTriple().getArch() == llvm::Triple::amdgcn)
2155 GPU = parseAMDGCNName(Name);
2156 else
2157 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002158
Matt Arsenault250024f2016-06-08 01:56:42 +00002159 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002160 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002161
Jan Vesely211ba782016-06-17 02:25:03 +00002162 void setSupportedOpenCLOpts() override {
2163 auto &Opts = getSupportedOpenCLOpts();
2164 Opts.cl_clang_storage_class_specifiers = 1;
2165 Opts.cl_khr_icd = 1;
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002166
Jan Vesely211ba782016-06-17 02:25:03 +00002167 if (hasFP64)
2168 Opts.cl_khr_fp64 = 1;
2169 if (GPU >= GK_EVERGREEN) {
2170 Opts.cl_khr_byte_addressable_store = 1;
2171 Opts.cl_khr_global_int32_base_atomics = 1;
2172 Opts.cl_khr_global_int32_extended_atomics = 1;
2173 Opts.cl_khr_local_int32_base_atomics = 1;
2174 Opts.cl_khr_local_int32_extended_atomics = 1;
2175 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002176 if (GPU >= GK_GFX6) {
Jan Vesely211ba782016-06-17 02:25:03 +00002177 Opts.cl_khr_fp16 = 1;
2178 Opts.cl_khr_int64_base_atomics = 1;
2179 Opts.cl_khr_int64_extended_atomics = 1;
Yaxun Liu3f9e9122016-07-29 17:52:34 +00002180 Opts.cl_khr_mipmap_image = 1;
Yaxun Liu93856802016-08-17 20:39:49 +00002181 Opts.cl_khr_subgroups = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002182 Opts.cl_khr_3d_image_writes = 1;
Yaxun Liu33174462016-08-16 20:49:49 +00002183 Opts.cl_amd_media_ops = 1;
2184 Opts.cl_amd_media_ops2 = 1;
Jan Vesely211ba782016-06-17 02:25:03 +00002185 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002186 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002187
Yaxun Liu99444cb2016-08-03 20:38:06 +00002188 LangAS::ID getOpenCLImageAddrSpace() const override {
2189 return LangAS::opencl_constant;
2190 }
2191
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002192 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2193 switch (CC) {
2194 default:
2195 return CCCR_Warning;
2196 case CC_C:
2197 case CC_OpenCLKernel:
2198 return CCCR_OK;
2199 }
2200 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002201};
2202
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002203const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002204#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002205 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002206#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2207 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002208#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002209};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002210const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002211 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2212 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2213 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2214 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2215 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2216 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2217 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2218 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2219 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2220 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2221 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2222 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2223 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2224 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2225 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2226 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2227 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2228 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2229 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2230 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2231 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2232 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2233 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2234 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2235 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2236 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2237 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2238 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2239 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2240 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2241 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2242 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2243 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2244 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2245 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2246 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2247 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2248 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2249 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2250 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2251 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2252 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2253 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2254 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2255 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2256 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2257 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002258 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002259 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2260 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002261};
2262
Craig Topperf054e3a2015-10-19 03:52:27 +00002263ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2264 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002265}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002266
Matt Arsenault250024f2016-06-08 01:56:42 +00002267bool AMDGPUTargetInfo::initFeatureMap(
2268 llvm::StringMap<bool> &Features,
2269 DiagnosticsEngine &Diags, StringRef CPU,
2270 const std::vector<std::string> &FeatureVec) const {
2271
2272 // XXX - What does the member GPU mean if device name string passed here?
2273 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2274 if (CPU.empty())
2275 CPU = "tahiti";
2276
2277 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002278 case GK_GFX6:
2279 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002280 break;
2281
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002282 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002283 Features["s-memrealtime"] = true;
2284 Features["16-bit-insts"] = true;
2285 break;
2286
2287 case GK_NONE:
2288 return false;
2289 default:
2290 llvm_unreachable("unhandled subtarget");
2291 }
2292 } else {
2293 if (CPU.empty())
2294 CPU = "r600";
2295
2296 switch (parseR600Name(CPU)) {
2297 case GK_R600:
2298 case GK_R700:
2299 case GK_EVERGREEN:
2300 case GK_NORTHERN_ISLANDS:
2301 break;
2302 case GK_R600_DOUBLE_OPS:
2303 case GK_R700_DOUBLE_OPS:
2304 case GK_EVERGREEN_DOUBLE_OPS:
2305 case GK_CAYMAN:
2306 Features["fp64"] = true;
2307 break;
2308 case GK_NONE:
2309 return false;
2310 default:
2311 llvm_unreachable("unhandled subtarget");
2312 }
2313 }
2314
2315 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2316}
2317
Eli Friedman3fd920a2008-08-20 02:34:37 +00002318// Namespace for x86 abstract base class
2319const Builtin::Info BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002320#define BUILTIN(ID, TYPE, ATTRS) \
2321 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002322#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
Craig Topper07d3b622015-08-07 05:14:44 +00002323 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002324#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002325 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002326#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2327 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002328#include "clang/Basic/BuiltinsX86.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002329};
Eli Friedmanb5366062008-05-20 14:21:01 +00002330
Nuno Lopescfca1f02009-12-23 17:49:57 +00002331static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002332 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2333 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002334 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002335 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2336 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2337 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002338 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002339 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2340 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002341 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2342 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2343 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2344 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2345 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2346 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2347 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2348 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002349};
2350
Eric Christophercdd36352011-06-21 00:05:20 +00002351const TargetInfo::AddlRegName AddlRegNames[] = {
2352 { { "al", "ah", "eax", "rax" }, 0 },
2353 { { "bl", "bh", "ebx", "rbx" }, 3 },
2354 { { "cl", "ch", "ecx", "rcx" }, 2 },
2355 { { "dl", "dh", "edx", "rdx" }, 1 },
2356 { { "esi", "rsi" }, 4 },
2357 { { "edi", "rdi" }, 5 },
2358 { { "esp", "rsp" }, 7 },
2359 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002360 { { "r8d", "r8w", "r8b" }, 38 },
2361 { { "r9d", "r9w", "r9b" }, 39 },
2362 { { "r10d", "r10w", "r10b" }, 40 },
2363 { { "r11d", "r11w", "r11b" }, 41 },
2364 { { "r12d", "r12w", "r12b" }, 42 },
2365 { { "r13d", "r13w", "r13b" }, 43 },
2366 { { "r14d", "r14w", "r14b" }, 44 },
2367 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002368};
2369
2370// X86 target abstract base class; x86-32 and x86-64 are very close, so
2371// most of the implementation can be shared.
2372class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002373 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002374 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002375 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002376 enum MMX3DNowEnum {
2377 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002378 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002379 enum XOPEnum {
2380 NoXOP,
2381 SSE4A,
2382 FMA4,
2383 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002384 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002385
Craig Topper543f3bd2015-10-14 23:47:57 +00002386 bool HasAES = false;
2387 bool HasPCLMUL = false;
2388 bool HasLZCNT = false;
2389 bool HasRDRND = false;
2390 bool HasFSGSBASE = false;
2391 bool HasBMI = false;
2392 bool HasBMI2 = false;
2393 bool HasPOPCNT = false;
2394 bool HasRTM = false;
2395 bool HasPRFCHW = false;
2396 bool HasRDSEED = false;
2397 bool HasADX = false;
2398 bool HasTBM = false;
2399 bool HasFMA = false;
2400 bool HasF16C = false;
2401 bool HasAVX512CD = false;
2402 bool HasAVX512ER = false;
2403 bool HasAVX512PF = false;
2404 bool HasAVX512DQ = false;
2405 bool HasAVX512BW = false;
2406 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002407 bool HasAVX512VBMI = false;
2408 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002409 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002410 bool HasMPX = false;
2411 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002412 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002413 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002414 bool HasXSAVE = false;
2415 bool HasXSAVEOPT = false;
2416 bool HasXSAVEC = false;
2417 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002418 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002419 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002420 bool HasCLFLUSHOPT = false;
2421 bool HasPCOMMIT = false;
2422 bool HasCLWB = false;
2423 bool HasUMIP = false;
2424 bool HasMOVBE = false;
2425 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002426
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002427 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2428 ///
2429 /// Each enumeration represents a particular CPU supported by Clang. These
2430 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2431 enum CPUKind {
2432 CK_Generic,
2433
2434 /// \name i386
2435 /// i386-generation processors.
2436 //@{
2437 CK_i386,
2438 //@}
2439
2440 /// \name i486
2441 /// i486-generation processors.
2442 //@{
2443 CK_i486,
2444 CK_WinChipC6,
2445 CK_WinChip2,
2446 CK_C3,
2447 //@}
2448
2449 /// \name i586
2450 /// i586-generation processors, P5 microarchitecture based.
2451 //@{
2452 CK_i586,
2453 CK_Pentium,
2454 CK_PentiumMMX,
2455 //@}
2456
2457 /// \name i686
2458 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2459 //@{
2460 CK_i686,
2461 CK_PentiumPro,
2462 CK_Pentium2,
2463 CK_Pentium3,
2464 CK_Pentium3M,
2465 CK_PentiumM,
2466 CK_C3_2,
2467
2468 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2469 /// Clang however has some logic to suport this.
2470 // FIXME: Warn, deprecate, and potentially remove this.
2471 CK_Yonah,
2472 //@}
2473
2474 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002475 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002476 //@{
2477 CK_Pentium4,
2478 CK_Pentium4M,
2479 CK_Prescott,
2480 CK_Nocona,
2481 //@}
2482
2483 /// \name Core
2484 /// Core microarchitecture based processors.
2485 //@{
2486 CK_Core2,
2487
2488 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2489 /// codename which GCC no longer accepts as an option to -march, but Clang
2490 /// has some logic for recognizing it.
2491 // FIXME: Warn, deprecate, and potentially remove this.
2492 CK_Penryn,
2493 //@}
2494
2495 /// \name Atom
2496 /// Atom processors
2497 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002498 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002499 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002500 //@}
2501
2502 /// \name Nehalem
2503 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002504 CK_Nehalem,
2505
2506 /// \name Westmere
2507 /// Westmere microarchitecture based processors.
2508 CK_Westmere,
2509
2510 /// \name Sandy Bridge
2511 /// Sandy Bridge microarchitecture based processors.
2512 CK_SandyBridge,
2513
2514 /// \name Ivy Bridge
2515 /// Ivy Bridge microarchitecture based processors.
2516 CK_IvyBridge,
2517
2518 /// \name Haswell
2519 /// Haswell microarchitecture based processors.
2520 CK_Haswell,
2521
2522 /// \name Broadwell
2523 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002524 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002525
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002526 /// \name Skylake Client
2527 /// Skylake client microarchitecture based processors.
2528 CK_SkylakeClient,
2529
2530 /// \name Skylake Server
2531 /// Skylake server microarchitecture based processors.
2532 CK_SkylakeServer,
2533
2534 /// \name Cannonlake Client
2535 /// Cannonlake client microarchitecture based processors.
2536 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002537
Craig Topper449314e2013-08-20 07:09:39 +00002538 /// \name Knights Landing
2539 /// Knights Landing processor.
2540 CK_KNL,
2541
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002542 /// \name Lakemont
2543 /// Lakemont microarchitecture based processors.
2544 CK_Lakemont,
2545
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002546 /// \name K6
2547 /// K6 architecture processors.
2548 //@{
2549 CK_K6,
2550 CK_K6_2,
2551 CK_K6_3,
2552 //@}
2553
2554 /// \name K7
2555 /// K7 architecture processors.
2556 //@{
2557 CK_Athlon,
2558 CK_AthlonThunderbird,
2559 CK_Athlon4,
2560 CK_AthlonXP,
2561 CK_AthlonMP,
2562 //@}
2563
2564 /// \name K8
2565 /// K8 architecture processors.
2566 //@{
2567 CK_Athlon64,
2568 CK_Athlon64SSE3,
2569 CK_AthlonFX,
2570 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002571 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002572 CK_Opteron,
2573 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002574 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002575 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002576
Benjamin Kramer569f2152012-01-10 11:50:18 +00002577 /// \name Bobcat
2578 /// Bobcat architecture processors.
2579 //@{
2580 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002581 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002582 //@}
2583
2584 /// \name Bulldozer
2585 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002586 //@{
2587 CK_BDVER1,
2588 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002589 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002590 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002591 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002592
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002593 /// This specification is deprecated and will be removed in the future.
2594 /// Users should prefer \see CK_K8.
2595 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002596 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002597 CK_x86_64,
2598 //@}
2599
2600 /// \name Geode
2601 /// Geode processors.
2602 //@{
2603 CK_Geode
2604 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002605 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002606
Eric Christopherc50738f2015-08-27 00:05:50 +00002607 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002608 return llvm::StringSwitch<CPUKind>(CPU)
2609 .Case("i386", CK_i386)
2610 .Case("i486", CK_i486)
2611 .Case("winchip-c6", CK_WinChipC6)
2612 .Case("winchip2", CK_WinChip2)
2613 .Case("c3", CK_C3)
2614 .Case("i586", CK_i586)
2615 .Case("pentium", CK_Pentium)
2616 .Case("pentium-mmx", CK_PentiumMMX)
2617 .Case("i686", CK_i686)
2618 .Case("pentiumpro", CK_PentiumPro)
2619 .Case("pentium2", CK_Pentium2)
2620 .Case("pentium3", CK_Pentium3)
2621 .Case("pentium3m", CK_Pentium3M)
2622 .Case("pentium-m", CK_PentiumM)
2623 .Case("c3-2", CK_C3_2)
2624 .Case("yonah", CK_Yonah)
2625 .Case("pentium4", CK_Pentium4)
2626 .Case("pentium4m", CK_Pentium4M)
2627 .Case("prescott", CK_Prescott)
2628 .Case("nocona", CK_Nocona)
2629 .Case("core2", CK_Core2)
2630 .Case("penryn", CK_Penryn)
2631 .Case("bonnell", CK_Bonnell)
2632 .Case("atom", CK_Bonnell) // Legacy name.
2633 .Case("silvermont", CK_Silvermont)
2634 .Case("slm", CK_Silvermont) // Legacy name.
2635 .Case("nehalem", CK_Nehalem)
2636 .Case("corei7", CK_Nehalem) // Legacy name.
2637 .Case("westmere", CK_Westmere)
2638 .Case("sandybridge", CK_SandyBridge)
2639 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2640 .Case("ivybridge", CK_IvyBridge)
2641 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2642 .Case("haswell", CK_Haswell)
2643 .Case("core-avx2", CK_Haswell) // Legacy name.
2644 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002645 .Case("skylake", CK_SkylakeClient)
2646 .Case("skylake-avx512", CK_SkylakeServer)
2647 .Case("skx", CK_SkylakeServer) // Legacy name.
2648 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002649 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002650 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002651 .Case("k6", CK_K6)
2652 .Case("k6-2", CK_K6_2)
2653 .Case("k6-3", CK_K6_3)
2654 .Case("athlon", CK_Athlon)
2655 .Case("athlon-tbird", CK_AthlonThunderbird)
2656 .Case("athlon-4", CK_Athlon4)
2657 .Case("athlon-xp", CK_AthlonXP)
2658 .Case("athlon-mp", CK_AthlonMP)
2659 .Case("athlon64", CK_Athlon64)
2660 .Case("athlon64-sse3", CK_Athlon64SSE3)
2661 .Case("athlon-fx", CK_AthlonFX)
2662 .Case("k8", CK_K8)
2663 .Case("k8-sse3", CK_K8SSE3)
2664 .Case("opteron", CK_Opteron)
2665 .Case("opteron-sse3", CK_OpteronSSE3)
2666 .Case("barcelona", CK_AMDFAM10)
2667 .Case("amdfam10", CK_AMDFAM10)
2668 .Case("btver1", CK_BTVER1)
2669 .Case("btver2", CK_BTVER2)
2670 .Case("bdver1", CK_BDVER1)
2671 .Case("bdver2", CK_BDVER2)
2672 .Case("bdver3", CK_BDVER3)
2673 .Case("bdver4", CK_BDVER4)
2674 .Case("x86-64", CK_x86_64)
2675 .Case("geode", CK_Geode)
2676 .Default(CK_Generic);
2677 }
2678
Rafael Espindolaeb265472013-08-21 21:59:03 +00002679 enum FPMathKind {
2680 FP_Default,
2681 FP_SSE,
2682 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002683 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002684
Eli Friedman3fd920a2008-08-20 02:34:37 +00002685public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002686 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2687 : TargetInfo(Triple) {
Andrey Bokhanko94e1d582015-11-05 12:43:09 +00002688 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
Chris Lattner1f5ad112006-10-14 18:32:12 +00002689 }
Craig Topper3164f332014-03-11 03:39:26 +00002690 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002691 // X87 evaluates with 80 bits "long double" precision.
2692 return SSELevel == NoSSE ? 2 : 0;
2693 }
Craig Topper6c03a542015-10-19 04:51:35 +00002694 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2695 return llvm::makeArrayRef(BuiltinInfo,
2696 clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00002697 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002698 ArrayRef<const char *> getGCCRegNames() const override {
2699 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002700 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002701 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2702 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002703 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002704 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2705 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002706 }
Eric Christopherd9832702015-06-29 21:00:05 +00002707 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002708 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002709 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002710
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002711 bool validateGlobalRegisterVariable(StringRef RegName,
2712 unsigned RegSize,
2713 bool &HasSizeMismatch) const override {
2714 // esp and ebp are the only 32-bit registers the x86 backend can currently
2715 // handle.
2716 if (RegName.equals("esp") || RegName.equals("ebp")) {
2717 // Check that the register size is 32-bit.
2718 HasSizeMismatch = RegSize != 32;
2719 return true;
2720 }
2721
2722 return false;
2723 }
2724
Akira Hatanaka974131e2014-09-18 18:17:18 +00002725 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2726
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002727 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2728
Akira Hatanaka974131e2014-09-18 18:17:18 +00002729 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2730
Craig Topper3164f332014-03-11 03:39:26 +00002731 std::string convertConstraint(const char *&Constraint) const override;
2732 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002733 return "~{dirflag},~{fpsr},~{flags}";
2734 }
Craig Topper3164f332014-03-11 03:39:26 +00002735 void getTargetDefines(const LangOptions &Opts,
2736 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002737 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2738 bool Enabled);
2739 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2740 bool Enabled);
2741 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2742 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002743 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2744 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002745 setFeatureEnabledImpl(Features, Name, Enabled);
2746 }
2747 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002748 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002749 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2750 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002751 bool
2752 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2753 StringRef CPU,
2754 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002755 bool hasFeature(StringRef Feature) const override;
2756 bool handleTargetFeatures(std::vector<std::string> &Features,
2757 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002758 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002759 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2760 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002761 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002762 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002763 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002764 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002765 return "no-mmx";
2766 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002767 }
Craig Topper3164f332014-03-11 03:39:26 +00002768 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002769 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002770
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002771 // Perform any per-CPU checks necessary to determine if this CPU is
2772 // acceptable.
2773 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2774 // invalid without explaining *why*.
2775 switch (CPU) {
2776 case CK_Generic:
2777 // No processor selected!
2778 return false;
2779
2780 case CK_i386:
2781 case CK_i486:
2782 case CK_WinChipC6:
2783 case CK_WinChip2:
2784 case CK_C3:
2785 case CK_i586:
2786 case CK_Pentium:
2787 case CK_PentiumMMX:
2788 case CK_i686:
2789 case CK_PentiumPro:
2790 case CK_Pentium2:
2791 case CK_Pentium3:
2792 case CK_Pentium3M:
2793 case CK_PentiumM:
2794 case CK_Yonah:
2795 case CK_C3_2:
2796 case CK_Pentium4:
2797 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002798 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002799 case CK_Prescott:
2800 case CK_K6:
2801 case CK_K6_2:
2802 case CK_K6_3:
2803 case CK_Athlon:
2804 case CK_AthlonThunderbird:
2805 case CK_Athlon4:
2806 case CK_AthlonXP:
2807 case CK_AthlonMP:
2808 case CK_Geode:
2809 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002810 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002811 return false;
2812
2813 // Fallthrough
2814 case CK_Nocona:
2815 case CK_Core2:
2816 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002817 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002818 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002819 case CK_Nehalem:
2820 case CK_Westmere:
2821 case CK_SandyBridge:
2822 case CK_IvyBridge:
2823 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002824 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002825 case CK_SkylakeClient:
2826 case CK_SkylakeServer:
2827 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002828 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002829 case CK_Athlon64:
2830 case CK_Athlon64SSE3:
2831 case CK_AthlonFX:
2832 case CK_K8:
2833 case CK_K8SSE3:
2834 case CK_Opteron:
2835 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002836 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002837 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002838 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002839 case CK_BDVER1:
2840 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002841 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002842 case CK_BDVER4:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002843 case CK_x86_64:
2844 return true;
2845 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002846 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002847 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002848
Craig Topper3164f332014-03-11 03:39:26 +00002849 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002850
Craig Topper3164f332014-03-11 03:39:26 +00002851 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002852 // Most of the non-ARM calling conventions are i386 conventions.
2853 switch (CC) {
2854 case CC_X86ThisCall:
2855 case CC_X86FastCall:
2856 case CC_X86StdCall:
2857 case CC_X86VectorCall:
2858 case CC_C:
2859 case CC_Swift:
2860 case CC_X86Pascal:
2861 case CC_IntelOclBicc:
2862 return CCCR_OK;
2863 default:
2864 return CCCR_Warning;
2865 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002866 }
2867
Craig Topper3164f332014-03-11 03:39:26 +00002868 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002869 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002870 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002871
2872 bool hasSjLjLowering() const override {
2873 return true;
2874 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002875
2876 void setSupportedOpenCLOpts() override {
2877 getSupportedOpenCLOpts().setAll();
2878 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002879};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002880
Rafael Espindolaeb265472013-08-21 21:59:03 +00002881bool X86TargetInfo::setFPMath(StringRef Name) {
2882 if (Name == "387") {
2883 FPMath = FP_387;
2884 return true;
2885 }
2886 if (Name == "sse") {
2887 FPMath = FP_SSE;
2888 return true;
2889 }
2890 return false;
2891}
2892
Eric Christopher007b0a02015-08-28 22:32:01 +00002893bool X86TargetInfo::initFeatureMap(
2894 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00002895 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002896 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002897 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002898 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00002899 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002900
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002901 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00002902
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002903 // Enable X87 for all X86 processors but Lakemont.
2904 if (Kind != CK_Lakemont)
2905 setFeatureEnabledImpl(Features, "x87", true);
2906
2907 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00002908 case CK_Generic:
2909 case CK_i386:
2910 case CK_i486:
2911 case CK_i586:
2912 case CK_Pentium:
2913 case CK_i686:
2914 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002915 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00002916 break;
2917 case CK_PentiumMMX:
2918 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00002919 case CK_K6:
2920 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00002921 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002922 break;
2923 case CK_Pentium3:
2924 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00002925 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00002926 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002927 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002928 break;
2929 case CK_PentiumM:
2930 case CK_Pentium4:
2931 case CK_Pentium4M:
2932 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00002933 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002934 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002935 break;
2936 case CK_Yonah:
2937 case CK_Prescott:
2938 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00002939 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002940 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002941 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002942 break;
2943 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002944 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00002945 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002946 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002947 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002948 break;
2949 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00002950 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00002951 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00002952 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00002953 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002954 case CK_Cannonlake:
2955 setFeatureEnabledImpl(Features, "avx512ifma", true);
2956 setFeatureEnabledImpl(Features, "avx512vbmi", true);
2957 setFeatureEnabledImpl(Features, "sha", true);
2958 setFeatureEnabledImpl(Features, "umip", true);
2959 // FALLTHROUGH
2960 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002961 setFeatureEnabledImpl(Features, "avx512f", true);
2962 setFeatureEnabledImpl(Features, "avx512cd", true);
2963 setFeatureEnabledImpl(Features, "avx512dq", true);
2964 setFeatureEnabledImpl(Features, "avx512bw", true);
2965 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002966 setFeatureEnabledImpl(Features, "pku", true);
2967 setFeatureEnabledImpl(Features, "pcommit", true);
2968 setFeatureEnabledImpl(Features, "clwb", true);
2969 // FALLTHROUGH
2970 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00002971 setFeatureEnabledImpl(Features, "xsavec", true);
2972 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002973 setFeatureEnabledImpl(Features, "mpx", true);
2974 setFeatureEnabledImpl(Features, "sgx", true);
2975 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002976 // FALLTHROUGH
2977 case CK_Broadwell:
2978 setFeatureEnabledImpl(Features, "rdseed", true);
2979 setFeatureEnabledImpl(Features, "adx", true);
2980 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002981 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00002982 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002983 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00002984 setFeatureEnabledImpl(Features, "bmi", true);
2985 setFeatureEnabledImpl(Features, "bmi2", true);
2986 setFeatureEnabledImpl(Features, "rtm", true);
2987 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002988 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002989 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002990 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002991 setFeatureEnabledImpl(Features, "rdrnd", true);
2992 setFeatureEnabledImpl(Features, "f16c", true);
2993 setFeatureEnabledImpl(Features, "fsgsbase", true);
2994 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002995 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00002996 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00002997 setFeatureEnabledImpl(Features, "xsave", true);
2998 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00002999 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003000 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003001 case CK_Silvermont:
3002 setFeatureEnabledImpl(Features, "aes", true);
3003 setFeatureEnabledImpl(Features, "pclmul", true);
3004 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003005 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003006 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003007 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003008 setFeatureEnabledImpl(Features, "cx16", true);
3009 break;
3010 case CK_KNL:
3011 setFeatureEnabledImpl(Features, "avx512f", true);
3012 setFeatureEnabledImpl(Features, "avx512cd", true);
3013 setFeatureEnabledImpl(Features, "avx512er", true);
3014 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003015 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003016 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003017 setFeatureEnabledImpl(Features, "rdseed", true);
3018 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003019 setFeatureEnabledImpl(Features, "lzcnt", true);
3020 setFeatureEnabledImpl(Features, "bmi", true);
3021 setFeatureEnabledImpl(Features, "bmi2", true);
3022 setFeatureEnabledImpl(Features, "rtm", true);
3023 setFeatureEnabledImpl(Features, "fma", true);
3024 setFeatureEnabledImpl(Features, "rdrnd", true);
3025 setFeatureEnabledImpl(Features, "f16c", true);
3026 setFeatureEnabledImpl(Features, "fsgsbase", true);
3027 setFeatureEnabledImpl(Features, "aes", true);
3028 setFeatureEnabledImpl(Features, "pclmul", true);
3029 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003030 setFeatureEnabledImpl(Features, "xsaveopt", true);
3031 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003032 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003033 break;
3034 case CK_K6_2:
3035 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003036 case CK_WinChip2:
3037 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003038 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003039 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003040 case CK_Athlon:
3041 case CK_AthlonThunderbird:
3042 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003043 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003044 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003045 case CK_Athlon4:
3046 case CK_AthlonXP:
3047 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003048 setFeatureEnabledImpl(Features, "sse", true);
3049 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003050 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003051 break;
3052 case CK_K8:
3053 case CK_Opteron:
3054 case CK_Athlon64:
3055 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003056 setFeatureEnabledImpl(Features, "sse2", true);
3057 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003058 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003059 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003060 case CK_AMDFAM10:
3061 setFeatureEnabledImpl(Features, "sse4a", true);
3062 setFeatureEnabledImpl(Features, "lzcnt", true);
3063 setFeatureEnabledImpl(Features, "popcnt", true);
3064 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 case CK_K8SSE3:
3066 case CK_OpteronSSE3:
3067 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003068 setFeatureEnabledImpl(Features, "sse3", true);
3069 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003070 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003071 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003072 case CK_BTVER2:
3073 setFeatureEnabledImpl(Features, "avx", true);
3074 setFeatureEnabledImpl(Features, "aes", true);
3075 setFeatureEnabledImpl(Features, "pclmul", true);
3076 setFeatureEnabledImpl(Features, "bmi", true);
3077 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003078 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003079 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003080 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003081 setFeatureEnabledImpl(Features, "ssse3", true);
3082 setFeatureEnabledImpl(Features, "sse4a", true);
3083 setFeatureEnabledImpl(Features, "lzcnt", true);
3084 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003085 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003086 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003087 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003088 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003089 case CK_BDVER4:
3090 setFeatureEnabledImpl(Features, "avx2", true);
3091 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003092 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003093 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003094 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003095 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003096 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003097 // FALLTHROUGH
3098 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003099 setFeatureEnabledImpl(Features, "bmi", true);
3100 setFeatureEnabledImpl(Features, "fma", true);
3101 setFeatureEnabledImpl(Features, "f16c", true);
3102 setFeatureEnabledImpl(Features, "tbm", true);
3103 // FALLTHROUGH
3104 case CK_BDVER1:
3105 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003106 setFeatureEnabledImpl(Features, "xop", true);
3107 setFeatureEnabledImpl(Features, "lzcnt", true);
3108 setFeatureEnabledImpl(Features, "aes", true);
3109 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003110 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003111 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003112 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003113 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003114 break;
Eli Friedman33465822011-07-08 23:31:17 +00003115 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003116 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3117 return false;
3118
3119 // Can't do this earlier because we need to be able to explicitly enable
3120 // or disable these features and the things that they depend upon.
3121
3122 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3123 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003124 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003125 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3126 FeaturesVec.end())
3127 Features["popcnt"] = true;
3128
3129 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3130 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003131 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003132 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3133 FeaturesVec.end())
3134 Features["prfchw"] = true;
3135
Eric Christophera7260af2015-10-08 20:10:18 +00003136 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3137 // then enable MMX.
3138 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003139 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003140 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3141 FeaturesVec.end())
3142 Features["mmx"] = true;
3143
Eric Christopherbbd746d2015-10-08 20:10:14 +00003144 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003145}
3146
Rafael Espindolae62e2792013-08-20 13:44:29 +00003147void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003148 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003149 if (Enabled) {
3150 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003151 case AVX512F:
3152 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003153 case AVX2:
3154 Features["avx2"] = true;
3155 case AVX:
3156 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003157 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003158 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003159 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003160 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003161 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003162 case SSSE3:
3163 Features["ssse3"] = true;
3164 case SSE3:
3165 Features["sse3"] = true;
3166 case SSE2:
3167 Features["sse2"] = true;
3168 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003169 Features["sse"] = true;
3170 case NoSSE:
3171 break;
3172 }
3173 return;
3174 }
3175
3176 switch (Level) {
3177 case NoSSE:
3178 case SSE1:
3179 Features["sse"] = false;
3180 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003181 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3182 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003183 case SSE3:
3184 Features["sse3"] = false;
3185 setXOPLevel(Features, NoXOP, false);
3186 case SSSE3:
3187 Features["ssse3"] = false;
3188 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003189 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003190 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003191 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003192 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003193 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3194 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003195 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003196 case AVX2:
3197 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003198 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003199 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003200 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003201 Features["avx512vl"] = Features["avx512vbmi"] =
3202 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003203 }
3204}
3205
3206void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003207 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003208 if (Enabled) {
3209 switch (Level) {
3210 case AMD3DNowAthlon:
3211 Features["3dnowa"] = true;
3212 case AMD3DNow:
3213 Features["3dnow"] = true;
3214 case MMX:
3215 Features["mmx"] = true;
3216 case NoMMX3DNow:
3217 break;
3218 }
3219 return;
3220 }
3221
3222 switch (Level) {
3223 case NoMMX3DNow:
3224 case MMX:
3225 Features["mmx"] = false;
3226 case AMD3DNow:
3227 Features["3dnow"] = false;
3228 case AMD3DNowAthlon:
3229 Features["3dnowa"] = false;
3230 }
3231}
3232
3233void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003234 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003235 if (Enabled) {
3236 switch (Level) {
3237 case XOP:
3238 Features["xop"] = true;
3239 case FMA4:
3240 Features["fma4"] = true;
3241 setSSELevel(Features, AVX, true);
3242 case SSE4A:
3243 Features["sse4a"] = true;
3244 setSSELevel(Features, SSE3, true);
3245 case NoXOP:
3246 break;
3247 }
3248 return;
3249 }
3250
3251 switch (Level) {
3252 case NoXOP:
3253 case SSE4A:
3254 Features["sse4a"] = false;
3255 case FMA4:
3256 Features["fma4"] = false;
3257 case XOP:
3258 Features["xop"] = false;
3259 }
3260}
3261
Craig Topper86d79ef2013-09-17 04:51:29 +00003262void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3263 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003264 // This is a bit of a hack to deal with the sse4 target feature when used
3265 // as part of the target attribute. We handle sse4 correctly everywhere
3266 // else. See below for more information on how we handle the sse4 options.
3267 if (Name != "sse4")
3268 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003269
Craig Topper29561122013-09-19 01:13:07 +00003270 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003271 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003272 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003273 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003274 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003275 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003276 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003277 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003278 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003279 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003280 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003281 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003282 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003283 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003284 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003285 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003286 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003287 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003288 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003289 if (Enabled)
3290 setSSELevel(Features, SSE2, Enabled);
3291 } else if (Name == "pclmul") {
3292 if (Enabled)
3293 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003294 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003295 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003296 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003298 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003299 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003300 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3301 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3302 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003303 if (Enabled)
3304 setSSELevel(Features, AVX512F, Enabled);
3305 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003306 if (Enabled)
3307 setSSELevel(Features, AVX, Enabled);
3308 } else if (Name == "fma4") {
3309 setXOPLevel(Features, FMA4, Enabled);
3310 } else if (Name == "xop") {
3311 setXOPLevel(Features, XOP, Enabled);
3312 } else if (Name == "sse4a") {
3313 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003314 } else if (Name == "f16c") {
3315 if (Enabled)
3316 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003317 } else if (Name == "sha") {
3318 if (Enabled)
3319 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003320 } else if (Name == "sse4") {
3321 // We can get here via the __target__ attribute since that's not controlled
3322 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3323 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3324 // disabled.
3325 if (Enabled)
3326 setSSELevel(Features, SSE42, Enabled);
3327 else
3328 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003329 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003330 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003331 Features["xsaveopt"] = false;
3332 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003333 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003334 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003335 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003336}
3337
Eric Christopher3ff21b32013-10-16 21:26:26 +00003338/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003339/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003340bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003341 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003342 for (const auto &Feature : Features) {
3343 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003344 continue;
3345
Eric Christopher610fe112015-08-26 08:21:55 +00003346 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003347 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003348 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003349 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003350 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003351 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003352 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003353 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003354 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003355 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003356 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003357 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003358 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003359 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003360 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003361 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003362 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003363 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003364 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003365 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003366 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003367 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003368 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003369 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003370 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003371 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003372 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003373 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003374 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003375 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003376 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003377 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003378 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003379 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003380 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003381 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003382 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003383 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003384 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003385 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003386 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003387 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003388 } else if (Feature == "+avx512vbmi") {
3389 HasAVX512VBMI = true;
3390 } else if (Feature == "+avx512ifma") {
3391 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003392 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003393 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003394 } else if (Feature == "+mpx") {
3395 HasMPX = true;
3396 } else if (Feature == "+movbe") {
3397 HasMOVBE = true;
3398 } else if (Feature == "+sgx") {
3399 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003400 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003401 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003402 } else if (Feature == "+fxsr") {
3403 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003404 } else if (Feature == "+xsave") {
3405 HasXSAVE = true;
3406 } else if (Feature == "+xsaveopt") {
3407 HasXSAVEOPT = true;
3408 } else if (Feature == "+xsavec") {
3409 HasXSAVEC = true;
3410 } else if (Feature == "+xsaves") {
3411 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003412 } else if (Feature == "+mwaitx") {
3413 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003414 } else if (Feature == "+pku") {
3415 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003416 } else if (Feature == "+clflushopt") {
3417 HasCLFLUSHOPT = true;
3418 } else if (Feature == "+pcommit") {
3419 HasPCOMMIT = true;
3420 } else if (Feature == "+clwb") {
3421 HasCLWB = true;
3422 } else if (Feature == "+umip") {
3423 HasUMIP = true;
3424 } else if (Feature == "+prefetchwt1") {
3425 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003426 }
3427
Benjamin Kramer27402c62012-03-05 15:10:44 +00003428 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003429 .Case("+avx512f", AVX512F)
3430 .Case("+avx2", AVX2)
3431 .Case("+avx", AVX)
3432 .Case("+sse4.2", SSE42)
3433 .Case("+sse4.1", SSE41)
3434 .Case("+ssse3", SSSE3)
3435 .Case("+sse3", SSE3)
3436 .Case("+sse2", SSE2)
3437 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003438 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003439 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003440
Eli Friedman33465822011-07-08 23:31:17 +00003441 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003442 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003443 .Case("+3dnowa", AMD3DNowAthlon)
3444 .Case("+3dnow", AMD3DNow)
3445 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003446 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003447 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003448
3449 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003450 .Case("+xop", XOP)
3451 .Case("+fma4", FMA4)
3452 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003453 .Default(NoXOP);
3454 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003455 }
Eli Friedman33465822011-07-08 23:31:17 +00003456
Rafael Espindolaeb265472013-08-21 21:59:03 +00003457 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3458 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003459 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3460 (FPMath == FP_387 && SSELevel >= SSE1)) {
3461 Diags.Report(diag::err_target_unsupported_fpmath) <<
3462 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003463 return false;
3464 }
3465
Alexey Bataev00396512015-07-02 03:40:19 +00003466 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003467 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003468 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003469}
Chris Lattnerecd49032009-03-02 22:27:17 +00003470
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003471/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3472/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003473void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003474 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003475 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003476 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003477 Builder.defineMacro("__amd64__");
3478 Builder.defineMacro("__amd64");
3479 Builder.defineMacro("__x86_64");
3480 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003481 if (getTriple().getArchName() == "x86_64h") {
3482 Builder.defineMacro("__x86_64h");
3483 Builder.defineMacro("__x86_64h__");
3484 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003485 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003486 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003487 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003488
Chris Lattnerecd49032009-03-02 22:27:17 +00003489 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003490 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3491 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003492 switch (CPU) {
3493 case CK_Generic:
3494 break;
3495 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003496 // The rest are coming from the i386 define above.
3497 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003498 break;
3499 case CK_i486:
3500 case CK_WinChipC6:
3501 case CK_WinChip2:
3502 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003503 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003504 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003505 case CK_PentiumMMX:
3506 Builder.defineMacro("__pentium_mmx__");
3507 Builder.defineMacro("__tune_pentium_mmx__");
3508 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003509 case CK_i586:
3510 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003511 defineCPUMacros(Builder, "i586");
3512 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003513 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003514 case CK_Pentium3:
3515 case CK_Pentium3M:
3516 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003517 Builder.defineMacro("__tune_pentium3__");
3518 // Fallthrough
3519 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003520 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003521 Builder.defineMacro("__tune_pentium2__");
3522 // Fallthrough
3523 case CK_PentiumPro:
3524 Builder.defineMacro("__tune_i686__");
3525 Builder.defineMacro("__tune_pentiumpro__");
3526 // Fallthrough
3527 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003528 Builder.defineMacro("__i686");
3529 Builder.defineMacro("__i686__");
3530 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3531 Builder.defineMacro("__pentiumpro");
3532 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003533 break;
3534 case CK_Pentium4:
3535 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003536 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003537 break;
3538 case CK_Yonah:
3539 case CK_Prescott:
3540 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003541 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003542 break;
3543 case CK_Core2:
3544 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003545 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003546 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003547 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003548 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003549 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003550 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003551 defineCPUMacros(Builder, "slm");
3552 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003553 case CK_Nehalem:
3554 case CK_Westmere:
3555 case CK_SandyBridge:
3556 case CK_IvyBridge:
3557 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003558 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003559 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003560 // FIXME: Historically, we defined this legacy name, it would be nice to
3561 // remove it at some point. We've never exposed fine-grained names for
3562 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003563 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003564 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003565 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003566 defineCPUMacros(Builder, "skx");
3567 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003568 case CK_Cannonlake:
3569 break;
Craig Topper449314e2013-08-20 07:09:39 +00003570 case CK_KNL:
3571 defineCPUMacros(Builder, "knl");
3572 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003573 case CK_Lakemont:
3574 Builder.defineMacro("__tune_lakemont__");
3575 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003576 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003577 Builder.defineMacro("__k6_2__");
3578 Builder.defineMacro("__tune_k6_2__");
3579 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003580 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003581 if (CPU != CK_K6_2) { // In case of fallthrough
3582 // FIXME: GCC may be enabling these in cases where some other k6
3583 // architecture is specified but -m3dnow is explicitly provided. The
3584 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003585 Builder.defineMacro("__k6_3__");
3586 Builder.defineMacro("__tune_k6_3__");
3587 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003588 // Fallthrough
3589 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003590 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003591 break;
3592 case CK_Athlon:
3593 case CK_AthlonThunderbird:
3594 case CK_Athlon4:
3595 case CK_AthlonXP:
3596 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003597 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003598 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003599 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003600 Builder.defineMacro("__tune_athlon_sse__");
3601 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003602 break;
3603 case CK_K8:
3604 case CK_K8SSE3:
3605 case CK_x86_64:
3606 case CK_Opteron:
3607 case CK_OpteronSSE3:
3608 case CK_Athlon64:
3609 case CK_Athlon64SSE3:
3610 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003611 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003612 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003613 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003614 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003615 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003616 case CK_BTVER1:
3617 defineCPUMacros(Builder, "btver1");
3618 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003619 case CK_BTVER2:
3620 defineCPUMacros(Builder, "btver2");
3621 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003622 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003623 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003624 break;
3625 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003626 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003627 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003628 case CK_BDVER3:
3629 defineCPUMacros(Builder, "bdver3");
3630 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003631 case CK_BDVER4:
3632 defineCPUMacros(Builder, "bdver4");
3633 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003634 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003635 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003636 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003637 }
Chris Lattner96e43572009-03-02 22:40:39 +00003638
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003639 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003640 Builder.defineMacro("__REGISTER_PREFIX__", "");
3641
Chris Lattner6df41af2009-04-19 17:32:33 +00003642 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3643 // functions in glibc header files that use FP Stack inline asm which the
3644 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003645 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003646
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003647 if (HasAES)
3648 Builder.defineMacro("__AES__");
3649
Craig Topper3f122a72012-05-31 05:18:48 +00003650 if (HasPCLMUL)
3651 Builder.defineMacro("__PCLMUL__");
3652
Craig Topper22967d42011-12-25 05:06:45 +00003653 if (HasLZCNT)
3654 Builder.defineMacro("__LZCNT__");
3655
Benjamin Kramer1e250392012-07-07 09:39:18 +00003656 if (HasRDRND)
3657 Builder.defineMacro("__RDRND__");
3658
Craig Topper8c7f2512014-11-03 06:51:41 +00003659 if (HasFSGSBASE)
3660 Builder.defineMacro("__FSGSBASE__");
3661
Craig Topper22967d42011-12-25 05:06:45 +00003662 if (HasBMI)
3663 Builder.defineMacro("__BMI__");
3664
3665 if (HasBMI2)
3666 Builder.defineMacro("__BMI2__");
3667
Craig Topper1de83482011-12-29 16:10:46 +00003668 if (HasPOPCNT)
3669 Builder.defineMacro("__POPCNT__");
3670
Michael Liao625a8752012-11-10 05:17:46 +00003671 if (HasRTM)
3672 Builder.defineMacro("__RTM__");
3673
Michael Liao74f4eaf2013-03-26 17:52:08 +00003674 if (HasPRFCHW)
3675 Builder.defineMacro("__PRFCHW__");
3676
Michael Liaoffaae352013-03-29 05:17:55 +00003677 if (HasRDSEED)
3678 Builder.defineMacro("__RDSEED__");
3679
Robert Khasanov50e6f582014-09-19 09:53:48 +00003680 if (HasADX)
3681 Builder.defineMacro("__ADX__");
3682
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003683 if (HasTBM)
3684 Builder.defineMacro("__TBM__");
3685
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003686 if (HasMWAITX)
3687 Builder.defineMacro("__MWAITX__");
3688
Rafael Espindolae62e2792013-08-20 13:44:29 +00003689 switch (XOPLevel) {
3690 case XOP:
3691 Builder.defineMacro("__XOP__");
3692 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003693 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003694 case SSE4A:
3695 Builder.defineMacro("__SSE4A__");
3696 case NoXOP:
3697 break;
3698 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003699
Craig Topperbba778b2012-06-03 21:46:30 +00003700 if (HasFMA)
3701 Builder.defineMacro("__FMA__");
3702
Manman Rena45358c2012-10-11 00:59:55 +00003703 if (HasF16C)
3704 Builder.defineMacro("__F16C__");
3705
Craig Topper679b53a2013-08-21 05:29:10 +00003706 if (HasAVX512CD)
3707 Builder.defineMacro("__AVX512CD__");
3708 if (HasAVX512ER)
3709 Builder.defineMacro("__AVX512ER__");
3710 if (HasAVX512PF)
3711 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003712 if (HasAVX512DQ)
3713 Builder.defineMacro("__AVX512DQ__");
3714 if (HasAVX512BW)
3715 Builder.defineMacro("__AVX512BW__");
3716 if (HasAVX512VL)
3717 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003718 if (HasAVX512VBMI)
3719 Builder.defineMacro("__AVX512VBMI__");
3720 if (HasAVX512IFMA)
3721 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003722
Ben Langmuir58078d02013-09-19 13:22:04 +00003723 if (HasSHA)
3724 Builder.defineMacro("__SHA__");
3725
Craig Toppere33f51f2015-10-16 06:22:36 +00003726 if (HasFXSR)
3727 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003728 if (HasXSAVE)
3729 Builder.defineMacro("__XSAVE__");
3730 if (HasXSAVEOPT)
3731 Builder.defineMacro("__XSAVEOPT__");
3732 if (HasXSAVEC)
3733 Builder.defineMacro("__XSAVEC__");
3734 if (HasXSAVES)
3735 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003736 if (HasPKU)
3737 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003738 if (HasCX16)
3739 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3740
Chris Lattner96e43572009-03-02 22:40:39 +00003741 // Each case falls through to the previous one here.
3742 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003743 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003744 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003745 case AVX2:
3746 Builder.defineMacro("__AVX2__");
3747 case AVX:
3748 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003749 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003750 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003751 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003752 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003753 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003754 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003755 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003756 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003757 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003758 Builder.defineMacro("__SSE2__");
3759 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003760 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003761 Builder.defineMacro("__SSE__");
3762 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003763 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003764 break;
3765 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003766
Derek Schuffc7dd7222012-10-11 15:52:22 +00003767 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003768 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003769 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003770 case AVX2:
3771 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003772 case SSE42:
3773 case SSE41:
3774 case SSSE3:
3775 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003776 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003777 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003778 break;
3779 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003780 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003781 break;
3782 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003783 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003784 }
3785 }
3786
Anders Carlssone437c682010-01-27 03:47:49 +00003787 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003788 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003789 case AMD3DNowAthlon:
3790 Builder.defineMacro("__3dNOW_A__");
3791 case AMD3DNow:
3792 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003793 case MMX:
3794 Builder.defineMacro("__MMX__");
3795 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003796 break;
3797 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003798
3799 if (CPU >= CK_i486) {
3800 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3801 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3802 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3803 }
3804 if (CPU >= CK_i586)
3805 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003806}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003807
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003808bool X86TargetInfo::hasFeature(StringRef Feature) const {
3809 return llvm::StringSwitch<bool>(Feature)
3810 .Case("aes", HasAES)
3811 .Case("avx", SSELevel >= AVX)
3812 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003813 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003814 .Case("avx512cd", HasAVX512CD)
3815 .Case("avx512er", HasAVX512ER)
3816 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003817 .Case("avx512dq", HasAVX512DQ)
3818 .Case("avx512bw", HasAVX512BW)
3819 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003820 .Case("avx512vbmi", HasAVX512VBMI)
3821 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003822 .Case("bmi", HasBMI)
3823 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003824 .Case("clflushopt", HasCLFLUSHOPT)
3825 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003826 .Case("cx16", HasCX16)
3827 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003828 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003829 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003830 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003831 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003832 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003833 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3834 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3835 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003836 .Case("movbe", HasMOVBE)
3837 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003838 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003839 .Case("pcommit", HasPCOMMIT)
3840 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003841 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003842 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003843 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003844 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003845 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003846 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003847 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003848 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003849 .Case("sse", SSELevel >= SSE1)
3850 .Case("sse2", SSELevel >= SSE2)
3851 .Case("sse3", SSELevel >= SSE3)
3852 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00003853 .Case("sse4.1", SSELevel >= SSE41)
3854 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003855 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00003856 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003857 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003858 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00003859 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3860 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003861 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00003862 .Case("xsave", HasXSAVE)
3863 .Case("xsavec", HasXSAVEC)
3864 .Case("xsaves", HasXSAVES)
3865 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003866 .Default(false);
3867}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003868
Eric Christopherd9832702015-06-29 21:00:05 +00003869// We can't use a generic validation scheme for the features accepted here
3870// versus subtarget features accepted in the target attribute because the
3871// bitfield structure that's initialized in the runtime only supports the
3872// below currently rather than the full range of subtarget features. (See
3873// X86TargetInfo::hasFeature for a somewhat comprehensive list).
3874bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
3875 return llvm::StringSwitch<bool>(FeatureStr)
3876 .Case("cmov", true)
3877 .Case("mmx", true)
3878 .Case("popcnt", true)
3879 .Case("sse", true)
3880 .Case("sse2", true)
3881 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003882 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003883 .Case("sse4.1", true)
3884 .Case("sse4.2", true)
3885 .Case("avx", true)
3886 .Case("avx2", true)
3887 .Case("sse4a", true)
3888 .Case("fma4", true)
3889 .Case("xop", true)
3890 .Case("fma", true)
3891 .Case("avx512f", true)
3892 .Case("bmi", true)
3893 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00003894 .Case("aes", true)
3895 .Case("pclmul", true)
3896 .Case("avx512vl", true)
3897 .Case("avx512bw", true)
3898 .Case("avx512dq", true)
3899 .Case("avx512cd", true)
3900 .Case("avx512er", true)
3901 .Case("avx512pf", true)
3902 .Case("avx512vbmi", true)
3903 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00003904 .Default(false);
3905}
3906
Eli Friedman3fd920a2008-08-20 02:34:37 +00003907bool
Anders Carlsson58436352009-02-28 17:11:49 +00003908X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00003909 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00003910 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00003911 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00003912 // Constant constraints.
3913 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
3914 // instructions.
3915 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3916 // x86_64 instructions.
3917 case 's':
3918 Info.setRequiresImmediate();
3919 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003920 case 'I':
3921 Info.setRequiresImmediate(0, 31);
3922 return true;
3923 case 'J':
3924 Info.setRequiresImmediate(0, 63);
3925 return true;
3926 case 'K':
3927 Info.setRequiresImmediate(-128, 127);
3928 return true;
3929 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00003930 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00003931 return true;
3932 case 'M':
3933 Info.setRequiresImmediate(0, 3);
3934 return true;
3935 case 'N':
3936 Info.setRequiresImmediate(0, 255);
3937 return true;
3938 case 'O':
3939 Info.setRequiresImmediate(0, 127);
3940 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003941 // Register constraints.
3942 case 'Y': // 'Y' is the first character for several 2-character constraints.
3943 // Shift the pointer to the second character of the constraint.
3944 Name++;
3945 switch (*Name) {
3946 default:
3947 return false;
3948 case '0': // First SSE register.
3949 case 't': // Any SSE register, when SSE2 is enabled.
3950 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3951 case 'm': // Any MMX register, when inter-unit moves enabled.
3952 Info.setAllowsRegister();
3953 return true;
3954 }
3955 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003956 // Constraint 'f' cannot be used for output operands.
3957 if (Info.ConstraintStr[0] == '=')
3958 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00003959 Info.setAllowsRegister();
3960 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00003961 case 'a': // eax.
3962 case 'b': // ebx.
3963 case 'c': // ecx.
3964 case 'd': // edx.
3965 case 'S': // esi.
3966 case 'D': // edi.
3967 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00003968 case 't': // Top of floating point stack.
3969 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003970 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00003971 case 'y': // Any MMX register.
Anders Carlsson5f7ee682008-10-06 19:17:39 +00003972 case 'x': // Any SSE register.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003973 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00003974 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3975 case 'l': // "Index" registers: any general register that can be used as an
3976 // index in a base+index memory access.
3977 Info.setAllowsRegister();
3978 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00003979 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00003980 case 'C': // SSE floating point constant.
3981 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00003982 return true;
3983 }
3984}
3985
Akira Hatanaka974131e2014-09-18 18:17:18 +00003986bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3987 unsigned Size) const {
3988 // Strip off constraint modifiers.
3989 while (Constraint[0] == '=' ||
3990 Constraint[0] == '+' ||
3991 Constraint[0] == '&')
3992 Constraint = Constraint.substr(1);
3993
3994 return validateOperandSize(Constraint, Size);
3995}
3996
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00003997bool X86TargetInfo::validateInputSize(StringRef Constraint,
3998 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00003999 return validateOperandSize(Constraint, Size);
4000}
4001
4002bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4003 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004004 switch (Constraint[0]) {
4005 default: break;
4006 case 'y':
4007 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004008 case 'f':
4009 case 't':
4010 case 'u':
4011 return Size <= 128;
Hans Wennborg3c619a42014-09-18 20:24:04 +00004012 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004013 if (SSELevel >= AVX512F)
4014 // 512-bit zmm registers can be used if target supports AVX512F.
4015 return Size <= 512U;
4016 else if (SSELevel >= AVX)
4017 // 256-bit ymm registers can be used if target supports AVX.
4018 return Size <= 256U;
4019 return Size <= 128U;
4020 case 'Y':
4021 // 'Y' is the first character for several 2-character constraints.
4022 switch (Constraint[1]) {
4023 default: break;
4024 case 'm':
4025 // 'Ym' is synonymous with 'y'.
4026 return Size <= 64;
4027 case 'i':
4028 case 't':
4029 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4030 if (SSELevel >= AVX512F)
4031 return Size <= 512U;
4032 else if (SSELevel >= AVX)
4033 return Size <= 256U;
4034 return SSELevel >= SSE2 && Size <= 128U;
4035 }
4036
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004037 }
4038
4039 return true;
4040}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004041
Eli Friedman3fd920a2008-08-20 02:34:37 +00004042std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004043X86TargetInfo::convertConstraint(const char *&Constraint) const {
4044 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004045 case 'a': return std::string("{ax}");
4046 case 'b': return std::string("{bx}");
4047 case 'c': return std::string("{cx}");
4048 case 'd': return std::string("{dx}");
4049 case 'S': return std::string("{si}");
4050 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004051 case 'p': // address
4052 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004053 case 't': // top of floating point stack.
4054 return std::string("{st}");
4055 case 'u': // second from top of floating point stack.
4056 return std::string("{st(1)}"); // second from top of floating point stack.
4057 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004058 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004059 }
4060}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004061
Eli Friedman3fd920a2008-08-20 02:34:37 +00004062// X86-32 generic target
4063class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004064public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004065 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4066 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004067 DoubleAlign = LongLongAlign = 32;
4068 LongDoubleWidth = 96;
4069 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004070 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004071 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004072 SizeType = UnsignedInt;
4073 PtrDiffType = SignedInt;
4074 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004075 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004076
4077 // Use fpret for all types.
4078 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4079 (1 << TargetInfo::Double) |
4080 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004081
4082 // x86-32 has atomics up to 8 bytes
4083 // FIXME: Check that we actually have cmpxchg8b before setting
4084 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4085 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004086 }
Craig Topper3164f332014-03-11 03:39:26 +00004087 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004088 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004089 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004090
Craig Topper3164f332014-03-11 03:39:26 +00004091 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004092 if (RegNo == 0) return 0;
4093 if (RegNo == 1) return 2;
4094 return -1;
4095 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004096 bool validateOperandSize(StringRef Constraint,
4097 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004098 switch (Constraint[0]) {
4099 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004100 case 'R':
4101 case 'q':
4102 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004103 case 'a':
4104 case 'b':
4105 case 'c':
4106 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004107 case 'S':
4108 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004109 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004110 case 'A':
4111 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004112 }
4113
Akira Hatanaka974131e2014-09-18 18:17:18 +00004114 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004115 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004116};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004117
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004118class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4119public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004120 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4121 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004122
Craig Topper3164f332014-03-11 03:39:26 +00004123 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004124 unsigned Major, Minor, Micro;
4125 getTriple().getOSVersion(Major, Minor, Micro);
4126 // New NetBSD uses the default rounding mode.
4127 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4128 return X86_32TargetInfo::getFloatEvalMethod();
4129 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004130 return 1;
4131 }
4132};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004133
Eli Friedmane3aa4542009-07-05 18:47:56 +00004134class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4135public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004136 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4137 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004138 SizeType = UnsignedLong;
4139 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004140 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004141 }
4142};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004143
Eli Friedman9fa28852012-08-08 23:57:20 +00004144class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4145public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004146 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4147 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004148 SizeType = UnsignedLong;
4149 IntPtrType = SignedLong;
4150 PtrDiffType = SignedLong;
4151 }
4152};
Eli Friedman9fa28852012-08-08 23:57:20 +00004153
Torok Edwinb2b37c62009-06-30 17:10:35 +00004154class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004155public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004156 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4157 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004158 LongDoubleWidth = 128;
4159 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004160 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004161 MaxVectorAlign = 256;
4162 // The watchOS simulator uses the builtin bool type for Objective-C.
4163 llvm::Triple T = llvm::Triple(Triple);
4164 if (T.isWatchOS())
4165 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004166 SizeType = UnsignedLong;
4167 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004168 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004169 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004170 }
4171
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004172 bool handleTargetFeatures(std::vector<std::string> &Features,
4173 DiagnosticsEngine &Diags) override {
4174 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4175 Diags))
4176 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004177 // We now know the features we have: we can decide how to align vectors.
4178 MaxVectorAlign =
4179 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004180 return true;
4181 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004182};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004183
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004184// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004185class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004186public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004187 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4188 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004189 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004190 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004191 bool IsWinCOFF =
4192 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004193 resetDataLayout(IsWinCOFF
4194 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4195 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004196 }
Craig Topper3164f332014-03-11 03:39:26 +00004197 void getTargetDefines(const LangOptions &Opts,
4198 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004199 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4200 }
4201};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004202
4203// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004204class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004205public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004206 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4207 const TargetOptions &Opts)
4208 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004209 LongDoubleWidth = LongDoubleAlign = 64;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004210 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4211 }
Craig Topper3164f332014-03-11 03:39:26 +00004212 void getTargetDefines(const LangOptions &Opts,
4213 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004214 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4215 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4216 // The value of the following reflects processor type.
4217 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4218 // We lost the original triple, so we use the default.
4219 Builder.defineMacro("_M_IX86", "600");
4220 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004221};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004222
David Majnemerae1ed0e2015-05-28 04:36:18 +00004223static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004224 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4225 // supports __declspec natively under -fms-extensions, but we define a no-op
4226 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004227 if (Opts.MicrosoftExt)
4228 Builder.defineMacro("__declspec", "__declspec");
4229 else
4230 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4231
4232 if (!Opts.MicrosoftExt) {
4233 // Provide macros for all the calling convention keywords. Provide both
4234 // single and double underscore prefixed variants. These are available on
4235 // x64 as well as x86, even though they have no effect.
4236 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4237 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004238 std::string GCCSpelling = "__attribute__((__";
4239 GCCSpelling += CC;
4240 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004241 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4242 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4243 }
4244 }
4245}
4246
David Majnemerae1ed0e2015-05-28 04:36:18 +00004247static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4248 Builder.defineMacro("__MSVCRT__");
4249 Builder.defineMacro("__MINGW32__");
4250 addCygMingDefines(Opts, Builder);
4251}
4252
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004253// x86-32 MinGW target
4254class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4255public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004256 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4257 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004258 void getTargetDefines(const LangOptions &Opts,
4259 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004260 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004261 DefineStd(Builder, "WIN32", Opts);
4262 DefineStd(Builder, "WINNT", Opts);
4263 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004264 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004265 }
4266};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004267
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004268// x86-32 Cygwin target
4269class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4270public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004271 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4272 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004273 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004274 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004275 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 +00004276 }
Craig Topper3164f332014-03-11 03:39:26 +00004277 void getTargetDefines(const LangOptions &Opts,
4278 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004279 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004280 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004281 Builder.defineMacro("__CYGWIN__");
4282 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004283 addCygMingDefines(Opts, Builder);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004284 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004285 if (Opts.CPlusPlus)
4286 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004287 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004288};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004289
Chris Lattnerb986aba2010-04-11 19:29:39 +00004290// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004291class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004292public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004293 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004294 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004295 }
Craig Topper3164f332014-03-11 03:39:26 +00004296 void getTargetDefines(const LangOptions &Opts,
4297 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004298 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004299 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004300 }
4301};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004302
Alexey Bataevc99b0492015-11-25 09:24:26 +00004303// X86-32 MCU target
4304class MCUX86_32TargetInfo : public X86_32TargetInfo {
4305public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004306 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4307 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004308 LongDoubleWidth = 64;
4309 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
James Y Knightb214cbc2016-03-04 19:00:41 +00004310 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 +00004311 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004312 }
4313
4314 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4315 // On MCU we support only C calling convention.
4316 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4317 }
4318
4319 void getTargetDefines(const LangOptions &Opts,
4320 MacroBuilder &Builder) const override {
4321 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4322 Builder.defineMacro("__iamcu");
4323 Builder.defineMacro("__iamcu__");
4324 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004325
4326 bool allowsLargerPreferedTypeAlignment() const override {
4327 return false;
4328 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004329};
4330
Douglas Gregor9fabd852011-07-01 22:41:14 +00004331// RTEMS Target
4332template<typename Target>
4333class RTEMSTargetInfo : public OSTargetInfo<Target> {
4334protected:
Craig Topper3164f332014-03-11 03:39:26 +00004335 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4336 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004337 // RTEMS defines; list based off of gcc output
4338
Douglas Gregor9fabd852011-07-01 22:41:14 +00004339 Builder.defineMacro("__rtems__");
4340 Builder.defineMacro("__ELF__");
4341 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004342
Douglas Gregor9fabd852011-07-01 22:41:14 +00004343public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004344 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4345 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004346 switch (Triple.getArch()) {
4347 default:
4348 case llvm::Triple::x86:
4349 // this->MCountName = ".mcount";
4350 break;
4351 case llvm::Triple::mips:
4352 case llvm::Triple::mipsel:
4353 case llvm::Triple::ppc:
4354 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004355 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004356 // this->MCountName = "_mcount";
4357 break;
4358 case llvm::Triple::arm:
4359 // this->MCountName = "__mcount";
4360 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004361 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004362 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004363};
4364
Douglas Gregor9fabd852011-07-01 22:41:14 +00004365// x86-32 RTEMS target
4366class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4367public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004368 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4369 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004370 SizeType = UnsignedLong;
4371 IntPtrType = SignedLong;
4372 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004373 }
Craig Topper3164f332014-03-11 03:39:26 +00004374 void getTargetDefines(const LangOptions &Opts,
4375 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004376 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4377 Builder.defineMacro("__INTEL__");
4378 Builder.defineMacro("__rtems__");
4379 }
4380};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004381
Eli Friedman3fd920a2008-08-20 02:34:37 +00004382// x86-64 generic target
4383class X86_64TargetInfo : public X86TargetInfo {
4384public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004385 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4386 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004387 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004388 bool IsWinCOFF =
4389 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004390 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004391 LongDoubleWidth = 128;
4392 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004393 LargeArrayMinWidth = 128;
4394 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004395 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004396 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4397 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4398 IntPtrType = IsX32 ? SignedInt : SignedLong;
4399 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004400 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004401 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004402
Eric Christopher917e9522014-11-18 22:36:15 +00004403 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004404 resetDataLayout(IsX32
4405 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4406 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4407 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004408
4409 // Use fpret only for long double.
4410 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004411
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004412 // Use fp2ret for _Complex long double.
4413 ComplexLongDoubleUsesFP2Ret = true;
4414
Charles Davisc7d5c942015-09-17 20:55:33 +00004415 // Make __builtin_ms_va_list available.
4416 HasBuiltinMSVaList = true;
4417
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004418 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004419 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004420 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004421 }
Craig Topper3164f332014-03-11 03:39:26 +00004422 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004423 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004424 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004425
Craig Topper3164f332014-03-11 03:39:26 +00004426 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004427 if (RegNo == 0) return 0;
4428 if (RegNo == 1) return 1;
4429 return -1;
4430 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004431
Craig Topper3164f332014-03-11 03:39:26 +00004432 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004433 switch (CC) {
4434 case CC_C:
4435 case CC_Swift:
4436 case CC_X86VectorCall:
4437 case CC_IntelOclBicc:
4438 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004439 case CC_PreserveMost:
4440 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00004441 return CCCR_OK;
4442 default:
4443 return CCCR_Warning;
4444 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004445 }
4446
Craig Topper3164f332014-03-11 03:39:26 +00004447 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004448 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004449 }
4450
Pavel Chupinfd223e12014-08-04 12:39:43 +00004451 // for x32 we need it here explicitly
4452 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004453 unsigned getUnwindWordWidth() const override { return 64; }
4454 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004455
4456 bool validateGlobalRegisterVariable(StringRef RegName,
4457 unsigned RegSize,
4458 bool &HasSizeMismatch) const override {
4459 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4460 // handle.
4461 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4462 // Check that the register size is 64-bit.
4463 HasSizeMismatch = RegSize != 64;
4464 return true;
4465 }
4466
4467 // Check if the register is a 32-bit register the backend can handle.
4468 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4469 HasSizeMismatch);
4470 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004471};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004472
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004473// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004474class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004475public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004476 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4477 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004478 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004479 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004480 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004481 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004482 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004483 SizeType = UnsignedLongLong;
4484 PtrDiffType = SignedLongLong;
4485 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004486 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004487
Craig Topper3164f332014-03-11 03:39:26 +00004488 void getTargetDefines(const LangOptions &Opts,
4489 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004490 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004491 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004492 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004493
Craig Topper3164f332014-03-11 03:39:26 +00004494 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004495 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004496 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004497
Craig Topper3164f332014-03-11 03:39:26 +00004498 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004499 switch (CC) {
4500 case CC_X86StdCall:
4501 case CC_X86ThisCall:
4502 case CC_X86FastCall:
4503 return CCCR_Ignore;
4504 case CC_C:
4505 case CC_X86VectorCall:
4506 case CC_IntelOclBicc:
4507 case CC_X86_64SysV:
4508 return CCCR_OK;
4509 default:
4510 return CCCR_Warning;
4511 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004512 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004513};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004514
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004515// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004516class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004517public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004518 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4519 const TargetOptions &Opts)
4520 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004521 LongDoubleWidth = LongDoubleAlign = 64;
4522 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004523 }
Craig Topper3164f332014-03-11 03:39:26 +00004524 void getTargetDefines(const LangOptions &Opts,
4525 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004526 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4527 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004528 Builder.defineMacro("_M_X64", "100");
4529 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004530 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004531};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004532
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004533// x86-64 MinGW target
4534class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4535public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004536 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4537 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004538 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4539 // with x86 FP ops. Weird.
4540 LongDoubleWidth = LongDoubleAlign = 128;
4541 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
4542 }
4543
Craig Topper3164f332014-03-11 03:39:26 +00004544 void getTargetDefines(const LangOptions &Opts,
4545 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004546 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004547 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004548 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004549 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004550
4551 // GCC defines this macro when it is using __gxx_personality_seh0.
4552 if (!Opts.SjLjExceptions)
4553 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004554 }
4555};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004556
Yaron Kerend030d112015-07-22 17:38:19 +00004557// x86-64 Cygwin target
4558class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4559public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004560 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4561 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004562 TLSSupported = false;
4563 WCharType = UnsignedShort;
4564 }
4565 void getTargetDefines(const LangOptions &Opts,
4566 MacroBuilder &Builder) const override {
4567 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4568 Builder.defineMacro("__x86_64__");
4569 Builder.defineMacro("__CYGWIN__");
4570 Builder.defineMacro("__CYGWIN64__");
4571 addCygMingDefines(Opts, Builder);
4572 DefineStd(Builder, "unix", Opts);
4573 if (Opts.CPlusPlus)
4574 Builder.defineMacro("_GNU_SOURCE");
4575
4576 // GCC defines this macro when it is using __gxx_personality_seh0.
4577 if (!Opts.SjLjExceptions)
4578 Builder.defineMacro("__SEH__");
4579 }
4580};
4581
Eli Friedman2857ccb2009-07-01 03:36:11 +00004582class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4583public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004584 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4585 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004586 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004587 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4588 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004589 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004590 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004591 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004592 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004593
4594 bool handleTargetFeatures(std::vector<std::string> &Features,
4595 DiagnosticsEngine &Diags) override {
4596 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4597 Diags))
4598 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004599 // We now know the features we have: we can decide how to align vectors.
4600 MaxVectorAlign =
4601 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004602 return true;
4603 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004604};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004605
Eli Friedman245f2292009-07-05 22:31:18 +00004606class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4607public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004608 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4609 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004610 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004611 Int64Type = SignedLongLong;
4612 }
4613};
Eli Friedman245f2292009-07-05 22:31:18 +00004614
Eli Friedman9fa28852012-08-08 23:57:20 +00004615class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4616public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004617 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4618 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004619 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004620 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004621 }
4622};
Tim Northover9bb857a2013-01-31 12:13:10 +00004623
Eli Friedmanf05b7722008-08-20 07:44:10 +00004624class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004625 // Possible FPU choices.
4626 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004627 VFP2FPU = (1 << 0),
4628 VFP3FPU = (1 << 1),
4629 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004630 NeonFPU = (1 << 3),
4631 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004632 };
4633
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004634 // Possible HWDiv features.
4635 enum HWDivMode {
4636 HWDivThumb = (1 << 0),
4637 HWDivARM = (1 << 1)
4638 };
4639
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004640 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004641 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004642 }
4643
4644 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4645 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004646
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004647 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004648
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004649 StringRef CPUProfile;
4650 StringRef CPUAttr;
4651
Rafael Espindolaeb265472013-08-21 21:59:03 +00004652 enum {
4653 FP_Default,
4654 FP_VFP,
4655 FP_Neon
4656 } FPMath;
4657
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004658 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004659 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004660 unsigned ArchProfile;
4661 unsigned ArchVersion;
4662
Bernard Ogdenda13af32013-10-24 18:32:51 +00004663 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004664
Logan Chien57086ce2012-10-10 06:56:20 +00004665 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004666 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004667
4668 // Initialized via features.
4669 unsigned SoftFloat : 1;
4670 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004671
Bernard Ogden18b57012013-10-29 09:47:51 +00004672 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004673 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004674 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004675 unsigned Unaligned : 1;
4676
4677 enum {
4678 LDREX_B = (1 << 0), /// byte (8-bit)
4679 LDREX_H = (1 << 1), /// half (16-bit)
4680 LDREX_W = (1 << 2), /// word (32-bit)
4681 LDREX_D = (1 << 3), /// double (64-bit)
4682 };
4683
4684 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004685
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004686 // ACLE 6.5.1 Hardware floating point
4687 enum {
4688 HW_FP_HP = (1 << 1), /// half (16-bit)
4689 HW_FP_SP = (1 << 2), /// single (32-bit)
4690 HW_FP_DP = (1 << 3), /// double (64-bit)
4691 };
4692 uint32_t HW_FP;
4693
Chris Lattner5cc15e02010-03-03 19:03:45 +00004694 static const Builtin::Info BuiltinInfo[];
4695
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004696 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004697 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004698
4699 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004700 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004701
Renato Golin0201a9e2016-09-22 19:28:20 +00004702 // size_t is unsigned long on MachO-derived environments, NetBSD,
4703 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004704 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004705 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004706 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004707 SizeType = UnsignedLong;
4708 else
4709 SizeType = UnsignedInt;
4710
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004711 switch (T.getOS()) {
4712 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004713 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004714 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004715 break;
4716 case llvm::Triple::Win32:
4717 WCharType = UnsignedShort;
4718 break;
4719 case llvm::Triple::Linux:
4720 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004721 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4722 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004723 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004724 }
4725
4726 UseBitFieldTypeAlignment = true;
4727
4728 ZeroLengthBitfieldBoundary = 0;
4729
Tim Northover147cd2f2014-10-14 22:12:21 +00004730 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4731 // so set preferred for small types to 32.
4732 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004733 resetDataLayout(BigEndian
4734 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4735 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004736 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004737 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004738 resetDataLayout("e"
4739 "-m:w"
4740 "-p:32:32"
4741 "-i64:64"
4742 "-v128:64:128"
4743 "-a:0:32"
4744 "-n32"
4745 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004746 } else if (T.isOSNaCl()) {
4747 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004748 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004749 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004750 resetDataLayout(BigEndian
4751 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4752 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004753 }
4754
4755 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004756 }
4757
Tim Northover5627d392015-10-30 16:30:45 +00004758 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004759 const llvm::Triple &T = getTriple();
4760
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004761 IsAAPCS = false;
4762
Tim Northover5627d392015-10-30 16:30:45 +00004763 if (IsAAPCS16)
4764 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4765 else
4766 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004767
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004768 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004769 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004770 SizeType = UnsignedInt;
4771 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004772 SizeType = UnsignedLong;
4773
4774 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4775 WCharType = SignedInt;
4776
4777 // Do not respect the alignment of bit-field types when laying out
4778 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4779 UseBitFieldTypeAlignment = false;
4780
4781 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4782 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4783 /// gcc.
4784 ZeroLengthBitfieldBoundary = 32;
4785
Tim Northover5627d392015-10-30 16:30:45 +00004786 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4787 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004788 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004789 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004790 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004791 BigEndian
4792 ? "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 +00004793 : "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 +00004794 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004795 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004796 BigEndian
4797 ? "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 +00004798 : "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 +00004799
4800 // FIXME: Override "preferred align" for double and long long.
4801 }
4802
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004803 void setArchInfo() {
4804 StringRef ArchName = getTriple().getArchName();
4805
Renato Goline84b0002015-10-08 16:43:26 +00004806 ArchISA = llvm::ARM::parseArchISA(ArchName);
4807 CPU = llvm::ARM::getDefaultCPU(ArchName);
4808 unsigned AK = llvm::ARM::parseArch(ArchName);
4809 if (AK != llvm::ARM::AK_INVALID)
4810 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004811 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004812 }
4813
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004814 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004815 StringRef SubArch;
4816
4817 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004818 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00004819 SubArch = llvm::ARM::getSubArch(ArchKind);
4820 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
4821 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004822
4823 // cache CPU related strings
4824 CPUAttr = getCPUAttr();
4825 CPUProfile = getCPUProfile();
4826 }
4827
4828 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00004829 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004830 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00004831 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004832 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
4833 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00004834 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004835 if (ArchProfile == llvm::ARM::PK_M) {
4836 MaxAtomicPromoteWidth = 32;
4837 if (ShouldUseInlineAtomic)
4838 MaxAtomicInlineWidth = 32;
4839 }
4840 else {
4841 MaxAtomicPromoteWidth = 64;
4842 if (ShouldUseInlineAtomic)
4843 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00004844 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004845 }
4846
4847 bool isThumb() const {
4848 return (ArchISA == llvm::ARM::IK_THUMB);
4849 }
4850
4851 bool supportsThumb() const {
4852 return CPUAttr.count('T') || ArchVersion >= 6;
4853 }
4854
4855 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00004856 return CPUAttr.equals("6T2") ||
4857 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004858 }
4859
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004860 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004861 // For most sub-arches, the build attribute CPU name is enough.
4862 // For Cortex variants, it's slightly different.
4863 switch(ArchKind) {
4864 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00004865 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004866 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004867 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00004868 case llvm::ARM::AK_ARMV7S:
4869 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004870 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004871 return "7A";
4872 case llvm::ARM::AK_ARMV7R:
4873 return "7R";
4874 case llvm::ARM::AK_ARMV7M:
4875 return "7M";
4876 case llvm::ARM::AK_ARMV7EM:
4877 return "7EM";
4878 case llvm::ARM::AK_ARMV8A:
4879 return "8A";
4880 case llvm::ARM::AK_ARMV8_1A:
4881 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00004882 case llvm::ARM::AK_ARMV8_2A:
4883 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00004884 case llvm::ARM::AK_ARMV8MBaseline:
4885 return "8M_BASE";
4886 case llvm::ARM::AK_ARMV8MMainline:
4887 return "8M_MAIN";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004888 }
4889 }
4890
4891 StringRef getCPUProfile() const {
4892 switch(ArchProfile) {
4893 case llvm::ARM::PK_A:
4894 return "A";
4895 case llvm::ARM::PK_R:
4896 return "R";
4897 case llvm::ARM::PK_M:
4898 return "M";
4899 default:
4900 return "";
4901 }
4902 }
4903
Chris Lattner17df24e2008-04-21 18:56:49 +00004904public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00004905 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004906 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
4907 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004908
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004909 switch (getTriple().getOS()) {
4910 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004911 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004912 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004913 break;
4914 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00004915 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00004916 break;
4917 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004918
Renato Goline84b0002015-10-08 16:43:26 +00004919 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004920 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00004921
Chris Lattner1a8f3942010-04-23 16:29:58 +00004922 // {} in inline assembly are neon specifiers, not assembly variant
4923 // specifiers.
4924 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004925
Eric Christopher0e261882014-12-05 01:06:59 +00004926 // FIXME: This duplicates code from the driver that sets the -target-abi
4927 // option - this code is used if -target-abi isn't passed and should
4928 // be unified in some way.
4929 if (Triple.isOSBinFormatMachO()) {
4930 // The backend is hardwired to assume AAPCS for M-class processors, ensure
4931 // the frontend matches that.
4932 if (Triple.getEnvironment() == llvm::Triple::EABI ||
4933 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00004934 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00004935 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00004936 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00004937 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00004938 } else {
4939 setABI("apcs-gnu");
4940 }
4941 } else if (Triple.isOSWindows()) {
4942 // FIXME: this is invalid for WindowsCE
4943 setABI("aapcs");
4944 } else {
4945 // Select the default based on the platform.
4946 switch (Triple.getEnvironment()) {
4947 case llvm::Triple::Android:
4948 case llvm::Triple::GNUEABI:
4949 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00004950 case llvm::Triple::MuslEABI:
4951 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00004952 setABI("aapcs-linux");
4953 break;
4954 case llvm::Triple::EABIHF:
4955 case llvm::Triple::EABI:
4956 setABI("aapcs");
4957 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00004958 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00004959 setABI("apcs-gnu");
4960 break;
Eric Christopher0e261882014-12-05 01:06:59 +00004961 default:
4962 if (Triple.getOS() == llvm::Triple::NetBSD)
4963 setABI("apcs-gnu");
4964 else
4965 setABI("aapcs");
4966 break;
4967 }
4968 }
John McCall86353412010-08-21 22:46:04 +00004969
4970 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00004971 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004972
Renato Golin15b86152015-07-03 16:41:13 +00004973 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004974 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00004975
James Molloya7139222012-03-12 09:14:10 +00004976 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00004977 // the alignment of the zero-length bitfield is greater than the member
4978 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00004979 // zero length bitfield.
4980 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00004981
4982 if (Triple.getOS() == llvm::Triple::Linux ||
4983 Triple.getOS() == llvm::Triple::UnknownOS)
4984 this->MCountName =
4985 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00004986 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004987
Alp Toker4925ba72014-06-07 23:30:42 +00004988 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00004989
Craig Topper3164f332014-03-11 03:39:26 +00004990 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004991 ABI = Name;
4992
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00004993 // The defaults (above) are for AAPCS, check if we need to change them.
4994 //
4995 // FIXME: We need support for -meabi... we could just mangle it into the
4996 // name.
Tim Northover756447a2015-10-30 16:30:36 +00004997 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00004998 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004999 return true;
5000 }
5001 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5002 setABIAAPCS();
5003 return true;
5004 }
5005 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005006 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005007
Renato Golinf5c4dec2015-05-27 13:33:00 +00005008 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005009 bool
5010 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5011 StringRef CPU,
5012 const std::vector<std::string> &FeaturesVec) const override {
5013
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005014 std::vector<const char*> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005015 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005016
5017 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005018 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005019 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5020
5021 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005022 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005023 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5024
5025 for (const char *Feature : TargetFeatures)
5026 if (Feature[0] == '+')
Eric Christopherb093d692015-10-09 18:39:59 +00005027 Features[Feature+1] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005028
Eric Christopher007b0a02015-08-28 22:32:01 +00005029 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005030 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005031
Craig Topper3164f332014-03-11 03:39:26 +00005032 bool handleTargetFeatures(std::vector<std::string> &Features,
5033 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005034 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005035 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005036 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005037 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005038 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005039 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005040 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005041
Ranjeet Singhac08e532015-06-24 23:39:25 +00005042 // This does not diagnose illegal cases like having both
5043 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5044 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005045 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005046 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005047 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005048 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005049 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005050 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005051 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005052 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005053 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005054 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005055 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005056 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005057 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005058 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005059 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005060 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005061 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005062 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005063 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005064 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005065 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005066 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005067 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005068 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005069 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005070 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005071 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005072 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005073 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005074 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005075 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005076 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005077 } else if (Feature == "+strict-align") {
5078 Unaligned = 0;
5079 } else if (Feature == "+fp16") {
5080 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005081 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005082 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005083 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005084
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005085 switch (ArchVersion) {
5086 case 6:
5087 if (ArchProfile == llvm::ARM::PK_M)
5088 LDREX = 0;
5089 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5090 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5091 else
5092 LDREX = LDREX_W;
5093 break;
5094 case 7:
5095 if (ArchProfile == llvm::ARM::PK_M)
5096 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5097 else
5098 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5099 break;
5100 case 8:
5101 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5102 }
5103
Rafael Espindolaeb265472013-08-21 21:59:03 +00005104 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5105 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5106 return false;
5107 }
5108
5109 if (FPMath == FP_Neon)
5110 Features.push_back("+neonfp");
5111 else if (FPMath == FP_VFP)
5112 Features.push_back("-neonfp");
5113
Daniel Dunbar893d4752009-12-19 04:15:38 +00005114 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005115 auto Feature =
5116 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5117 if (Feature != Features.end())
5118 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005119
Rafael Espindolaeb265472013-08-21 21:59:03 +00005120 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005121 }
5122
Craig Topper3164f332014-03-11 03:39:26 +00005123 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005124 return llvm::StringSwitch<bool>(Feature)
5125 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005126 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005127 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005128 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005129 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005130 .Case("hwdiv", HWDiv & HWDivThumb)
5131 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005132 .Default(false);
5133 }
Renato Golin15b86152015-07-03 16:41:13 +00005134
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005135 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005136 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005137 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005138
Renato Golin15b86152015-07-03 16:41:13 +00005139 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005140 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005141 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005142 CPU = Name;
5143 return true;
5144 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005145
Craig Topper3164f332014-03-11 03:39:26 +00005146 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005147
Craig Topper3164f332014-03-11 03:39:26 +00005148 void getTargetDefines(const LangOptions &Opts,
5149 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005150 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005151 Builder.defineMacro("__arm");
5152 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005153 // For bare-metal none-eabi.
5154 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5155 getTriple().getEnvironment() == llvm::Triple::EABI)
5156 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005157
Chris Lattnerecd49032009-03-02 22:27:17 +00005158 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005159 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005160
5161 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5162 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005163 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005164 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5165
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005166 if (!CPUAttr.empty())
5167 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005168
5169 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005170 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005171 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005172
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005173 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005174 // ACLE 6.5.7 Crypto Extension
5175 if (Crypto)
5176 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5177 // ACLE 6.5.8 CRC32 Extension
5178 if (CRC)
5179 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5180 // ACLE 6.5.10 Numeric Maximum and Minimum
5181 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5182 // ACLE 6.5.9 Directed Rounding
5183 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005184 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005185
5186 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5187 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005188 // NOTE that the default profile is assumed to be 'A'
5189 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005190 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5191
Bradley Smithf4affc12016-03-03 13:52:22 +00005192 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5193 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5194 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5195 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005196 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005197 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005198 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005199 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5200
5201 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5202 // instruction set such as ARM or Thumb.
5203 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5204
5205 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5206
5207 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005208 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005209 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005210
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005211 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005212 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005213 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005214
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005215 // ACLE 6.4.4 LDREX/STREX
5216 if (LDREX)
5217 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5218
5219 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005220 if (ArchVersion == 5 ||
5221 (ArchVersion == 6 && CPUProfile != "M") ||
5222 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005223 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5224
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005225 // ACLE 6.5.1 Hardware Floating Point
5226 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005227 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005228
Yi Konga44c4d72014-06-27 21:25:42 +00005229 // ACLE predefines.
5230 Builder.defineMacro("__ARM_ACLE", "200");
5231
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005232 // FP16 support (we currently only support IEEE format).
5233 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5234 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5235
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005236 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005237 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005238 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5239
Mike Stump9d54bd72009-04-08 02:07:04 +00005240 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005241
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005242 // FIXME: It's more complicated than this and we don't really support
5243 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005244 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005245 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005246 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005247
David Tweed8f676532012-10-25 13:33:01 +00005248 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005249 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005250 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005251 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005252 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005253 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005254 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005255
Tim Northover28fc0e12016-04-28 13:59:55 +00005256 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5257 ABI == "aapcs16")
5258 Builder.defineMacro("__ARM_PCS_VFP", "1");
5259
Daniel Dunbar893d4752009-12-19 04:15:38 +00005260 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005261 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005262
Zijiao Ma56a83722016-08-17 02:13:33 +00005263 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005264 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005265
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005266 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005267 Builder.defineMacro("__THUMBEL__");
5268 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005269 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005270 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005271 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005272
5273 // ACLE 6.4.9 32-bit SIMD instructions
5274 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5275 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5276
5277 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005278 if (((HWDiv & HWDivThumb) && isThumb()) ||
5279 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005280 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005281 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005282 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005283
5284 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005285 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005286
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005287 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005288 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005289 if (FPU & VFP2FPU)
5290 Builder.defineMacro("__ARM_VFPV2__");
5291 if (FPU & VFP3FPU)
5292 Builder.defineMacro("__ARM_VFPV3__");
5293 if (FPU & VFP4FPU)
5294 Builder.defineMacro("__ARM_VFPV4__");
5295 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005296
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005297 // This only gets set when Neon instructions are actually available, unlike
5298 // the VFP define, hence the soft float and arch check. This is subtly
5299 // different from gcc, we follow the intent which was that it should be set
5300 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005301 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005302 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005303 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005304 // current AArch32 NEON implementations do not support double-precision
5305 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005306 Builder.defineMacro("__ARM_NEON_FP",
5307 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005308 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005309
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005310 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5311 Opts.ShortWChar ? "2" : "4");
5312
5313 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5314 Opts.ShortEnums ? "1" : "4");
5315
Bradley Smithf4affc12016-03-03 13:52:22 +00005316 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005317 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5318 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5319 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5320 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5321 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005322
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005323 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005324 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005325 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005326 }
5327
5328 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005329 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005330 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5331 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005332 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005333 }
5334
5335 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005336 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005337 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005338
5339 if (Opts.UnsafeFPMath)
5340 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005341
5342 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5343 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005344 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005345
Craig Topper6c03a542015-10-19 04:51:35 +00005346 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5347 return llvm::makeArrayRef(BuiltinInfo,
5348 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005349 }
Craig Topper3164f332014-03-11 03:39:26 +00005350 bool isCLZForZeroUndef() const override { return false; }
5351 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005352 return IsAAPCS
5353 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005354 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5355 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005356 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005357 ArrayRef<const char *> getGCCRegNames() const override;
5358 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005359 bool validateAsmConstraint(const char *&Name,
5360 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005361 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005362 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005363 case 'l': // r0-r7
5364 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005365 case 't': // VFP Floating point register single precision
5366 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005367 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005368 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005369 case 'I':
5370 case 'J':
5371 case 'K':
5372 case 'L':
5373 case 'M':
5374 // FIXME
5375 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005376 case 'Q': // A memory address that is a single base register.
5377 Info.setAllowsMemory();
5378 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005379 case 'U': // a memory reference...
5380 switch (Name[1]) {
5381 case 'q': // ...ARMV4 ldrsb
5382 case 'v': // ...VFP load/store (reg+constant offset)
5383 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005384 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005385 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005386 case 'n': // valid address for Neon doubleword vector load/store
5387 case 'm': // valid address for Neon element and structure load/store
5388 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005389 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005390 Info.setAllowsMemory();
5391 Name++;
5392 return true;
5393 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005394 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005395 return false;
5396 }
Craig Topper3164f332014-03-11 03:39:26 +00005397 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005398 std::string R;
5399 switch (*Constraint) {
5400 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005401 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005402 Constraint++;
5403 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005404 case 'p': // 'p' should be translated to 'r' by default.
5405 R = std::string("r");
5406 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005407 default:
5408 return std::string(1, *Constraint);
5409 }
5410 return R;
5411 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005412 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005413 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005414 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005415 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005416 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005417
Bill Wendling9d1ee112012-10-25 23:28:48 +00005418 // Strip off constraint modifiers.
5419 while (Constraint[0] == '=' ||
5420 Constraint[0] == '+' ||
5421 Constraint[0] == '&')
5422 Constraint = Constraint.substr(1);
5423
5424 switch (Constraint[0]) {
5425 default: break;
5426 case 'r': {
5427 switch (Modifier) {
5428 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005429 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005430 case 'q':
5431 // A register of size 32 cannot fit a vector type.
5432 return false;
5433 }
5434 }
5435 }
5436
5437 return true;
5438 }
Craig Topper3164f332014-03-11 03:39:26 +00005439 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005440 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005441 return "";
5442 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005443
Craig Topper3164f332014-03-11 03:39:26 +00005444 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005445 switch (CC) {
5446 case CC_AAPCS:
5447 case CC_AAPCS_VFP:
5448 case CC_Swift:
5449 return CCCR_OK;
5450 default:
5451 return CCCR_Warning;
5452 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005453 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005454
Craig Topper3164f332014-03-11 03:39:26 +00005455 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005456 if (RegNo == 0) return 0;
5457 if (RegNo == 1) return 1;
5458 return -1;
5459 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005460
5461 bool hasSjLjLowering() const override {
5462 return true;
5463 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005464};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005465
Rafael Espindolaeb265472013-08-21 21:59:03 +00005466bool ARMTargetInfo::setFPMath(StringRef Name) {
5467 if (Name == "neon") {
5468 FPMath = FP_Neon;
5469 return true;
5470 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5471 Name == "vfp4") {
5472 FPMath = FP_VFP;
5473 return true;
5474 }
5475 return false;
5476}
5477
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005478const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005479 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005480 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005481 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5482
5483 // Float registers
5484 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5485 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5486 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005487 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005488
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005489 // Double registers
5490 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5491 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005492 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5493 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005494
5495 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005496 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5497 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005498};
5499
Craig Topperf054e3a2015-10-19 03:52:27 +00005500ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5501 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005502}
5503
5504const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005505 { { "a1" }, "r0" },
5506 { { "a2" }, "r1" },
5507 { { "a3" }, "r2" },
5508 { { "a4" }, "r3" },
5509 { { "v1" }, "r4" },
5510 { { "v2" }, "r5" },
5511 { { "v3" }, "r6" },
5512 { { "v4" }, "r7" },
5513 { { "v5" }, "r8" },
5514 { { "v6", "rfp" }, "r9" },
5515 { { "sl" }, "r10" },
5516 { { "fp" }, "r11" },
5517 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005518 { { "r13" }, "sp" },
5519 { { "r14" }, "lr" },
5520 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005521 // The S, D and Q registers overlap, but aren't really aliases; we
5522 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005523};
5524
Craig Topperf054e3a2015-10-19 03:52:27 +00005525ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5526 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005527}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005528
5529const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005530#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005531 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005532#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5533 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005534#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005535
Craig Topper07d3b622015-08-07 05:14:44 +00005536#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005537 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005538#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005539 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005540#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5541 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005542#include "clang/Basic/BuiltinsARM.def"
5543};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005544
5545class ARMleTargetInfo : public ARMTargetInfo {
5546public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005547 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005548 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005549 void getTargetDefines(const LangOptions &Opts,
5550 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005551 Builder.defineMacro("__ARMEL__");
5552 ARMTargetInfo::getTargetDefines(Opts, Builder);
5553 }
5554};
5555
5556class ARMbeTargetInfo : public ARMTargetInfo {
5557public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005558 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005559 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005560 void getTargetDefines(const LangOptions &Opts,
5561 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005562 Builder.defineMacro("__ARMEB__");
5563 Builder.defineMacro("__ARM_BIG_ENDIAN");
5564 ARMTargetInfo::getTargetDefines(Opts, Builder);
5565 }
5566};
Chris Lattner17df24e2008-04-21 18:56:49 +00005567
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005568class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5569 const llvm::Triple Triple;
5570public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005571 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5572 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005573 WCharType = UnsignedShort;
5574 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005575 }
5576 void getVisualStudioDefines(const LangOptions &Opts,
5577 MacroBuilder &Builder) const {
5578 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5579
5580 // FIXME: this is invalid for WindowsCE
5581 Builder.defineMacro("_M_ARM_NT", "1");
5582 Builder.defineMacro("_M_ARMT", "_M_ARM");
5583 Builder.defineMacro("_M_THUMB", "_M_ARM");
5584
5585 assert((Triple.getArch() == llvm::Triple::arm ||
5586 Triple.getArch() == llvm::Triple::thumb) &&
5587 "invalid architecture for Windows ARM target info");
5588 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5589 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5590
5591 // TODO map the complete set of values
5592 // 31: VFPv3 40: VFPv4
5593 Builder.defineMacro("_M_ARM_FP", "31");
5594 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005595 BuiltinVaListKind getBuiltinVaListKind() const override {
5596 return TargetInfo::CharPtrBuiltinVaList;
5597 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005598 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5599 switch (CC) {
5600 case CC_X86StdCall:
5601 case CC_X86ThisCall:
5602 case CC_X86FastCall:
5603 case CC_X86VectorCall:
5604 return CCCR_Ignore;
5605 case CC_C:
5606 return CCCR_OK;
5607 default:
5608 return CCCR_Warning;
5609 }
5610 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005611};
5612
5613// Windows ARM + Itanium C++ ABI Target
5614class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5615public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005616 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5617 const TargetOptions &Opts)
5618 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005619 TheCXXABI.set(TargetCXXABI::GenericARM);
5620 }
5621
5622 void getTargetDefines(const LangOptions &Opts,
5623 MacroBuilder &Builder) const override {
5624 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5625
5626 if (Opts.MSVCCompat)
5627 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5628 }
5629};
5630
5631// Windows ARM, MS (C++) ABI
5632class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5633public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005634 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5635 const TargetOptions &Opts)
5636 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005637 TheCXXABI.set(TargetCXXABI::Microsoft);
5638 }
5639
5640 void getTargetDefines(const LangOptions &Opts,
5641 MacroBuilder &Builder) const override {
5642 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5643 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5644 }
5645};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005646
Yaron Keren321249c2015-07-15 13:32:23 +00005647// ARM MinGW target
5648class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5649public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005650 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5651 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005652 TheCXXABI.set(TargetCXXABI::GenericARM);
5653 }
5654
5655 void getTargetDefines(const LangOptions &Opts,
5656 MacroBuilder &Builder) const override {
5657 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5658 DefineStd(Builder, "WIN32", Opts);
5659 DefineStd(Builder, "WINNT", Opts);
5660 Builder.defineMacro("_ARM_");
5661 addMinGWDefines(Opts, Builder);
5662 }
5663};
5664
5665// ARM Cygwin target
5666class CygwinARMTargetInfo : public ARMleTargetInfo {
5667public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005668 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5669 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005670 TLSSupported = false;
5671 WCharType = UnsignedShort;
5672 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005673 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005674 }
5675 void getTargetDefines(const LangOptions &Opts,
5676 MacroBuilder &Builder) const override {
5677 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5678 Builder.defineMacro("_ARM_");
5679 Builder.defineMacro("__CYGWIN__");
5680 Builder.defineMacro("__CYGWIN32__");
5681 DefineStd(Builder, "unix", Opts);
5682 if (Opts.CPlusPlus)
5683 Builder.defineMacro("_GNU_SOURCE");
5684 }
5685};
5686
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005687class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005688protected:
Craig Topper3164f332014-03-11 03:39:26 +00005689 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5690 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005691 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005692 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005693
Torok Edwinb2b37c62009-06-30 17:10:35 +00005694public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005695 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5696 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005697 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005698 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005699 // FIXME: This should be based off of the target features in
5700 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005701 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005702
Tim Northoverd88ecb32016-01-27 19:32:40 +00005703 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005704 // Darwin on iOS uses a variant of the ARM C++ ABI.
5705 TheCXXABI.set(TargetCXXABI::WatchOS);
5706
5707 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5708 // size_t is long, it's a bit weird for it to be int.
5709 PtrDiffType = SignedLong;
5710
5711 // BOOL should be a real boolean on the new ABI
5712 UseSignedCharForObjCBool = false;
5713 } else
5714 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005715 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005716};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005717
Tim Northover573cbee2014-05-24 12:52:07 +00005718class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005719 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005720 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5721 static const char *const GCCRegNames[];
5722
James Molloy75f5f9e2014-04-16 15:33:48 +00005723 enum FPUModeEnum {
5724 FPUMode,
5725 NeonMode
5726 };
5727
5728 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005729 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005730 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005731 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005732 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005733
Tim Northovera2ee4332014-03-29 15:09:45 +00005734 static const Builtin::Info BuiltinInfo[];
5735
5736 std::string ABI;
5737
5738public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005739 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005740 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005741 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5742 WCharType = SignedInt;
5743
5744 // NetBSD apparently prefers consistency across ARM targets to consistency
5745 // across 64-bit targets.
5746 Int64Type = SignedLongLong;
5747 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005748 } else {
5749 WCharType = UnsignedInt;
5750 Int64Type = SignedLong;
5751 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005752 }
5753
Tim Northovera2ee4332014-03-29 15:09:45 +00005754 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005755 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005756 MaxAtomicInlineWidth = 128;
5757 MaxAtomicPromoteWidth = 128;
5758
Tim Northovera6a19f12015-02-06 01:25:07 +00005759 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005760 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5761
Tim Northovera2ee4332014-03-29 15:09:45 +00005762 // {} in inline assembly are neon specifiers, not assembly variant
5763 // specifiers.
5764 NoAsmVariants = true;
5765
Tim Northover7ad87af2015-01-16 18:44:04 +00005766 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5767 // contributes to the alignment of the containing aggregate in the same way
5768 // a plain (non bit-field) member of that type would, without exception for
5769 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005770 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005771 UseZeroLengthBitfieldAlignment = true;
5772
Tim Northover573cbee2014-05-24 12:52:07 +00005773 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005774 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005775
5776 if (Triple.getOS() == llvm::Triple::Linux ||
5777 Triple.getOS() == llvm::Triple::UnknownOS)
5778 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005779 }
5780
Alp Toker4925ba72014-06-07 23:30:42 +00005781 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005782 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005783 if (Name != "aapcs" && Name != "darwinpcs")
5784 return false;
5785
5786 ABI = Name;
5787 return true;
5788 }
5789
David Blaikie1cbb9712014-11-14 19:09:44 +00005790 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005791 return Name == "generic" ||
5792 llvm::AArch64::parseCPUArch(Name) !=
5793 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005794 }
5795
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005796 void getTargetDefines(const LangOptions &Opts,
5797 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005798 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005799 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005800
5801 // Target properties.
5802 Builder.defineMacro("_LP64");
5803 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005804
5805 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5806 Builder.defineMacro("__ARM_ACLE", "200");
5807 Builder.defineMacro("__ARM_ARCH", "8");
5808 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5809
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005810 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005811 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005812 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005813
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005814 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5815 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5816 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
5817 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00005818 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005819 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5820 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005821
5822 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
5823
5824 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005825 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00005826
5827 // PCS specifies this for SysV variants, which is all we support. Other ABIs
5828 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005829 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5830 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005831
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005832 if (Opts.UnsafeFPMath)
5833 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00005834
5835 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
5836
5837 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5838 Opts.ShortEnums ? "1" : "4");
5839
James Molloy75f5f9e2014-04-16 15:33:48 +00005840 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005841 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00005842 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005843 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00005844 }
Tim Northovera2ee4332014-03-29 15:09:45 +00005845
Bradley Smith418c5932014-05-02 15:17:51 +00005846 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005847 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00005848
James Molloy75f5f9e2014-04-16 15:33:48 +00005849 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005850 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5851
5852 if (Unaligned)
5853 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00005854
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005855 if (V8_1A)
5856 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
5857
Reid Klecknerd167d422015-05-06 15:31:46 +00005858 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
5859 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5860 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5861 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5862 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00005863 }
5864
Craig Topper6c03a542015-10-19 04:51:35 +00005865 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5866 return llvm::makeArrayRef(BuiltinInfo,
5867 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00005868 }
5869
David Blaikie1cbb9712014-11-14 19:09:44 +00005870 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005871 return Feature == "aarch64" ||
5872 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005873 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00005874 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00005875 }
5876
James Molloy5e73df52014-04-16 15:06:20 +00005877 bool handleTargetFeatures(std::vector<std::string> &Features,
5878 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00005879 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00005880 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00005881 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005882 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005883 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005884
Eric Christopher610fe112015-08-26 08:21:55 +00005885 for (const auto &Feature : Features) {
5886 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00005887 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00005888 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00005889 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00005890 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00005891 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005892 if (Feature == "+strict-align")
5893 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005894 if (Feature == "+v8.1a")
5895 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00005896 }
5897
James Y Knightb214cbc2016-03-04 19:00:41 +00005898 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00005899
5900 return true;
5901 }
5902
John McCall477f2bb2016-03-03 06:39:32 +00005903 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5904 switch (CC) {
5905 case CC_C:
5906 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00005907 case CC_PreserveMost:
5908 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00005909 return CCCR_OK;
5910 default:
5911 return CCCR_Warning;
5912 }
5913 }
5914
David Blaikie1cbb9712014-11-14 19:09:44 +00005915 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005916
David Blaikie1cbb9712014-11-14 19:09:44 +00005917 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005918 return TargetInfo::AArch64ABIBuiltinVaList;
5919 }
5920
Craig Topperf054e3a2015-10-19 03:52:27 +00005921 ArrayRef<const char *> getGCCRegNames() const override;
5922 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00005923
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005924 bool validateAsmConstraint(const char *&Name,
5925 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005926 switch (*Name) {
5927 default:
5928 return false;
5929 case 'w': // Floating point and SIMD registers (V0-V31)
5930 Info.setAllowsRegister();
5931 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00005932 case 'I': // Constant that can be used with an ADD instruction
5933 case 'J': // Constant that can be used with a SUB instruction
5934 case 'K': // Constant that can be used with a 32-bit logical instruction
5935 case 'L': // Constant that can be used with a 64-bit logical instruction
5936 case 'M': // Constant that can be used as a 32-bit MOV immediate
5937 case 'N': // Constant that can be used as a 64-bit MOV immediate
5938 case 'Y': // Floating point constant zero
5939 case 'Z': // Integer constant zero
5940 return true;
5941 case 'Q': // A memory reference with base register and no offset
5942 Info.setAllowsMemory();
5943 return true;
5944 case 'S': // A symbolic address
5945 Info.setAllowsRegister();
5946 return true;
5947 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00005948 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
5949 // Utf: A memory address suitable for ldp/stp in TF mode.
5950 // Usa: An absolute symbolic address.
5951 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
5952 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00005953 case 'z': // Zero register, wzr or xzr
5954 Info.setAllowsRegister();
5955 return true;
5956 case 'x': // Floating point and SIMD registers (V0-V15)
5957 Info.setAllowsRegister();
5958 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00005959 }
5960 return false;
5961 }
5962
Akira Hatanaka987f1862014-08-22 06:05:21 +00005963 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005964 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005965 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00005966 // Strip off constraint modifiers.
5967 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
5968 Constraint = Constraint.substr(1);
5969
5970 switch (Constraint[0]) {
5971 default:
5972 return true;
5973 case 'z':
5974 case 'r': {
5975 switch (Modifier) {
5976 case 'x':
5977 case 'w':
5978 // For now assume that the person knows what they're
5979 // doing with the modifier.
5980 return true;
5981 default:
5982 // By default an 'r' constraint will be in the 'x'
5983 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00005984 if (Size == 64)
5985 return true;
5986
5987 SuggestedModifier = "w";
5988 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00005989 }
5990 }
5991 }
5992 }
5993
David Blaikie1cbb9712014-11-14 19:09:44 +00005994 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00005995
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00005996 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005997 if (RegNo == 0)
5998 return 0;
5999 if (RegNo == 1)
6000 return 1;
6001 return -1;
6002 }
6003};
6004
Tim Northover573cbee2014-05-24 12:52:07 +00006005const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006006 // 32-bit Integer registers
6007 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6008 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6009 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6010
6011 // 64-bit Integer registers
6012 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6013 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6014 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6015
6016 // 32-bit floating point regsisters
6017 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6018 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6019 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6020
6021 // 64-bit floating point regsisters
6022 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6023 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6024 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6025
6026 // Vector registers
6027 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6028 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6029 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6030};
6031
Craig Topperf054e3a2015-10-19 03:52:27 +00006032ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6033 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006034}
6035
Tim Northover573cbee2014-05-24 12:52:07 +00006036const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006037 { { "w31" }, "wsp" },
6038 { { "x29" }, "fp" },
6039 { { "x30" }, "lr" },
6040 { { "x31" }, "sp" },
6041 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6042 // don't want to substitute one of these for a different-sized one.
6043};
6044
Craig Topperf054e3a2015-10-19 03:52:27 +00006045ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6046 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006047}
6048
Tim Northover573cbee2014-05-24 12:52:07 +00006049const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006050#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006051 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006052#include "clang/Basic/BuiltinsNEON.def"
6053
6054#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006055 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006056#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006057};
James Molloy5e73df52014-04-16 15:06:20 +00006058
Tim Northover573cbee2014-05-24 12:52:07 +00006059class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006060 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006061 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006062 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006063 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006064 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006065 }
6066
6067public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006068 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6069 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006070 }
James Molloy5e73df52014-04-16 15:06:20 +00006071 void getTargetDefines(const LangOptions &Opts,
6072 MacroBuilder &Builder) const override {
6073 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006074 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006075 }
6076};
6077
Tim Northover573cbee2014-05-24 12:52:07 +00006078class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006079 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006080 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006081 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006082 }
6083
6084public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006085 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6086 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006087 void getTargetDefines(const LangOptions &Opts,
6088 MacroBuilder &Builder) const override {
6089 Builder.defineMacro("__AARCH64EB__");
6090 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6091 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006092 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006093 }
6094};
Tim Northovera2ee4332014-03-29 15:09:45 +00006095
Tim Northover573cbee2014-05-24 12:52:07 +00006096class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006097protected:
6098 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6099 MacroBuilder &Builder) const override {
6100 Builder.defineMacro("__AARCH64_SIMD__");
6101 Builder.defineMacro("__ARM64_ARCH_8__");
6102 Builder.defineMacro("__ARM_NEON__");
6103 Builder.defineMacro("__LITTLE_ENDIAN__");
6104 Builder.defineMacro("__REGISTER_PREFIX__", "");
6105 Builder.defineMacro("__arm64", "1");
6106 Builder.defineMacro("__arm64__", "1");
6107
6108 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6109 }
6110
Tim Northovera2ee4332014-03-29 15:09:45 +00006111public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006112 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6113 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006114 Int64Type = SignedLongLong;
6115 WCharType = SignedInt;
6116 UseSignedCharForObjCBool = false;
6117
Tim Northovera6a19f12015-02-06 01:25:07 +00006118 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00006119 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6120
6121 TheCXXABI.set(TargetCXXABI::iOS64);
6122 }
6123
David Blaikie1cbb9712014-11-14 19:09:44 +00006124 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006125 return TargetInfo::CharPtrBuiltinVaList;
6126 }
6127};
Tim Northovera2ee4332014-03-29 15:09:45 +00006128
Tony Linthicum76329bf2011-12-12 21:14:55 +00006129// Hexagon abstract base class
6130class HexagonTargetInfo : public TargetInfo {
6131 static const Builtin::Info BuiltinInfo[];
6132 static const char * const GCCRegNames[];
6133 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6134 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006135 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006136 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006137
Tony Linthicum76329bf2011-12-12 21:14:55 +00006138public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006139 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6140 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006141 // Specify the vector alignment explicitly. For v512x1, the calculated
6142 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6143 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006144 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006145 "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 +00006146 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006147 SizeType = UnsignedInt;
6148 PtrDiffType = SignedInt;
6149 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006150
6151 // {} in inline assembly are packet specifiers, not assembly variant
6152 // specifiers.
6153 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006154
6155 LargeArrayMinWidth = 64;
6156 LargeArrayAlign = 64;
6157 UseBitFieldTypeAlignment = true;
6158 ZeroLengthBitfieldBoundary = 32;
6159 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006160 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006161 }
6162
Craig Topper6c03a542015-10-19 04:51:35 +00006163 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6164 return llvm::makeArrayRef(BuiltinInfo,
6165 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006166 }
6167
Craig Topper3164f332014-03-11 03:39:26 +00006168 bool validateAsmConstraint(const char *&Name,
6169 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006170 switch (*Name) {
6171 case 'v':
6172 case 'q':
6173 if (HasHVX) {
6174 Info.setAllowsRegister();
6175 return true;
6176 }
6177 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006178 case 's':
6179 // Relocatable constant.
6180 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006181 }
6182 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006183 }
6184
Craig Topper3164f332014-03-11 03:39:26 +00006185 void getTargetDefines(const LangOptions &Opts,
6186 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006187
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006188 bool isCLZForZeroUndef() const override { return false; }
6189
Craig Topper3164f332014-03-11 03:39:26 +00006190 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006191 return llvm::StringSwitch<bool>(Feature)
6192 .Case("hexagon", true)
6193 .Case("hvx", HasHVX)
6194 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006195 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006196 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006197 }
Craig Topper3164f332014-03-11 03:39:26 +00006198
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006199 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6200 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6201 const override;
6202
6203 bool handleTargetFeatures(std::vector<std::string> &Features,
6204 DiagnosticsEngine &Diags) override;
6205
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006206 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6207 bool Enabled) const override;
6208
Craig Topper3164f332014-03-11 03:39:26 +00006209 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006210 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006211 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006212 ArrayRef<const char *> getGCCRegNames() const override;
6213 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006214 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006215 return "";
6216 }
Sebastian Pop86500282012-01-13 20:37:10 +00006217
6218 static const char *getHexagonCPUSuffix(StringRef Name) {
6219 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006220 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006221 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006222 .Case("hexagonv55", "55")
6223 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006224 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006225 }
6226
Craig Topper3164f332014-03-11 03:39:26 +00006227 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006228 if (!getHexagonCPUSuffix(Name))
6229 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006230 CPU = Name;
6231 return true;
6232 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006233
6234 int getEHDataRegisterNumber(unsigned RegNo) const override {
6235 return RegNo < 2 ? RegNo : -1;
6236 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006237};
6238
6239void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006240 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006241 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006242 Builder.defineMacro("__hexagon__", "1");
6243
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006244 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006245 Builder.defineMacro("__HEXAGON_V4__");
6246 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006247 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006248 Builder.defineMacro("__QDSP6_V4__");
6249 Builder.defineMacro("__QDSP6_ARCH__", "4");
6250 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006251 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006252 Builder.defineMacro("__HEXAGON_V5__");
6253 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6254 if(Opts.HexagonQdsp6Compat) {
6255 Builder.defineMacro("__QDSP6_V5__");
6256 Builder.defineMacro("__QDSP6_ARCH__", "5");
6257 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006258 } else if (CPU == "hexagonv55") {
6259 Builder.defineMacro("__HEXAGON_V55__");
6260 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6261 Builder.defineMacro("__QDSP6_V55__");
6262 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006263 } else if (CPU == "hexagonv60") {
6264 Builder.defineMacro("__HEXAGON_V60__");
6265 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6266 Builder.defineMacro("__QDSP6_V60__");
6267 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006268 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006269
6270 if (hasFeature("hvx")) {
6271 Builder.defineMacro("__HVX__");
6272 if (hasFeature("hvx-double"))
6273 Builder.defineMacro("__HVXDBL__");
6274 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006275}
6276
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006277bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6278 DiagnosticsEngine &Diags, StringRef CPU,
6279 const std::vector<std::string> &FeaturesVec) const {
6280 // Default for v60: -hvx, -hvx-double.
6281 Features["hvx"] = false;
6282 Features["hvx-double"] = false;
6283 Features["long-calls"] = false;
6284
6285 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6286}
6287
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006288bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6289 DiagnosticsEngine &Diags) {
6290 for (auto &F : Features) {
6291 if (F == "+hvx")
6292 HasHVX = true;
6293 else if (F == "-hvx")
6294 HasHVX = HasHVXDouble = false;
6295 else if (F == "+hvx-double")
6296 HasHVX = HasHVXDouble = true;
6297 else if (F == "-hvx-double")
6298 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006299
6300 if (F == "+long-calls")
6301 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006302 else if (F == "-long-calls")
6303 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006304 }
6305 return true;
6306}
6307
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006308void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6309 StringRef Name, bool Enabled) const {
6310 if (Enabled) {
6311 if (Name == "hvx-double")
6312 Features["hvx"] = true;
6313 } else {
6314 if (Name == "hvx")
6315 Features["hvx-double"] = false;
6316 }
6317 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006318}
6319
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006320const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006321 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6322 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6323 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6324 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6325 "p0", "p1", "p2", "p3",
6326 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6327};
6328
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006329ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006330 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006331}
6332
Tony Linthicum76329bf2011-12-12 21:14:55 +00006333const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6334 { { "sp" }, "r29" },
6335 { { "fp" }, "r30" },
6336 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006337};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006338
Craig Topperf054e3a2015-10-19 03:52:27 +00006339ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6340 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006341}
6342
6343
6344const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006345#define BUILTIN(ID, TYPE, ATTRS) \
6346 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6347#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6348 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006349#include "clang/Basic/BuiltinsHexagon.def"
6350};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006351
Jacques Pienaard964cc22016-03-28 21:02:54 +00006352class LanaiTargetInfo : public TargetInfo {
6353 // Class for Lanai (32-bit).
6354 // The CPU profiles supported by the Lanai backend
6355 enum CPUKind {
6356 CK_NONE,
6357 CK_V11,
6358 } CPU;
6359
6360 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6361 static const char *const GCCRegNames[];
6362
6363public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006364 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6365 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006366 // Description string has to be kept in sync with backend.
6367 resetDataLayout("E" // Big endian
6368 "-m:e" // ELF name manging
6369 "-p:32:32" // 32 bit pointers, 32 bit aligned
6370 "-i64:64" // 64 bit integers, 64 bit aligned
6371 "-a:0:32" // 32 bit alignment of objects of aggregate type
6372 "-n32" // 32 bit native integer width
6373 "-S64" // 64 bit natural stack alignment
6374 );
6375
6376 // Setting RegParmMax equal to what mregparm was set to in the old
6377 // toolchain
6378 RegParmMax = 4;
6379
6380 // Set the default CPU to V11
6381 CPU = CK_V11;
6382
6383 // Temporary approach to make everything at least word-aligned and allow for
6384 // safely casting between pointers with different alignment requirements.
6385 // TODO: Remove this when there are no more cast align warnings on the
6386 // firmware.
6387 MinGlobalAlign = 32;
6388 }
6389
6390 void getTargetDefines(const LangOptions &Opts,
6391 MacroBuilder &Builder) const override {
6392 // Define __lanai__ when building for target lanai.
6393 Builder.defineMacro("__lanai__");
6394
6395 // Set define for the CPU specified.
6396 switch (CPU) {
6397 case CK_V11:
6398 Builder.defineMacro("__LANAI_V11__");
6399 break;
6400 case CK_NONE:
6401 llvm_unreachable("Unhandled target CPU");
6402 }
6403 }
6404
6405 bool setCPU(const std::string &Name) override {
6406 CPU = llvm::StringSwitch<CPUKind>(Name)
6407 .Case("v11", CK_V11)
6408 .Default(CK_NONE);
6409
6410 return CPU != CK_NONE;
6411 }
6412
6413 bool hasFeature(StringRef Feature) const override {
6414 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6415 }
6416
6417 ArrayRef<const char *> getGCCRegNames() const override;
6418
6419 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6420
6421 BuiltinVaListKind getBuiltinVaListKind() const override {
6422 return TargetInfo::VoidPtrBuiltinVaList;
6423 }
6424
6425 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6426
6427 bool validateAsmConstraint(const char *&Name,
6428 TargetInfo::ConstraintInfo &info) const override {
6429 return false;
6430 }
6431
6432 const char *getClobbers() const override { return ""; }
6433};
6434
6435const char *const LanaiTargetInfo::GCCRegNames[] = {
6436 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6437 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6438 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6439
6440ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6441 return llvm::makeArrayRef(GCCRegNames);
6442}
6443
6444const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6445 {{"pc"}, "r2"},
6446 {{"sp"}, "r4"},
6447 {{"fp"}, "r5"},
6448 {{"rv"}, "r8"},
6449 {{"rr1"}, "r10"},
6450 {{"rr2"}, "r11"},
6451 {{"rca"}, "r15"},
6452};
6453
6454ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6455 return llvm::makeArrayRef(GCCRegAliases);
6456}
6457
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006458// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6459class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006460 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6461 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006462 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006463public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006464 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006465 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006466
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006467 int getEHDataRegisterNumber(unsigned RegNo) const override {
6468 if (RegNo == 0) return 24;
6469 if (RegNo == 1) return 25;
6470 return -1;
6471 }
6472
Craig Topper3164f332014-03-11 03:39:26 +00006473 bool handleTargetFeatures(std::vector<std::string> &Features,
6474 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006475 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006476 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6477 if (Feature != Features.end()) {
6478 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006479 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006480 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006481 }
Craig Topper3164f332014-03-11 03:39:26 +00006482 void getTargetDefines(const LangOptions &Opts,
6483 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006484 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006485 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006486
6487 if (SoftFloat)
6488 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006489 }
Craig Topper3164f332014-03-11 03:39:26 +00006490
6491 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006492 return llvm::StringSwitch<bool>(Feature)
6493 .Case("softfloat", SoftFloat)
6494 .Case("sparc", true)
6495 .Default(false);
6496 }
Craig Topper3164f332014-03-11 03:39:26 +00006497
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006498 bool hasSjLjLowering() const override {
6499 return true;
6500 }
6501
Craig Topper6c03a542015-10-19 04:51:35 +00006502 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006503 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006504 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006505 }
Craig Topper3164f332014-03-11 03:39:26 +00006506 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006507 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006508 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006509 ArrayRef<const char *> getGCCRegNames() const override;
6510 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006511 bool validateAsmConstraint(const char *&Name,
6512 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006513 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006514 switch (*Name) {
6515 case 'I': // Signed 13-bit constant
6516 case 'J': // Zero
6517 case 'K': // 32-bit constant with the low 12 bits clear
6518 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6519 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6520 case 'N': // Same as 'K' but zext (required for SIMode)
6521 case 'O': // The constant 4096
6522 return true;
6523 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006524 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006525 }
Craig Topper3164f332014-03-11 03:39:26 +00006526 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006527 // FIXME: Implement!
6528 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006529 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006530
6531 // No Sparc V7 for now, the backend doesn't support it anyway.
6532 enum CPUKind {
6533 CK_GENERIC,
6534 CK_V8,
6535 CK_SUPERSPARC,
6536 CK_SPARCLITE,
6537 CK_F934,
6538 CK_HYPERSPARC,
6539 CK_SPARCLITE86X,
6540 CK_SPARCLET,
6541 CK_TSC701,
6542 CK_V9,
6543 CK_ULTRASPARC,
6544 CK_ULTRASPARC3,
6545 CK_NIAGARA,
6546 CK_NIAGARA2,
6547 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006548 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006549 CK_MYRIAD2100,
6550 CK_MYRIAD2150,
6551 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006552 CK_LEON2,
6553 CK_LEON2_AT697E,
6554 CK_LEON2_AT697F,
6555 CK_LEON3,
6556 CK_LEON3_UT699,
6557 CK_LEON3_GR712RC,
6558 CK_LEON4,
6559 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006560 } CPU = CK_GENERIC;
6561
6562 enum CPUGeneration {
6563 CG_V8,
6564 CG_V9,
6565 };
6566
6567 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6568 switch (Kind) {
6569 case CK_GENERIC:
6570 case CK_V8:
6571 case CK_SUPERSPARC:
6572 case CK_SPARCLITE:
6573 case CK_F934:
6574 case CK_HYPERSPARC:
6575 case CK_SPARCLITE86X:
6576 case CK_SPARCLET:
6577 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006578 case CK_MYRIAD2100:
6579 case CK_MYRIAD2150:
6580 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006581 case CK_LEON2:
6582 case CK_LEON2_AT697E:
6583 case CK_LEON2_AT697F:
6584 case CK_LEON3:
6585 case CK_LEON3_UT699:
6586 case CK_LEON3_GR712RC:
6587 case CK_LEON4:
6588 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006589 return CG_V8;
6590 case CK_V9:
6591 case CK_ULTRASPARC:
6592 case CK_ULTRASPARC3:
6593 case CK_NIAGARA:
6594 case CK_NIAGARA2:
6595 case CK_NIAGARA3:
6596 case CK_NIAGARA4:
6597 return CG_V9;
6598 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006599 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006600 }
6601
6602 CPUKind getCPUKind(StringRef Name) const {
6603 return llvm::StringSwitch<CPUKind>(Name)
6604 .Case("v8", CK_V8)
6605 .Case("supersparc", CK_SUPERSPARC)
6606 .Case("sparclite", CK_SPARCLITE)
6607 .Case("f934", CK_F934)
6608 .Case("hypersparc", CK_HYPERSPARC)
6609 .Case("sparclite86x", CK_SPARCLITE86X)
6610 .Case("sparclet", CK_SPARCLET)
6611 .Case("tsc701", CK_TSC701)
6612 .Case("v9", CK_V9)
6613 .Case("ultrasparc", CK_ULTRASPARC)
6614 .Case("ultrasparc3", CK_ULTRASPARC3)
6615 .Case("niagara", CK_NIAGARA)
6616 .Case("niagara2", CK_NIAGARA2)
6617 .Case("niagara3", CK_NIAGARA3)
6618 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006619 .Case("ma2100", CK_MYRIAD2100)
6620 .Case("ma2150", CK_MYRIAD2150)
6621 .Case("ma2450", CK_MYRIAD2450)
6622 // FIXME: the myriad2[.n] spellings are obsolete,
6623 // but a grace period is needed to allow updating dependent builds.
6624 .Case("myriad2", CK_MYRIAD2100)
6625 .Case("myriad2.1", CK_MYRIAD2100)
6626 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006627 .Case("leon2", CK_LEON2)
6628 .Case("at697e", CK_LEON2_AT697E)
6629 .Case("at697f", CK_LEON2_AT697F)
6630 .Case("leon3", CK_LEON3)
6631 .Case("ut699", CK_LEON3_UT699)
6632 .Case("gr712rc", CK_LEON3_GR712RC)
6633 .Case("leon4", CK_LEON4)
6634 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006635 .Default(CK_GENERIC);
6636 }
6637
6638 bool setCPU(const std::string &Name) override {
6639 CPU = getCPUKind(Name);
6640 return CPU != CK_GENERIC;
6641 }
Gabor Greif49991682008-02-21 16:29:08 +00006642};
6643
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006644const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006645 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6646 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6647 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6648 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6649};
6650
Craig Topperf054e3a2015-10-19 03:52:27 +00006651ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6652 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006653}
6654
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006655const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006656 { { "g0" }, "r0" },
6657 { { "g1" }, "r1" },
6658 { { "g2" }, "r2" },
6659 { { "g3" }, "r3" },
6660 { { "g4" }, "r4" },
6661 { { "g5" }, "r5" },
6662 { { "g6" }, "r6" },
6663 { { "g7" }, "r7" },
6664 { { "o0" }, "r8" },
6665 { { "o1" }, "r9" },
6666 { { "o2" }, "r10" },
6667 { { "o3" }, "r11" },
6668 { { "o4" }, "r12" },
6669 { { "o5" }, "r13" },
6670 { { "o6", "sp" }, "r14" },
6671 { { "o7" }, "r15" },
6672 { { "l0" }, "r16" },
6673 { { "l1" }, "r17" },
6674 { { "l2" }, "r18" },
6675 { { "l3" }, "r19" },
6676 { { "l4" }, "r20" },
6677 { { "l5" }, "r21" },
6678 { { "l6" }, "r22" },
6679 { { "l7" }, "r23" },
6680 { { "i0" }, "r24" },
6681 { { "i1" }, "r25" },
6682 { { "i2" }, "r26" },
6683 { { "i3" }, "r27" },
6684 { { "i4" }, "r28" },
6685 { { "i5" }, "r29" },
6686 { { "i6", "fp" }, "r30" },
6687 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006688};
6689
Craig Topperf054e3a2015-10-19 03:52:27 +00006690ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6691 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006692}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006693
6694// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6695class SparcV8TargetInfo : public SparcTargetInfo {
6696public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006697 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6698 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006699 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006700 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6701 switch (getTriple().getOS()) {
6702 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006703 SizeType = UnsignedInt;
6704 IntPtrType = SignedInt;
6705 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006706 break;
6707 case llvm::Triple::NetBSD:
6708 case llvm::Triple::OpenBSD:
6709 SizeType = UnsignedLong;
6710 IntPtrType = SignedLong;
6711 PtrDiffType = SignedLong;
6712 break;
Brad Smith56495d52015-08-13 22:00:53 +00006713 }
Chris Dewhurst7cc4cfe2016-06-28 12:55:55 +00006714 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006715 }
6716
Craig Topper3164f332014-03-11 03:39:26 +00006717 void getTargetDefines(const LangOptions &Opts,
6718 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006719 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006720 switch (getCPUGeneration(CPU)) {
6721 case CG_V8:
6722 Builder.defineMacro("__sparcv8");
6723 if (getTriple().getOS() != llvm::Triple::Solaris)
6724 Builder.defineMacro("__sparcv8__");
6725 break;
6726 case CG_V9:
6727 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006728 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006729 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006730 Builder.defineMacro("__sparc_v9__");
6731 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006732 break;
6733 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006734 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006735 std::string MyriadArchValue, Myriad2Value;
6736 Builder.defineMacro("__sparc_v8__");
6737 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006738 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006739 case CK_MYRIAD2150:
6740 MyriadArchValue = "__ma2150";
6741 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006742 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006743 case CK_MYRIAD2450:
6744 MyriadArchValue = "__ma2450";
6745 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006746 break;
6747 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006748 MyriadArchValue = "__ma2100";
6749 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006750 break;
6751 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006752 Builder.defineMacro(MyriadArchValue, "1");
6753 Builder.defineMacro(MyriadArchValue+"__", "1");
6754 Builder.defineMacro("__myriad2__", Myriad2Value);
6755 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006756 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006757 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006758
6759 bool hasSjLjLowering() const override {
6760 return true;
6761 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006762};
6763
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006764// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6765class SparcV8elTargetInfo : public SparcV8TargetInfo {
6766 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006767 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6768 : SparcV8TargetInfo(Triple, Opts) {
6769 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006770 }
6771};
6772
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006773// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6774class SparcV9TargetInfo : public SparcTargetInfo {
6775public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006776 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6777 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006778 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006779 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006780 // This is an LP64 platform.
6781 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006782
6783 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006784 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006785 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006786 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006787 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006788 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006789
6790 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6791 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6792 LongDoubleWidth = 128;
6793 LongDoubleAlign = 128;
6794 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006795 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006796 }
6797
Craig Topper3164f332014-03-11 03:39:26 +00006798 void getTargetDefines(const LangOptions &Opts,
6799 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006800 SparcTargetInfo::getTargetDefines(Opts, Builder);
6801 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006802 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006803 // Solaris doesn't need these variants, but the BSDs do.
6804 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006805 Builder.defineMacro("__sparc64__");
6806 Builder.defineMacro("__sparc_v9__");
6807 Builder.defineMacro("__sparcv9__");
6808 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006809 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006810
Craig Topper3164f332014-03-11 03:39:26 +00006811 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006812 if (!SparcTargetInfo::setCPU(Name))
6813 return false;
6814 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00006815 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006816};
6817
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006818class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006819 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006820 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006821 std::string CPU;
6822 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006823 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00006824
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006825public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006826 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00006827 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
6828 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00006829 IntMaxType = SignedLong;
6830 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006831 TLSSupported = true;
6832 IntWidth = IntAlign = 32;
6833 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
6834 PointerWidth = PointerAlign = 64;
6835 LongDoubleWidth = 128;
6836 LongDoubleAlign = 64;
6837 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00006838 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006839 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00006840 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 +00006841 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6842 }
6843 void getTargetDefines(const LangOptions &Opts,
6844 MacroBuilder &Builder) const override {
6845 Builder.defineMacro("__s390__");
6846 Builder.defineMacro("__s390x__");
6847 Builder.defineMacro("__zarch__");
6848 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00006849
6850 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6851 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6852 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6853 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
6854
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006855 if (HasTransactionalExecution)
6856 Builder.defineMacro("__HTM__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00006857 if (Opts.ZVector)
6858 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006859 }
Craig Topper6c03a542015-10-19 04:51:35 +00006860 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6861 return llvm::makeArrayRef(BuiltinInfo,
6862 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00006863 }
6864
Craig Topperf054e3a2015-10-19 03:52:27 +00006865 ArrayRef<const char *> getGCCRegNames() const override;
6866 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006867 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00006868 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00006869 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006870 bool validateAsmConstraint(const char *&Name,
6871 TargetInfo::ConstraintInfo &info) const override;
6872 const char *getClobbers() const override {
6873 // FIXME: Is this really right?
6874 return "";
6875 }
6876 BuiltinVaListKind getBuiltinVaListKind() const override {
6877 return TargetInfo::SystemZBuiltinVaList;
6878 }
6879 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006880 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006881 bool CPUKnown = llvm::StringSwitch<bool>(Name)
6882 .Case("z10", true)
6883 .Case("z196", true)
6884 .Case("zEC12", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006885 .Case("z13", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006886 .Default(false);
6887
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006888 return CPUKnown;
6889 }
Eric Christopher8c47b422015-10-09 18:39:55 +00006890 bool
6891 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6892 StringRef CPU,
6893 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006894 if (CPU == "zEC12")
6895 Features["transactional-execution"] = true;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006896 if (CPU == "z13") {
6897 Features["transactional-execution"] = true;
6898 Features["vector"] = true;
6899 }
Eric Christopher007b0a02015-08-28 22:32:01 +00006900 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006901 }
6902
6903 bool handleTargetFeatures(std::vector<std::string> &Features,
6904 DiagnosticsEngine &Diags) override {
6905 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00006906 for (const auto &Feature : Features) {
6907 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006908 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00006909 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006910 HasVector = true;
6911 }
6912 // If we use the vector ABI, vector types are 64-bit aligned.
6913 if (HasVector) {
6914 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00006915 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
6916 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006917 }
6918 return true;
6919 }
6920
6921 bool hasFeature(StringRef Feature) const override {
6922 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00006923 .Case("systemz", true)
6924 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006925 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006926 .Default(false);
6927 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006928
Bryan Chane3f1ed52016-04-28 13:56:43 +00006929 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6930 switch (CC) {
6931 case CC_C:
6932 case CC_Swift:
6933 return CCCR_OK;
6934 default:
6935 return CCCR_Warning;
6936 }
6937 }
6938
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00006939 StringRef getABI() const override {
6940 if (HasVector)
6941 return "vector";
6942 return "";
6943 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00006944
6945 bool useFloat128ManglingForLongDouble() const override {
6946 return true;
6947 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006948};
6949
6950const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
6951#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006952 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00006953#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
6954 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00006955#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006956};
6957
6958const char *const SystemZTargetInfo::GCCRegNames[] = {
6959 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6960 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6961 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
6962 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
6963};
6964
Craig Topperf054e3a2015-10-19 03:52:27 +00006965ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
6966 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00006967}
6968
6969bool SystemZTargetInfo::
6970validateAsmConstraint(const char *&Name,
6971 TargetInfo::ConstraintInfo &Info) const {
6972 switch (*Name) {
6973 default:
6974 return false;
6975
6976 case 'a': // Address register
6977 case 'd': // Data register (equivalent to 'r')
6978 case 'f': // Floating-point register
6979 Info.setAllowsRegister();
6980 return true;
6981
6982 case 'I': // Unsigned 8-bit constant
6983 case 'J': // Unsigned 12-bit constant
6984 case 'K': // Signed 16-bit constant
6985 case 'L': // Signed 20-bit displacement (on all targets we support)
6986 case 'M': // 0x7fffffff
6987 return true;
6988
6989 case 'Q': // Memory with base and unsigned 12-bit displacement
6990 case 'R': // Likewise, plus an index
6991 case 'S': // Memory with base and signed 20-bit displacement
6992 case 'T': // Likewise, plus an index
6993 Info.setAllowsMemory();
6994 return true;
6995 }
6996}
Ulrich Weigand47445072013-05-06 16:26:41 +00006997
Eric Christopherc48497a2015-09-18 21:26:24 +00006998class MSP430TargetInfo : public TargetInfo {
6999 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007000
Eric Christopherc48497a2015-09-18 21:26:24 +00007001public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007002 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7003 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007004 TLSSupported = false;
7005 IntWidth = 16;
7006 IntAlign = 16;
7007 LongWidth = 32;
7008 LongLongWidth = 64;
7009 LongAlign = LongLongAlign = 16;
7010 PointerWidth = 16;
7011 PointerAlign = 16;
7012 SuitableAlign = 16;
7013 SizeType = UnsignedInt;
7014 IntMaxType = SignedLongLong;
7015 IntPtrType = SignedInt;
7016 PtrDiffType = SignedInt;
7017 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007018 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007019 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007020 void getTargetDefines(const LangOptions &Opts,
7021 MacroBuilder &Builder) const override {
7022 Builder.defineMacro("MSP430");
7023 Builder.defineMacro("__MSP430__");
7024 // FIXME: defines for different 'flavours' of MCU
7025 }
Craig Topper6c03a542015-10-19 04:51:35 +00007026 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007027 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007028 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007029 }
7030 bool hasFeature(StringRef Feature) const override {
7031 return Feature == "msp430";
7032 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007033 ArrayRef<const char *> getGCCRegNames() const override;
7034 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007035 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007036 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007037 }
7038 bool validateAsmConstraint(const char *&Name,
7039 TargetInfo::ConstraintInfo &info) const override {
7040 // FIXME: implement
7041 switch (*Name) {
7042 case 'K': // the constant 1
7043 case 'L': // constant -1^20 .. 1^19
7044 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007045 return true;
7046 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007047 // No target constraints for now.
7048 return false;
7049 }
7050 const char *getClobbers() const override {
7051 // FIXME: Is this really right?
7052 return "";
7053 }
7054 BuiltinVaListKind getBuiltinVaListKind() const override {
7055 // FIXME: implement
7056 return TargetInfo::CharPtrBuiltinVaList;
7057 }
7058};
7059
7060const char *const MSP430TargetInfo::GCCRegNames[] = {
7061 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7062 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7063
Craig Topperf054e3a2015-10-19 03:52:27 +00007064ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7065 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007066}
7067
7068// LLVM and Clang cannot be used directly to output native binaries for
7069// target, but is used to compile C code to llvm bitcode with correct
7070// type and alignment information.
7071//
7072// TCE uses the llvm bitcode as input and uses it for generating customized
7073// target processor and program binary. TCE co-design environment is
7074// publicly available in http://tce.cs.tut.fi
7075
7076static const unsigned TCEOpenCLAddrSpaceMap[] = {
7077 3, // opencl_global
7078 4, // opencl_local
7079 5, // opencl_constant
7080 // FIXME: generic has to be added to the target
7081 0, // opencl_generic
7082 0, // cuda_device
7083 0, // cuda_constant
7084 0 // cuda_shared
7085};
7086
7087class TCETargetInfo : public TargetInfo {
7088public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007089 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7090 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007091 TLSSupported = false;
7092 IntWidth = 32;
7093 LongWidth = LongLongWidth = 32;
7094 PointerWidth = 32;
7095 IntAlign = 32;
7096 LongAlign = LongLongAlign = 32;
7097 PointerAlign = 32;
7098 SuitableAlign = 32;
7099 SizeType = UnsignedInt;
7100 IntMaxType = SignedLong;
7101 IntPtrType = SignedInt;
7102 PtrDiffType = SignedInt;
7103 FloatWidth = 32;
7104 FloatAlign = 32;
7105 DoubleWidth = 32;
7106 DoubleAlign = 32;
7107 LongDoubleWidth = 32;
7108 LongDoubleAlign = 32;
7109 FloatFormat = &llvm::APFloat::IEEEsingle;
7110 DoubleFormat = &llvm::APFloat::IEEEsingle;
7111 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
James Y Knightb214cbc2016-03-04 19:00:41 +00007112 resetDataLayout("E-p:32:32-i8:8:32-i16:16:32-i64:32"
7113 "-f64:32-v64:32-v128:32-a:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007114 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7115 UseAddrSpaceMapMangling = true;
7116 }
7117
7118 void getTargetDefines(const LangOptions &Opts,
7119 MacroBuilder &Builder) const override {
7120 DefineStd(Builder, "tce", Opts);
7121 Builder.defineMacro("__TCE__");
7122 Builder.defineMacro("__TCE_V1__");
7123 }
7124 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7125
Craig Topper6c03a542015-10-19 04:51:35 +00007126 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007127 const char *getClobbers() const override { return ""; }
7128 BuiltinVaListKind getBuiltinVaListKind() const override {
7129 return TargetInfo::VoidPtrBuiltinVaList;
7130 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007131 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007132 bool validateAsmConstraint(const char *&Name,
7133 TargetInfo::ConstraintInfo &info) const override {
7134 return true;
7135 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007136 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7137 return None;
7138 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007139};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007140
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007141class BPFTargetInfo : public TargetInfo {
7142public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007143 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7144 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007145 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7146 SizeType = UnsignedLong;
7147 PtrDiffType = SignedLong;
7148 IntPtrType = SignedLong;
7149 IntMaxType = SignedLong;
7150 Int64Type = SignedLong;
7151 RegParmMax = 5;
7152 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007153 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007154 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007155 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007156 }
7157 MaxAtomicPromoteWidth = 64;
7158 MaxAtomicInlineWidth = 64;
7159 TLSSupported = false;
7160 }
7161 void getTargetDefines(const LangOptions &Opts,
7162 MacroBuilder &Builder) const override {
7163 DefineStd(Builder, "bpf", Opts);
7164 Builder.defineMacro("__BPF__");
7165 }
7166 bool hasFeature(StringRef Feature) const override {
7167 return Feature == "bpf";
7168 }
7169
Craig Topper6c03a542015-10-19 04:51:35 +00007170 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007171 const char *getClobbers() const override {
7172 return "";
7173 }
7174 BuiltinVaListKind getBuiltinVaListKind() const override {
7175 return TargetInfo::VoidPtrBuiltinVaList;
7176 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007177 ArrayRef<const char *> getGCCRegNames() const override {
7178 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007179 }
7180 bool validateAsmConstraint(const char *&Name,
7181 TargetInfo::ConstraintInfo &info) const override {
7182 return true;
7183 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007184 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7185 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007186 }
7187};
7188
Daniel Sanders4672af62016-05-27 11:51:02 +00007189class MipsTargetInfo : public TargetInfo {
7190 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007191 StringRef Layout;
7192
7193 if (ABI == "o32")
7194 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7195 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007196 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007197 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007198 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007199 else
7200 llvm_unreachable("Invalid ABI");
7201
7202 if (BigEndian)
7203 resetDataLayout(("E-" + Layout).str());
7204 else
7205 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007206 }
7207
Akira Hatanaka9064e362013-10-29 18:30:33 +00007208
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007209 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007210 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007211 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007212 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007213 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007214 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007215 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007216 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007217 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007218 enum DspRevEnum {
7219 NoDSP, DSP1, DSP2
7220 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007221 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007222
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007223protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007224 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007225 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007226
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007227public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007228 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007229 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7230 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7231 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007232 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007233
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007234 setABI((getTriple().getArch() == llvm::Triple::mips ||
7235 getTriple().getArch() == llvm::Triple::mipsel)
7236 ? "o32"
7237 : "n64");
7238
7239 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007240 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007241
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007242 bool isNaN2008Default() const {
7243 return CPU == "mips32r6" || CPU == "mips64r6";
7244 }
7245
7246 bool isFP64Default() const {
7247 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7248 }
7249
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007250 bool isNan2008() const override {
7251 return IsNan2008;
7252 }
7253
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007254 bool processorSupportsGPR64() const {
7255 return llvm::StringSwitch<bool>(CPU)
7256 .Case("mips3", true)
7257 .Case("mips4", true)
7258 .Case("mips5", true)
7259 .Case("mips64", true)
7260 .Case("mips64r2", true)
7261 .Case("mips64r3", true)
7262 .Case("mips64r5", true)
7263 .Case("mips64r6", true)
7264 .Case("octeon", true)
7265 .Default(false);
7266 return false;
7267 }
7268
Alp Toker4925ba72014-06-07 23:30:42 +00007269 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007270 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007271 if (Name == "o32") {
7272 setO32ABITypes();
7273 ABI = Name;
7274 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007275 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007276
7277 if (Name == "n32") {
7278 setN32ABITypes();
7279 ABI = Name;
7280 return true;
7281 }
7282 if (Name == "n64") {
7283 setN64ABITypes();
7284 ABI = Name;
7285 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007286 }
7287 return false;
7288 }
7289
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007290 void setO32ABITypes() {
7291 Int64Type = SignedLongLong;
7292 IntMaxType = Int64Type;
7293 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7294 LongDoubleWidth = LongDoubleAlign = 64;
7295 LongWidth = LongAlign = 32;
7296 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7297 PointerWidth = PointerAlign = 32;
7298 PtrDiffType = SignedInt;
7299 SizeType = UnsignedInt;
7300 SuitableAlign = 64;
7301 }
7302
7303 void setN32N64ABITypes() {
7304 LongDoubleWidth = LongDoubleAlign = 128;
7305 LongDoubleFormat = &llvm::APFloat::IEEEquad;
7306 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7307 LongDoubleWidth = LongDoubleAlign = 64;
7308 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
7309 }
7310 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7311 SuitableAlign = 128;
7312 }
7313
Daniel Sanders4672af62016-05-27 11:51:02 +00007314 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007315 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007316 Int64Type = SignedLong;
7317 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007318 LongWidth = LongAlign = 64;
7319 PointerWidth = PointerAlign = 64;
7320 PtrDiffType = SignedLong;
7321 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007322 }
7323
7324 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007325 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007326 Int64Type = SignedLongLong;
7327 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007328 LongWidth = LongAlign = 32;
7329 PointerWidth = PointerAlign = 32;
7330 PtrDiffType = SignedInt;
7331 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007332 }
7333
Craig Topper3164f332014-03-11 03:39:26 +00007334 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007335 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007336 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007337 .Case("mips1", true)
7338 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007339 .Case("mips3", true)
7340 .Case("mips4", true)
7341 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007342 .Case("mips32", true)
7343 .Case("mips32r2", true)
7344 .Case("mips32r3", true)
7345 .Case("mips32r5", true)
7346 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007347 .Case("mips64", true)
7348 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007349 .Case("mips64r3", true)
7350 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007351 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007352 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007353 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007354 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007355 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007356 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007357 bool
7358 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7359 StringRef CPU,
7360 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007361 if (CPU.empty())
7362 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007363 if (CPU == "octeon")
7364 Features["mips64r2"] = Features["cnmips"] = true;
7365 else
7366 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007367 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007368 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007369
Craig Topper3164f332014-03-11 03:39:26 +00007370 void getTargetDefines(const LangOptions &Opts,
7371 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007372 if (BigEndian) {
7373 DefineStd(Builder, "MIPSEB", Opts);
7374 Builder.defineMacro("_MIPSEB");
7375 } else {
7376 DefineStd(Builder, "MIPSEL", Opts);
7377 Builder.defineMacro("_MIPSEL");
7378 }
7379
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007380 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007381 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007382 if (Opts.GNUMode)
7383 Builder.defineMacro("mips");
7384
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007385 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007386 Builder.defineMacro("__mips", "32");
7387 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7388 } else {
7389 Builder.defineMacro("__mips", "64");
7390 Builder.defineMacro("__mips64");
7391 Builder.defineMacro("__mips64__");
7392 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7393 }
7394
7395 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7396 .Cases("mips32", "mips64", "1")
7397 .Cases("mips32r2", "mips64r2", "2")
7398 .Cases("mips32r3", "mips64r3", "3")
7399 .Cases("mips32r5", "mips64r5", "5")
7400 .Cases("mips32r6", "mips64r6", "6")
7401 .Default("");
7402 if (!ISARev.empty())
7403 Builder.defineMacro("__mips_isa_rev", ISARev);
7404
7405 if (ABI == "o32") {
7406 Builder.defineMacro("__mips_o32");
7407 Builder.defineMacro("_ABIO32", "1");
7408 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007409 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007410 Builder.defineMacro("__mips_n32");
7411 Builder.defineMacro("_ABIN32", "2");
7412 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7413 } else if (ABI == "n64") {
7414 Builder.defineMacro("__mips_n64");
7415 Builder.defineMacro("_ABI64", "3");
7416 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7417 } else
7418 llvm_unreachable("Invalid ABI.");
7419
Simon Atanasyan683535b2012-08-29 19:14:58 +00007420 Builder.defineMacro("__REGISTER_PREFIX__", "");
7421
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007422 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007423 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007424 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007425 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007426 case SoftFloat:
7427 Builder.defineMacro("__mips_soft_float", Twine(1));
7428 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007429 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007430
Simon Atanasyan16071912013-04-14 14:07:30 +00007431 if (IsSingleFloat)
7432 Builder.defineMacro("__mips_single_float", Twine(1));
7433
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007434 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7435 Builder.defineMacro("_MIPS_FPSET",
7436 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7437
Simon Atanasyan72244b62012-07-05 16:06:06 +00007438 if (IsMips16)
7439 Builder.defineMacro("__mips16", Twine(1));
7440
Simon Atanasyan60777612013-04-14 14:07:51 +00007441 if (IsMicromips)
7442 Builder.defineMacro("__mips_micromips", Twine(1));
7443
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007444 if (IsNan2008)
7445 Builder.defineMacro("__mips_nan2008", Twine(1));
7446
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007447 switch (DspRev) {
7448 default:
7449 break;
7450 case DSP1:
7451 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7452 Builder.defineMacro("__mips_dsp", Twine(1));
7453 break;
7454 case DSP2:
7455 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7456 Builder.defineMacro("__mips_dspr2", Twine(1));
7457 Builder.defineMacro("__mips_dsp", Twine(1));
7458 break;
7459 }
7460
Jack Carter44ff1e52013-08-12 17:20:29 +00007461 if (HasMSA)
7462 Builder.defineMacro("__mips_msa", Twine(1));
7463
Simon Atanasyan26f19672012-04-05 19:28:31 +00007464 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7465 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7466 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007467
7468 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7469 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007470
7471 // These shouldn't be defined for MIPS-I but there's no need to check
7472 // for that since MIPS-I isn't supported.
7473 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7474 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7475 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007476
7477 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7478 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7479 // the instructions exist but using them violates the ABI since they
7480 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7481 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007482 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007483 }
7484
Craig Topper6c03a542015-10-19 04:51:35 +00007485 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7486 return llvm::makeArrayRef(BuiltinInfo,
7487 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007488 }
Craig Topper3164f332014-03-11 03:39:26 +00007489 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007490 return llvm::StringSwitch<bool>(Feature)
7491 .Case("mips", true)
7492 .Case("fp64", HasFP64)
7493 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007494 }
Craig Topper3164f332014-03-11 03:39:26 +00007495 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007496 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007497 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007498 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007499 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007500 // CPU register names
7501 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007502 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7503 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7504 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007505 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7506 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007507 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7508 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7509 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7510 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007511 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007512 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007513 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7514 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007515 // MSA register names
7516 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7517 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7518 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7519 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7520 // MSA control register names
7521 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7522 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007523 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007524 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007525 }
Craig Topper3164f332014-03-11 03:39:26 +00007526 bool validateAsmConstraint(const char *&Name,
7527 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007528 switch (*Name) {
7529 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007530 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007531 case 'r': // CPU registers.
7532 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007533 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007534 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007535 case 'c': // $25 for indirect jumps
7536 case 'l': // lo register
7537 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007538 Info.setAllowsRegister();
7539 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007540 case 'I': // Signed 16-bit constant
7541 case 'J': // Integer 0
7542 case 'K': // Unsigned 16-bit constant
7543 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7544 case 'M': // Constants not loadable via lui, addiu, or ori
7545 case 'N': // Constant -1 to -65535
7546 case 'O': // A signed 15-bit constant
7547 case 'P': // A constant between 1 go 65535
7548 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007549 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007550 Info.setAllowsMemory();
7551 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007552 case 'Z':
7553 if (Name[1] == 'C') { // An address usable by ll, and sc.
7554 Info.setAllowsMemory();
7555 Name++; // Skip over 'Z'.
7556 return true;
7557 }
7558 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007559 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007560 }
7561
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007562 std::string convertConstraint(const char *&Constraint) const override {
7563 std::string R;
7564 switch (*Constraint) {
7565 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7566 if (Constraint[1] == 'C') {
7567 R = std::string("^") + std::string(Constraint, 2);
7568 Constraint++;
7569 return R;
7570 }
7571 break;
7572 }
7573 return TargetInfo::convertConstraint(Constraint);
7574 }
7575
Craig Topper3164f332014-03-11 03:39:26 +00007576 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007577 // In GCC, $1 is not widely used in generated code (it's used only in a few
7578 // specific situations), so there is no real need for users to add it to
7579 // the clobbers list if they want to use it in their inline assembly code.
7580 //
7581 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7582 // code generation, so using it in inline assembly without adding it to the
7583 // clobbers list can cause conflicts between the inline assembly code and
7584 // the surrounding generated code.
7585 //
7586 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7587 // operands, which will conflict with the ".set at" assembler option (which
7588 // we use only for inline assembly, in order to maintain compatibility with
7589 // GCC) and will also conflict with the user's usage of $1.
7590 //
7591 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7592 // register for generated code is to automatically clobber $1 for all inline
7593 // assembly code.
7594 //
7595 // FIXME: We should automatically clobber $1 only for inline assembly code
7596 // which actually uses it. This would allow LLVM to use $1 for inline
7597 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007598 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007599 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007600
Craig Topper3164f332014-03-11 03:39:26 +00007601 bool handleTargetFeatures(std::vector<std::string> &Features,
7602 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007603 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007604 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007605 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007606 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007607 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007608 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007609 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007610
Eric Christopher610fe112015-08-26 08:21:55 +00007611 for (const auto &Feature : Features) {
7612 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007613 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007614 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007615 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007616 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007617 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007618 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007619 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007620 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007621 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007622 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007623 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007624 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007625 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007626 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007627 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007628 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007629 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007630 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007631 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007632 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007633 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007634 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007635
James Y Knightb214cbc2016-03-04 19:00:41 +00007636 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007637
Rafael Espindolaeb265472013-08-21 21:59:03 +00007638 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007639 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007640
Craig Topper3164f332014-03-11 03:39:26 +00007641 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007642 if (RegNo == 0) return 4;
7643 if (RegNo == 1) return 5;
7644 return -1;
7645 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007646
7647 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007648
7649 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7650 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7651 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7652 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7653 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7654 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7655 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7656 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7657 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7658 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7659 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7660 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7661 {{"ra"}, "$31"}};
7662 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7663 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7664 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7665 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7666 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7667 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7668 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7669 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7670 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7671 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7672 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7673 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007674 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007675 return llvm::makeArrayRef(O32RegAliases);
7676 return llvm::makeArrayRef(NewABIRegAliases);
7677 }
7678
7679 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007680 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007681 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007682
7683 bool validateTarget(DiagnosticsEngine &Diags) const override {
7684 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7685 // this yet. It's better to fail here than on the backend assertion.
7686 if (processorSupportsGPR64() && ABI == "o32") {
7687 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7688 return false;
7689 }
7690
7691 // 64-bit ABI's require 64-bit CPU's.
7692 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7693 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7694 return false;
7695 }
7696
7697 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7698 // can't handle this yet. It's better to fail here than on the
7699 // backend assertion.
7700 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7701 getTriple().getArch() == llvm::Triple::mips64el) &&
7702 ABI == "o32") {
7703 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7704 << ABI << getTriple().str();
7705 return false;
7706 }
7707
7708 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7709 // can't handle this yet. It's better to fail here than on the
7710 // backend assertion.
7711 if ((getTriple().getArch() == llvm::Triple::mips ||
7712 getTriple().getArch() == llvm::Triple::mipsel) &&
7713 (ABI == "n32" || ABI == "n64")) {
7714 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7715 << ABI << getTriple().str();
7716 return false;
7717 }
7718
7719 return true;
7720 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007721};
7722
Daniel Sanders4672af62016-05-27 11:51:02 +00007723const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007724#define BUILTIN(ID, TYPE, ATTRS) \
7725 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7726#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7727 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007728#include "clang/Basic/BuiltinsMips.def"
7729};
7730
Ivan Krasindd7403e2011-08-24 20:22:22 +00007731class PNaClTargetInfo : public TargetInfo {
7732public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007733 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7734 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007735 this->LongAlign = 32;
7736 this->LongWidth = 32;
7737 this->PointerAlign = 32;
7738 this->PointerWidth = 32;
7739 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007740 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007741 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007742 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007743 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007744 this->SizeType = TargetInfo::UnsignedInt;
7745 this->PtrDiffType = TargetInfo::SignedInt;
7746 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007747 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007748 }
7749
Craig Toppere6f17d02014-03-11 04:07:52 +00007750 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007751 Builder.defineMacro("__le32__");
7752 Builder.defineMacro("__pnacl__");
7753 }
Craig Topper3164f332014-03-11 03:39:26 +00007754 void getTargetDefines(const LangOptions &Opts,
7755 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007756 getArchDefines(Opts, Builder);
7757 }
Craig Topper3164f332014-03-11 03:39:26 +00007758 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007759 return Feature == "pnacl";
7760 }
Craig Topper6c03a542015-10-19 04:51:35 +00007761 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007762 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007763 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007764 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007765 ArrayRef<const char *> getGCCRegNames() const override;
7766 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00007767 bool validateAsmConstraint(const char *&Name,
7768 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007769 return false;
7770 }
7771
Craig Topper3164f332014-03-11 03:39:26 +00007772 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007773 return "";
7774 }
7775};
7776
Craig Topperf054e3a2015-10-19 03:52:27 +00007777ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
7778 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007779}
7780
Craig Topperf054e3a2015-10-19 03:52:27 +00007781ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
7782 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007783}
Ivan Krasindd7403e2011-08-24 20:22:22 +00007784
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007785// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00007786class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007787public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007788 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7789 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00007790
7791 BuiltinVaListKind getBuiltinVaListKind() const override {
7792 return TargetInfo::PNaClABIBuiltinVaList;
7793 }
7794};
7795
JF Bastien643817d2014-09-12 17:52:47 +00007796class Le64TargetInfo : public TargetInfo {
7797 static const Builtin::Info BuiltinInfo[];
7798
7799public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007800 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7801 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00007802 NoAsmVariants = true;
7803 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7804 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007805 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00007806 }
7807
7808 void getTargetDefines(const LangOptions &Opts,
7809 MacroBuilder &Builder) const override {
7810 DefineStd(Builder, "unix", Opts);
7811 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
7812 Builder.defineMacro("__ELF__");
7813 }
Craig Topper6c03a542015-10-19 04:51:35 +00007814 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7815 return llvm::makeArrayRef(BuiltinInfo,
7816 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00007817 }
7818 BuiltinVaListKind getBuiltinVaListKind() const override {
7819 return TargetInfo::PNaClABIBuiltinVaList;
7820 }
7821 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00007822 ArrayRef<const char *> getGCCRegNames() const override {
7823 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007824 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007825 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7826 return None;
JF Bastien643817d2014-09-12 17:52:47 +00007827 }
7828 bool validateAsmConstraint(const char *&Name,
7829 TargetInfo::ConstraintInfo &Info) const override {
7830 return false;
7831 }
7832
7833 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00007834};
Dan Gohmanc2853072015-09-03 22:51:53 +00007835
7836class WebAssemblyTargetInfo : public TargetInfo {
7837 static const Builtin::Info BuiltinInfo[];
7838
7839 enum SIMDEnum {
7840 NoSIMD,
7841 SIMD128,
7842 } SIMDLevel;
7843
7844public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007845 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00007846 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007847 NoAsmVariants = true;
7848 SuitableAlign = 128;
7849 LargeArrayMinWidth = 128;
7850 LargeArrayAlign = 128;
7851 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007852 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00007853 LongDoubleWidth = LongDoubleAlign = 128;
7854 LongDoubleFormat = &llvm::APFloat::IEEEquad;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007855 SizeType = UnsignedInt;
7856 PtrDiffType = SignedInt;
7857 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00007858 }
7859
7860protected:
7861 void getTargetDefines(const LangOptions &Opts,
7862 MacroBuilder &Builder) const override {
7863 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
7864 if (SIMDLevel >= SIMD128)
7865 Builder.defineMacro("__wasm_simd128__");
7866 }
7867
7868private:
Eric Christopher8c47b422015-10-09 18:39:55 +00007869 bool
7870 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7871 StringRef CPU,
7872 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00007873 if (CPU == "bleeding-edge")
7874 Features["simd128"] = true;
7875 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
7876 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007877 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007878 return llvm::StringSwitch<bool>(Feature)
7879 .Case("simd128", SIMDLevel >= SIMD128)
7880 .Default(false);
7881 }
7882 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007883 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007884 for (const auto &Feature : Features) {
7885 if (Feature == "+simd128") {
7886 SIMDLevel = std::max(SIMDLevel, SIMD128);
7887 continue;
7888 }
7889 if (Feature == "-simd128") {
7890 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
7891 continue;
7892 }
7893
7894 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
7895 << "-target-feature";
7896 return false;
7897 }
7898 return true;
7899 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007900 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007901 return llvm::StringSwitch<bool>(Name)
7902 .Case("mvp", true)
7903 .Case("bleeding-edge", true)
7904 .Case("generic", true)
7905 .Default(false);
7906 }
Craig Topper6c03a542015-10-19 04:51:35 +00007907 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
7908 return llvm::makeArrayRef(BuiltinInfo,
7909 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00007910 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007911 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007912 return VoidPtrBuiltinVaList;
7913 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007914 ArrayRef<const char *> getGCCRegNames() const final {
7915 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007916 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007917 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
7918 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00007919 }
7920 bool
7921 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00007922 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00007923 return false;
7924 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00007925 const char *getClobbers() const final { return ""; }
7926 bool isCLZForZeroUndef() const final { return false; }
7927 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00007928 IntType getIntTypeByWidth(unsigned BitWidth,
7929 bool IsSigned) const final {
7930 // WebAssembly prefers long long for explicitly 64-bit integers.
7931 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7932 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
7933 }
7934 IntType getLeastIntTypeByWidth(unsigned BitWidth,
7935 bool IsSigned) const final {
7936 // WebAssembly uses long long for int_least64_t and int_fast64_t.
7937 return BitWidth == 64
7938 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
7939 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
7940 }
Dan Gohmanc2853072015-09-03 22:51:53 +00007941};
7942
7943const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
7944#define BUILTIN(ID, TYPE, ATTRS) \
7945 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7946#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7947 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
7948#include "clang/Basic/BuiltinsWebAssembly.def"
7949};
7950
7951class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
7952public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007953 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
7954 const TargetOptions &Opts)
7955 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007956 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00007957 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007958 }
7959
7960protected:
7961 void getTargetDefines(const LangOptions &Opts,
7962 MacroBuilder &Builder) const override {
7963 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7964 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
7965 }
7966};
7967
7968class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
7969public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007970 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
7971 const TargetOptions &Opts)
7972 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00007973 LongAlign = LongWidth = 64;
7974 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00007975 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00007976 SizeType = UnsignedLong;
7977 PtrDiffType = SignedLong;
7978 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007979 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00007980 }
7981
7982protected:
7983 void getTargetDefines(const LangOptions &Opts,
7984 MacroBuilder &Builder) const override {
7985 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
7986 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
7987 }
7988};
7989
JF Bastien643817d2014-09-12 17:52:47 +00007990const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
7991#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007992 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00007993#include "clang/Basic/BuiltinsLe64.def"
7994};
7995
Eric Christopherc48497a2015-09-18 21:26:24 +00007996static const unsigned SPIRAddrSpaceMap[] = {
7997 1, // opencl_global
7998 3, // opencl_local
7999 2, // opencl_constant
8000 4, // opencl_generic
8001 0, // cuda_device
8002 0, // cuda_constant
8003 0 // cuda_shared
8004};
8005class SPIRTargetInfo : public TargetInfo {
8006public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008007 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8008 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008009 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8010 "SPIR target must use unknown OS");
8011 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8012 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008013 TLSSupported = false;
8014 LongWidth = LongAlign = 64;
8015 AddrSpaceMap = &SPIRAddrSpaceMap;
8016 UseAddrSpaceMapMangling = true;
8017 // Define available target features
8018 // These must be defined in sorted order!
8019 NoAsmVariants = true;
8020 }
8021 void getTargetDefines(const LangOptions &Opts,
8022 MacroBuilder &Builder) const override {
8023 DefineStd(Builder, "SPIR", Opts);
8024 }
8025 bool hasFeature(StringRef Feature) const override {
8026 return Feature == "spir";
8027 }
Craig Topper3164f332014-03-11 03:39:26 +00008028
Craig Topper6c03a542015-10-19 04:51:35 +00008029 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008030 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008031 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008032 bool validateAsmConstraint(const char *&Name,
8033 TargetInfo::ConstraintInfo &info) const override {
8034 return true;
8035 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008036 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8037 return None;
8038 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008039 BuiltinVaListKind getBuiltinVaListKind() const override {
8040 return TargetInfo::VoidPtrBuiltinVaList;
8041 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008042
Eric Christopherc48497a2015-09-18 21:26:24 +00008043 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008044 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8045 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008046 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008047
Eric Christopherc48497a2015-09-18 21:26:24 +00008048 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8049 return CC_SpirFunction;
8050 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008051
8052 void setSupportedOpenCLOpts() override {
8053 // Assume all OpenCL extensions and optional core features are supported
8054 // for SPIR since it is a generic target.
8055 getSupportedOpenCLOpts().setAll();
8056 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008057};
Guy Benyeib798fc92012-12-11 21:38:14 +00008058
Eric Christopherc48497a2015-09-18 21:26:24 +00008059class SPIR32TargetInfo : public SPIRTargetInfo {
8060public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008061 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8062 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008063 PointerWidth = PointerAlign = 32;
8064 SizeType = TargetInfo::UnsignedInt;
8065 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008066 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8067 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008068 }
8069 void getTargetDefines(const LangOptions &Opts,
8070 MacroBuilder &Builder) const override {
8071 DefineStd(Builder, "SPIR32", Opts);
8072 }
8073};
Guy Benyeib798fc92012-12-11 21:38:14 +00008074
Eric Christopherc48497a2015-09-18 21:26:24 +00008075class SPIR64TargetInfo : public SPIRTargetInfo {
8076public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008077 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8078 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008079 PointerWidth = PointerAlign = 64;
8080 SizeType = TargetInfo::UnsignedLong;
8081 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008082 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8083 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008084 }
8085 void getTargetDefines(const LangOptions &Opts,
8086 MacroBuilder &Builder) const override {
8087 DefineStd(Builder, "SPIR64", Opts);
8088 }
8089};
Guy Benyeib798fc92012-12-11 21:38:14 +00008090
Robert Lytton0e076492013-08-13 09:43:10 +00008091class XCoreTargetInfo : public TargetInfo {
8092 static const Builtin::Info BuiltinInfo[];
8093public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008094 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8095 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008096 NoAsmVariants = true;
8097 LongLongAlign = 32;
8098 SuitableAlign = 32;
8099 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008100 SizeType = UnsignedInt;
8101 PtrDiffType = SignedInt;
8102 IntPtrType = SignedInt;
8103 WCharType = UnsignedChar;
8104 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008105 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008106 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8107 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008108 }
Craig Topper3164f332014-03-11 03:39:26 +00008109 void getTargetDefines(const LangOptions &Opts,
8110 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008111 Builder.defineMacro("__XS1B__");
8112 }
Craig Topper6c03a542015-10-19 04:51:35 +00008113 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8114 return llvm::makeArrayRef(BuiltinInfo,
8115 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008116 }
Craig Topper3164f332014-03-11 03:39:26 +00008117 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008118 return TargetInfo::VoidPtrBuiltinVaList;
8119 }
Craig Topper3164f332014-03-11 03:39:26 +00008120 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008121 return "";
8122 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008123 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008124 static const char * const GCCRegNames[] = {
8125 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8126 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8127 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008128 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008129 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008130 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8131 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008132 }
Craig Topper3164f332014-03-11 03:39:26 +00008133 bool validateAsmConstraint(const char *&Name,
8134 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008135 return false;
8136 }
Craig Topper3164f332014-03-11 03:39:26 +00008137 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008138 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8139 return (RegNo < 2)? RegNo : -1;
8140 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008141 bool allowsLargerPreferedTypeAlignment() const override {
8142 return false;
8143 }
Robert Lytton0e076492013-08-13 09:43:10 +00008144};
8145
8146const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008147#define BUILTIN(ID, TYPE, ATTRS) \
8148 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8149#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8150 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008151#include "clang/Basic/BuiltinsXCore.def"
8152};
Robert Lytton0e076492013-08-13 09:43:10 +00008153
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008154// x86_32 Android target
8155class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8156public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008157 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8158 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008159 SuitableAlign = 32;
8160 LongDoubleWidth = 64;
8161 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
8162 }
8163};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008164
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008165// x86_64 Android target
8166class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8167public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008168 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8169 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008170 LongDoubleFormat = &llvm::APFloat::IEEEquad;
8171 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008172
8173 bool useFloat128ManglingForLongDouble() const override {
8174 return true;
8175 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008176};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008177
8178// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8179class RenderScript32TargetInfo : public ARMleTargetInfo {
8180public:
8181 RenderScript32TargetInfo(const llvm::Triple &Triple,
8182 const TargetOptions &Opts)
8183 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8184 Triple.getOSName(),
8185 Triple.getEnvironmentName()),
8186 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008187 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008188 LongWidth = LongAlign = 64;
8189 }
8190 void getTargetDefines(const LangOptions &Opts,
8191 MacroBuilder &Builder) const override {
8192 Builder.defineMacro("__RENDERSCRIPT__");
8193 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8194 }
8195};
8196
8197// 64-bit RenderScript is aarch64
8198class RenderScript64TargetInfo : public AArch64leTargetInfo {
8199public:
8200 RenderScript64TargetInfo(const llvm::Triple &Triple,
8201 const TargetOptions &Opts)
8202 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8203 Triple.getOSName(),
8204 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008205 Opts) {
8206 IsRenderScriptTarget = true;
8207 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008208
8209 void getTargetDefines(const LangOptions &Opts,
8210 MacroBuilder &Builder) const override {
8211 Builder.defineMacro("__RENDERSCRIPT__");
8212 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8213 }
8214};
8215
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008216} // end anonymous namespace
8217
Chris Lattner5ba61f02006-10-14 07:39:34 +00008218//===----------------------------------------------------------------------===//
8219// Driver code
8220//===----------------------------------------------------------------------===//
8221
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008222static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8223 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008224 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008225
Daniel Dunbar52322032009-08-18 05:47:58 +00008226 switch (Triple.getArch()) {
8227 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008228 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008229
Tim Northover2a0783d2014-05-30 14:14:07 +00008230 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008231 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008232
8233 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008234 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008235
Jacques Pienaard964cc22016-03-28 21:02:54 +00008236 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008237 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008238
Tim Northover2a0783d2014-05-30 14:14:07 +00008239 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008240 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008241 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008242
8243 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008244 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008245 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008246 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008247 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008248 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008249 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008250 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008251 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008252 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008253 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008254 }
8255
Christian Pirker9b019ae2014-02-25 13:51:00 +00008256 case llvm::Triple::aarch64_be:
8257 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008258 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008259 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008260 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008261 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008262 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008263 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008264 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008265 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008266 }
8267
Daniel Dunbar52322032009-08-18 05:47:58 +00008268 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008269 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008270 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008271 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008272
Daniel Dunbar52322032009-08-18 05:47:58 +00008273 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008274 case llvm::Triple::CloudABI:
8275 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008276 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008277 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008278 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008279 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008280 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008281 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008282 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008283 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008284 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008285 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008286 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008287 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008288 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008289 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008290 case llvm::Triple::Win32:
8291 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008292 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008293 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008294 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008295 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008296 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008297 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008298 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008299 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008300 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008301 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008302 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008303 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008304 }
8305
8306 case llvm::Triple::armeb:
8307 case llvm::Triple::thumbeb:
8308 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008309 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008310
8311 switch (os) {
8312 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008313 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008314 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008315 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008316 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008317 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008318 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008319 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008320 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008321 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008322 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008323 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008324 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008325 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008326 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008328 }
Eli Friedmanb5366062008-05-20 14:21:01 +00008329
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008330 case llvm::Triple::bpfeb:
8331 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008332 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00008333
Daniel Dunbar52322032009-08-18 05:47:58 +00008334 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008335 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00008336
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008337 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008338 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008339 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008340 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008341 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008342 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008343 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008344 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008345 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008346 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008347 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008348 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00008349 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008350
8351 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008352 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008353 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008354 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008355 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008356 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008357 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008358 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008359 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008360 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00008361 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00008362 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008363 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008364 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00008365 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00008366
Akira Hatanakabef17452011-09-20 19:21:49 +00008367 case llvm::Triple::mips64:
8368 switch (os) {
8369 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008370 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008371 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008372 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008373 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008374 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008375 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008376 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008377 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008378 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008379 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008380 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008381 }
8382
8383 case llvm::Triple::mips64el:
8384 switch (os) {
8385 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00008386 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008387 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00008388 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008389 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008390 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008391 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008392 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008393 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00008394 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008395 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00008396 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00008397 }
8398
Ivan Krasindd7403e2011-08-24 20:22:22 +00008399 case llvm::Triple::le32:
8400 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00008401 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008402 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008403 default:
8404 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008405 }
8406
JF Bastien643817d2014-09-12 17:52:47 +00008407 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008408 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008409
Daniel Dunbar52322032009-08-18 05:47:58 +00008410 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008411 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008412 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008413 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008414 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008415 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008416 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008417 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008418 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008419 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008420 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008421 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008422 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008423 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008424 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008425 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008426 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008427
8428 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008429 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008430 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008431 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008432 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008433 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008434 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008435 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008436 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008437 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008438 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008439 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008440 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008441 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008442 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008443
Bill Schmidt778d3872013-07-26 01:36:11 +00008444 case llvm::Triple::ppc64le:
8445 switch (os) {
8446 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008447 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00008448 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008449 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008450 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008451 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00008452 }
8453
Peter Collingbournec947aae2012-05-20 23:28:41 +00008454 case llvm::Triple::nvptx:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008455 return new NVPTX32TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008456 case llvm::Triple::nvptx64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008457 return new NVPTX64TargetInfo(Triple, Opts);
Peter Collingbournec947aae2012-05-20 23:28:41 +00008458
Tom Stellardd8e38a32015-01-06 20:34:47 +00008459 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00008460 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008461 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00008462
Daniel Dunbar52322032009-08-18 05:47:58 +00008463 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008464 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00008465 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008466 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008467 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008468 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008469 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008470 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008471 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008472 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008473 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008474 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008475 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008476 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008477 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008478
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008479 // The 'sparcel' architecture copies all the above cases except for Solaris.
8480 case llvm::Triple::sparcel:
8481 switch (os) {
8482 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008483 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008484 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008485 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008486 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008487 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008488 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008489 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008490 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008491 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008492 }
8493
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008494 case llvm::Triple::sparcv9:
8495 switch (os) {
8496 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008497 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008498 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008499 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008500 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008501 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008502 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008503 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008504 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008505 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008506 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008507 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00008508 }
8509
Ulrich Weigand47445072013-05-06 16:26:41 +00008510 case llvm::Triple::systemz:
8511 switch (os) {
8512 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008513 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008514 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008515 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00008516 }
8517
Eli Friedmana9c3d712009-08-19 20:47:07 +00008518 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008519 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00008520
Daniel Dunbar52322032009-08-18 05:47:58 +00008521 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008522 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008523 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008524
Daniel Dunbar52322032009-08-18 05:47:58 +00008525 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00008526 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008527 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008528 case llvm::Triple::Linux: {
8529 switch (Triple.getEnvironment()) {
8530 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008531 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008532 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008533 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008534 }
8535 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008536 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008537 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008538 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008539 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008540 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008541 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008542 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008543 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008544 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008545 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008546 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008547 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008548 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008549 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008550 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008551 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008552 case llvm::Triple::Win32: {
8553 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008554 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008555 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008556 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008557 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00008558 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008559 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008560 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008561 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008562 }
8563 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00008564 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008565 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008566 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008567 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008568 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008569 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00008570 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008571 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008572 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008573 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008574 }
8575
8576 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008577 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008578 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008579
Daniel Dunbar52322032009-08-18 05:47:58 +00008580 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00008581 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008582 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008583 case llvm::Triple::Linux: {
8584 switch (Triple.getEnvironment()) {
8585 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008586 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008587 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008588 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008589 }
8590 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00008591 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008592 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008593 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008594 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008595 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008596 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008597 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008598 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008599 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008600 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00008601 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008602 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008603 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008604 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008605 case llvm::Triple::Win32: {
8606 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00008607 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008608 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008609 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008610 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008611 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008612 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008613 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00008614 }
8615 }
Reid Kleckner330fb172016-05-11 16:19:05 +00008616 case llvm::Triple::Haiku:
8617 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008618 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008619 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00008620 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008621 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008622 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008623 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008624 }
Guy Benyeib798fc92012-12-11 21:38:14 +00008625
Douglas Katzman78d7c542015-05-12 21:18:10 +00008626 case llvm::Triple::spir: {
8627 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8628 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8629 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008630 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008631 }
8632 case llvm::Triple::spir64: {
8633 if (Triple.getOS() != llvm::Triple::UnknownOS ||
8634 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
8635 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008636 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00008637 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008638 case llvm::Triple::wasm32:
8639 if (!(Triple == llvm::Triple("wasm32-unknown-unknown")))
8640 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008641 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00008642 case llvm::Triple::wasm64:
8643 if (!(Triple == llvm::Triple("wasm64-unknown-unknown")))
8644 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008645 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008646
8647 case llvm::Triple::renderscript32:
8648 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
8649 case llvm::Triple::renderscript64:
8650 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008651 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00008652}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008653
8654/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00008655/// options.
Alp Toker80758082014-07-06 05:26:44 +00008656TargetInfo *
8657TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00008658 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00008659 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008660
8661 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008662 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008663 if (!Target) {
8664 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00008665 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008666 }
Alp Toker80758082014-07-06 05:26:44 +00008667 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008668
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008669 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008670 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
8671 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00008672 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00008673 }
8674
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008675 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008676 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
8677 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00008678 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008679 }
8680
Rafael Espindolaeb265472013-08-21 21:59:03 +00008681 // Set the fp math unit.
8682 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
8683 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00008684 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00008685 }
8686
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008687 // Compute the default target features, we need the target to handle this
8688 // because features may have dependencies on one another.
8689 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00008690 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
8691 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00008692 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008693
8694 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00008695 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00008696 for (const auto &F : Features)
8697 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
8698
Eric Christopher3ff21b32013-10-16 21:26:26 +00008699 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00008700 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008701
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008702 Target->setSupportedOpenCLOpts();
8703
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00008704 if (!Target->validateTarget(Diags))
8705 return nullptr;
8706
Ahmed Charles9a16beb2014-03-07 19:33:25 +00008707 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00008708}