blob: 3da1b0f4a242c064ca44c21a450b398ef58fbd6b [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__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000309 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__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000346 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000347 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
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000391 DefineStd(Builder, "unix", Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +0000392 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__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000414 DefineStd(Builder, "unix", Opts);
Reid Kleckner330fb172016-05-11 16:19:05 +0000415 }
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__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000444 DefineStd(Builder, "unix", Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +0000445 }
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
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000458 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000459 DefineStd(Builder, "linux", Opts);
460 Builder.defineMacro("__gnu_linux__");
461 Builder.defineMacro("__ELF__");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +0000462 if (Triple.isAndroid()) {
Evgeniy Stepanov94dc4c92012-04-26 12:08:09 +0000463 Builder.defineMacro("__ANDROID__", "1");
Dan Albert84aee012015-03-03 18:28:38 +0000464 unsigned Maj, Min, Rev;
David Majnemer5c2589a2015-06-01 23:38:25 +0000465 Triple.getEnvironmentVersion(Maj, Min, Rev);
Dan Albert84aee012015-03-03 18:28:38 +0000466 this->PlatformName = "android";
467 this->PlatformMinVersion = VersionTuple(Maj, Min, Rev);
Stephen Hinesa89d8ff2016-11-11 01:29:39 +0000468 if (Maj)
469 Builder.defineMacro("__ANDROID_API__", Twine(Maj));
Dan Albert84aee012015-03-03 18:28:38 +0000470 }
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000471 if (Opts.POSIXThreads)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000472 Builder.defineMacro("_REENTRANT");
Douglas Gregor3ecc6652010-04-21 05:52:38 +0000473 if (Opts.CPlusPlus)
474 Builder.defineMacro("_GNU_SOURCE");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000475 if (this->HasFloat128)
476 Builder.defineMacro("__FLOAT128__");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000477 }
478public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000479 LinuxTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
480 : OSTargetInfo<Target>(Triple, Opts) {
Douglas Gregore6d6e512011-01-12 21:19:25 +0000481 this->WIntType = TargetInfo::UnsignedInt;
Hal Finkelecdb4542014-03-30 13:00:06 +0000482
483 switch (Triple.getArch()) {
484 default:
485 break;
486 case llvm::Triple::ppc:
487 case llvm::Triple::ppc64:
488 case llvm::Triple::ppc64le:
489 this->MCountName = "_mcount";
490 break;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +0000491 case llvm::Triple::x86:
492 case llvm::Triple::x86_64:
493 case llvm::Triple::systemz:
494 this->HasFloat128 = true;
495 break;
Hal Finkelecdb4542014-03-30 13:00:06 +0000496 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000497 }
Benjamin Kramera518b222011-10-15 17:53:33 +0000498
Craig Topper3164f332014-03-11 03:39:26 +0000499 const char *getStaticInitSectionSpecifier() const override {
Benjamin Kramera518b222011-10-15 17:53:33 +0000500 return ".text.startup";
501 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000502};
503
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000504// NetBSD Target
505template<typename Target>
506class NetBSDTargetInfo : public OSTargetInfo<Target> {
507protected:
Craig Topper3164f332014-03-11 03:39:26 +0000508 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
509 MacroBuilder &Builder) const override {
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000510 // NetBSD defines; list based off of gcc output
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000511 Builder.defineMacro("__NetBSD__");
512 Builder.defineMacro("__unix__");
513 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000514 if (Opts.POSIXThreads)
Joerg Sonnenberger84502662017-01-16 14:07:24 +0000515 Builder.defineMacro("_REENTRANT");
Joerg Sonnenbergercc1edb52014-05-13 18:58:36 +0000516
517 switch (Triple.getArch()) {
518 default:
519 break;
520 case llvm::Triple::arm:
521 case llvm::Triple::armeb:
522 case llvm::Triple::thumb:
523 case llvm::Triple::thumbeb:
524 Builder.defineMacro("__ARM_DWARF_EH__");
525 break;
526 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000527 }
528public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000529 NetBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
530 : OSTargetInfo<Target>(Triple, Opts) {
Joerg Sonnenberger740f3f42015-04-10 21:02:53 +0000531 this->MCountName = "_mcount";
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000532 }
Chris Lattnerd1d820ed2009-07-13 20:29:08 +0000533};
534
Torok Edwinb2b37c62009-06-30 17:10:35 +0000535// OpenBSD Target
536template<typename Target>
537class OpenBSDTargetInfo : public OSTargetInfo<Target> {
538protected:
Craig Topper3164f332014-03-11 03:39:26 +0000539 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
540 MacroBuilder &Builder) const override {
Torok Edwinb2b37c62009-06-30 17:10:35 +0000541 // OpenBSD defines; list based off of gcc output
542
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000543 Builder.defineMacro("__OpenBSD__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000544 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000545 Builder.defineMacro("__ELF__");
Daniel Dunbara77eaeb2009-09-03 04:54:28 +0000546 if (Opts.POSIXThreads)
Chris Lattner024e12d2012-04-25 06:12:24 +0000547 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000548 }
549public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000550 OpenBSDTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
551 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000552 this->TLSSupported = false;
Eli Friedman3715d1f2011-12-15 02:15:56 +0000553
Eli Friedman3715d1f2011-12-15 02:15:56 +0000554 switch (Triple.getArch()) {
555 default:
556 case llvm::Triple::x86:
557 case llvm::Triple::x86_64:
558 case llvm::Triple::arm:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000559 case llvm::Triple::sparc:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000560 this->MCountName = "__mcount";
561 break;
562 case llvm::Triple::mips64:
563 case llvm::Triple::mips64el:
564 case llvm::Triple::ppc:
Eric Christopherfd081ca2012-11-14 22:08:59 +0000565 case llvm::Triple::sparcv9:
Eli Friedman3715d1f2011-12-15 02:15:56 +0000566 this->MCountName = "_mcount";
567 break;
568 }
569 }
Torok Edwinb2b37c62009-06-30 17:10:35 +0000570};
571
Eli Friedman9fa28852012-08-08 23:57:20 +0000572// Bitrig Target
573template<typename Target>
574class BitrigTargetInfo : public OSTargetInfo<Target> {
575protected:
Craig Topper3164f332014-03-11 03:39:26 +0000576 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
577 MacroBuilder &Builder) const override {
Eli Friedman9fa28852012-08-08 23:57:20 +0000578 // Bitrig defines; list based off of gcc output
579
580 Builder.defineMacro("__Bitrig__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000581 DefineStd(Builder, "unix", Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +0000582 Builder.defineMacro("__ELF__");
583 if (Opts.POSIXThreads)
584 Builder.defineMacro("_REENTRANT");
Renato Golin9ba39232015-02-27 16:35:48 +0000585
586 switch (Triple.getArch()) {
587 default:
588 break;
589 case llvm::Triple::arm:
590 case llvm::Triple::armeb:
591 case llvm::Triple::thumb:
592 case llvm::Triple::thumbeb:
593 Builder.defineMacro("__ARM_DWARF_EH__");
594 break;
595 }
Eli Friedman9fa28852012-08-08 23:57:20 +0000596 }
597public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000598 BitrigTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
599 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000600 this->MCountName = "__mcount";
Eli Friedman9fa28852012-08-08 23:57:20 +0000601 }
602};
603
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000604// PSP Target
605template<typename Target>
606class PSPTargetInfo : public OSTargetInfo<Target> {
607protected:
Craig Topper3164f332014-03-11 03:39:26 +0000608 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
609 MacroBuilder &Builder) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000610 // PSP defines; list based on the output of the pspdev gcc toolchain.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000611 Builder.defineMacro("PSP");
612 Builder.defineMacro("_PSP");
613 Builder.defineMacro("__psp__");
614 Builder.defineMacro("__ELF__");
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000615 }
616public:
James Y Knightb214cbc2016-03-04 19:00:41 +0000617 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {}
Edward O'Callaghane9a58b12009-11-15 10:22:07 +0000618};
619
John Thompsone467e192009-11-19 17:18:50 +0000620// PS3 PPU Target
621template<typename Target>
622class PS3PPUTargetInfo : public OSTargetInfo<Target> {
623protected:
Craig Topper3164f332014-03-11 03:39:26 +0000624 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
625 MacroBuilder &Builder) const override {
John Thompsone467e192009-11-19 17:18:50 +0000626 // PS3 PPU defines.
John Thompson957816f2010-03-25 16:18:32 +0000627 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000628 Builder.defineMacro("__PPU__");
629 Builder.defineMacro("__CELLOS_LV2__");
630 Builder.defineMacro("__ELF__");
631 Builder.defineMacro("__LP32__");
John Thompson07a61a42010-06-24 22:44:13 +0000632 Builder.defineMacro("_ARCH_PPC64");
633 Builder.defineMacro("__powerpc64__");
John Thompsone467e192009-11-19 17:18:50 +0000634 }
635public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000636 PS3PPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
637 : OSTargetInfo<Target>(Triple, Opts) {
Nick Lewyckyc0a61732011-12-16 22:32:39 +0000638 this->LongWidth = this->LongAlign = 32;
639 this->PointerWidth = this->PointerAlign = 32;
John Thompson07a61a42010-06-24 22:44:13 +0000640 this->IntMaxType = TargetInfo::SignedLongLong;
John Thompson07a61a42010-06-24 22:44:13 +0000641 this->Int64Type = TargetInfo::SignedLongLong;
John Thompson6f8dba72009-12-18 14:21:08 +0000642 this->SizeType = TargetInfo::UnsignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +0000643 this->resetDataLayout("E-m:e-p:32:32-i64:64-n32:64");
John Thompsone467e192009-11-19 17:18:50 +0000644 }
645};
646
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000647template <typename Target>
648class PS4OSTargetInfo : public OSTargetInfo<Target> {
649protected:
650 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
651 MacroBuilder &Builder) const override {
652 Builder.defineMacro("__FreeBSD__", "9");
653 Builder.defineMacro("__FreeBSD_cc_version", "900001");
654 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000655 DefineStd(Builder, "unix", Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000656 Builder.defineMacro("__ELF__");
Paul Robinson9d613612016-05-16 17:22:25 +0000657 Builder.defineMacro("__ORBIS__");
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000658 }
659public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000660 PS4OSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
661 : OSTargetInfo<Target>(Triple, Opts) {
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000662 this->WCharType = this->UnsignedShort;
663
Paul Robinsond30e2ee2015-07-14 20:52:32 +0000664 // On PS4, TLS variable cannot be aligned to more than 32 bytes (256 bits).
665 this->MaxTLSAlign = 256;
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000666
Sunil Srivastava0ce2f222016-02-05 20:50:02 +0000667 // On PS4, do not honor explicit bit field alignment,
668 // as in "__attribute__((aligned(2))) int b : 1;".
669 this->UseExplicitBitFieldAlignment = false;
670
Alex Rosenberg12207fa2015-01-27 14:47:44 +0000671 switch (Triple.getArch()) {
672 default:
673 case llvm::Triple::x86_64:
674 this->MCountName = ".mcount";
675 break;
676 }
677 }
678};
679
Torok Edwinb2b37c62009-06-30 17:10:35 +0000680// Solaris target
681template<typename Target>
682class SolarisTargetInfo : public OSTargetInfo<Target> {
683protected:
Craig Topper3164f332014-03-11 03:39:26 +0000684 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
685 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000686 DefineStd(Builder, "sun", Opts);
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000687 DefineStd(Builder, "unix", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +0000688 Builder.defineMacro("__ELF__");
689 Builder.defineMacro("__svr4__");
690 Builder.defineMacro("__SVR4");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000691 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
692 // newer, but to 500 for everything else. feature_test.h has a check to
693 // ensure that you are not using C99 with an old version of X/Open or C89
Richard Smithab506ad2014-10-20 23:26:58 +0000694 // with a new version.
695 if (Opts.C99)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000696 Builder.defineMacro("_XOPEN_SOURCE", "600");
697 else
698 Builder.defineMacro("_XOPEN_SOURCE", "500");
David Chisnalle04307e2012-03-02 10:49:52 +0000699 if (Opts.CPlusPlus)
David Chisnall0c52c0f2012-02-28 17:10:04 +0000700 Builder.defineMacro("__C99FEATURES__");
David Chisnall0c1941cb2012-02-17 18:35:11 +0000701 Builder.defineMacro("_LARGEFILE_SOURCE");
702 Builder.defineMacro("_LARGEFILE64_SOURCE");
703 Builder.defineMacro("__EXTENSIONS__");
David Chisnall0c52c0f2012-02-28 17:10:04 +0000704 Builder.defineMacro("_REENTRANT");
Torok Edwinb2b37c62009-06-30 17:10:35 +0000705 }
706public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000707 SolarisTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
708 : OSTargetInfo<Target>(Triple, Opts) {
David Chisnallb526e932012-03-28 18:04:14 +0000709 this->WCharType = this->SignedInt;
Torok Edwinb2b37c62009-06-30 17:10:35 +0000710 // FIXME: WIntType should be SignedLong
711 }
712};
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000713
714// Windows target
715template<typename Target>
716class WindowsTargetInfo : public OSTargetInfo<Target> {
717protected:
Craig Topper3164f332014-03-11 03:39:26 +0000718 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
719 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000720 Builder.defineMacro("_WIN32");
721 }
722 void getVisualStudioDefines(const LangOptions &Opts,
723 MacroBuilder &Builder) const {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000724 if (Opts.CPlusPlus) {
David Majnemerf6072342014-07-01 22:24:56 +0000725 if (Opts.RTTIData)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000726 Builder.defineMacro("_CPPRTTI");
727
Reid Kleckner16514352015-01-30 21:42:55 +0000728 if (Opts.CXXExceptions)
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000729 Builder.defineMacro("_CPPUNWIND");
730 }
731
David Majnemer6a658902015-07-22 22:36:26 +0000732 if (Opts.Bool)
733 Builder.defineMacro("__BOOL_DEFINED");
734
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000735 if (!Opts.CharIsSigned)
736 Builder.defineMacro("_CHAR_UNSIGNED");
737
738 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
739 // but it works for now.
740 if (Opts.POSIXThreads)
741 Builder.defineMacro("_MT");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +0000742
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +0000743 if (Opts.MSCompatibilityVersion) {
744 Builder.defineMacro("_MSC_VER",
745 Twine(Opts.MSCompatibilityVersion / 100000));
746 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000747 // FIXME We cannot encode the revision information into 32-bits
748 Builder.defineMacro("_MSC_BUILD", Twine(1));
David Majnemeraaf2b842015-03-18 07:53:18 +0000749
David Majnemerb710a932015-05-11 03:57:49 +0000750 if (Opts.CPlusPlus11 && Opts.isCompatibleWithMSVC(LangOptions::MSVC2015))
David Majnemeraaf2b842015-03-18 07:53:18 +0000751 Builder.defineMacro("_HAS_CHAR16_T_LANGUAGE_SUPPORT", Twine(1));
David Majnemer017cf352016-06-28 03:13:16 +0000752
753 if (Opts.isCompatibleWithMSVC(LangOptions::MSVC2015)) {
754 if (Opts.CPlusPlus1z)
755 Builder.defineMacro("_MSVC_LANG", "201403L");
756 else if (Opts.CPlusPlus14)
757 Builder.defineMacro("_MSVC_LANG", "201402L");
758 }
Saleem Abdulrasool9d45e772014-06-20 22:58:35 +0000759 }
Reid Kleckner6f6e76d2014-04-16 20:10:16 +0000760
761 if (Opts.MicrosoftExt) {
762 Builder.defineMacro("_MSC_EXTENSIONS");
763
764 if (Opts.CPlusPlus11) {
765 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
766 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
767 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
768 }
769 }
770
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000771 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000772 }
773
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000774public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000775 WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
776 : OSTargetInfo<Target>(Triple, Opts) {}
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +0000777};
778
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000779template <typename Target>
780class NaClTargetInfo : public OSTargetInfo<Target> {
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000781protected:
Craig Topper3164f332014-03-11 03:39:26 +0000782 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
783 MacroBuilder &Builder) const override {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000784 if (Opts.POSIXThreads)
785 Builder.defineMacro("_REENTRANT");
786 if (Opts.CPlusPlus)
787 Builder.defineMacro("_GNU_SOURCE");
788
Saleem Abdulrasool56027092017-02-07 19:00:06 +0000789 DefineStd(Builder, "unix", Opts);
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000790 Builder.defineMacro("__ELF__");
791 Builder.defineMacro("__native_client__");
792 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +0000793
794public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000795 NaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
796 : OSTargetInfo<Target>(Triple, Opts) {
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000797 this->LongAlign = 32;
798 this->LongWidth = 32;
799 this->PointerAlign = 32;
800 this->PointerWidth = 32;
801 this->IntMaxType = TargetInfo::SignedLongLong;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000802 this->Int64Type = TargetInfo::SignedLongLong;
803 this->DoubleAlign = 64;
804 this->LongDoubleWidth = 64;
805 this->LongDoubleAlign = 64;
Jan Wen Voung1f9c4ee2014-01-15 21:42:41 +0000806 this->LongLongWidth = 64;
807 this->LongLongAlign = 64;
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000808 this->SizeType = TargetInfo::UnsignedInt;
809 this->PtrDiffType = TargetInfo::SignedInt;
810 this->IntPtrType = TargetInfo::SignedInt;
Guy Blank294cbbd2016-08-18 08:44:33 +0000811 // RegParmMax is inherited from the underlying architecture.
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000812 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Rafael Espindola1c09b262013-12-18 23:41:04 +0000813 if (Triple.getArch() == llvm::Triple::arm) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +0000814 // Handled in ARM's setABI().
Rafael Espindola1c09b262013-12-18 23:41:04 +0000815 } else if (Triple.getArch() == llvm::Triple::x86) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000816 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000817 } else if (Triple.getArch() == llvm::Triple::x86_64) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000818 this->resetDataLayout("e-m:e-p:32:32-i64:64-n8:16:32:64-S128");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000819 } else if (Triple.getArch() == llvm::Triple::mipsel) {
James Y Knightb214cbc2016-03-04 19:00:41 +0000820 // Handled on mips' setDataLayout.
Rafael Espindola1c09b262013-12-18 23:41:04 +0000821 } else {
822 assert(Triple.getArch() == llvm::Triple::le32);
James Y Knightb214cbc2016-03-04 19:00:41 +0000823 this->resetDataLayout("e-p:32:32-i64:64");
Rafael Espindola1c09b262013-12-18 23:41:04 +0000824 }
Derek Schuff57b7e8f2012-10-11 16:55:58 +0000825 }
826};
Torok Edwinb2b37c62009-06-30 17:10:35 +0000827
Petr Hosek62e1d232016-10-06 06:08:09 +0000828// Fuchsia Target
829template<typename Target>
830class FuchsiaTargetInfo : public OSTargetInfo<Target> {
831protected:
832 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
833 MacroBuilder &Builder) const override {
834 Builder.defineMacro("__Fuchsia__");
835 Builder.defineMacro("__ELF__");
836 if (Opts.POSIXThreads)
837 Builder.defineMacro("_REENTRANT");
838 // Required by the libc++ locale support.
839 if (Opts.CPlusPlus)
840 Builder.defineMacro("_GNU_SOURCE");
841 }
842public:
843 FuchsiaTargetInfo(const llvm::Triple &Triple,
844 const TargetOptions &Opts)
845 : OSTargetInfo<Target>(Triple, Opts) {
846 this->MCountName = "__mcount";
847 }
848};
849
Dan Gohmanc2853072015-09-03 22:51:53 +0000850// WebAssembly target
851template <typename Target>
852class WebAssemblyOSTargetInfo : public OSTargetInfo<Target> {
853 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Hans Wennborg7eb54642015-09-10 17:07:54 +0000854 MacroBuilder &Builder) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000855 // A common platform macro.
856 if (Opts.POSIXThreads)
857 Builder.defineMacro("_REENTRANT");
858 // Follow g++ convention and predefine _GNU_SOURCE for C++.
859 if (Opts.CPlusPlus)
860 Builder.defineMacro("_GNU_SOURCE");
861 }
862
863 // As an optimization, group static init code together in a section.
Hans Wennborg7eb54642015-09-10 17:07:54 +0000864 const char *getStaticInitSectionSpecifier() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +0000865 return ".text.__startup";
866 }
867
868public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000869 explicit WebAssemblyOSTargetInfo(const llvm::Triple &Triple,
870 const TargetOptions &Opts)
871 : OSTargetInfo<Target>(Triple, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +0000872 this->MCountName = "__mcount";
Dan Gohmanc2853072015-09-03 22:51:53 +0000873 this->TheCXXABI.set(TargetCXXABI::WebAssembly);
874 }
875};
Dan Gohmanc2853072015-09-03 22:51:53 +0000876
Chris Lattner09d98f52008-10-05 21:50:58 +0000877//===----------------------------------------------------------------------===//
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000878// Specific target implementations.
879//===----------------------------------------------------------------------===//
Anders Carlssona7408e72007-10-13 00:45:48 +0000880
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000881// PPC abstract base class
882class PPCTargetInfo : public TargetInfo {
883 static const Builtin::Info BuiltinInfo[];
884 static const char * const GCCRegNames[];
885 static const TargetInfo::GCCRegAlias GCCRegAliases[];
Hal Finkel8eb59282012-06-11 22:35:19 +0000886 std::string CPU;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000887
888 // Target cpu features.
889 bool HasVSX;
Bill Schmidt8c184e32014-10-10 17:21:23 +0000890 bool HasP8Vector;
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +0000891 bool HasP8Crypto;
Nemanja Ivanovic35458c22015-04-11 10:43:36 +0000892 bool HasDirectMove;
Hal Finkel0d0a1a52015-03-11 19:14:15 +0000893 bool HasQPX;
Kit Barton8246f282015-03-25 19:41:41 +0000894 bool HasHTM;
Nemanja Ivanovic239eec72015-04-09 23:58:16 +0000895 bool HasBPERMD;
896 bool HasExtDiv;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000897 bool HasP9Vector;
Eric Christopher2fe3b4a2013-10-16 21:19:26 +0000898
Ulrich Weigand8afad612014-07-28 13:17:52 +0000899protected:
900 std::string ABI;
901
Eli Friedmanb9e5bed2008-08-20 23:11:40 +0000902public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +0000903 PPCTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Saleem Abdulrasool10a49722016-04-08 16:52:00 +0000904 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false),
905 HasP8Crypto(false), HasDirectMove(false), HasQPX(false), HasHTM(false),
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +0000906 HasBPERMD(false), HasExtDiv(false), HasP9Vector(false) {
Alexey Bataev00396512015-07-02 03:40:19 +0000907 SimdDefaultAlign = 128;
Nico Weber3435ede2012-01-31 02:07:33 +0000908 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +0000909 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble();
Nico Weber3435ede2012-01-31 02:07:33 +0000910 }
Eli Friedman9ffd4a92009-06-05 07:05:05 +0000911
Hal Finkel6b984f02012-07-03 16:51:04 +0000912 /// \brief Flags for architecture specific defines.
913 typedef enum {
914 ArchDefineNone = 0,
915 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
916 ArchDefinePpcgr = 1 << 1,
917 ArchDefinePpcsq = 1 << 2,
918 ArchDefine440 = 1 << 3,
919 ArchDefine603 = 1 << 4,
920 ArchDefine604 = 1 << 5,
921 ArchDefinePwr4 = 1 << 6,
Bill Schmidt38378a02013-02-01 20:23:10 +0000922 ArchDefinePwr5 = 1 << 7,
923 ArchDefinePwr5x = 1 << 8,
924 ArchDefinePwr6 = 1 << 9,
925 ArchDefinePwr6x = 1 << 10,
926 ArchDefinePwr7 = 1 << 11,
Will Schmidtf0487512014-06-26 13:34:10 +0000927 ArchDefinePwr8 = 1 << 12,
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000928 ArchDefinePwr9 = 1 << 13,
929 ArchDefineA2 = 1 << 14,
930 ArchDefineA2q = 1 << 15
Hal Finkel6b984f02012-07-03 16:51:04 +0000931 } ArchDefineTypes;
932
Bill Schmidt38378a02013-02-01 20:23:10 +0000933 // Note: GCC recognizes the following additional cpus:
934 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
935 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
936 // titan, rs64.
Craig Topper3164f332014-03-11 03:39:26 +0000937 bool setCPU(const std::string &Name) override {
Hal Finkel8eb59282012-06-11 22:35:19 +0000938 bool CPUKnown = llvm::StringSwitch<bool>(Name)
939 .Case("generic", true)
940 .Case("440", true)
941 .Case("450", true)
942 .Case("601", true)
943 .Case("602", true)
944 .Case("603", true)
945 .Case("603e", true)
946 .Case("603ev", true)
947 .Case("604", true)
948 .Case("604e", true)
949 .Case("620", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000950 .Case("630", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000951 .Case("g3", true)
952 .Case("7400", true)
953 .Case("g4", true)
954 .Case("7450", true)
955 .Case("g4+", true)
956 .Case("750", true)
957 .Case("970", true)
958 .Case("g5", true)
959 .Case("a2", true)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +0000960 .Case("a2q", true)
Hal Finkelf6d6cb02012-09-18 22:25:03 +0000961 .Case("e500mc", true)
962 .Case("e5500", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000963 .Case("power3", true)
964 .Case("pwr3", true)
965 .Case("power4", true)
966 .Case("pwr4", true)
967 .Case("power5", true)
968 .Case("pwr5", true)
969 .Case("power5x", true)
970 .Case("pwr5x", true)
971 .Case("power6", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000972 .Case("pwr6", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000973 .Case("power6x", true)
974 .Case("pwr6x", true)
975 .Case("power7", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000976 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +0000977 .Case("power8", true)
978 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +0000979 .Case("power9", true)
980 .Case("pwr9", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000981 .Case("powerpc", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000982 .Case("ppc", true)
Bill Schmidt38378a02013-02-01 20:23:10 +0000983 .Case("powerpc64", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000984 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +0000985 .Case("powerpc64le", true)
986 .Case("ppc64le", true)
Hal Finkel8eb59282012-06-11 22:35:19 +0000987 .Default(false);
988
989 if (CPUKnown)
990 CPU = Name;
991
992 return CPUKnown;
993 }
994
Ulrich Weigand8afad612014-07-28 13:17:52 +0000995
996 StringRef getABI() const override { return ABI; }
997
Craig Topper6c03a542015-10-19 04:51:35 +0000998 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
999 return llvm::makeArrayRef(BuiltinInfo,
1000 clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner10a5b382007-01-29 05:24:35 +00001001 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001002
Craig Topper3164f332014-03-11 03:39:26 +00001003 bool isCLZForZeroUndef() const override { return false; }
Bob Wilson19a2f2b2012-01-28 18:02:29 +00001004
Craig Topper3164f332014-03-11 03:39:26 +00001005 void getTargetDefines(const LangOptions &Opts,
1006 MacroBuilder &Builder) const override;
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001007
Eric Christopher8c47b422015-10-09 18:39:55 +00001008 bool
1009 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1010 StringRef CPU,
1011 const std::vector<std::string> &FeaturesVec) const override;
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001012
Craig Topper3164f332014-03-11 03:39:26 +00001013 bool handleTargetFeatures(std::vector<std::string> &Features,
1014 DiagnosticsEngine &Diags) override;
1015 bool hasFeature(StringRef Feature) const override;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001016 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
1017 bool Enabled) const override;
Craig Topper3164f332014-03-11 03:39:26 +00001018
Craig Topperf054e3a2015-10-19 03:52:27 +00001019 ArrayRef<const char *> getGCCRegNames() const override;
1020 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00001021 bool validateAsmConstraint(const char *&Name,
1022 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00001023 switch (*Name) {
Anders Carlssonf511f642007-11-27 04:11:28 +00001024 default: return false;
1025 case 'O': // Zero
John Thompson07a61a42010-06-24 22:44:13 +00001026 break;
Anders Carlssonf511f642007-11-27 04:11:28 +00001027 case 'b': // Base register
1028 case 'f': // Floating point register
Chris Lattnerd9725f72009-04-26 07:16:29 +00001029 Info.setAllowsRegister();
John Thompson07a61a42010-06-24 22:44:13 +00001030 break;
1031 // FIXME: The following are added to allow parsing.
1032 // I just took a guess at what the actions should be.
1033 // Also, is more specific checking needed? I.e. specific registers?
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001034 case 'd': // Floating point register (containing 64-bit value)
John Thompson07a61a42010-06-24 22:44:13 +00001035 case 'v': // Altivec vector register
1036 Info.setAllowsRegister();
1037 break;
1038 case 'w':
1039 switch (Name[1]) {
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001040 case 'd':// VSX vector register to hold vector double data
1041 case 'f':// VSX vector register to hold vector float data
1042 case 's':// VSX vector register to hold scalar float data
1043 case 'a':// Any VSX register
Hal Finkelf7a07a52014-03-02 18:24:18 +00001044 case 'c':// An individual CR bit
John Thompson07a61a42010-06-24 22:44:13 +00001045 break;
1046 default:
1047 return false;
1048 }
1049 Info.setAllowsRegister();
1050 Name++; // Skip over 'w'.
1051 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001052 case 'h': // `MQ', `CTR', or `LINK' register
1053 case 'q': // `MQ' register
1054 case 'c': // `CTR' register
1055 case 'l': // `LINK' register
1056 case 'x': // `CR' register (condition register) number 0
1057 case 'y': // `CR' register (condition register)
1058 case 'z': // `XER[CA]' carry bit (part of the XER register)
John Thompson07a61a42010-06-24 22:44:13 +00001059 Info.setAllowsRegister();
1060 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001061 case 'I': // Signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001062 case 'J': // Unsigned 16-bit constant shifted left 16 bits
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001063 // (use `L' instead for SImode constants)
1064 case 'K': // Unsigned 16-bit constant
1065 case 'L': // Signed 16-bit constant shifted left 16 bits
1066 case 'M': // Constant larger than 31
1067 case 'N': // Exact power of 2
1068 case 'P': // Constant whose negation is a signed 16-bit constant
John Thompson07a61a42010-06-24 22:44:13 +00001069 case 'G': // Floating point constant that can be loaded into a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001070 // register with one instruction per word
John Thompson07a61a42010-06-24 22:44:13 +00001071 case 'H': // Integer/Floating point constant that can be loaded
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001072 // into a register using three instructions
John Thompson07a61a42010-06-24 22:44:13 +00001073 break;
1074 case 'm': // Memory operand. Note that on PowerPC targets, m can
1075 // include addresses that update the base register. It
1076 // is therefore only safe to use `m' in an asm statement
1077 // if that asm statement accesses the operand exactly once.
1078 // The asm statement must also use `%U<opno>' as a
Sebastian Redldd008712010-08-17 22:42:34 +00001079 // placeholder for the "update" flag in the corresponding
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001080 // load or store instruction. For example:
John Thompson07a61a42010-06-24 22:44:13 +00001081 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001082 // is correct but:
John Thompson07a61a42010-06-24 22:44:13 +00001083 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
1084 // is not. Use es rather than m if you don't want the base
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001085 // register to be updated.
1086 case 'e':
John Thompsonceebdf12010-06-25 00:02:05 +00001087 if (Name[1] != 's')
1088 return false;
Sebastian Redldd008712010-08-17 22:42:34 +00001089 // es: A "stable" memory operand; that is, one which does not
John Thompson07a61a42010-06-24 22:44:13 +00001090 // include any automodification of the base register. Unlike
1091 // `m', this constraint can be used in asm statements that
1092 // might access the operand several times, or that might not
John Thompsonceebdf12010-06-25 00:02:05 +00001093 // access it at all.
John Thompson07a61a42010-06-24 22:44:13 +00001094 Info.setAllowsMemory();
John Thompsonceebdf12010-06-25 00:02:05 +00001095 Name++; // Skip over 'e'.
John Thompson07a61a42010-06-24 22:44:13 +00001096 break;
1097 case 'Q': // Memory operand that is an offset from a register (it is
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001098 // usually better to use `m' or `es' in asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001099 case 'Z': // Memory operand that is an indexed or indirect from a
1100 // register (it is usually better to use `m' or `es' in
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001101 // asm statements)
John Thompson07a61a42010-06-24 22:44:13 +00001102 Info.setAllowsMemory();
1103 Info.setAllowsRegister();
1104 break;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001105 case 'R': // AIX TOC entry
John Thompson07a61a42010-06-24 22:44:13 +00001106 case 'a': // Address operand that is an indexed or indirect from a
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001107 // register (`p' is preferable for asm statements)
1108 case 'S': // Constant suitable as a 64-bit mask operand
1109 case 'T': // Constant suitable as a 32-bit mask operand
1110 case 'U': // System V Release 4 small data area reference
John Thompson07a61a42010-06-24 22:44:13 +00001111 case 't': // AND masks that can be performed by two rldic{l, r}
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001112 // instructions
1113 case 'W': // Vector constant that does not require memory
1114 case 'j': // Vector constant that is all zeros.
John Thompson07a61a42010-06-24 22:44:13 +00001115 break;
1116 // End FIXME.
Anders Carlssonf511f642007-11-27 04:11:28 +00001117 }
John Thompson07a61a42010-06-24 22:44:13 +00001118 return true;
Anders Carlssonf511f642007-11-27 04:11:28 +00001119 }
Craig Topper3164f332014-03-11 03:39:26 +00001120 std::string convertConstraint(const char *&Constraint) const override {
Hal Finkelf7a07a52014-03-02 18:24:18 +00001121 std::string R;
1122 switch (*Constraint) {
1123 case 'e':
1124 case 'w':
1125 // Two-character constraint; add "^" hint for later parsing.
1126 R = std::string("^") + std::string(Constraint, 2);
1127 Constraint++;
1128 break;
1129 default:
1130 return TargetInfo::convertConstraint(Constraint);
1131 }
1132 return R;
1133 }
Craig Topper3164f332014-03-11 03:39:26 +00001134 const char *getClobbers() const override {
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001135 return "";
Anders Carlssonf511f642007-11-27 04:11:28 +00001136 }
Craig Topper3164f332014-03-11 03:39:26 +00001137 int getEHDataRegisterNumber(unsigned RegNo) const override {
Adhemerval Zanella5d874ae2013-01-22 20:02:45 +00001138 if (RegNo == 0) return 3;
1139 if (RegNo == 1) return 4;
1140 return -1;
1141 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00001142
1143 bool hasSjLjLowering() const override {
1144 return true;
1145 }
David Majnemer2617ea62015-06-09 18:05:33 +00001146
1147 bool useFloat128ManglingForLongDouble() const override {
1148 return LongDoubleWidth == 128 &&
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001149 LongDoubleFormat == &llvm::APFloat::PPCDoubleDouble() &&
David Majnemer2617ea62015-06-09 18:05:33 +00001150 getTriple().isOSBinFormatELF();
1151 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001152};
Anders Carlssonf511f642007-11-27 04:11:28 +00001153
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001154const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00001155#define BUILTIN(ID, TYPE, ATTRS) \
1156 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1157#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1158 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Chris Lattner5abdec72009-06-14 01:05:48 +00001159#include "clang/Basic/BuiltinsPPC.def"
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001160};
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001161
Eric Christopher917e9522014-11-18 22:36:15 +00001162/// handleTargetFeatures - Perform initialization based on the user
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001163/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00001164bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001165 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00001166 for (const auto &Feature : Features) {
1167 if (Feature == "+vsx") {
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001168 HasVSX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001169 } else if (Feature == "+bpermd") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001170 HasBPERMD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001171 } else if (Feature == "+extdiv") {
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001172 HasExtDiv = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001173 } else if (Feature == "+power8-vector") {
Bill Schmidt8c184e32014-10-10 17:21:23 +00001174 HasP8Vector = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001175 } else if (Feature == "+crypto") {
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001176 HasP8Crypto = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001177 } else if (Feature == "+direct-move") {
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001178 HasDirectMove = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001179 } else if (Feature == "+qpx") {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001180 HasQPX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00001181 } else if (Feature == "+htm") {
Kit Barton8246f282015-03-25 19:41:41 +00001182 HasHTM = true;
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001183 } else if (Feature == "+float128") {
1184 HasFloat128 = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001185 } else if (Feature == "+power9-vector") {
1186 HasP9Vector = true;
Kit Barton8246f282015-03-25 19:41:41 +00001187 }
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001188 // TODO: Finish this list and add an assert that we've handled them
1189 // all.
1190 }
Eric Christopher02c33352015-08-25 00:59:11 +00001191
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001192 return true;
1193}
1194
Chris Lattnerecd49032009-03-02 22:27:17 +00001195/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
1196/// #defines that are not tied to a specific subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00001197void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001198 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00001199 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001200 Builder.defineMacro("__ppc__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001201 Builder.defineMacro("__PPC__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001202 Builder.defineMacro("_ARCH_PPC");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001203 Builder.defineMacro("__powerpc__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001204 Builder.defineMacro("__POWERPC__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001205 if (PointerWidth == 64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001206 Builder.defineMacro("_ARCH_PPC64");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001207 Builder.defineMacro("__powerpc64__");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001208 Builder.defineMacro("__ppc64__");
Chandler Carruth6aa92ad2013-06-25 11:13:47 +00001209 Builder.defineMacro("__PPC64__");
Chris Lattnerecd49032009-03-02 22:27:17 +00001210 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001211
Chris Lattnerecd49032009-03-02 22:27:17 +00001212 // Target properties.
Bill Schmidt778d3872013-07-26 01:36:11 +00001213 if (getTriple().getArch() == llvm::Triple::ppc64le) {
1214 Builder.defineMacro("_LITTLE_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001215 } else {
1216 if (getTriple().getOS() != llvm::Triple::NetBSD &&
1217 getTriple().getOS() != llvm::Triple::OpenBSD)
1218 Builder.defineMacro("_BIG_ENDIAN");
Bill Schmidt778d3872013-07-26 01:36:11 +00001219 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001220
Ulrich Weigand8afad612014-07-28 13:17:52 +00001221 // ABI options.
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001222 if (ABI == "elfv1" || ABI == "elfv1-qpx")
Ulrich Weigand8afad612014-07-28 13:17:52 +00001223 Builder.defineMacro("_CALL_ELF", "1");
1224 if (ABI == "elfv2")
1225 Builder.defineMacro("_CALL_ELF", "2");
1226
Chris Lattnerecd49032009-03-02 22:27:17 +00001227 // Subtarget options.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001228 Builder.defineMacro("__NATURAL_ALIGNMENT__");
1229 Builder.defineMacro("__REGISTER_PREFIX__", "");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00001230
Chris Lattnerecd49032009-03-02 22:27:17 +00001231 // FIXME: Should be controlled by command line option.
Roman Divacky13b586f2013-07-03 19:45:54 +00001232 if (LongDoubleWidth == 128)
1233 Builder.defineMacro("__LONG_DOUBLE_128__");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00001234
John Thompsone467e192009-11-19 17:18:50 +00001235 if (Opts.AltiVec) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00001236 Builder.defineMacro("__VEC__", "10206");
1237 Builder.defineMacro("__ALTIVEC__");
John Thompsone467e192009-11-19 17:18:50 +00001238 }
Hal Finkel8eb59282012-06-11 22:35:19 +00001239
1240 // CPU identification.
Hal Finkel6b984f02012-07-03 16:51:04 +00001241 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1242 .Case("440", ArchDefineName)
1243 .Case("450", ArchDefineName | ArchDefine440)
1244 .Case("601", ArchDefineName)
1245 .Case("602", ArchDefineName | ArchDefinePpcgr)
1246 .Case("603", ArchDefineName | ArchDefinePpcgr)
1247 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1248 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1249 .Case("604", ArchDefineName | ArchDefinePpcgr)
1250 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1251 .Case("620", ArchDefineName | ArchDefinePpcgr)
Bill Schmidt38378a02013-02-01 20:23:10 +00001252 .Case("630", ArchDefineName | ArchDefinePpcgr)
Hal Finkel6b984f02012-07-03 16:51:04 +00001253 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1254 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1255 .Case("750", ArchDefineName | ArchDefinePpcgr)
1256 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1257 | ArchDefinePpcsq)
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001258 .Case("a2", ArchDefineA2)
1259 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
Bill Schmidt38378a02013-02-01 20:23:10 +00001260 .Case("pwr3", ArchDefinePpcgr)
1261 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1262 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1263 | ArchDefinePpcsq)
1264 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1265 | ArchDefinePpcgr | ArchDefinePpcsq)
1266 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1267 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1268 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1269 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1270 | ArchDefinePpcsq)
1271 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1272 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001273 | ArchDefinePpcgr | ArchDefinePpcsq)
1274 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1275 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1276 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001277 .Case("pwr9", ArchDefineName | ArchDefinePwr8 | ArchDefinePwr7
1278 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1279 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1280 | ArchDefinePpcsq)
Bill Schmidt38378a02013-02-01 20:23:10 +00001281 .Case("power3", ArchDefinePpcgr)
1282 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1283 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1284 | ArchDefinePpcsq)
1285 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1286 | ArchDefinePpcgr | ArchDefinePpcsq)
1287 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1288 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1289 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1290 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1291 | ArchDefinePpcsq)
1292 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1293 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
Will Schmidtf0487512014-06-26 13:34:10 +00001294 | ArchDefinePpcgr | ArchDefinePpcsq)
1295 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1296 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1297 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001298 .Case("power9", ArchDefinePwr9 | ArchDefinePwr8 | ArchDefinePwr7
1299 | ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1300 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1301 | ArchDefinePpcsq)
Hal Finkel6b984f02012-07-03 16:51:04 +00001302 .Default(ArchDefineNone);
1303
1304 if (defs & ArchDefineName)
1305 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1306 if (defs & ArchDefinePpcgr)
1307 Builder.defineMacro("_ARCH_PPCGR");
1308 if (defs & ArchDefinePpcsq)
1309 Builder.defineMacro("_ARCH_PPCSQ");
1310 if (defs & ArchDefine440)
Hal Finkel8eb59282012-06-11 22:35:19 +00001311 Builder.defineMacro("_ARCH_440");
Hal Finkel6b984f02012-07-03 16:51:04 +00001312 if (defs & ArchDefine603)
1313 Builder.defineMacro("_ARCH_603");
1314 if (defs & ArchDefine604)
1315 Builder.defineMacro("_ARCH_604");
Bill Schmidt38378a02013-02-01 20:23:10 +00001316 if (defs & ArchDefinePwr4)
Hal Finkel6b984f02012-07-03 16:51:04 +00001317 Builder.defineMacro("_ARCH_PWR4");
Bill Schmidt38378a02013-02-01 20:23:10 +00001318 if (defs & ArchDefinePwr5)
Hal Finkel6b984f02012-07-03 16:51:04 +00001319 Builder.defineMacro("_ARCH_PWR5");
Bill Schmidt38378a02013-02-01 20:23:10 +00001320 if (defs & ArchDefinePwr5x)
1321 Builder.defineMacro("_ARCH_PWR5X");
1322 if (defs & ArchDefinePwr6)
Hal Finkel8eb59282012-06-11 22:35:19 +00001323 Builder.defineMacro("_ARCH_PWR6");
Bill Schmidt38378a02013-02-01 20:23:10 +00001324 if (defs & ArchDefinePwr6x)
1325 Builder.defineMacro("_ARCH_PWR6X");
1326 if (defs & ArchDefinePwr7)
1327 Builder.defineMacro("_ARCH_PWR7");
Will Schmidtf0487512014-06-26 13:34:10 +00001328 if (defs & ArchDefinePwr8)
1329 Builder.defineMacro("_ARCH_PWR8");
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001330 if (defs & ArchDefinePwr9)
1331 Builder.defineMacro("_ARCH_PWR9");
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001332 if (defs & ArchDefineA2)
1333 Builder.defineMacro("_ARCH_A2");
1334 if (defs & ArchDefineA2q) {
1335 Builder.defineMacro("_ARCH_A2Q");
1336 Builder.defineMacro("_ARCH_QP");
1337 }
1338
1339 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1340 Builder.defineMacro("__bg__");
1341 Builder.defineMacro("__THW_BLUEGENE__");
1342 Builder.defineMacro("__bgq__");
1343 Builder.defineMacro("__TOS_BGQ__");
1344 }
Bill Schmidt38378a02013-02-01 20:23:10 +00001345
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001346 if (HasVSX)
1347 Builder.defineMacro("__VSX__");
Bill Schmidt8c184e32014-10-10 17:21:23 +00001348 if (HasP8Vector)
Bill Schmidt59eb7672014-10-10 15:09:43 +00001349 Builder.defineMacro("__POWER8_VECTOR__");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001350 if (HasP8Crypto)
1351 Builder.defineMacro("__CRYPTO__");
Kit Barton8246f282015-03-25 19:41:41 +00001352 if (HasHTM)
1353 Builder.defineMacro("__HTM__");
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001354 if (HasFloat128)
1355 Builder.defineMacro("__FLOAT128__");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001356 if (HasP9Vector)
1357 Builder.defineMacro("__POWER9_VECTOR__");
Hal Finkela57b8902015-10-01 13:39:49 +00001358
1359 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
1360 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
1361 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
1362 if (PointerWidth == 64)
1363 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Eric Christopher2fe3b4a2013-10-16 21:19:26 +00001364
Bill Schmidt38378a02013-02-01 20:23:10 +00001365 // FIXME: The following are not yet generated here by Clang, but are
1366 // generated by GCC:
1367 //
1368 // _SOFT_FLOAT_
1369 // __RECIP_PRECISION__
1370 // __APPLE_ALTIVEC__
Bill Schmidt38378a02013-02-01 20:23:10 +00001371 // __RECIP__
1372 // __RECIPF__
1373 // __RSQRTE__
1374 // __RSQRTEF__
1375 // _SOFT_DOUBLE_
1376 // __NO_LWSYNC__
1377 // __HAVE_BSWAP__
1378 // __LONGDOUBLE128
1379 // __CMODEL_MEDIUM__
1380 // __CMODEL_LARGE__
1381 // _CALL_SYSV
1382 // _CALL_DARWIN
1383 // __NO_FPRS__
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001384}
1385
Eric Christophera8a14c32015-08-31 18:39:16 +00001386// Handle explicit options being passed to the compiler here: if we've
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001387// explicitly turned off vsx and turned on any of:
1388// - power8-vector
1389// - direct-move
1390// - float128
1391// - power9-vector
1392// then go ahead and error since the customer has expressed an incompatible
Eric Christophera8a14c32015-08-31 18:39:16 +00001393// set of options.
1394static bool ppcUserFeaturesCheck(DiagnosticsEngine &Diags,
Eric Christopher8c47b422015-10-09 18:39:55 +00001395 const std::vector<std::string> &FeaturesVec) {
Eric Christophera8a14c32015-08-31 18:39:16 +00001396
1397 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "-vsx") !=
1398 FeaturesVec.end()) {
1399 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power8-vector") !=
1400 FeaturesVec.end()) {
1401 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower8-vector"
1402 << "-mno-vsx";
1403 return false;
1404 }
1405
1406 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+direct-move") !=
1407 FeaturesVec.end()) {
1408 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mdirect-move"
1409 << "-mno-vsx";
1410 return false;
1411 }
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001412
1413 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+float128") !=
1414 FeaturesVec.end()) {
1415 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mfloat128"
1416 << "-mno-vsx";
1417 return false;
1418 }
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001419
1420 if (std::find(FeaturesVec.begin(), FeaturesVec.end(), "+power9-vector") !=
1421 FeaturesVec.end()) {
1422 Diags.Report(diag::err_opt_not_valid_with_opt) << "-mpower9-vector"
1423 << "-mno-vsx";
1424 return false;
1425 }
Eric Christophera8a14c32015-08-31 18:39:16 +00001426 }
1427
1428 return true;
1429}
1430
Eric Christopher8c47b422015-10-09 18:39:55 +00001431bool PPCTargetInfo::initFeatureMap(
1432 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
1433 const std::vector<std::string> &FeaturesVec) const {
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001434 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1435 .Case("7400", true)
1436 .Case("g4", true)
1437 .Case("7450", true)
1438 .Case("g4+", true)
1439 .Case("970", true)
1440 .Case("g5", true)
1441 .Case("pwr6", true)
1442 .Case("pwr7", true)
Will Schmidtf0487512014-06-26 13:34:10 +00001443 .Case("pwr8", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001444 .Case("pwr9", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001445 .Case("ppc64", true)
Bill Schmidt778d3872013-07-26 01:36:11 +00001446 .Case("ppc64le", true)
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001447 .Default(false);
Hal Finkelb58ce852013-02-01 18:44:19 +00001448
1449 Features["qpx"] = (CPU == "a2q");
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001450 Features["power9-vector"] = (CPU == "pwr9");
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001451 Features["crypto"] = llvm::StringSwitch<bool>(CPU)
1452 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001453 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001454 .Case("pwr8", true)
1455 .Default(false);
1456 Features["power8-vector"] = llvm::StringSwitch<bool>(CPU)
1457 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001458 .Case("pwr9", true)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001459 .Case("pwr8", true)
1460 .Default(false);
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001461 Features["bpermd"] = llvm::StringSwitch<bool>(CPU)
1462 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001463 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001464 .Case("pwr8", true)
1465 .Case("pwr7", true)
1466 .Default(false);
1467 Features["extdiv"] = llvm::StringSwitch<bool>(CPU)
1468 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001469 .Case("pwr9", true)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001470 .Case("pwr8", true)
1471 .Case("pwr7", true)
1472 .Default(false);
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001473 Features["direct-move"] = llvm::StringSwitch<bool>(CPU)
1474 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001475 .Case("pwr9", true)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001476 .Case("pwr8", true)
1477 .Default(false);
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001478 Features["vsx"] = llvm::StringSwitch<bool>(CPU)
1479 .Case("ppc64le", true)
Nemanja Ivanovicd99f21b2016-05-09 18:58:02 +00001480 .Case("pwr9", true)
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001481 .Case("pwr8", true)
1482 .Case("pwr7", true)
1483 .Default(false);
Eric Christopheref1e2952015-08-28 02:13:58 +00001484
Eric Christophera8a14c32015-08-31 18:39:16 +00001485 if (!ppcUserFeaturesCheck(Diags, FeaturesVec))
1486 return false;
Eric Christopher007b0a02015-08-28 22:32:01 +00001487
Eric Christopher007b0a02015-08-28 22:32:01 +00001488 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Bill Schmidt2fe4c672013-02-01 02:14:03 +00001489}
1490
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001491bool PPCTargetInfo::hasFeature(StringRef Feature) const {
Bill Schmidte6e9d152014-11-02 14:56:41 +00001492 return llvm::StringSwitch<bool>(Feature)
1493 .Case("powerpc", true)
1494 .Case("vsx", HasVSX)
1495 .Case("power8-vector", HasP8Vector)
Nemanja Ivanovic55e757d2015-03-04 21:48:22 +00001496 .Case("crypto", HasP8Crypto)
Nemanja Ivanovic35458c22015-04-11 10:43:36 +00001497 .Case("direct-move", HasDirectMove)
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001498 .Case("qpx", HasQPX)
Kit Barton8246f282015-03-25 19:41:41 +00001499 .Case("htm", HasHTM)
Nemanja Ivanovic239eec72015-04-09 23:58:16 +00001500 .Case("bpermd", HasBPERMD)
1501 .Case("extdiv", HasExtDiv)
Nemanja Ivanovicbb1ea2d2016-05-09 08:52:33 +00001502 .Case("float128", HasFloat128)
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001503 .Case("power9-vector", HasP9Vector)
Bill Schmidte6e9d152014-11-02 14:56:41 +00001504 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00001505}
Chris Lattner17df24e2008-04-21 18:56:49 +00001506
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001507void PPCTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
1508 StringRef Name, bool Enabled) const {
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001509 // If we're enabling direct-move or power8-vector go ahead and enable vsx
1510 // as well. Do the inverse if we're disabling vsx. We'll diagnose any user
1511 // incompatible options.
1512 if (Enabled) {
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001513 if (Name == "direct-move" ||
1514 Name == "power8-vector" ||
1515 Name == "float128" ||
1516 Name == "power9-vector") {
1517 // power9-vector is really a superset of power8-vector so encode that.
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001518 Features[Name] = Features["vsx"] = true;
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001519 if (Name == "power9-vector")
1520 Features["power8-vector"] = true;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001521 } else {
1522 Features[Name] = true;
1523 }
1524 } else {
1525 if (Name == "vsx") {
1526 Features[Name] = Features["direct-move"] = Features["power8-vector"] =
Nemanja Ivanovic10e2b5d2016-09-27 10:45:22 +00001527 Features["float128"] = Features["power9-vector"] = false;
Eric Christopherf0c2dd02015-08-25 13:45:28 +00001528 } else {
1529 Features[Name] = false;
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001530 }
1531 }
Nemanja Ivanovic26c35342015-07-10 13:11:34 +00001532}
1533
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001534const char * const PPCTargetInfo::GCCRegNames[] = {
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001535 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1536 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1537 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1538 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1539 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1540 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1541 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1542 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001543 "mq", "lr", "ctr", "ap",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001544 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001545 "xer",
Chris Lattnerf7ff53d2009-09-16 05:05:27 +00001546 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1547 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1548 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1549 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001550 "vrsave", "vscr",
1551 "spe_acc", "spefscr",
1552 "sfp"
1553};
Chris Lattner10a5b382007-01-29 05:24:35 +00001554
Craig Topperf054e3a2015-10-19 03:52:27 +00001555ArrayRef<const char*> PPCTargetInfo::getGCCRegNames() const {
1556 return llvm::makeArrayRef(GCCRegNames);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001557}
Chris Lattner5ba61f02006-10-14 07:39:34 +00001558
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001559const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1560 // While some of these aliases do map to different registers
1561 // they still share the same register name.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001562 { { "0" }, "r0" },
1563 { { "1"}, "r1" },
1564 { { "2" }, "r2" },
1565 { { "3" }, "r3" },
1566 { { "4" }, "r4" },
1567 { { "5" }, "r5" },
1568 { { "6" }, "r6" },
1569 { { "7" }, "r7" },
1570 { { "8" }, "r8" },
1571 { { "9" }, "r9" },
1572 { { "10" }, "r10" },
1573 { { "11" }, "r11" },
1574 { { "12" }, "r12" },
1575 { { "13" }, "r13" },
1576 { { "14" }, "r14" },
1577 { { "15" }, "r15" },
1578 { { "16" }, "r16" },
1579 { { "17" }, "r17" },
1580 { { "18" }, "r18" },
1581 { { "19" }, "r19" },
1582 { { "20" }, "r20" },
1583 { { "21" }, "r21" },
1584 { { "22" }, "r22" },
1585 { { "23" }, "r23" },
1586 { { "24" }, "r24" },
1587 { { "25" }, "r25" },
1588 { { "26" }, "r26" },
1589 { { "27" }, "r27" },
1590 { { "28" }, "r28" },
1591 { { "29" }, "r29" },
1592 { { "30" }, "r30" },
1593 { { "31" }, "r31" },
1594 { { "fr0" }, "f0" },
1595 { { "fr1" }, "f1" },
1596 { { "fr2" }, "f2" },
1597 { { "fr3" }, "f3" },
1598 { { "fr4" }, "f4" },
1599 { { "fr5" }, "f5" },
1600 { { "fr6" }, "f6" },
1601 { { "fr7" }, "f7" },
1602 { { "fr8" }, "f8" },
1603 { { "fr9" }, "f9" },
Mike Stumpfaacf012009-09-17 21:15:00 +00001604 { { "fr10" }, "f10" },
Daniel Dunbar1da76c42009-09-17 07:03:19 +00001605 { { "fr11" }, "f11" },
1606 { { "fr12" }, "f12" },
1607 { { "fr13" }, "f13" },
1608 { { "fr14" }, "f14" },
1609 { { "fr15" }, "f15" },
1610 { { "fr16" }, "f16" },
1611 { { "fr17" }, "f17" },
1612 { { "fr18" }, "f18" },
1613 { { "fr19" }, "f19" },
1614 { { "fr20" }, "f20" },
1615 { { "fr21" }, "f21" },
1616 { { "fr22" }, "f22" },
1617 { { "fr23" }, "f23" },
1618 { { "fr24" }, "f24" },
1619 { { "fr25" }, "f25" },
1620 { { "fr26" }, "f26" },
1621 { { "fr27" }, "f27" },
1622 { { "fr28" }, "f28" },
1623 { { "fr29" }, "f29" },
1624 { { "fr30" }, "f30" },
1625 { { "fr31" }, "f31" },
1626 { { "cc" }, "cr0" },
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001627};
1628
Craig Topperf054e3a2015-10-19 03:52:27 +00001629ArrayRef<TargetInfo::GCCRegAlias> PPCTargetInfo::getGCCRegAliases() const {
1630 return llvm::makeArrayRef(GCCRegAliases);
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001631}
Chris Lattner02dffbd2006-10-14 07:50:21 +00001632
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001633class PPC32TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001634public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001635 PPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1636 : PPCTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001637 resetDataLayout("E-m:e-p:32:32-i64:64-n32");
Chris Lattnerdb5c16b2010-02-16 18:14:57 +00001638
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001639 switch (getTriple().getOS()) {
Nico Weber3435ede2012-01-31 02:07:33 +00001640 case llvm::Triple::Linux:
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001641 case llvm::Triple::FreeBSD:
1642 case llvm::Triple::NetBSD:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001643 SizeType = UnsignedInt;
Hal Finkel26908382012-03-02 20:54:36 +00001644 PtrDiffType = SignedInt;
1645 IntPtrType = SignedInt;
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001646 break;
Joerg Sonnenbergerf031fd92011-07-04 23:11:58 +00001647 default:
Joerg Sonnenbergera6d11772011-07-05 14:54:41 +00001648 break;
Joerg Sonnenbergere72d9b12011-07-04 21:57:55 +00001649 }
Roman Divacky816dcd12012-03-13 16:53:54 +00001650
Roman Divacky3ffe7462012-03-13 19:20:17 +00001651 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1652 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001653 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Roman Divacky3ffe7462012-03-13 19:20:17 +00001654 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001655
1656 // PPC32 supports atomics up to 4 bytes.
1657 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
Roman Divacky965b0b72011-01-06 08:27:10 +00001658 }
1659
Craig Topper3164f332014-03-11 03:39:26 +00001660 BuiltinVaListKind getBuiltinVaListKind() const override {
Roman Divacky965b0b72011-01-06 08:27:10 +00001661 // This is the ELF definition, and is overridden by the Darwin sub-target
Meador Inge5d3fb222012-06-16 03:34:49 +00001662 return TargetInfo::PowerABIBuiltinVaList;
Eli Friedman873f65a2008-08-21 00:13:15 +00001663 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00001664};
Chris Lattner5ba61f02006-10-14 07:39:34 +00001665
Bill Schmidt778d3872013-07-26 01:36:11 +00001666// Note: ABI differences may eventually require us to have a separate
1667// TargetInfo for little endian.
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001668class PPC64TargetInfo : public PPCTargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00001669public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001670 PPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1671 : PPCTargetInfo(Triple, Opts) {
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001672 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001673 IntMaxType = SignedLong;
Eli Friedman2857ccb2009-07-01 03:36:11 +00001674 Int64Type = SignedLong;
Roman Divacky816dcd12012-03-13 16:53:54 +00001675
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001676 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
James Y Knightb214cbc2016-03-04 19:00:41 +00001677 resetDataLayout("e-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001678 ABI = "elfv2";
1679 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00001680 resetDataLayout("E-m:e-i64:64-n32:64");
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001681 ABI = "elfv1";
1682 }
1683
1684 switch (getTriple().getOS()) {
1685 case llvm::Triple::FreeBSD:
Roman Divacky3ffe7462012-03-13 19:20:17 +00001686 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00001687 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001688 break;
Joerg Sonnenbergeraac82c42014-10-15 19:52:03 +00001689 case llvm::Triple::NetBSD:
1690 IntMaxType = SignedLongLong;
1691 Int64Type = SignedLongLong;
1692 break;
Joerg Sonnenberger3f1a9352014-10-15 19:47:15 +00001693 default:
1694 break;
Ulrich Weigand8afad612014-07-28 13:17:52 +00001695 }
Benjamin Kramer37196de2012-11-17 17:30:55 +00001696
1697 // PPC64 supports atomics up to 8 bytes.
1698 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Chris Lattnerba7a6c12008-05-09 06:17:04 +00001699 }
Craig Topper3164f332014-03-11 03:39:26 +00001700 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001701 return TargetInfo::CharPtrBuiltinVaList;
Roman Divacky965b0b72011-01-06 08:27:10 +00001702 }
Eric Christophere6b7cf42015-07-10 18:25:52 +00001703 // PPC64 Linux-specific ABI options.
Ulrich Weigand8afad612014-07-28 13:17:52 +00001704 bool setABI(const std::string &Name) override {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001705 if (Name == "elfv1" || Name == "elfv1-qpx" || Name == "elfv2") {
Ulrich Weigand8afad612014-07-28 13:17:52 +00001706 ABI = Name;
1707 return true;
1708 }
1709 return false;
1710 }
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001711};
Eli Friedmanb9e5bed2008-08-20 23:11:40 +00001712
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001713class DarwinPPC32TargetInfo : public DarwinTargetInfo<PPC32TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001714public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001715 DarwinPPC32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1716 : DarwinTargetInfo<PPC32TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001717 HasAlignMac68kSupport = true;
Roman Divacky965b0b72011-01-06 08:27:10 +00001718 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
Eric Christopher917e9522014-11-18 22:36:15 +00001719 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
Anton Yartsev68d773c2012-01-17 22:40:00 +00001720 LongLongAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001721 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001722 resetDataLayout("E-m:o-p:32:32-f64:32:64-n32");
Roman Divacky965b0b72011-01-06 08:27:10 +00001723 }
Craig Topper3164f332014-03-11 03:39:26 +00001724 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00001725 return TargetInfo::CharPtrBuiltinVaList;
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001726 }
1727};
1728
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001729class DarwinPPC64TargetInfo : public DarwinTargetInfo<PPC64TargetInfo> {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001730public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001731 DarwinPPC64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
1732 : DarwinTargetInfo<PPC64TargetInfo>(Triple, Opts) {
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001733 HasAlignMac68kSupport = true;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00001734 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00001735 resetDataLayout("E-m:o-i64:64-n32:64");
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001736 }
1737};
Daniel Dunbar0e15c9a2010-05-30 00:07:30 +00001738
Eric Christopherc48497a2015-09-18 21:26:24 +00001739static const unsigned NVPTXAddrSpaceMap[] = {
1740 1, // opencl_global
1741 3, // opencl_local
1742 4, // opencl_constant
Anastasia Stulova2c8dcfb2014-11-26 14:10:06 +00001743 // FIXME: generic has to be added to the target
Eric Christopherc48497a2015-09-18 21:26:24 +00001744 0, // opencl_generic
1745 1, // cuda_device
1746 4, // cuda_constant
1747 3, // cuda_shared
1748};
1749
1750class NVPTXTargetInfo : public TargetInfo {
1751 static const char *const GCCRegNames[];
1752 static const Builtin::Info BuiltinInfo[];
Justin Lebar62907612016-07-06 21:21:39 +00001753 CudaArch GPU;
Justin Lebarb6626592017-01-05 16:53:21 +00001754 std::unique_ptr<TargetInfo> HostTarget;
Reid Klecknerbbc01782014-12-03 21:53:36 +00001755
Eric Christopherc48497a2015-09-18 21:26:24 +00001756public:
Justin Lebarb6626592017-01-05 16:53:21 +00001757 NVPTXTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts,
1758 unsigned TargetPointerWidth)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00001759 : TargetInfo(Triple) {
Justin Lebarb6626592017-01-05 16:53:21 +00001760 assert((TargetPointerWidth == 32 || TargetPointerWidth == 64) &&
1761 "NVPTX only supports 32- and 64-bit modes.");
1762
Eric Christopherc48497a2015-09-18 21:26:24 +00001763 TLSSupported = false;
Eric Christopherc48497a2015-09-18 21:26:24 +00001764 AddrSpaceMap = &NVPTXAddrSpaceMap;
1765 UseAddrSpaceMapMangling = true;
Justin Lebarb6626592017-01-05 16:53:21 +00001766
Eric Christopherc48497a2015-09-18 21:26:24 +00001767 // Define available target features
1768 // These must be defined in sorted order!
1769 NoAsmVariants = true;
Justin Lebar62907612016-07-06 21:21:39 +00001770 GPU = CudaArch::SM_20;
Justin Lebar76945b22016-04-29 23:05:19 +00001771
Justin Lebarb6626592017-01-05 16:53:21 +00001772 if (TargetPointerWidth == 32)
1773 resetDataLayout("e-p:32:32-i64:64-v16:16-v32:32-n16:32:64");
1774 else
1775 resetDataLayout("e-i64:64-v16:16-v32:32-n16:32:64");
1776
Justin Lebar76945b22016-04-29 23:05:19 +00001777 // If possible, get a TargetInfo for our host triple, so we can match its
1778 // types.
1779 llvm::Triple HostTriple(Opts.HostTriple);
Justin Lebarb6626592017-01-05 16:53:21 +00001780 if (!HostTriple.isNVPTX())
1781 HostTarget.reset(AllocateTarget(llvm::Triple(Opts.HostTriple), Opts));
1782
1783 // If no host target, make some guesses about the data layout and return.
Justin Lebar76945b22016-04-29 23:05:19 +00001784 if (!HostTarget) {
Justin Lebarb6626592017-01-05 16:53:21 +00001785 LongWidth = LongAlign = TargetPointerWidth;
1786 PointerWidth = PointerAlign = TargetPointerWidth;
1787 switch (TargetPointerWidth) {
1788 case 32:
1789 SizeType = TargetInfo::UnsignedInt;
1790 PtrDiffType = TargetInfo::SignedInt;
1791 IntPtrType = TargetInfo::SignedInt;
1792 break;
1793 case 64:
1794 SizeType = TargetInfo::UnsignedLong;
1795 PtrDiffType = TargetInfo::SignedLong;
1796 IntPtrType = TargetInfo::SignedLong;
1797 break;
1798 default:
1799 llvm_unreachable("TargetPointerWidth must be 32 or 64");
1800 }
Justin Lebar76945b22016-04-29 23:05:19 +00001801 return;
1802 }
1803
Justin Lebarb6626592017-01-05 16:53:21 +00001804 // Copy properties from host target.
Justin Lebar76945b22016-04-29 23:05:19 +00001805 PointerWidth = HostTarget->getPointerWidth(/* AddrSpace = */ 0);
1806 PointerAlign = HostTarget->getPointerAlign(/* AddrSpace = */ 0);
1807 BoolWidth = HostTarget->getBoolWidth();
1808 BoolAlign = HostTarget->getBoolAlign();
1809 IntWidth = HostTarget->getIntWidth();
1810 IntAlign = HostTarget->getIntAlign();
1811 HalfWidth = HostTarget->getHalfWidth();
1812 HalfAlign = HostTarget->getHalfAlign();
1813 FloatWidth = HostTarget->getFloatWidth();
1814 FloatAlign = HostTarget->getFloatAlign();
1815 DoubleWidth = HostTarget->getDoubleWidth();
1816 DoubleAlign = HostTarget->getDoubleAlign();
1817 LongWidth = HostTarget->getLongWidth();
1818 LongAlign = HostTarget->getLongAlign();
1819 LongLongWidth = HostTarget->getLongLongWidth();
1820 LongLongAlign = HostTarget->getLongLongAlign();
1821 MinGlobalAlign = HostTarget->getMinGlobalAlign();
Richard Smith59139022016-09-30 22:41:36 +00001822 NewAlign = HostTarget->getNewAlign();
Justin Lebar76945b22016-04-29 23:05:19 +00001823 DefaultAlignForAttributeAligned =
1824 HostTarget->getDefaultAlignForAttributeAligned();
1825 SizeType = HostTarget->getSizeType();
1826 IntMaxType = HostTarget->getIntMaxType();
1827 PtrDiffType = HostTarget->getPtrDiffType(/* AddrSpace = */ 0);
1828 IntPtrType = HostTarget->getIntPtrType();
1829 WCharType = HostTarget->getWCharType();
1830 WIntType = HostTarget->getWIntType();
1831 Char16Type = HostTarget->getChar16Type();
1832 Char32Type = HostTarget->getChar32Type();
1833 Int64Type = HostTarget->getInt64Type();
1834 SigAtomicType = HostTarget->getSigAtomicType();
1835 ProcessIDType = HostTarget->getProcessIDType();
1836
1837 UseBitFieldTypeAlignment = HostTarget->useBitFieldTypeAlignment();
1838 UseZeroLengthBitfieldAlignment =
1839 HostTarget->useZeroLengthBitfieldAlignment();
1840 UseExplicitBitFieldAlignment = HostTarget->useExplicitBitFieldAlignment();
1841 ZeroLengthBitfieldBoundary = HostTarget->getZeroLengthBitfieldBoundary();
1842
Justin Lebar5057f172016-09-09 20:35:43 +00001843 // This is a bit of a lie, but it controls __GCC_ATOMIC_XXX_LOCK_FREE, and
1844 // we need those macros to be identical on host and device, because (among
1845 // other things) they affect which standard library classes are defined, and
1846 // we need all classes to be defined on both the host and device.
1847 MaxAtomicInlineWidth = HostTarget->getMaxAtomicInlineWidth();
1848
Justin Lebar76945b22016-04-29 23:05:19 +00001849 // Properties intentionally not copied from host:
1850 // - LargeArrayMinWidth, LargeArrayAlign: Not visible across the
1851 // host/device boundary.
1852 // - SuitableAlign: Not visible across the host/device boundary, and may
1853 // correctly be different on host/device, e.g. if host has wider vector
1854 // types than device.
1855 // - LongDoubleWidth, LongDoubleAlign: nvptx's long double type is the same
1856 // as its double type, but that's not necessarily true on the host.
1857 // TODO: nvcc emits a warning when using long double on device; we should
1858 // do the same.
Eric Christopherc48497a2015-09-18 21:26:24 +00001859 }
1860 void getTargetDefines(const LangOptions &Opts,
1861 MacroBuilder &Builder) const override {
1862 Builder.defineMacro("__PTX__");
1863 Builder.defineMacro("__NVPTX__");
1864 if (Opts.CUDAIsDevice) {
1865 // Set __CUDA_ARCH__ for the GPU specified.
Justin Lebaref1aaac2016-07-06 21:21:14 +00001866 std::string CUDAArchCode = [this] {
1867 switch (GPU) {
Simon Pilgrim13dff572016-07-07 22:32:26 +00001868 case CudaArch::UNKNOWN:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001869 assert(false && "No GPU arch when compiling CUDA device code.");
1870 return "";
Justin Lebar62907612016-07-06 21:21:39 +00001871 case CudaArch::SM_20:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001872 return "200";
Justin Lebar62907612016-07-06 21:21:39 +00001873 case CudaArch::SM_21:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001874 return "210";
Justin Lebar62907612016-07-06 21:21:39 +00001875 case CudaArch::SM_30:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001876 return "300";
Justin Lebar62907612016-07-06 21:21:39 +00001877 case CudaArch::SM_32:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001878 return "320";
Justin Lebar62907612016-07-06 21:21:39 +00001879 case CudaArch::SM_35:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001880 return "350";
Justin Lebar62907612016-07-06 21:21:39 +00001881 case CudaArch::SM_37:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001882 return "370";
Justin Lebar62907612016-07-06 21:21:39 +00001883 case CudaArch::SM_50:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001884 return "500";
Justin Lebar62907612016-07-06 21:21:39 +00001885 case CudaArch::SM_52:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001886 return "520";
Justin Lebar62907612016-07-06 21:21:39 +00001887 case CudaArch::SM_53:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001888 return "530";
Justin Lebar62907612016-07-06 21:21:39 +00001889 case CudaArch::SM_60:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001890 return "600";
Justin Lebar62907612016-07-06 21:21:39 +00001891 case CudaArch::SM_61:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001892 return "610";
Justin Lebar62907612016-07-06 21:21:39 +00001893 case CudaArch::SM_62:
Justin Lebaref1aaac2016-07-06 21:21:14 +00001894 return "620";
1895 }
Simon Pilgrim13dff572016-07-07 22:32:26 +00001896 llvm_unreachable("unhandled CudaArch");
Justin Lebaref1aaac2016-07-06 21:21:14 +00001897 }();
Eric Christopherc48497a2015-09-18 21:26:24 +00001898 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001899 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001900 }
Craig Topper6c03a542015-10-19 04:51:35 +00001901 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
1902 return llvm::makeArrayRef(BuiltinInfo,
1903 clang::NVPTX::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eric Christopherc48497a2015-09-18 21:26:24 +00001904 }
Artem Belevichfda99052016-09-28 17:47:35 +00001905 bool
1906 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
1907 StringRef CPU,
1908 const std::vector<std::string> &FeaturesVec) const override {
1909 Features["satom"] = GPU >= CudaArch::SM_60;
1910 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
1911 }
1912
Eric Christopherc48497a2015-09-18 21:26:24 +00001913 bool hasFeature(StringRef Feature) const override {
Artem Belevichfda99052016-09-28 17:47:35 +00001914 return llvm::StringSwitch<bool>(Feature)
1915 .Cases("ptx", "nvptx", true)
1916 .Case("satom", GPU >= CudaArch::SM_60) // Atomics w/ scope.
1917 .Default(false);
Peter Collingbournec947aae2012-05-20 23:28:41 +00001918 }
1919
Craig Topperf054e3a2015-10-19 03:52:27 +00001920 ArrayRef<const char *> getGCCRegNames() const override;
1921 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00001922 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00001923 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00001924 }
1925 bool validateAsmConstraint(const char *&Name,
1926 TargetInfo::ConstraintInfo &Info) const override {
1927 switch (*Name) {
1928 default:
1929 return false;
1930 case 'c':
1931 case 'h':
1932 case 'r':
1933 case 'l':
1934 case 'f':
1935 case 'd':
1936 Info.setAllowsRegister();
1937 return true;
Eli Bendersky13467172015-04-01 20:29:18 +00001938 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001939 }
1940 const char *getClobbers() const override {
1941 // FIXME: Is this really right?
1942 return "";
1943 }
1944 BuiltinVaListKind getBuiltinVaListKind() const override {
1945 // FIXME: implement
1946 return TargetInfo::CharPtrBuiltinVaList;
1947 }
1948 bool setCPU(const std::string &Name) override {
Justin Lebar62907612016-07-06 21:21:39 +00001949 GPU = StringToCudaArch(Name);
1950 return GPU != CudaArch::UNKNOWN;
Eric Christopherc48497a2015-09-18 21:26:24 +00001951 }
Jan Vesely9674bd42016-06-17 19:02:14 +00001952 void setSupportedOpenCLOpts() override {
1953 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00001954 Opts.support("cl_clang_storage_class_specifiers");
1955 Opts.support("cl_khr_gl_sharing");
1956 Opts.support("cl_khr_icd");
Jan Vesely9674bd42016-06-17 19:02:14 +00001957
Yaxun Liu5b746652016-12-18 05:18:55 +00001958 Opts.support("cl_khr_fp64");
1959 Opts.support("cl_khr_byte_addressable_store");
1960 Opts.support("cl_khr_global_int32_base_atomics");
1961 Opts.support("cl_khr_global_int32_extended_atomics");
1962 Opts.support("cl_khr_local_int32_base_atomics");
1963 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely9674bd42016-06-17 19:02:14 +00001964 }
Justin Lebar86c4e632017-01-05 16:53:38 +00001965
1966 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
1967 // CUDA compilations support all of the host's calling conventions.
1968 //
1969 // TODO: We should warn if you apply a non-default CC to anything other than
1970 // a host function.
1971 if (HostTarget)
1972 return HostTarget->checkCallingConvention(CC);
1973 return CCCR_Warning;
1974 }
Eric Christopherc48497a2015-09-18 21:26:24 +00001975};
1976
1977const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1978#define BUILTIN(ID, TYPE, ATTRS) \
1979 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
1980#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
1981 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Artem Belevichfda99052016-09-28 17:47:35 +00001982#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
1983 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Eric Christopherc48497a2015-09-18 21:26:24 +00001984#include "clang/Basic/BuiltinsNVPTX.def"
1985};
1986
1987const char *const NVPTXTargetInfo::GCCRegNames[] = {"r0"};
1988
Craig Topperf054e3a2015-10-19 03:52:27 +00001989ArrayRef<const char *> NVPTXTargetInfo::getGCCRegNames() const {
1990 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00001991}
1992
Matt Arsenault3ea39f92015-06-19 17:54:10 +00001993static const unsigned AMDGPUAddrSpaceMap[] = {
Eli Friedmand13b41e2012-10-12 23:32:00 +00001994 1, // opencl_global
1995 3, // opencl_local
1996 2, // opencl_constant
Matt Arsenaultbfe25b22014-12-01 16:46:03 +00001997 4, // opencl_generic
Eli Friedmand13b41e2012-10-12 23:32:00 +00001998 1, // cuda_device
1999 2, // cuda_constant
2000 3 // cuda_shared
2001};
2002
Tom Stellarda96344b2014-08-21 13:58:40 +00002003// If you edit the description strings, make sure you update
2004// getPointerWidthV().
2005
Craig Topper273dbc62015-10-18 05:29:26 +00002006static const char *const DataLayoutStringR600 =
Rafael Espindola29db13a2014-01-03 18:13:17 +00002007 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2008 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002009
Craig Topper273dbc62015-10-18 05:29:26 +00002010static const char *const DataLayoutStringSI =
Matt Arsenault6dc455f2016-05-31 16:58:18 +00002011 "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 +00002012 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
2013 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
Tom Stellardc74b1e02013-03-04 17:40:53 +00002014
Matt Arsenault250024f2016-06-08 01:56:42 +00002015class AMDGPUTargetInfo final : public TargetInfo {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002016 static const Builtin::Info BuiltinInfo[];
Tom Stellard7b1059b2015-04-14 14:36:56 +00002017 static const char * const GCCRegNames[];
Matt Arsenault56f008d2014-06-24 20:45:01 +00002018
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002019 /// \brief The GPU profiles supported by the AMDGPU target.
Tom Stellardc74b1e02013-03-04 17:40:53 +00002020 enum GPUKind {
2021 GK_NONE,
2022 GK_R600,
2023 GK_R600_DOUBLE_OPS,
2024 GK_R700,
2025 GK_R700_DOUBLE_OPS,
2026 GK_EVERGREEN,
2027 GK_EVERGREEN_DOUBLE_OPS,
2028 GK_NORTHERN_ISLANDS,
2029 GK_CAYMAN,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002030 GK_GFX6,
2031 GK_GFX7,
2032 GK_GFX8
Tom Stellardc74b1e02013-03-04 17:40:53 +00002033 } GPU;
2034
Jan Veselyeebeaea2015-05-04 19:53:36 +00002035 bool hasFP64:1;
2036 bool hasFMAF:1;
2037 bool hasLDEXPF:1;
Yaxun Liud3e85b92016-09-13 17:37:09 +00002038 bool hasFullSpeedFP32Denorms:1;
Jan Veselya3abd6d2015-05-01 17:38:13 +00002039
Matt Arsenault250024f2016-06-08 01:56:42 +00002040 static bool isAMDGCN(const llvm::Triple &TT) {
2041 return TT.getArch() == llvm::Triple::amdgcn;
2042 }
2043
Eli Friedmand13b41e2012-10-12 23:32:00 +00002044public:
Yaxun Liu2c17e822016-08-09 19:43:38 +00002045 AMDGPUTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenault250024f2016-06-08 01:56:42 +00002046 : TargetInfo(Triple) ,
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002047 GPU(isAMDGCN(Triple) ? GK_GFX6 : GK_R600),
Matt Arsenault250024f2016-06-08 01:56:42 +00002048 hasFP64(false),
2049 hasFMAF(false),
Yaxun Liu2c17e822016-08-09 19:43:38 +00002050 hasLDEXPF(false),
Yaxun Liud3e85b92016-09-13 17:37:09 +00002051 hasFullSpeedFP32Denorms(false){
Matt Arsenault250024f2016-06-08 01:56:42 +00002052 if (getTriple().getArch() == llvm::Triple::amdgcn) {
Jan Veselya3abd6d2015-05-01 17:38:13 +00002053 hasFP64 = true;
Jan Veselyeebeaea2015-05-04 19:53:36 +00002054 hasFMAF = true;
2055 hasLDEXPF = true;
Tom Stellardd99fb952015-01-28 15:38:44 +00002056 }
Matt Arsenault250024f2016-06-08 01:56:42 +00002057
2058 resetDataLayout(getTriple().getArch() == llvm::Triple::amdgcn ?
2059 DataLayoutStringSI : DataLayoutStringR600);
2060
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002061 AddrSpaceMap = &AMDGPUAddrSpaceMap;
David Tweed31d09b02013-09-13 12:04:22 +00002062 UseAddrSpaceMapMangling = true;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002063 }
2064
Tom Stellarda96344b2014-08-21 13:58:40 +00002065 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
2066 if (GPU <= GK_CAYMAN)
2067 return 32;
2068
2069 switch(AddrSpace) {
2070 default:
2071 return 64;
2072 case 0:
2073 case 3:
2074 case 5:
2075 return 32;
2076 }
2077 }
2078
Yaxun Liu26f75662016-08-19 05:17:25 +00002079 uint64_t getMaxPointerWidth() const override {
2080 return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
2081 }
2082
Craig Topper3164f332014-03-11 03:39:26 +00002083 const char * getClobbers() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002084 return "";
2085 }
2086
Craig Topperf054e3a2015-10-19 03:52:27 +00002087 ArrayRef<const char *> getGCCRegNames() const override;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002088
Craig Topperf054e3a2015-10-19 03:52:27 +00002089 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2090 return None;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002091 }
2092
Craig Topper3164f332014-03-11 03:39:26 +00002093 bool validateAsmConstraint(const char *&Name,
Tom Stellardd097e942015-11-19 22:11:58 +00002094 TargetInfo::ConstraintInfo &Info) const override {
2095 switch (*Name) {
2096 default: break;
2097 case 'v': // vgpr
2098 case 's': // sgpr
2099 Info.setAllowsRegister();
2100 return true;
2101 }
2102 return false;
Eli Friedmand13b41e2012-10-12 23:32:00 +00002103 }
2104
Matt Arsenault250024f2016-06-08 01:56:42 +00002105 bool initFeatureMap(llvm::StringMap<bool> &Features,
2106 DiagnosticsEngine &Diags, StringRef CPU,
2107 const std::vector<std::string> &FeatureVec) const override;
2108
Yaxun Liu2c17e822016-08-09 19:43:38 +00002109 void adjustTargetOptions(const CodeGenOptions &CGOpts,
2110 TargetOptions &TargetOpts) const override {
Yaxun Liu2c17e822016-08-09 19:43:38 +00002111 bool hasFP32Denormals = false;
2112 bool hasFP64Denormals = false;
2113 for (auto &I : TargetOpts.FeaturesAsWritten) {
2114 if (I == "+fp32-denormals" || I == "-fp32-denormals")
2115 hasFP32Denormals = true;
Matt Arsenault09cca092017-01-23 22:31:14 +00002116 if (I == "+fp64-fp16-denormals" || I == "-fp64-fp16-denormals")
Yaxun Liu2c17e822016-08-09 19:43:38 +00002117 hasFP64Denormals = true;
2118 }
2119 if (!hasFP32Denormals)
Yaxun Liud3e85b92016-09-13 17:37:09 +00002120 TargetOpts.Features.push_back((Twine(hasFullSpeedFP32Denorms &&
2121 !CGOpts.FlushDenorm ? '+' : '-') + Twine("fp32-denormals")).str());
Matt Arsenault09cca092017-01-23 22:31:14 +00002122 // Always do not flush fp64 or fp16 denorms.
Yaxun Liu2c17e822016-08-09 19:43:38 +00002123 if (!hasFP64Denormals && hasFP64)
Matt Arsenault09cca092017-01-23 22:31:14 +00002124 TargetOpts.Features.push_back("+fp64-fp16-denormals");
Yaxun Liu2c17e822016-08-09 19:43:38 +00002125 }
2126
Craig Topper6c03a542015-10-19 04:51:35 +00002127 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
2128 return llvm::makeArrayRef(BuiltinInfo,
2129 clang::AMDGPU::LastTSBuiltin - Builtin::FirstTSBuiltin);
Eli Friedmand13b41e2012-10-12 23:32:00 +00002130 }
2131
Craig Topper3164f332014-03-11 03:39:26 +00002132 void getTargetDefines(const LangOptions &Opts,
2133 MacroBuilder &Builder) const override {
Matt Arsenault5e020b22016-02-27 09:06:26 +00002134 if (getTriple().getArch() == llvm::Triple::amdgcn)
2135 Builder.defineMacro("__AMDGCN__");
2136 else
2137 Builder.defineMacro("__R600__");
2138
Jan Veselyeebeaea2015-05-04 19:53:36 +00002139 if (hasFMAF)
2140 Builder.defineMacro("__HAS_FMAF__");
2141 if (hasLDEXPF)
2142 Builder.defineMacro("__HAS_LDEXPF__");
Jan Vesely211ba782016-06-17 02:25:03 +00002143 if (hasFP64)
2144 Builder.defineMacro("__HAS_FP64__");
Eli Friedmand13b41e2012-10-12 23:32:00 +00002145 }
2146
Craig Topper3164f332014-03-11 03:39:26 +00002147 BuiltinVaListKind getBuiltinVaListKind() const override {
Eli Friedmand13b41e2012-10-12 23:32:00 +00002148 return TargetInfo::CharPtrBuiltinVaList;
2149 }
2150
Matt Arsenault250024f2016-06-08 01:56:42 +00002151 static GPUKind parseR600Name(StringRef Name) {
2152 return llvm::StringSwitch<GPUKind>(Name)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002153 .Case("r600" , GK_R600)
2154 .Case("rv610", GK_R600)
2155 .Case("rv620", GK_R600)
2156 .Case("rv630", GK_R600)
2157 .Case("rv635", GK_R600)
2158 .Case("rs780", GK_R600)
2159 .Case("rs880", GK_R600)
2160 .Case("rv670", GK_R600_DOUBLE_OPS)
2161 .Case("rv710", GK_R700)
2162 .Case("rv730", GK_R700)
2163 .Case("rv740", GK_R700_DOUBLE_OPS)
2164 .Case("rv770", GK_R700_DOUBLE_OPS)
2165 .Case("palm", GK_EVERGREEN)
2166 .Case("cedar", GK_EVERGREEN)
2167 .Case("sumo", GK_EVERGREEN)
2168 .Case("sumo2", GK_EVERGREEN)
2169 .Case("redwood", GK_EVERGREEN)
2170 .Case("juniper", GK_EVERGREEN)
2171 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
2172 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
2173 .Case("barts", GK_NORTHERN_ISLANDS)
2174 .Case("turks", GK_NORTHERN_ISLANDS)
2175 .Case("caicos", GK_NORTHERN_ISLANDS)
2176 .Case("cayman", GK_CAYMAN)
2177 .Case("aruba", GK_CAYMAN)
Matt Arsenault250024f2016-06-08 01:56:42 +00002178 .Default(GK_NONE);
2179 }
2180
2181 static GPUKind parseAMDGCNName(StringRef Name) {
2182 return llvm::StringSwitch<GPUKind>(Name)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002183 .Case("tahiti", GK_GFX6)
2184 .Case("pitcairn", GK_GFX6)
2185 .Case("verde", GK_GFX6)
2186 .Case("oland", GK_GFX6)
2187 .Case("hainan", GK_GFX6)
2188 .Case("bonaire", GK_GFX7)
2189 .Case("kabini", GK_GFX7)
2190 .Case("kaveri", GK_GFX7)
2191 .Case("hawaii", GK_GFX7)
2192 .Case("mullins", GK_GFX7)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002193 .Case("gfx700", GK_GFX7)
2194 .Case("gfx701", GK_GFX7)
2195 .Case("gfx702", GK_GFX7)
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002196 .Case("tonga", GK_GFX8)
2197 .Case("iceland", GK_GFX8)
2198 .Case("carrizo", GK_GFX8)
2199 .Case("fiji", GK_GFX8)
2200 .Case("stoney", GK_GFX8)
2201 .Case("polaris10", GK_GFX8)
2202 .Case("polaris11", GK_GFX8)
Yaxun Liue59a0bc2016-10-26 16:40:21 +00002203 .Case("gfx800", GK_GFX8)
2204 .Case("gfx801", GK_GFX8)
2205 .Case("gfx802", GK_GFX8)
2206 .Case("gfx803", GK_GFX8)
2207 .Case("gfx804", GK_GFX8)
2208 .Case("gfx810", GK_GFX8)
Tom Stellardc74b1e02013-03-04 17:40:53 +00002209 .Default(GK_NONE);
Matt Arsenault250024f2016-06-08 01:56:42 +00002210 }
Tom Stellardc74b1e02013-03-04 17:40:53 +00002211
Matt Arsenault250024f2016-06-08 01:56:42 +00002212 bool setCPU(const std::string &Name) override {
2213 if (getTriple().getArch() == llvm::Triple::amdgcn)
2214 GPU = parseAMDGCNName(Name);
2215 else
2216 GPU = parseR600Name(Name);
Tom Stellardc74b1e02013-03-04 17:40:53 +00002217
Matt Arsenault250024f2016-06-08 01:56:42 +00002218 return GPU != GK_NONE;
Tom Stellardc74b1e02013-03-04 17:40:53 +00002219 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002220
Jan Vesely211ba782016-06-17 02:25:03 +00002221 void setSupportedOpenCLOpts() override {
2222 auto &Opts = getSupportedOpenCLOpts();
Yaxun Liu5b746652016-12-18 05:18:55 +00002223 Opts.support("cl_clang_storage_class_specifiers");
2224 Opts.support("cl_khr_icd");
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002225
Jan Vesely211ba782016-06-17 02:25:03 +00002226 if (hasFP64)
Yaxun Liu5b746652016-12-18 05:18:55 +00002227 Opts.support("cl_khr_fp64");
Jan Vesely211ba782016-06-17 02:25:03 +00002228 if (GPU >= GK_EVERGREEN) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002229 Opts.support("cl_khr_byte_addressable_store");
2230 Opts.support("cl_khr_global_int32_base_atomics");
2231 Opts.support("cl_khr_global_int32_extended_atomics");
2232 Opts.support("cl_khr_local_int32_base_atomics");
2233 Opts.support("cl_khr_local_int32_extended_atomics");
Jan Vesely211ba782016-06-17 02:25:03 +00002234 }
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002235 if (GPU >= GK_GFX6) {
Yaxun Liu5b746652016-12-18 05:18:55 +00002236 Opts.support("cl_khr_fp16");
2237 Opts.support("cl_khr_int64_base_atomics");
2238 Opts.support("cl_khr_int64_extended_atomics");
2239 Opts.support("cl_khr_mipmap_image");
2240 Opts.support("cl_khr_subgroups");
2241 Opts.support("cl_khr_3d_image_writes");
2242 Opts.support("cl_amd_media_ops");
2243 Opts.support("cl_amd_media_ops2");
Jan Vesely211ba782016-06-17 02:25:03 +00002244 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002245 }
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002246
Yaxun Liu99444cb2016-08-03 20:38:06 +00002247 LangAS::ID getOpenCLImageAddrSpace() const override {
2248 return LangAS::opencl_constant;
2249 }
2250
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00002251 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2252 switch (CC) {
2253 default:
2254 return CCCR_Warning;
2255 case CC_C:
2256 case CC_OpenCLKernel:
2257 return CCCR_OK;
2258 }
2259 }
Yaxun Liu402804b2016-12-15 08:09:08 +00002260
2261 // In amdgcn target the null pointer in global, constant, and generic
2262 // address space has value 0 but in private and local address space has
2263 // value ~0.
2264 uint64_t getNullPointerValue(unsigned AS) const override {
2265 return AS != LangAS::opencl_local && AS != 0 ? 0 : ~0;
2266 }
Eli Friedmand13b41e2012-10-12 23:32:00 +00002267};
2268
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002269const Builtin::Info AMDGPUTargetInfo::BuiltinInfo[] = {
Matt Arsenault56f008d2014-06-24 20:45:01 +00002270#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00002271 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Matt Arsenault250024f2016-06-08 01:56:42 +00002272#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2273 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002274#include "clang/Basic/BuiltinsAMDGPU.def"
Matt Arsenault56f008d2014-06-24 20:45:01 +00002275};
Matt Arsenault3ea39f92015-06-19 17:54:10 +00002276const char * const AMDGPUTargetInfo::GCCRegNames[] = {
Tom Stellard7b1059b2015-04-14 14:36:56 +00002277 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
2278 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
2279 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
2280 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
2281 "v32", "v33", "v34", "v35", "v36", "v37", "v38", "v39",
2282 "v40", "v41", "v42", "v43", "v44", "v45", "v46", "v47",
2283 "v48", "v49", "v50", "v51", "v52", "v53", "v54", "v55",
2284 "v56", "v57", "v58", "v59", "v60", "v61", "v62", "v63",
2285 "v64", "v65", "v66", "v67", "v68", "v69", "v70", "v71",
2286 "v72", "v73", "v74", "v75", "v76", "v77", "v78", "v79",
2287 "v80", "v81", "v82", "v83", "v84", "v85", "v86", "v87",
2288 "v88", "v89", "v90", "v91", "v92", "v93", "v94", "v95",
2289 "v96", "v97", "v98", "v99", "v100", "v101", "v102", "v103",
2290 "v104", "v105", "v106", "v107", "v108", "v109", "v110", "v111",
2291 "v112", "v113", "v114", "v115", "v116", "v117", "v118", "v119",
2292 "v120", "v121", "v122", "v123", "v124", "v125", "v126", "v127",
2293 "v128", "v129", "v130", "v131", "v132", "v133", "v134", "v135",
2294 "v136", "v137", "v138", "v139", "v140", "v141", "v142", "v143",
2295 "v144", "v145", "v146", "v147", "v148", "v149", "v150", "v151",
2296 "v152", "v153", "v154", "v155", "v156", "v157", "v158", "v159",
2297 "v160", "v161", "v162", "v163", "v164", "v165", "v166", "v167",
2298 "v168", "v169", "v170", "v171", "v172", "v173", "v174", "v175",
2299 "v176", "v177", "v178", "v179", "v180", "v181", "v182", "v183",
2300 "v184", "v185", "v186", "v187", "v188", "v189", "v190", "v191",
2301 "v192", "v193", "v194", "v195", "v196", "v197", "v198", "v199",
2302 "v200", "v201", "v202", "v203", "v204", "v205", "v206", "v207",
2303 "v208", "v209", "v210", "v211", "v212", "v213", "v214", "v215",
2304 "v216", "v217", "v218", "v219", "v220", "v221", "v222", "v223",
2305 "v224", "v225", "v226", "v227", "v228", "v229", "v230", "v231",
2306 "v232", "v233", "v234", "v235", "v236", "v237", "v238", "v239",
2307 "v240", "v241", "v242", "v243", "v244", "v245", "v246", "v247",
2308 "v248", "v249", "v250", "v251", "v252", "v253", "v254", "v255",
2309 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
2310 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
2311 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
2312 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
2313 "s32", "s33", "s34", "s35", "s36", "s37", "s38", "s39",
2314 "s40", "s41", "s42", "s43", "s44", "s45", "s46", "s47",
2315 "s48", "s49", "s50", "s51", "s52", "s53", "s54", "s55",
2316 "s56", "s57", "s58", "s59", "s60", "s61", "s62", "s63",
2317 "s64", "s65", "s66", "s67", "s68", "s69", "s70", "s71",
2318 "s72", "s73", "s74", "s75", "s76", "s77", "s78", "s79",
2319 "s80", "s81", "s82", "s83", "s84", "s85", "s86", "s87",
2320 "s88", "s89", "s90", "s91", "s92", "s93", "s94", "s95",
2321 "s96", "s97", "s98", "s99", "s100", "s101", "s102", "s103",
2322 "s104", "s105", "s106", "s107", "s108", "s109", "s110", "s111",
2323 "s112", "s113", "s114", "s115", "s116", "s117", "s118", "s119",
Etienne Bergerone8ae26f2016-03-24 18:29:24 +00002324 "s120", "s121", "s122", "s123", "s124", "s125", "s126", "s127",
Matt Arsenaultb015d622016-02-27 09:06:22 +00002325 "exec", "vcc", "scc", "m0", "flat_scratch", "exec_lo", "exec_hi",
2326 "vcc_lo", "vcc_hi", "flat_scratch_lo", "flat_scratch_hi"
Tom Stellard7b1059b2015-04-14 14:36:56 +00002327};
2328
Craig Topperf054e3a2015-10-19 03:52:27 +00002329ArrayRef<const char *> AMDGPUTargetInfo::getGCCRegNames() const {
2330 return llvm::makeArrayRef(GCCRegNames);
Tom Stellard7b1059b2015-04-14 14:36:56 +00002331}
Matt Arsenault56f008d2014-06-24 20:45:01 +00002332
Matt Arsenault250024f2016-06-08 01:56:42 +00002333bool AMDGPUTargetInfo::initFeatureMap(
2334 llvm::StringMap<bool> &Features,
2335 DiagnosticsEngine &Diags, StringRef CPU,
2336 const std::vector<std::string> &FeatureVec) const {
2337
2338 // XXX - What does the member GPU mean if device name string passed here?
2339 if (getTriple().getArch() == llvm::Triple::amdgcn) {
2340 if (CPU.empty())
2341 CPU = "tahiti";
2342
2343 switch (parseAMDGCNName(CPU)) {
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002344 case GK_GFX6:
2345 case GK_GFX7:
Matt Arsenault250024f2016-06-08 01:56:42 +00002346 break;
2347
Niels Ole Salscheiderb28cc452016-09-03 07:13:54 +00002348 case GK_GFX8:
Matt Arsenault250024f2016-06-08 01:56:42 +00002349 Features["s-memrealtime"] = true;
2350 Features["16-bit-insts"] = true;
2351 break;
2352
2353 case GK_NONE:
2354 return false;
2355 default:
2356 llvm_unreachable("unhandled subtarget");
2357 }
2358 } else {
2359 if (CPU.empty())
2360 CPU = "r600";
2361
2362 switch (parseR600Name(CPU)) {
2363 case GK_R600:
2364 case GK_R700:
2365 case GK_EVERGREEN:
2366 case GK_NORTHERN_ISLANDS:
2367 break;
2368 case GK_R600_DOUBLE_OPS:
2369 case GK_R700_DOUBLE_OPS:
2370 case GK_EVERGREEN_DOUBLE_OPS:
2371 case GK_CAYMAN:
2372 Features["fp64"] = true;
2373 break;
2374 case GK_NONE:
2375 return false;
2376 default:
2377 llvm_unreachable("unhandled subtarget");
2378 }
2379 }
2380
2381 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeatureVec);
2382}
2383
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002384const Builtin::Info BuiltinInfoX86[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00002385#define BUILTIN(ID, TYPE, ATTRS) \
2386 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Eric Christopherb6dfd942015-08-06 22:11:54 +00002387#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
Craig Topper07d3b622015-08-07 05:14:44 +00002388 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowski727ab8a2016-09-14 21:19:43 +00002389#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2390 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5abdec72009-06-14 01:05:48 +00002391#include "clang/Basic/BuiltinsX86.def"
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002392
2393#define BUILTIN(ID, TYPE, ATTRS) \
2394 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Albert Gutowski0fd6e962016-10-12 17:28:44 +00002395#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
2396 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002397#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2398 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
2399#include "clang/Basic/BuiltinsX86_64.def"
Eli Friedman3fd920a2008-08-20 02:34:37 +00002400};
Eli Friedmanb5366062008-05-20 14:21:01 +00002401
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00002402
Nuno Lopescfca1f02009-12-23 17:49:57 +00002403static const char* const GCCRegNames[] = {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002404 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
2405 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
Eric Christopher0c912c52011-07-07 22:55:26 +00002406 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002407 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
2408 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
2409 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
Eric Christophercdd36352011-06-21 00:05:20 +00002410 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
Eric Christopheraf643102011-12-02 02:12:16 +00002411 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
2412 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
Marina Yatsina41c45fa2016-02-03 11:32:08 +00002413 "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23",
2414 "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31",
2415 "ymm16", "ymm17", "ymm18", "ymm19", "ymm20", "ymm21", "ymm22", "ymm23",
2416 "ymm24", "ymm25", "ymm26", "ymm27", "ymm28", "ymm29", "ymm30", "ymm31",
2417 "zmm0", "zmm1", "zmm2", "zmm3", "zmm4", "zmm5", "zmm6", "zmm7",
2418 "zmm8", "zmm9", "zmm10", "zmm11", "zmm12", "zmm13", "zmm14", "zmm15",
2419 "zmm16", "zmm17", "zmm18", "zmm19", "zmm20", "zmm21", "zmm22", "zmm23",
2420 "zmm24", "zmm25", "zmm26", "zmm27", "zmm28", "zmm29", "zmm30", "zmm31",
Michael Zuckerman15604b92016-10-31 14:16:57 +00002421 "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7",
Eli Friedman3fd920a2008-08-20 02:34:37 +00002422};
2423
Eric Christophercdd36352011-06-21 00:05:20 +00002424const TargetInfo::AddlRegName AddlRegNames[] = {
2425 { { "al", "ah", "eax", "rax" }, 0 },
2426 { { "bl", "bh", "ebx", "rbx" }, 3 },
2427 { { "cl", "ch", "ecx", "rcx" }, 2 },
2428 { { "dl", "dh", "edx", "rdx" }, 1 },
2429 { { "esi", "rsi" }, 4 },
2430 { { "edi", "rdi" }, 5 },
2431 { { "esp", "rsp" }, 7 },
2432 { { "ebp", "rbp" }, 6 },
Alexey Bataeva7ab1b42015-09-04 03:42:23 +00002433 { { "r8d", "r8w", "r8b" }, 38 },
2434 { { "r9d", "r9w", "r9b" }, 39 },
2435 { { "r10d", "r10w", "r10b" }, 40 },
2436 { { "r11d", "r11w", "r11b" }, 41 },
2437 { { "r12d", "r12w", "r12b" }, 42 },
2438 { { "r13d", "r13w", "r13b" }, 43 },
2439 { { "r14d", "r14w", "r14b" }, 44 },
2440 { { "r15d", "r15w", "r15b" }, 45 },
Eli Friedman3fd920a2008-08-20 02:34:37 +00002441};
2442
2443// X86 target abstract base class; x86-32 and x86-64 are very close, so
2444// most of the implementation can be shared.
2445class X86TargetInfo : public TargetInfo {
Chris Lattner96e43572009-03-02 22:40:39 +00002446 enum X86SSEEnum {
Craig Topper9c4d17f2013-08-21 03:59:22 +00002447 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
Craig Topper543f3bd2015-10-14 23:47:57 +00002448 } SSELevel = NoSSE;
Eli Friedman33465822011-07-08 23:31:17 +00002449 enum MMX3DNowEnum {
2450 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
Craig Topper543f3bd2015-10-14 23:47:57 +00002451 } MMX3DNowLevel = NoMMX3DNow;
Rafael Espindolae62e2792013-08-20 13:44:29 +00002452 enum XOPEnum {
2453 NoXOP,
2454 SSE4A,
2455 FMA4,
2456 XOP
Craig Topper543f3bd2015-10-14 23:47:57 +00002457 } XOPLevel = NoXOP;
Anders Carlssone437c682010-01-27 03:47:49 +00002458
Craig Topper543f3bd2015-10-14 23:47:57 +00002459 bool HasAES = false;
2460 bool HasPCLMUL = false;
2461 bool HasLZCNT = false;
2462 bool HasRDRND = false;
2463 bool HasFSGSBASE = false;
2464 bool HasBMI = false;
2465 bool HasBMI2 = false;
2466 bool HasPOPCNT = false;
2467 bool HasRTM = false;
2468 bool HasPRFCHW = false;
2469 bool HasRDSEED = false;
2470 bool HasADX = false;
2471 bool HasTBM = false;
2472 bool HasFMA = false;
2473 bool HasF16C = false;
2474 bool HasAVX512CD = false;
2475 bool HasAVX512ER = false;
2476 bool HasAVX512PF = false;
2477 bool HasAVX512DQ = false;
2478 bool HasAVX512BW = false;
2479 bool HasAVX512VL = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002480 bool HasAVX512VBMI = false;
2481 bool HasAVX512IFMA = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002482 bool HasSHA = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002483 bool HasMPX = false;
2484 bool HasSGX = false;
Craig Topper543f3bd2015-10-14 23:47:57 +00002485 bool HasCX16 = false;
Craig Toppere33f51f2015-10-16 06:22:36 +00002486 bool HasFXSR = false;
Craig Topperda9fe562015-10-15 05:23:38 +00002487 bool HasXSAVE = false;
2488 bool HasXSAVEOPT = false;
2489 bool HasXSAVEC = false;
2490 bool HasXSAVES = false;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00002491 bool HasMWAITX = false;
Asaf Badouha9d1e182015-12-31 14:14:07 +00002492 bool HasPKU = false;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002493 bool HasCLFLUSHOPT = false;
2494 bool HasPCOMMIT = false;
2495 bool HasCLWB = false;
2496 bool HasUMIP = false;
2497 bool HasMOVBE = false;
2498 bool HasPREFETCHWT1 = false;
Bruno Cardoso Lopesd81ef1c2010-08-04 22:29:13 +00002499
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002500 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
2501 ///
2502 /// Each enumeration represents a particular CPU supported by Clang. These
2503 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
2504 enum CPUKind {
2505 CK_Generic,
2506
2507 /// \name i386
2508 /// i386-generation processors.
2509 //@{
2510 CK_i386,
2511 //@}
2512
2513 /// \name i486
2514 /// i486-generation processors.
2515 //@{
2516 CK_i486,
2517 CK_WinChipC6,
2518 CK_WinChip2,
2519 CK_C3,
2520 //@}
2521
2522 /// \name i586
2523 /// i586-generation processors, P5 microarchitecture based.
2524 //@{
2525 CK_i586,
2526 CK_Pentium,
2527 CK_PentiumMMX,
2528 //@}
2529
2530 /// \name i686
2531 /// i686-generation processors, P6 / Pentium M microarchitecture based.
2532 //@{
2533 CK_i686,
2534 CK_PentiumPro,
2535 CK_Pentium2,
2536 CK_Pentium3,
2537 CK_Pentium3M,
2538 CK_PentiumM,
2539 CK_C3_2,
2540
2541 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
2542 /// Clang however has some logic to suport this.
2543 // FIXME: Warn, deprecate, and potentially remove this.
2544 CK_Yonah,
2545 //@}
2546
2547 /// \name Netburst
Chandler Carruth3270e262011-09-28 18:17:30 +00002548 /// Netburst microarchitecture based processors.
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002549 //@{
2550 CK_Pentium4,
2551 CK_Pentium4M,
2552 CK_Prescott,
2553 CK_Nocona,
2554 //@}
2555
2556 /// \name Core
2557 /// Core microarchitecture based processors.
2558 //@{
2559 CK_Core2,
2560
2561 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
2562 /// codename which GCC no longer accepts as an option to -march, but Clang
2563 /// has some logic for recognizing it.
2564 // FIXME: Warn, deprecate, and potentially remove this.
2565 CK_Penryn,
2566 //@}
2567
2568 /// \name Atom
2569 /// Atom processors
2570 //@{
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002571 CK_Bonnell,
Preston Gurda3c58c02013-09-13 19:27:17 +00002572 CK_Silvermont,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002573 //@}
2574
2575 /// \name Nehalem
2576 /// Nehalem microarchitecture based processors.
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002577 CK_Nehalem,
2578
2579 /// \name Westmere
2580 /// Westmere microarchitecture based processors.
2581 CK_Westmere,
2582
2583 /// \name Sandy Bridge
2584 /// Sandy Bridge microarchitecture based processors.
2585 CK_SandyBridge,
2586
2587 /// \name Ivy Bridge
2588 /// Ivy Bridge microarchitecture based processors.
2589 CK_IvyBridge,
2590
2591 /// \name Haswell
2592 /// Haswell microarchitecture based processors.
2593 CK_Haswell,
2594
2595 /// \name Broadwell
2596 /// Broadwell microarchitecture based processors.
Robert Khasanov50e6f582014-09-19 09:53:48 +00002597 CK_Broadwell,
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002598
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002599 /// \name Skylake Client
2600 /// Skylake client microarchitecture based processors.
2601 CK_SkylakeClient,
2602
2603 /// \name Skylake Server
2604 /// Skylake server microarchitecture based processors.
2605 CK_SkylakeServer,
2606
2607 /// \name Cannonlake Client
2608 /// Cannonlake client microarchitecture based processors.
2609 CK_Cannonlake,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002610
Craig Topper449314e2013-08-20 07:09:39 +00002611 /// \name Knights Landing
2612 /// Knights Landing processor.
2613 CK_KNL,
2614
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002615 /// \name Lakemont
2616 /// Lakemont microarchitecture based processors.
2617 CK_Lakemont,
2618
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002619 /// \name K6
2620 /// K6 architecture processors.
2621 //@{
2622 CK_K6,
2623 CK_K6_2,
2624 CK_K6_3,
2625 //@}
2626
2627 /// \name K7
2628 /// K7 architecture processors.
2629 //@{
2630 CK_Athlon,
2631 CK_AthlonThunderbird,
2632 CK_Athlon4,
2633 CK_AthlonXP,
2634 CK_AthlonMP,
2635 //@}
2636
2637 /// \name K8
2638 /// K8 architecture processors.
2639 //@{
2640 CK_Athlon64,
2641 CK_Athlon64SSE3,
2642 CK_AthlonFX,
2643 CK_K8,
Chandler Carruth212334f2011-09-28 08:55:37 +00002644 CK_K8SSE3,
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002645 CK_Opteron,
2646 CK_OpteronSSE3,
Roman Divacky43eb6f82011-10-30 07:48:46 +00002647 CK_AMDFAM10,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002648 //@}
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002649
Benjamin Kramer569f2152012-01-10 11:50:18 +00002650 /// \name Bobcat
2651 /// Bobcat architecture processors.
2652 //@{
2653 CK_BTVER1,
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002654 CK_BTVER2,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002655 //@}
2656
2657 /// \name Bulldozer
2658 /// Bulldozer architecture processors.
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002659 //@{
2660 CK_BDVER1,
2661 CK_BDVER2,
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002662 CK_BDVER3,
Benjamin Kramer56c58222014-05-02 15:47:51 +00002663 CK_BDVER4,
Benjamin Kramer569f2152012-01-10 11:50:18 +00002664 //@}
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002665
Craig Topperc45744a2017-01-10 06:02:12 +00002666 /// \name zen
2667 /// Zen architecture processors.
2668 //@{
2669 CK_ZNVER1,
2670 //@}
2671
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002672 /// This specification is deprecated and will be removed in the future.
2673 /// Users should prefer \see CK_K8.
2674 // FIXME: Warn on this when the CPU is set to it.
Saleem Abdulrasoolcb29c1a2014-11-17 18:40:15 +00002675 //@{
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002676 CK_x86_64,
2677 //@}
2678
2679 /// \name Geode
2680 /// Geode processors.
2681 //@{
2682 CK_Geode
2683 //@}
Craig Topper543f3bd2015-10-14 23:47:57 +00002684 } CPU = CK_Generic;
Chandler Carruth3ac7aea2011-09-28 08:55:34 +00002685
Eric Christopherc50738f2015-08-27 00:05:50 +00002686 CPUKind getCPUKind(StringRef CPU) const {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002687 return llvm::StringSwitch<CPUKind>(CPU)
2688 .Case("i386", CK_i386)
2689 .Case("i486", CK_i486)
2690 .Case("winchip-c6", CK_WinChipC6)
2691 .Case("winchip2", CK_WinChip2)
2692 .Case("c3", CK_C3)
2693 .Case("i586", CK_i586)
2694 .Case("pentium", CK_Pentium)
2695 .Case("pentium-mmx", CK_PentiumMMX)
2696 .Case("i686", CK_i686)
2697 .Case("pentiumpro", CK_PentiumPro)
2698 .Case("pentium2", CK_Pentium2)
2699 .Case("pentium3", CK_Pentium3)
2700 .Case("pentium3m", CK_Pentium3M)
2701 .Case("pentium-m", CK_PentiumM)
2702 .Case("c3-2", CK_C3_2)
2703 .Case("yonah", CK_Yonah)
2704 .Case("pentium4", CK_Pentium4)
2705 .Case("pentium4m", CK_Pentium4M)
2706 .Case("prescott", CK_Prescott)
2707 .Case("nocona", CK_Nocona)
2708 .Case("core2", CK_Core2)
2709 .Case("penryn", CK_Penryn)
2710 .Case("bonnell", CK_Bonnell)
2711 .Case("atom", CK_Bonnell) // Legacy name.
2712 .Case("silvermont", CK_Silvermont)
2713 .Case("slm", CK_Silvermont) // Legacy name.
2714 .Case("nehalem", CK_Nehalem)
2715 .Case("corei7", CK_Nehalem) // Legacy name.
2716 .Case("westmere", CK_Westmere)
2717 .Case("sandybridge", CK_SandyBridge)
2718 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2719 .Case("ivybridge", CK_IvyBridge)
2720 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2721 .Case("haswell", CK_Haswell)
2722 .Case("core-avx2", CK_Haswell) // Legacy name.
2723 .Case("broadwell", CK_Broadwell)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002724 .Case("skylake", CK_SkylakeClient)
2725 .Case("skylake-avx512", CK_SkylakeServer)
2726 .Case("skx", CK_SkylakeServer) // Legacy name.
2727 .Case("cannonlake", CK_Cannonlake)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002728 .Case("knl", CK_KNL)
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002729 .Case("lakemont", CK_Lakemont)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002730 .Case("k6", CK_K6)
2731 .Case("k6-2", CK_K6_2)
2732 .Case("k6-3", CK_K6_3)
2733 .Case("athlon", CK_Athlon)
2734 .Case("athlon-tbird", CK_AthlonThunderbird)
2735 .Case("athlon-4", CK_Athlon4)
2736 .Case("athlon-xp", CK_AthlonXP)
2737 .Case("athlon-mp", CK_AthlonMP)
2738 .Case("athlon64", CK_Athlon64)
2739 .Case("athlon64-sse3", CK_Athlon64SSE3)
2740 .Case("athlon-fx", CK_AthlonFX)
2741 .Case("k8", CK_K8)
2742 .Case("k8-sse3", CK_K8SSE3)
2743 .Case("opteron", CK_Opteron)
2744 .Case("opteron-sse3", CK_OpteronSSE3)
2745 .Case("barcelona", CK_AMDFAM10)
2746 .Case("amdfam10", CK_AMDFAM10)
2747 .Case("btver1", CK_BTVER1)
2748 .Case("btver2", CK_BTVER2)
2749 .Case("bdver1", CK_BDVER1)
2750 .Case("bdver2", CK_BDVER2)
2751 .Case("bdver3", CK_BDVER3)
2752 .Case("bdver4", CK_BDVER4)
Craig Topperc45744a2017-01-10 06:02:12 +00002753 .Case("znver1", CK_ZNVER1)
Eric Christopherb39e44b2015-08-26 23:42:18 +00002754 .Case("x86-64", CK_x86_64)
2755 .Case("geode", CK_Geode)
2756 .Default(CK_Generic);
2757 }
2758
Rafael Espindolaeb265472013-08-21 21:59:03 +00002759 enum FPMathKind {
2760 FP_Default,
2761 FP_SSE,
2762 FP_387
Craig Topper543f3bd2015-10-14 23:47:57 +00002763 } FPMath = FP_Default;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002764
Eli Friedman3fd920a2008-08-20 02:34:37 +00002765public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00002766 X86TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
2767 : TargetInfo(Triple) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00002768 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Chris Lattner1f5ad112006-10-14 18:32:12 +00002769 }
Craig Topper3164f332014-03-11 03:39:26 +00002770 unsigned getFloatEvalMethod() const override {
Benjamin Kramercf501472011-12-28 15:47:06 +00002771 // X87 evaluates with 80 bits "long double" precision.
2772 return SSELevel == NoSSE ? 2 : 0;
2773 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002774 ArrayRef<const char *> getGCCRegNames() const override {
2775 return llvm::makeArrayRef(GCCRegNames);
Anders Carlsson5fa3f342007-11-24 23:38:12 +00002776 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002777 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
2778 return None;
Eric Christophercdd36352011-06-21 00:05:20 +00002779 }
Craig Topperf054e3a2015-10-19 03:52:27 +00002780 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
2781 return llvm::makeArrayRef(AddlRegNames);
Anders Carlssona7408e72007-10-13 00:45:48 +00002782 }
Eric Christopherd9832702015-06-29 21:00:05 +00002783 bool validateCpuSupports(StringRef Name) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002784 bool validateAsmConstraint(const char *&Name,
Eric Christopher917e9522014-11-18 22:36:15 +00002785 TargetInfo::ConstraintInfo &info) const override;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002786
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00002787 bool validateGlobalRegisterVariable(StringRef RegName,
2788 unsigned RegSize,
2789 bool &HasSizeMismatch) const override {
2790 // esp and ebp are the only 32-bit registers the x86 backend can currently
2791 // handle.
2792 if (RegName.equals("esp") || RegName.equals("ebp")) {
2793 // Check that the register size is 32-bit.
2794 HasSizeMismatch = RegSize != 32;
2795 return true;
2796 }
2797
2798 return false;
2799 }
2800
Akira Hatanaka974131e2014-09-18 18:17:18 +00002801 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
2802
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00002803 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
2804
Akira Hatanaka974131e2014-09-18 18:17:18 +00002805 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
2806
Craig Topper3164f332014-03-11 03:39:26 +00002807 std::string convertConstraint(const char *&Constraint) const override;
2808 const char *getClobbers() const override {
Eli Friedman3fd920a2008-08-20 02:34:37 +00002809 return "~{dirflag},~{fpsr},~{flags}";
2810 }
Marina Yatsinac42fd032016-12-26 12:23:42 +00002811
2812 StringRef getConstraintRegister(const StringRef &Constraint,
2813 const StringRef &Expression) const override {
2814 StringRef::iterator I, E;
2815 for (I = Constraint.begin(), E = Constraint.end(); I != E; ++I) {
2816 if (isalpha(*I))
2817 break;
2818 }
2819 if (I == E)
2820 return "";
2821 switch (*I) {
2822 // For the register constraints, return the matching register name
2823 case 'a':
2824 return "ax";
2825 case 'b':
2826 return "bx";
2827 case 'c':
2828 return "cx";
2829 case 'd':
2830 return "dx";
2831 case 'S':
2832 return "si";
2833 case 'D':
2834 return "di";
2835 // In case the constraint is 'r' we need to return Expression
2836 case 'r':
2837 return Expression;
2838 default:
2839 // Default value if there is no constraint for the register
2840 return "";
2841 }
2842 return "";
2843 }
2844
Craig Topper3164f332014-03-11 03:39:26 +00002845 void getTargetDefines(const LangOptions &Opts,
2846 MacroBuilder &Builder) const override;
Craig Topper13f61a62013-09-17 04:12:55 +00002847 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2848 bool Enabled);
2849 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2850 bool Enabled);
2851 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2852 bool Enabled);
Craig Topper3164f332014-03-11 03:39:26 +00002853 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2854 StringRef Name, bool Enabled) const override {
Craig Topper86d79ef2013-09-17 04:51:29 +00002855 setFeatureEnabledImpl(Features, Name, Enabled);
2856 }
2857 // This exists purely to cut down on the number of virtual calls in
Eric Christopheref1e2952015-08-28 02:13:58 +00002858 // initFeatureMap which calls this repeatedly.
Craig Topper86d79ef2013-09-17 04:51:29 +00002859 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2860 StringRef Name, bool Enabled);
Eric Christopher8c47b422015-10-09 18:39:55 +00002861 bool
2862 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
2863 StringRef CPU,
2864 const std::vector<std::string> &FeaturesVec) const override;
Craig Topper3164f332014-03-11 03:39:26 +00002865 bool hasFeature(StringRef Feature) const override;
2866 bool handleTargetFeatures(std::vector<std::string> &Features,
2867 DiagnosticsEngine &Diags) override;
Alp Toker4925ba72014-06-07 23:30:42 +00002868 StringRef getABI() const override {
Ahmed Bougacha0b938282015-06-22 21:31:43 +00002869 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX512F)
2870 return "avx512";
Craig Topperd945d502015-10-20 00:00:17 +00002871 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002872 return "avx";
Craig Topperd945d502015-10-20 00:00:17 +00002873 if (getTriple().getArch() == llvm::Triple::x86 &&
Derek Schuffc7dd7222012-10-11 15:52:22 +00002874 MMX3DNowLevel == NoMMX3DNow)
Eli Friedmanbfd5add2011-12-02 00:11:43 +00002875 return "no-mmx";
2876 return "";
Eli Friedman33465822011-07-08 23:31:17 +00002877 }
Craig Topper3164f332014-03-11 03:39:26 +00002878 bool setCPU(const std::string &Name) override {
Eric Christopherb39e44b2015-08-26 23:42:18 +00002879 CPU = getCPUKind(Name);
Chandler Carruth212334f2011-09-28 08:55:37 +00002880
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002881 // Perform any per-CPU checks necessary to determine if this CPU is
2882 // acceptable.
2883 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2884 // invalid without explaining *why*.
2885 switch (CPU) {
2886 case CK_Generic:
2887 // No processor selected!
2888 return false;
2889
2890 case CK_i386:
2891 case CK_i486:
2892 case CK_WinChipC6:
2893 case CK_WinChip2:
2894 case CK_C3:
2895 case CK_i586:
2896 case CK_Pentium:
2897 case CK_PentiumMMX:
2898 case CK_i686:
2899 case CK_PentiumPro:
2900 case CK_Pentium2:
2901 case CK_Pentium3:
2902 case CK_Pentium3M:
2903 case CK_PentiumM:
2904 case CK_Yonah:
2905 case CK_C3_2:
2906 case CK_Pentium4:
2907 case CK_Pentium4M:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00002908 case CK_Lakemont:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002909 case CK_Prescott:
2910 case CK_K6:
2911 case CK_K6_2:
2912 case CK_K6_3:
2913 case CK_Athlon:
2914 case CK_AthlonThunderbird:
2915 case CK_Athlon4:
2916 case CK_AthlonXP:
2917 case CK_AthlonMP:
2918 case CK_Geode:
2919 // Only accept certain architectures when compiling in 32-bit mode.
Derek Schuffc7dd7222012-10-11 15:52:22 +00002920 if (getTriple().getArch() != llvm::Triple::x86)
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002921 return false;
2922
2923 // Fallthrough
2924 case CK_Nocona:
2925 case CK_Core2:
2926 case CK_Penryn:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002927 case CK_Bonnell:
Preston Gurda3c58c02013-09-13 19:27:17 +00002928 case CK_Silvermont:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00002929 case CK_Nehalem:
2930 case CK_Westmere:
2931 case CK_SandyBridge:
2932 case CK_IvyBridge:
2933 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00002934 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00002935 case CK_SkylakeClient:
2936 case CK_SkylakeServer:
2937 case CK_Cannonlake:
Craig Topper449314e2013-08-20 07:09:39 +00002938 case CK_KNL:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002939 case CK_Athlon64:
2940 case CK_Athlon64SSE3:
2941 case CK_AthlonFX:
2942 case CK_K8:
2943 case CK_K8SSE3:
2944 case CK_Opteron:
2945 case CK_OpteronSSE3:
Roman Divacky43eb6f82011-10-30 07:48:46 +00002946 case CK_AMDFAM10:
Benjamin Kramer569f2152012-01-10 11:50:18 +00002947 case CK_BTVER1:
Benjamin Kramer914d7e02013-05-03 10:47:15 +00002948 case CK_BTVER2:
Benjamin Kramer6bd51592011-12-01 18:23:59 +00002949 case CK_BDVER1:
2950 case CK_BDVER2:
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00002951 case CK_BDVER3:
Benjamin Kramer56c58222014-05-02 15:47:51 +00002952 case CK_BDVER4:
Craig Topperc45744a2017-01-10 06:02:12 +00002953 case CK_ZNVER1:
Chandler Carruth6e20c2b2011-09-28 09:45:08 +00002954 case CK_x86_64:
2955 return true;
2956 }
Chandler Carruth7d8241c2011-09-28 10:49:06 +00002957 llvm_unreachable("Unhandled CPU kind");
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00002958 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002959
Craig Topper3164f332014-03-11 03:39:26 +00002960 bool setFPMath(StringRef Name) override;
Rafael Espindolaeb265472013-08-21 21:59:03 +00002961
Craig Topper3164f332014-03-11 03:39:26 +00002962 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00002963 // Most of the non-ARM calling conventions are i386 conventions.
2964 switch (CC) {
2965 case CC_X86ThisCall:
2966 case CC_X86FastCall:
2967 case CC_X86StdCall:
2968 case CC_X86VectorCall:
Erich Keane757d3172016-11-02 18:29:35 +00002969 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00002970 case CC_C:
2971 case CC_Swift:
2972 case CC_X86Pascal:
2973 case CC_IntelOclBicc:
2974 return CCCR_OK;
2975 default:
2976 return CCCR_Warning;
2977 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002978 }
2979
Craig Topper3164f332014-03-11 03:39:26 +00002980 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00002981 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00002982 }
Joerg Sonnenberger27173282015-03-11 23:46:32 +00002983
2984 bool hasSjLjLowering() const override {
2985 return true;
2986 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002987
2988 void setSupportedOpenCLOpts() override {
Yaxun Liu5b746652016-12-18 05:18:55 +00002989 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00002990 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00002991};
Chris Lattnerc25d8a72009-03-02 22:20:04 +00002992
Rafael Espindolaeb265472013-08-21 21:59:03 +00002993bool X86TargetInfo::setFPMath(StringRef Name) {
2994 if (Name == "387") {
2995 FPMath = FP_387;
2996 return true;
2997 }
2998 if (Name == "sse") {
2999 FPMath = FP_SSE;
3000 return true;
3001 }
3002 return false;
3003}
3004
Eric Christopher007b0a02015-08-28 22:32:01 +00003005bool X86TargetInfo::initFeatureMap(
3006 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
Eric Christopher8c47b422015-10-09 18:39:55 +00003007 const std::vector<std::string> &FeaturesVec) const {
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003008 // FIXME: This *really* should not be here.
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003009 // X86_64 always has SSE2.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003010 if (getTriple().getArch() == llvm::Triple::x86_64)
Craig Topper86d79ef2013-09-17 04:51:29 +00003011 setFeatureEnabledImpl(Features, "sse2", true);
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003012
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003013 const CPUKind Kind = getCPUKind(CPU);
Andrey Turetskiy5f1cf5f2016-03-23 11:15:10 +00003014
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003015 // Enable X87 for all X86 processors but Lakemont.
3016 if (Kind != CK_Lakemont)
3017 setFeatureEnabledImpl(Features, "x87", true);
3018
3019 switch (Kind) {
Chandler Carruth212334f2011-09-28 08:55:37 +00003020 case CK_Generic:
3021 case CK_i386:
3022 case CK_i486:
3023 case CK_i586:
3024 case CK_Pentium:
3025 case CK_i686:
3026 case CK_PentiumPro:
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003027 case CK_Lakemont:
Chandler Carruth212334f2011-09-28 08:55:37 +00003028 break;
3029 case CK_PentiumMMX:
3030 case CK_Pentium2:
Craig Topperdb4dc082014-11-06 05:52:19 +00003031 case CK_K6:
3032 case CK_WinChipC6:
Craig Topper86d79ef2013-09-17 04:51:29 +00003033 setFeatureEnabledImpl(Features, "mmx", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003034 break;
3035 case CK_Pentium3:
3036 case CK_Pentium3M:
Craig Topperdb4dc082014-11-06 05:52:19 +00003037 case CK_C3_2:
Craig Topper86d79ef2013-09-17 04:51:29 +00003038 setFeatureEnabledImpl(Features, "sse", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003039 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003040 break;
3041 case CK_PentiumM:
3042 case CK_Pentium4:
3043 case CK_Pentium4M:
3044 case CK_x86_64:
Craig Topper86d79ef2013-09-17 04:51:29 +00003045 setFeatureEnabledImpl(Features, "sse2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003046 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003047 break;
3048 case CK_Yonah:
3049 case CK_Prescott:
3050 case CK_Nocona:
Craig Topper86d79ef2013-09-17 04:51:29 +00003051 setFeatureEnabledImpl(Features, "sse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003052 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003053 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003054 break;
3055 case CK_Core2:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003056 case CK_Bonnell:
Craig Topper86d79ef2013-09-17 04:51:29 +00003057 setFeatureEnabledImpl(Features, "ssse3", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003058 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003059 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003060 break;
3061 case CK_Penryn:
Craig Topper86d79ef2013-09-17 04:51:29 +00003062 setFeatureEnabledImpl(Features, "sse4.1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003063 setFeatureEnabledImpl(Features, "fxsr", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003064 setFeatureEnabledImpl(Features, "cx16", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003065 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003066 case CK_Cannonlake:
3067 setFeatureEnabledImpl(Features, "avx512ifma", true);
3068 setFeatureEnabledImpl(Features, "avx512vbmi", true);
3069 setFeatureEnabledImpl(Features, "sha", true);
3070 setFeatureEnabledImpl(Features, "umip", true);
3071 // FALLTHROUGH
3072 case CK_SkylakeServer:
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003073 setFeatureEnabledImpl(Features, "avx512f", true);
3074 setFeatureEnabledImpl(Features, "avx512cd", true);
3075 setFeatureEnabledImpl(Features, "avx512dq", true);
3076 setFeatureEnabledImpl(Features, "avx512bw", true);
3077 setFeatureEnabledImpl(Features, "avx512vl", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003078 setFeatureEnabledImpl(Features, "pku", true);
3079 setFeatureEnabledImpl(Features, "pcommit", true);
3080 setFeatureEnabledImpl(Features, "clwb", true);
3081 // FALLTHROUGH
3082 case CK_SkylakeClient:
Craig Topperda9fe562015-10-15 05:23:38 +00003083 setFeatureEnabledImpl(Features, "xsavec", true);
3084 setFeatureEnabledImpl(Features, "xsaves", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003085 setFeatureEnabledImpl(Features, "mpx", true);
3086 setFeatureEnabledImpl(Features, "sgx", true);
3087 setFeatureEnabledImpl(Features, "clflushopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003088 // FALLTHROUGH
3089 case CK_Broadwell:
3090 setFeatureEnabledImpl(Features, "rdseed", true);
3091 setFeatureEnabledImpl(Features, "adx", true);
3092 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003093 case CK_Haswell:
Craig Topperdb4dc082014-11-06 05:52:19 +00003094 setFeatureEnabledImpl(Features, "avx2", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003095 setFeatureEnabledImpl(Features, "lzcnt", true);
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003096 setFeatureEnabledImpl(Features, "bmi", true);
3097 setFeatureEnabledImpl(Features, "bmi2", true);
3098 setFeatureEnabledImpl(Features, "rtm", true);
3099 setFeatureEnabledImpl(Features, "fma", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003100 setFeatureEnabledImpl(Features, "movbe", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003101 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003102 case CK_IvyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003103 setFeatureEnabledImpl(Features, "rdrnd", true);
3104 setFeatureEnabledImpl(Features, "f16c", true);
3105 setFeatureEnabledImpl(Features, "fsgsbase", true);
3106 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003107 case CK_SandyBridge:
Craig Topperdb4dc082014-11-06 05:52:19 +00003108 setFeatureEnabledImpl(Features, "avx", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003109 setFeatureEnabledImpl(Features, "xsave", true);
3110 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003111 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003112 case CK_Westmere:
Craig Topperdb4dc082014-11-06 05:52:19 +00003113 case CK_Silvermont:
3114 setFeatureEnabledImpl(Features, "aes", true);
3115 setFeatureEnabledImpl(Features, "pclmul", true);
3116 // FALLTHROUGH
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003117 case CK_Nehalem:
Craig Topperdb4dc082014-11-06 05:52:19 +00003118 setFeatureEnabledImpl(Features, "sse4.2", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003119 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003120 setFeatureEnabledImpl(Features, "cx16", true);
3121 break;
3122 case CK_KNL:
3123 setFeatureEnabledImpl(Features, "avx512f", true);
3124 setFeatureEnabledImpl(Features, "avx512cd", true);
3125 setFeatureEnabledImpl(Features, "avx512er", true);
3126 setFeatureEnabledImpl(Features, "avx512pf", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003127 setFeatureEnabledImpl(Features, "prefetchwt1", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003128 setFeatureEnabledImpl(Features, "fxsr", true);
Robert Khasanov50e6f582014-09-19 09:53:48 +00003129 setFeatureEnabledImpl(Features, "rdseed", true);
3130 setFeatureEnabledImpl(Features, "adx", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003131 setFeatureEnabledImpl(Features, "lzcnt", true);
3132 setFeatureEnabledImpl(Features, "bmi", true);
3133 setFeatureEnabledImpl(Features, "bmi2", true);
3134 setFeatureEnabledImpl(Features, "rtm", true);
3135 setFeatureEnabledImpl(Features, "fma", true);
3136 setFeatureEnabledImpl(Features, "rdrnd", true);
3137 setFeatureEnabledImpl(Features, "f16c", true);
3138 setFeatureEnabledImpl(Features, "fsgsbase", true);
3139 setFeatureEnabledImpl(Features, "aes", true);
3140 setFeatureEnabledImpl(Features, "pclmul", true);
3141 setFeatureEnabledImpl(Features, "cx16", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003142 setFeatureEnabledImpl(Features, "xsaveopt", true);
3143 setFeatureEnabledImpl(Features, "xsave", true);
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003144 setFeatureEnabledImpl(Features, "movbe", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003145 break;
3146 case CK_K6_2:
3147 case CK_K6_3:
Chandler Carruth212334f2011-09-28 08:55:37 +00003148 case CK_WinChip2:
3149 case CK_C3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003150 setFeatureEnabledImpl(Features, "3dnow", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003151 break;
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003152 case CK_Athlon:
3153 case CK_AthlonThunderbird:
3154 case CK_Geode:
Craig Topper86d79ef2013-09-17 04:51:29 +00003155 setFeatureEnabledImpl(Features, "3dnowa", true);
Chandler Carruthcd99bad2011-09-28 10:36:46 +00003156 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003157 case CK_Athlon4:
3158 case CK_AthlonXP:
3159 case CK_AthlonMP:
Craig Topper86d79ef2013-09-17 04:51:29 +00003160 setFeatureEnabledImpl(Features, "sse", true);
3161 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003162 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003163 break;
3164 case CK_K8:
3165 case CK_Opteron:
3166 case CK_Athlon64:
3167 case CK_AthlonFX:
Craig Topper86d79ef2013-09-17 04:51:29 +00003168 setFeatureEnabledImpl(Features, "sse2", true);
3169 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003170 setFeatureEnabledImpl(Features, "fxsr", true);
Chandler Carruth212334f2011-09-28 08:55:37 +00003171 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003172 case CK_AMDFAM10:
3173 setFeatureEnabledImpl(Features, "sse4a", true);
3174 setFeatureEnabledImpl(Features, "lzcnt", true);
3175 setFeatureEnabledImpl(Features, "popcnt", true);
3176 // FALLTHROUGH
Chandler Carruth212334f2011-09-28 08:55:37 +00003177 case CK_K8SSE3:
3178 case CK_OpteronSSE3:
3179 case CK_Athlon64SSE3:
Craig Topper86d79ef2013-09-17 04:51:29 +00003180 setFeatureEnabledImpl(Features, "sse3", true);
3181 setFeatureEnabledImpl(Features, "3dnowa", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003182 setFeatureEnabledImpl(Features, "fxsr", true);
Roman Divackyce253d82011-10-30 13:47:56 +00003183 break;
Craig Topperdb4dc082014-11-06 05:52:19 +00003184 case CK_BTVER2:
3185 setFeatureEnabledImpl(Features, "avx", true);
3186 setFeatureEnabledImpl(Features, "aes", true);
3187 setFeatureEnabledImpl(Features, "pclmul", true);
3188 setFeatureEnabledImpl(Features, "bmi", true);
3189 setFeatureEnabledImpl(Features, "f16c", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003190 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topperdb4dc082014-11-06 05:52:19 +00003191 // FALLTHROUGH
Benjamin Kramer569f2152012-01-10 11:50:18 +00003192 case CK_BTVER1:
Craig Topper86d79ef2013-09-17 04:51:29 +00003193 setFeatureEnabledImpl(Features, "ssse3", true);
3194 setFeatureEnabledImpl(Features, "sse4a", true);
3195 setFeatureEnabledImpl(Features, "lzcnt", true);
3196 setFeatureEnabledImpl(Features, "popcnt", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003197 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003198 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003199 setFeatureEnabledImpl(Features, "fxsr", true);
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003200 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003201 case CK_ZNVER1:
3202 setFeatureEnabledImpl(Features, "adx", true);
3203 setFeatureEnabledImpl(Features, "aes", true);
3204 setFeatureEnabledImpl(Features, "avx2", true);
3205 setFeatureEnabledImpl(Features, "bmi", true);
3206 setFeatureEnabledImpl(Features, "bmi2", true);
3207 setFeatureEnabledImpl(Features, "clflushopt", true);
3208 setFeatureEnabledImpl(Features, "cx16", true);
3209 setFeatureEnabledImpl(Features, "f16c", true);
3210 setFeatureEnabledImpl(Features, "fma", true);
3211 setFeatureEnabledImpl(Features, "fsgsbase", true);
3212 setFeatureEnabledImpl(Features, "fxsr", true);
3213 setFeatureEnabledImpl(Features, "lzcnt", true);
3214 setFeatureEnabledImpl(Features, "mwaitx", true);
3215 setFeatureEnabledImpl(Features, "movbe", true);
3216 setFeatureEnabledImpl(Features, "pclmul", true);
3217 setFeatureEnabledImpl(Features, "popcnt", true);
3218 setFeatureEnabledImpl(Features, "prfchw", true);
3219 setFeatureEnabledImpl(Features, "rdrnd", true);
3220 setFeatureEnabledImpl(Features, "rdseed", true);
3221 setFeatureEnabledImpl(Features, "sha", true);
3222 setFeatureEnabledImpl(Features, "sse4a", true);
3223 setFeatureEnabledImpl(Features, "xsave", true);
3224 setFeatureEnabledImpl(Features, "xsavec", true);
3225 setFeatureEnabledImpl(Features, "xsaveopt", true);
3226 setFeatureEnabledImpl(Features, "xsaves", true);
3227 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003228 case CK_BDVER4:
3229 setFeatureEnabledImpl(Features, "avx2", true);
3230 setFeatureEnabledImpl(Features, "bmi2", true);
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003231 setFeatureEnabledImpl(Features, "mwaitx", true);
Benjamin Kramer56c58222014-05-02 15:47:51 +00003232 // FALLTHROUGH
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003233 case CK_BDVER3:
Craig Topper8c7f2512014-11-03 06:51:41 +00003234 setFeatureEnabledImpl(Features, "fsgsbase", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003235 setFeatureEnabledImpl(Features, "xsaveopt", true);
Craig Topper8c7f2512014-11-03 06:51:41 +00003236 // FALLTHROUGH
3237 case CK_BDVER2:
Andrea Di Biagio9760a442014-11-06 12:08:57 +00003238 setFeatureEnabledImpl(Features, "bmi", true);
3239 setFeatureEnabledImpl(Features, "fma", true);
3240 setFeatureEnabledImpl(Features, "f16c", true);
3241 setFeatureEnabledImpl(Features, "tbm", true);
3242 // FALLTHROUGH
3243 case CK_BDVER1:
3244 // xop implies avx, sse4a and fma4.
Craig Topper86d79ef2013-09-17 04:51:29 +00003245 setFeatureEnabledImpl(Features, "xop", true);
3246 setFeatureEnabledImpl(Features, "lzcnt", true);
3247 setFeatureEnabledImpl(Features, "aes", true);
3248 setFeatureEnabledImpl(Features, "pclmul", true);
Yunzhong Gao61089362013-10-16 19:07:02 +00003249 setFeatureEnabledImpl(Features, "prfchw", true);
Nick Lewycky50e8f482013-10-05 20:14:27 +00003250 setFeatureEnabledImpl(Features, "cx16", true);
Craig Toppere33f51f2015-10-16 06:22:36 +00003251 setFeatureEnabledImpl(Features, "fxsr", true);
Craig Topperda9fe562015-10-15 05:23:38 +00003252 setFeatureEnabledImpl(Features, "xsave", true);
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003253 break;
Eli Friedman33465822011-07-08 23:31:17 +00003254 }
Eric Christopherbbd746d2015-10-08 20:10:14 +00003255 if (!TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec))
3256 return false;
3257
3258 // Can't do this earlier because we need to be able to explicitly enable
3259 // or disable these features and the things that they depend upon.
3260
3261 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
3262 auto I = Features.find("sse4.2");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003263 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003264 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-popcnt") ==
3265 FeaturesVec.end())
3266 Features["popcnt"] = true;
3267
3268 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
3269 I = Features.find("3dnow");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003270 if (I != Features.end() && I->getValue() &&
Eric Christopherbbd746d2015-10-08 20:10:14 +00003271 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-prfchw") ==
3272 FeaturesVec.end())
3273 Features["prfchw"] = true;
3274
Eric Christophera7260af2015-10-08 20:10:18 +00003275 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
3276 // then enable MMX.
3277 I = Features.find("sse");
Rafael Espindolaa9195872015-10-24 23:15:31 +00003278 if (I != Features.end() && I->getValue() &&
Eric Christophera7260af2015-10-08 20:10:18 +00003279 std::find(FeaturesVec.begin(), FeaturesVec.end(), "-mmx") ==
3280 FeaturesVec.end())
3281 Features["mmx"] = true;
3282
Eric Christopherbbd746d2015-10-08 20:10:14 +00003283 return true;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003284}
3285
Rafael Espindolae62e2792013-08-20 13:44:29 +00003286void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003287 X86SSEEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003288 if (Enabled) {
3289 switch (Level) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003290 case AVX512F:
3291 Features["avx512f"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003292 case AVX2:
3293 Features["avx2"] = true;
3294 case AVX:
3295 Features["avx"] = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003296 Features["xsave"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003297 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003298 Features["sse4.2"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003299 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003300 Features["sse4.1"] = true;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003301 case SSSE3:
3302 Features["ssse3"] = true;
3303 case SSE3:
3304 Features["sse3"] = true;
3305 case SSE2:
3306 Features["sse2"] = true;
3307 case SSE1:
Rafael Espindolae62e2792013-08-20 13:44:29 +00003308 Features["sse"] = true;
3309 case NoSSE:
3310 break;
3311 }
3312 return;
3313 }
3314
3315 switch (Level) {
3316 case NoSSE:
3317 case SSE1:
3318 Features["sse"] = false;
3319 case SSE2:
Ben Langmuir58078d02013-09-19 13:22:04 +00003320 Features["sse2"] = Features["pclmul"] = Features["aes"] =
3321 Features["sha"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003322 case SSE3:
3323 Features["sse3"] = false;
3324 setXOPLevel(Features, NoXOP, false);
3325 case SSSE3:
3326 Features["ssse3"] = false;
3327 case SSE41:
Rafael Espindola89049822013-08-23 20:21:37 +00003328 Features["sse4.1"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003329 case SSE42:
Craig Topper7481d8a2013-09-10 06:55:47 +00003330 Features["sse4.2"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003331 case AVX:
Craig Topperda9fe562015-10-15 05:23:38 +00003332 Features["fma"] = Features["avx"] = Features["f16c"] = Features["xsave"] =
3333 Features["xsaveopt"] = false;
Rafael Espindola0221d862013-08-21 13:28:02 +00003334 setXOPLevel(Features, FMA4, false);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003335 case AVX2:
3336 Features["avx2"] = false;
Craig Topper9c4d17f2013-08-21 03:59:22 +00003337 case AVX512F:
Eric Christopher917e9522014-11-18 22:36:15 +00003338 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
Craig Toppera31a5da2014-12-27 06:59:37 +00003339 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
Craig Topperb4f83a02016-02-29 06:51:38 +00003340 Features["avx512vl"] = Features["avx512vbmi"] =
3341 Features["avx512ifma"] = false;
Rafael Espindolae62e2792013-08-20 13:44:29 +00003342 }
3343}
3344
3345void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
Craig Topper13f61a62013-09-17 04:12:55 +00003346 MMX3DNowEnum Level, bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003347 if (Enabled) {
3348 switch (Level) {
3349 case AMD3DNowAthlon:
3350 Features["3dnowa"] = true;
3351 case AMD3DNow:
3352 Features["3dnow"] = true;
3353 case MMX:
3354 Features["mmx"] = true;
3355 case NoMMX3DNow:
3356 break;
3357 }
3358 return;
3359 }
3360
3361 switch (Level) {
3362 case NoMMX3DNow:
3363 case MMX:
3364 Features["mmx"] = false;
3365 case AMD3DNow:
3366 Features["3dnow"] = false;
3367 case AMD3DNowAthlon:
3368 Features["3dnowa"] = false;
3369 }
3370}
3371
3372void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
Craig Topper13f61a62013-09-17 04:12:55 +00003373 bool Enabled) {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003374 if (Enabled) {
3375 switch (Level) {
3376 case XOP:
3377 Features["xop"] = true;
3378 case FMA4:
3379 Features["fma4"] = true;
3380 setSSELevel(Features, AVX, true);
3381 case SSE4A:
3382 Features["sse4a"] = true;
3383 setSSELevel(Features, SSE3, true);
3384 case NoXOP:
3385 break;
3386 }
3387 return;
3388 }
3389
3390 switch (Level) {
3391 case NoXOP:
3392 case SSE4A:
3393 Features["sse4a"] = false;
3394 case FMA4:
3395 Features["fma4"] = false;
3396 case XOP:
3397 Features["xop"] = false;
3398 }
3399}
3400
Craig Topper86d79ef2013-09-17 04:51:29 +00003401void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
3402 StringRef Name, bool Enabled) {
Eric Christopher298ac302015-07-01 00:08:32 +00003403 // This is a bit of a hack to deal with the sse4 target feature when used
3404 // as part of the target attribute. We handle sse4 correctly everywhere
3405 // else. See below for more information on how we handle the sse4 options.
3406 if (Name != "sse4")
3407 Features[Name] = Enabled;
Rafael Espindolaa6416a72011-11-27 20:00:43 +00003408
Craig Topper29561122013-09-19 01:13:07 +00003409 if (Name == "mmx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003410 setMMXLevel(Features, MMX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003411 } else if (Name == "sse") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003412 setSSELevel(Features, SSE1, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003413 } else if (Name == "sse2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003414 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003415 } else if (Name == "sse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003416 setSSELevel(Features, SSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003417 } else if (Name == "ssse3") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003418 setSSELevel(Features, SSSE3, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003419 } else if (Name == "sse4.2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003420 setSSELevel(Features, SSE42, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003421 } else if (Name == "sse4.1") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003422 setSSELevel(Features, SSE41, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003423 } else if (Name == "3dnow") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003424 setMMXLevel(Features, AMD3DNow, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003425 } else if (Name == "3dnowa") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003426 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003427 } else if (Name == "aes") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003428 if (Enabled)
3429 setSSELevel(Features, SSE2, Enabled);
3430 } else if (Name == "pclmul") {
3431 if (Enabled)
3432 setSSELevel(Features, SSE2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003433 } else if (Name == "avx") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003434 setSSELevel(Features, AVX, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003435 } else if (Name == "avx2") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003436 setSSELevel(Features, AVX2, Enabled);
Craig Topper29561122013-09-19 01:13:07 +00003437 } else if (Name == "avx512f") {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003438 setSSELevel(Features, AVX512F, Enabled);
Craig Topperb4f83a02016-02-29 06:51:38 +00003439 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf" ||
3440 Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl" ||
3441 Name == "avx512vbmi" || Name == "avx512ifma") {
Craig Topper679b53a2013-08-21 05:29:10 +00003442 if (Enabled)
3443 setSSELevel(Features, AVX512F, Enabled);
Craig Topper6c7ecc52016-11-09 04:51:03 +00003444 // Enable BWI instruction if VBMI is being enabled.
3445 if (Name == "avx512vbmi" && Enabled)
3446 Features["avx512bw"] = true;
3447 // Also disable VBMI if BWI is being disabled.
3448 if (Name == "avx512bw" && !Enabled)
3449 Features["avx512vbmi"] = false;
Craig Topper679b53a2013-08-21 05:29:10 +00003450 } else if (Name == "fma") {
Rafael Espindolae62e2792013-08-20 13:44:29 +00003451 if (Enabled)
3452 setSSELevel(Features, AVX, Enabled);
3453 } else if (Name == "fma4") {
3454 setXOPLevel(Features, FMA4, Enabled);
3455 } else if (Name == "xop") {
3456 setXOPLevel(Features, XOP, Enabled);
3457 } else if (Name == "sse4a") {
3458 setXOPLevel(Features, SSE4A, Enabled);
Craig Topper31db3a22013-09-16 04:54:13 +00003459 } else if (Name == "f16c") {
3460 if (Enabled)
3461 setSSELevel(Features, AVX, Enabled);
Ben Langmuir58078d02013-09-19 13:22:04 +00003462 } else if (Name == "sha") {
3463 if (Enabled)
3464 setSSELevel(Features, SSE2, Enabled);
Eric Christopher298ac302015-07-01 00:08:32 +00003465 } else if (Name == "sse4") {
3466 // We can get here via the __target__ attribute since that's not controlled
3467 // via the -msse4/-mno-sse4 command line alias. Handle this the same way
3468 // here - turn on the sse4.2 if enabled, turn off the sse4.1 level if
3469 // disabled.
3470 if (Enabled)
3471 setSSELevel(Features, SSE42, Enabled);
3472 else
3473 setSSELevel(Features, SSE41, Enabled);
Craig Topperda9fe562015-10-15 05:23:38 +00003474 } else if (Name == "xsave") {
Craig Topper840927e2016-02-29 06:51:34 +00003475 if (!Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003476 Features["xsaveopt"] = false;
3477 } else if (Name == "xsaveopt" || Name == "xsavec" || Name == "xsaves") {
Craig Topper840927e2016-02-29 06:51:34 +00003478 if (Enabled)
Craig Topperda9fe562015-10-15 05:23:38 +00003479 Features["xsave"] = true;
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003480 }
Daniel Dunbarbb36aed2009-05-06 21:07:50 +00003481}
3482
Eric Christopher3ff21b32013-10-16 21:26:26 +00003483/// handleTargetFeatures - Perform initialization based on the user
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003484/// configured set of features.
Eric Christopher3ff21b32013-10-16 21:26:26 +00003485bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
Rafael Espindolaeb265472013-08-21 21:59:03 +00003486 DiagnosticsEngine &Diags) {
Eric Christopher610fe112015-08-26 08:21:55 +00003487 for (const auto &Feature : Features) {
3488 if (Feature[0] != '+')
Daniel Dunbar979586e2009-11-11 09:38:56 +00003489 continue;
3490
Eric Christopher610fe112015-08-26 08:21:55 +00003491 if (Feature == "+aes") {
Eric Christophere1ddaf92010-04-02 23:50:19 +00003492 HasAES = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003493 } else if (Feature == "+pclmul") {
Craig Topper3f122a72012-05-31 05:18:48 +00003494 HasPCLMUL = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003495 } else if (Feature == "+lzcnt") {
Craig Topper22967d42011-12-25 05:06:45 +00003496 HasLZCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003497 } else if (Feature == "+rdrnd") {
Benjamin Kramer1e250392012-07-07 09:39:18 +00003498 HasRDRND = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003499 } else if (Feature == "+fsgsbase") {
Craig Topper8c7f2512014-11-03 06:51:41 +00003500 HasFSGSBASE = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003501 } else if (Feature == "+bmi") {
Craig Topper22967d42011-12-25 05:06:45 +00003502 HasBMI = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003503 } else if (Feature == "+bmi2") {
Craig Topper22967d42011-12-25 05:06:45 +00003504 HasBMI2 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003505 } else if (Feature == "+popcnt") {
Craig Topper1de83482011-12-29 16:10:46 +00003506 HasPOPCNT = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003507 } else if (Feature == "+rtm") {
Michael Liao625a8752012-11-10 05:17:46 +00003508 HasRTM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003509 } else if (Feature == "+prfchw") {
Michael Liao74f4eaf2013-03-26 17:52:08 +00003510 HasPRFCHW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003511 } else if (Feature == "+rdseed") {
Michael Liaoffaae352013-03-29 05:17:55 +00003512 HasRDSEED = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003513 } else if (Feature == "+adx") {
Robert Khasanov50e6f582014-09-19 09:53:48 +00003514 HasADX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003515 } else if (Feature == "+tbm") {
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003516 HasTBM = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003517 } else if (Feature == "+fma") {
Craig Topperbba778b2012-06-03 21:46:30 +00003518 HasFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003519 } else if (Feature == "+f16c") {
Manman Rena45358c2012-10-11 00:59:55 +00003520 HasF16C = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003521 } else if (Feature == "+avx512cd") {
Craig Topper679b53a2013-08-21 05:29:10 +00003522 HasAVX512CD = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003523 } else if (Feature == "+avx512er") {
Craig Topper679b53a2013-08-21 05:29:10 +00003524 HasAVX512ER = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003525 } else if (Feature == "+avx512pf") {
Craig Topper679b53a2013-08-21 05:29:10 +00003526 HasAVX512PF = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003527 } else if (Feature == "+avx512dq") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003528 HasAVX512DQ = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003529 } else if (Feature == "+avx512bw") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003530 HasAVX512BW = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003531 } else if (Feature == "+avx512vl") {
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003532 HasAVX512VL = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003533 } else if (Feature == "+avx512vbmi") {
3534 HasAVX512VBMI = true;
3535 } else if (Feature == "+avx512ifma") {
3536 HasAVX512IFMA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003537 } else if (Feature == "+sha") {
Ben Langmuir58078d02013-09-19 13:22:04 +00003538 HasSHA = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003539 } else if (Feature == "+mpx") {
3540 HasMPX = true;
3541 } else if (Feature == "+movbe") {
3542 HasMOVBE = true;
3543 } else if (Feature == "+sgx") {
3544 HasSGX = true;
Eric Christopher610fe112015-08-26 08:21:55 +00003545 } else if (Feature == "+cx16") {
Nick Lewycky50e8f482013-10-05 20:14:27 +00003546 HasCX16 = true;
Craig Toppere33f51f2015-10-16 06:22:36 +00003547 } else if (Feature == "+fxsr") {
3548 HasFXSR = true;
Craig Topperda9fe562015-10-15 05:23:38 +00003549 } else if (Feature == "+xsave") {
3550 HasXSAVE = true;
3551 } else if (Feature == "+xsaveopt") {
3552 HasXSAVEOPT = true;
3553 } else if (Feature == "+xsavec") {
3554 HasXSAVEC = true;
3555 } else if (Feature == "+xsaves") {
3556 HasXSAVES = true;
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003557 } else if (Feature == "+mwaitx") {
3558 HasMWAITX = true;
Asaf Badouha9d1e182015-12-31 14:14:07 +00003559 } else if (Feature == "+pku") {
3560 HasPKU = true;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003561 } else if (Feature == "+clflushopt") {
3562 HasCLFLUSHOPT = true;
3563 } else if (Feature == "+pcommit") {
3564 HasPCOMMIT = true;
3565 } else if (Feature == "+clwb") {
3566 HasCLWB = true;
3567 } else if (Feature == "+umip") {
3568 HasUMIP = true;
3569 } else if (Feature == "+prefetchwt1") {
3570 HasPREFETCHWT1 = true;
Nick Lewycky50e8f482013-10-05 20:14:27 +00003571 }
3572
Benjamin Kramer27402c62012-03-05 15:10:44 +00003573 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003574 .Case("+avx512f", AVX512F)
3575 .Case("+avx2", AVX2)
3576 .Case("+avx", AVX)
3577 .Case("+sse4.2", SSE42)
3578 .Case("+sse4.1", SSE41)
3579 .Case("+ssse3", SSSE3)
3580 .Case("+sse3", SSE3)
3581 .Case("+sse2", SSE2)
3582 .Case("+sse", SSE1)
Eli Friedman33465822011-07-08 23:31:17 +00003583 .Default(NoSSE);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003584 SSELevel = std::max(SSELevel, Level);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003585
Eli Friedman33465822011-07-08 23:31:17 +00003586 MMX3DNowEnum ThreeDNowLevel =
Benjamin Kramer27402c62012-03-05 15:10:44 +00003587 llvm::StringSwitch<MMX3DNowEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003588 .Case("+3dnowa", AMD3DNowAthlon)
3589 .Case("+3dnow", AMD3DNow)
3590 .Case("+mmx", MMX)
Eli Friedman33465822011-07-08 23:31:17 +00003591 .Default(NoMMX3DNow);
Eli Friedman33465822011-07-08 23:31:17 +00003592 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
Rafael Espindolae62e2792013-08-20 13:44:29 +00003593
3594 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
Eric Christopher610fe112015-08-26 08:21:55 +00003595 .Case("+xop", XOP)
3596 .Case("+fma4", FMA4)
3597 .Case("+sse4a", SSE4A)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003598 .Default(NoXOP);
3599 XOPLevel = std::max(XOPLevel, XLevel);
Daniel Dunbar979586e2009-11-11 09:38:56 +00003600 }
Eli Friedman33465822011-07-08 23:31:17 +00003601
Rafael Espindolaeb265472013-08-21 21:59:03 +00003602 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
3603 // matches the selected sse level.
Craig Topperd945d502015-10-20 00:00:17 +00003604 if ((FPMath == FP_SSE && SSELevel < SSE1) ||
3605 (FPMath == FP_387 && SSELevel >= SSE1)) {
3606 Diags.Report(diag::err_target_unsupported_fpmath) <<
3607 (FPMath == FP_SSE ? "sse" : "387");
Rafael Espindolaeb265472013-08-21 21:59:03 +00003608 return false;
3609 }
3610
Alexey Bataev00396512015-07-02 03:40:19 +00003611 SimdDefaultAlign =
Ahmed Bougacha68bf64e2015-08-27 22:24:56 +00003612 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Rafael Espindolaeb265472013-08-21 21:59:03 +00003613 return true;
Chris Lattnerc25d8a72009-03-02 22:20:04 +00003614}
Chris Lattnerecd49032009-03-02 22:27:17 +00003615
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003616/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
3617/// definitions for this particular subtarget.
Chris Lattner4ba73aa02009-03-20 15:52:06 +00003618void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003619 MacroBuilder &Builder) const {
Chris Lattnerecd49032009-03-02 22:27:17 +00003620 // Target identification.
Derek Schuffc7dd7222012-10-11 15:52:22 +00003621 if (getTriple().getArch() == llvm::Triple::x86_64) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003622 Builder.defineMacro("__amd64__");
3623 Builder.defineMacro("__amd64");
3624 Builder.defineMacro("__x86_64");
3625 Builder.defineMacro("__x86_64__");
Bob Wilsona2acb1e2014-08-08 23:46:28 +00003626 if (getTriple().getArchName() == "x86_64h") {
3627 Builder.defineMacro("__x86_64h");
3628 Builder.defineMacro("__x86_64h__");
3629 }
Chris Lattnerecd49032009-03-02 22:27:17 +00003630 } else {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003631 DefineStd(Builder, "i386", Opts);
Chris Lattnerecd49032009-03-02 22:27:17 +00003632 }
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003633
Chris Lattnerecd49032009-03-02 22:27:17 +00003634 // Subtarget options.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003635 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
3636 // truly should be based on -mtune options.
Chandler Carruth212334f2011-09-28 08:55:37 +00003637 switch (CPU) {
3638 case CK_Generic:
3639 break;
3640 case CK_i386:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003641 // The rest are coming from the i386 define above.
3642 Builder.defineMacro("__tune_i386__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003643 break;
3644 case CK_i486:
3645 case CK_WinChipC6:
3646 case CK_WinChip2:
3647 case CK_C3:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003648 defineCPUMacros(Builder, "i486");
Chandler Carruth212334f2011-09-28 08:55:37 +00003649 break;
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003650 case CK_PentiumMMX:
3651 Builder.defineMacro("__pentium_mmx__");
3652 Builder.defineMacro("__tune_pentium_mmx__");
3653 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003654 case CK_i586:
3655 case CK_Pentium:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003656 defineCPUMacros(Builder, "i586");
3657 defineCPUMacros(Builder, "pentium");
Chandler Carruth212334f2011-09-28 08:55:37 +00003658 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003659 case CK_Pentium3:
3660 case CK_Pentium3M:
3661 case CK_PentiumM:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003662 Builder.defineMacro("__tune_pentium3__");
3663 // Fallthrough
3664 case CK_Pentium2:
Chandler Carruth212334f2011-09-28 08:55:37 +00003665 case CK_C3_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003666 Builder.defineMacro("__tune_pentium2__");
3667 // Fallthrough
3668 case CK_PentiumPro:
3669 Builder.defineMacro("__tune_i686__");
3670 Builder.defineMacro("__tune_pentiumpro__");
3671 // Fallthrough
3672 case CK_i686:
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003673 Builder.defineMacro("__i686");
3674 Builder.defineMacro("__i686__");
3675 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
3676 Builder.defineMacro("__pentiumpro");
3677 Builder.defineMacro("__pentiumpro__");
Chandler Carruth212334f2011-09-28 08:55:37 +00003678 break;
3679 case CK_Pentium4:
3680 case CK_Pentium4M:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003681 defineCPUMacros(Builder, "pentium4");
Chandler Carruth212334f2011-09-28 08:55:37 +00003682 break;
3683 case CK_Yonah:
3684 case CK_Prescott:
3685 case CK_Nocona:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003686 defineCPUMacros(Builder, "nocona");
Chandler Carruth212334f2011-09-28 08:55:37 +00003687 break;
3688 case CK_Core2:
3689 case CK_Penryn:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003690 defineCPUMacros(Builder, "core2");
Chandler Carruth212334f2011-09-28 08:55:37 +00003691 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003692 case CK_Bonnell:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003693 defineCPUMacros(Builder, "atom");
Chandler Carruth212334f2011-09-28 08:55:37 +00003694 break;
Preston Gurda3c58c02013-09-13 19:27:17 +00003695 case CK_Silvermont:
Benjamin Kramerffecc842013-08-30 14:05:34 +00003696 defineCPUMacros(Builder, "slm");
3697 break;
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003698 case CK_Nehalem:
3699 case CK_Westmere:
3700 case CK_SandyBridge:
3701 case CK_IvyBridge:
3702 case CK_Haswell:
Robert Khasanov50e6f582014-09-19 09:53:48 +00003703 case CK_Broadwell:
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003704 case CK_SkylakeClient:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003705 // FIXME: Historically, we defined this legacy name, it would be nice to
3706 // remove it at some point. We've never exposed fine-grained names for
3707 // recent primary x86 CPUs, and we should keep it that way.
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003708 defineCPUMacros(Builder, "corei7");
Chandler Carruth212334f2011-09-28 08:55:37 +00003709 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003710 case CK_SkylakeServer:
Chandler Carruth04ca0bb2014-12-09 14:50:25 +00003711 defineCPUMacros(Builder, "skx");
3712 break;
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003713 case CK_Cannonlake:
3714 break;
Craig Topper449314e2013-08-20 07:09:39 +00003715 case CK_KNL:
3716 defineCPUMacros(Builder, "knl");
3717 break;
Andrey Turetskiyfd259ff2016-04-05 15:04:26 +00003718 case CK_Lakemont:
3719 Builder.defineMacro("__tune_lakemont__");
3720 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003721 case CK_K6_2:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003722 Builder.defineMacro("__k6_2__");
3723 Builder.defineMacro("__tune_k6_2__");
3724 // Fallthrough
Chandler Carruth212334f2011-09-28 08:55:37 +00003725 case CK_K6_3:
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003726 if (CPU != CK_K6_2) { // In case of fallthrough
3727 // FIXME: GCC may be enabling these in cases where some other k6
3728 // architecture is specified but -m3dnow is explicitly provided. The
3729 // exact semantics need to be determined and emulated here.
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003730 Builder.defineMacro("__k6_3__");
3731 Builder.defineMacro("__tune_k6_3__");
3732 }
Chandler Carruthdf5f48a2011-09-28 09:45:05 +00003733 // Fallthrough
3734 case CK_K6:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003735 defineCPUMacros(Builder, "k6");
Chandler Carruth212334f2011-09-28 08:55:37 +00003736 break;
3737 case CK_Athlon:
3738 case CK_AthlonThunderbird:
3739 case CK_Athlon4:
3740 case CK_AthlonXP:
3741 case CK_AthlonMP:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003742 defineCPUMacros(Builder, "athlon");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003743 if (SSELevel != NoSSE) {
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003744 Builder.defineMacro("__athlon_sse__");
Chandler Carruth5d0feef2011-09-28 09:54:11 +00003745 Builder.defineMacro("__tune_athlon_sse__");
3746 }
Chandler Carruth212334f2011-09-28 08:55:37 +00003747 break;
3748 case CK_K8:
3749 case CK_K8SSE3:
3750 case CK_x86_64:
3751 case CK_Opteron:
3752 case CK_OpteronSSE3:
3753 case CK_Athlon64:
3754 case CK_Athlon64SSE3:
3755 case CK_AthlonFX:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003756 defineCPUMacros(Builder, "k8");
Chandler Carruth212334f2011-09-28 08:55:37 +00003757 break;
Roman Divacky43eb6f82011-10-30 07:48:46 +00003758 case CK_AMDFAM10:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003759 defineCPUMacros(Builder, "amdfam10");
Roman Divacky43eb6f82011-10-30 07:48:46 +00003760 break;
Benjamin Kramer569f2152012-01-10 11:50:18 +00003761 case CK_BTVER1:
3762 defineCPUMacros(Builder, "btver1");
3763 break;
Benjamin Kramer914d7e02013-05-03 10:47:15 +00003764 case CK_BTVER2:
3765 defineCPUMacros(Builder, "btver2");
3766 break;
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003767 case CK_BDVER1:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003768 defineCPUMacros(Builder, "bdver1");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003769 break;
3770 case CK_BDVER2:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003771 defineCPUMacros(Builder, "bdver2");
Benjamin Kramer6bd51592011-12-01 18:23:59 +00003772 break;
Benjamin Kramerd9a5e2a2013-11-04 10:29:51 +00003773 case CK_BDVER3:
3774 defineCPUMacros(Builder, "bdver3");
3775 break;
Benjamin Kramer56c58222014-05-02 15:47:51 +00003776 case CK_BDVER4:
3777 defineCPUMacros(Builder, "bdver4");
3778 break;
Craig Topperc45744a2017-01-10 06:02:12 +00003779 case CK_ZNVER1:
3780 defineCPUMacros(Builder, "znver1");
3781 break;
Chandler Carruth212334f2011-09-28 08:55:37 +00003782 case CK_Geode:
Benjamin Kramere3b442d2012-01-10 11:50:09 +00003783 defineCPUMacros(Builder, "geode");
Chandler Carruth212334f2011-09-28 08:55:37 +00003784 break;
Chandler Carruth5ac1e8e2011-09-28 02:59:25 +00003785 }
Chris Lattner96e43572009-03-02 22:40:39 +00003786
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003787 // Target properties.
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003788 Builder.defineMacro("__REGISTER_PREFIX__", "");
3789
Chris Lattner6df41af2009-04-19 17:32:33 +00003790 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
3791 // functions in glibc header files that use FP Stack inline asm which the
3792 // backend can't deal with (PR879).
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003793 Builder.defineMacro("__NO_MATH_INLINES");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003794
Chandler Carruth3f7ed952011-09-28 09:54:07 +00003795 if (HasAES)
3796 Builder.defineMacro("__AES__");
3797
Craig Topper3f122a72012-05-31 05:18:48 +00003798 if (HasPCLMUL)
3799 Builder.defineMacro("__PCLMUL__");
3800
Craig Topper22967d42011-12-25 05:06:45 +00003801 if (HasLZCNT)
3802 Builder.defineMacro("__LZCNT__");
3803
Benjamin Kramer1e250392012-07-07 09:39:18 +00003804 if (HasRDRND)
3805 Builder.defineMacro("__RDRND__");
3806
Craig Topper8c7f2512014-11-03 06:51:41 +00003807 if (HasFSGSBASE)
3808 Builder.defineMacro("__FSGSBASE__");
3809
Craig Topper22967d42011-12-25 05:06:45 +00003810 if (HasBMI)
3811 Builder.defineMacro("__BMI__");
3812
3813 if (HasBMI2)
3814 Builder.defineMacro("__BMI2__");
3815
Craig Topper1de83482011-12-29 16:10:46 +00003816 if (HasPOPCNT)
3817 Builder.defineMacro("__POPCNT__");
3818
Michael Liao625a8752012-11-10 05:17:46 +00003819 if (HasRTM)
3820 Builder.defineMacro("__RTM__");
3821
Michael Liao74f4eaf2013-03-26 17:52:08 +00003822 if (HasPRFCHW)
3823 Builder.defineMacro("__PRFCHW__");
3824
Michael Liaoffaae352013-03-29 05:17:55 +00003825 if (HasRDSEED)
3826 Builder.defineMacro("__RDSEED__");
3827
Robert Khasanov50e6f582014-09-19 09:53:48 +00003828 if (HasADX)
3829 Builder.defineMacro("__ADX__");
3830
Yunzhong Gao1f6aeeb2013-09-24 19:00:58 +00003831 if (HasTBM)
3832 Builder.defineMacro("__TBM__");
3833
Ashutosh Nema51c9dd02016-05-18 11:56:23 +00003834 if (HasMWAITX)
3835 Builder.defineMacro("__MWAITX__");
3836
Rafael Espindolae62e2792013-08-20 13:44:29 +00003837 switch (XOPLevel) {
3838 case XOP:
3839 Builder.defineMacro("__XOP__");
3840 case FMA4:
Craig Topperffdb46c2011-12-30 07:33:42 +00003841 Builder.defineMacro("__FMA4__");
Rafael Espindolae62e2792013-08-20 13:44:29 +00003842 case SSE4A:
3843 Builder.defineMacro("__SSE4A__");
3844 case NoXOP:
3845 break;
3846 }
Craig Topperffdb46c2011-12-30 07:33:42 +00003847
Craig Topperbba778b2012-06-03 21:46:30 +00003848 if (HasFMA)
3849 Builder.defineMacro("__FMA__");
3850
Manman Rena45358c2012-10-11 00:59:55 +00003851 if (HasF16C)
3852 Builder.defineMacro("__F16C__");
3853
Craig Topper679b53a2013-08-21 05:29:10 +00003854 if (HasAVX512CD)
3855 Builder.defineMacro("__AVX512CD__");
3856 if (HasAVX512ER)
3857 Builder.defineMacro("__AVX512ER__");
3858 if (HasAVX512PF)
3859 Builder.defineMacro("__AVX512PF__");
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003860 if (HasAVX512DQ)
3861 Builder.defineMacro("__AVX512DQ__");
3862 if (HasAVX512BW)
3863 Builder.defineMacro("__AVX512BW__");
3864 if (HasAVX512VL)
3865 Builder.defineMacro("__AVX512VL__");
Craig Topperb4f83a02016-02-29 06:51:38 +00003866 if (HasAVX512VBMI)
3867 Builder.defineMacro("__AVX512VBMI__");
3868 if (HasAVX512IFMA)
3869 Builder.defineMacro("__AVX512IFMA__");
Craig Topper679b53a2013-08-21 05:29:10 +00003870
Ben Langmuir58078d02013-09-19 13:22:04 +00003871 if (HasSHA)
3872 Builder.defineMacro("__SHA__");
3873
Craig Toppere33f51f2015-10-16 06:22:36 +00003874 if (HasFXSR)
3875 Builder.defineMacro("__FXSR__");
Craig Topperda9fe562015-10-15 05:23:38 +00003876 if (HasXSAVE)
3877 Builder.defineMacro("__XSAVE__");
3878 if (HasXSAVEOPT)
3879 Builder.defineMacro("__XSAVEOPT__");
3880 if (HasXSAVEC)
3881 Builder.defineMacro("__XSAVEC__");
3882 if (HasXSAVES)
3883 Builder.defineMacro("__XSAVES__");
Asaf Badouha9d1e182015-12-31 14:14:07 +00003884 if (HasPKU)
3885 Builder.defineMacro("__PKU__");
Nick Lewycky50e8f482013-10-05 20:14:27 +00003886 if (HasCX16)
3887 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3888
Chris Lattner96e43572009-03-02 22:40:39 +00003889 // Each case falls through to the previous one here.
3890 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003891 case AVX512F:
Craig Topper007b0592013-08-20 07:39:54 +00003892 Builder.defineMacro("__AVX512F__");
Craig Topper23b92192012-01-09 09:19:09 +00003893 case AVX2:
3894 Builder.defineMacro("__AVX2__");
3895 case AVX:
3896 Builder.defineMacro("__AVX__");
Chris Lattner96e43572009-03-02 22:40:39 +00003897 case SSE42:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003898 Builder.defineMacro("__SSE4_2__");
Chris Lattner96e43572009-03-02 22:40:39 +00003899 case SSE41:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003900 Builder.defineMacro("__SSE4_1__");
Chris Lattner96e43572009-03-02 22:40:39 +00003901 case SSSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003902 Builder.defineMacro("__SSSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003903 case SSE3:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003904 Builder.defineMacro("__SSE3__");
Chris Lattner96e43572009-03-02 22:40:39 +00003905 case SSE2:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003906 Builder.defineMacro("__SSE2__");
3907 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
Chris Lattner96e43572009-03-02 22:40:39 +00003908 case SSE1:
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00003909 Builder.defineMacro("__SSE__");
3910 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
Eli Friedman33465822011-07-08 23:31:17 +00003911 case NoSSE:
Chris Lattner96e43572009-03-02 22:40:39 +00003912 break;
3913 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00003914
Derek Schuffc7dd7222012-10-11 15:52:22 +00003915 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003916 switch (SSELevel) {
Craig Topper9c4d17f2013-08-21 03:59:22 +00003917 case AVX512F:
Craig Topper23b92192012-01-09 09:19:09 +00003918 case AVX2:
3919 case AVX:
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00003920 case SSE42:
3921 case SSE41:
3922 case SSSE3:
3923 case SSE3:
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003924 case SSE2:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003925 Builder.defineMacro("_M_IX86_FP", Twine(2));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003926 break;
3927 case SSE1:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003928 Builder.defineMacro("_M_IX86_FP", Twine(1));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003929 break;
3930 default:
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003931 Builder.defineMacro("_M_IX86_FP", Twine(0));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003932 }
3933 }
3934
Anders Carlssone437c682010-01-27 03:47:49 +00003935 // Each case falls through to the previous one here.
Eli Friedman33465822011-07-08 23:31:17 +00003936 switch (MMX3DNowLevel) {
Anders Carlssone437c682010-01-27 03:47:49 +00003937 case AMD3DNowAthlon:
3938 Builder.defineMacro("__3dNOW_A__");
3939 case AMD3DNow:
3940 Builder.defineMacro("__3dNOW__");
Eli Friedman33465822011-07-08 23:31:17 +00003941 case MMX:
3942 Builder.defineMacro("__MMX__");
3943 case NoMMX3DNow:
Anders Carlssone437c682010-01-27 03:47:49 +00003944 break;
3945 }
Michael J. Spencera0d5eb3a2013-04-04 23:53:43 +00003946
3947 if (CPU >= CK_i486) {
3948 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3949 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3950 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3951 }
3952 if (CPU >= CK_i586)
3953 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Chris Lattnerecd49032009-03-02 22:27:17 +00003954}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00003955
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003956bool X86TargetInfo::hasFeature(StringRef Feature) const {
3957 return llvm::StringSwitch<bool>(Feature)
3958 .Case("aes", HasAES)
3959 .Case("avx", SSELevel >= AVX)
3960 .Case("avx2", SSELevel >= AVX2)
Craig Topper9c4d17f2013-08-21 03:59:22 +00003961 .Case("avx512f", SSELevel >= AVX512F)
Craig Topper679b53a2013-08-21 05:29:10 +00003962 .Case("avx512cd", HasAVX512CD)
3963 .Case("avx512er", HasAVX512ER)
3964 .Case("avx512pf", HasAVX512PF)
Robert Khasanov3b6616c2014-07-30 13:53:40 +00003965 .Case("avx512dq", HasAVX512DQ)
3966 .Case("avx512bw", HasAVX512BW)
3967 .Case("avx512vl", HasAVX512VL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003968 .Case("avx512vbmi", HasAVX512VBMI)
3969 .Case("avx512ifma", HasAVX512IFMA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003970 .Case("bmi", HasBMI)
3971 .Case("bmi2", HasBMI2)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003972 .Case("clflushopt", HasCLFLUSHOPT)
3973 .Case("clwb", HasCLWB)
Nick Lewycky50e8f482013-10-05 20:14:27 +00003974 .Case("cx16", HasCX16)
3975 .Case("f16c", HasF16C)
Craig Topperbba778b2012-06-03 21:46:30 +00003976 .Case("fma", HasFMA)
Rafael Espindolae62e2792013-08-20 13:44:29 +00003977 .Case("fma4", XOPLevel >= FMA4)
Craig Topper8c7f2512014-11-03 06:51:41 +00003978 .Case("fsgsbase", HasFSGSBASE)
Craig Toppere33f51f2015-10-16 06:22:36 +00003979 .Case("fxsr", HasFXSR)
Craig Topper8dbc5842014-11-03 07:05:26 +00003980 .Case("lzcnt", HasLZCNT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003981 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3982 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3983 .Case("mmx", MMX3DNowLevel >= MMX)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003984 .Case("movbe", HasMOVBE)
3985 .Case("mpx", HasMPX)
Craig Topper3f122a72012-05-31 05:18:48 +00003986 .Case("pclmul", HasPCLMUL)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003987 .Case("pcommit", HasPCOMMIT)
3988 .Case("pku", HasPKU)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003989 .Case("popcnt", HasPOPCNT)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003990 .Case("prefetchwt1", HasPREFETCHWT1)
Michael Liao74f4eaf2013-03-26 17:52:08 +00003991 .Case("prfchw", HasPRFCHW)
Craig Topper8dbc5842014-11-03 07:05:26 +00003992 .Case("rdrnd", HasRDRND)
Michael Liaoffaae352013-03-29 05:17:55 +00003993 .Case("rdseed", HasRDSEED)
Craig Topper8dbc5842014-11-03 07:05:26 +00003994 .Case("rtm", HasRTM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00003995 .Case("sgx", HasSGX)
Ben Langmuir58078d02013-09-19 13:22:04 +00003996 .Case("sha", HasSHA)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00003997 .Case("sse", SSELevel >= SSE1)
3998 .Case("sse2", SSELevel >= SSE2)
3999 .Case("sse3", SSELevel >= SSE3)
4000 .Case("ssse3", SSELevel >= SSSE3)
Rafael Espindola89049822013-08-23 20:21:37 +00004001 .Case("sse4.1", SSELevel >= SSE41)
4002 .Case("sse4.2", SSELevel >= SSE42)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004003 .Case("sse4a", XOPLevel >= SSE4A)
Craig Topper8dbc5842014-11-03 07:05:26 +00004004 .Case("tbm", HasTBM)
Elena Demikhovskya89df0c2016-02-21 07:41:23 +00004005 .Case("umip", HasUMIP)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004006 .Case("x86", true)
Derek Schuffc7dd7222012-10-11 15:52:22 +00004007 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
4008 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
Rafael Espindolae62e2792013-08-20 13:44:29 +00004009 .Case("xop", XOPLevel >= XOP)
Craig Topperda9fe562015-10-15 05:23:38 +00004010 .Case("xsave", HasXSAVE)
4011 .Case("xsavec", HasXSAVEC)
4012 .Case("xsaves", HasXSAVES)
4013 .Case("xsaveopt", HasXSAVEOPT)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00004014 .Default(false);
4015}
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00004016
Eric Christopherd9832702015-06-29 21:00:05 +00004017// We can't use a generic validation scheme for the features accepted here
4018// versus subtarget features accepted in the target attribute because the
4019// bitfield structure that's initialized in the runtime only supports the
4020// below currently rather than the full range of subtarget features. (See
4021// X86TargetInfo::hasFeature for a somewhat comprehensive list).
4022bool X86TargetInfo::validateCpuSupports(StringRef FeatureStr) const {
4023 return llvm::StringSwitch<bool>(FeatureStr)
4024 .Case("cmov", true)
4025 .Case("mmx", true)
4026 .Case("popcnt", true)
4027 .Case("sse", true)
4028 .Case("sse2", true)
4029 .Case("sse3", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004030 .Case("ssse3", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004031 .Case("sse4.1", true)
4032 .Case("sse4.2", true)
4033 .Case("avx", true)
4034 .Case("avx2", true)
4035 .Case("sse4a", true)
4036 .Case("fma4", true)
4037 .Case("xop", true)
4038 .Case("fma", true)
4039 .Case("avx512f", true)
4040 .Case("bmi", true)
4041 .Case("bmi2", true)
Benjamin Kramerf4c520d2016-05-20 15:21:08 +00004042 .Case("aes", true)
4043 .Case("pclmul", true)
4044 .Case("avx512vl", true)
4045 .Case("avx512bw", true)
4046 .Case("avx512dq", true)
4047 .Case("avx512cd", true)
4048 .Case("avx512er", true)
4049 .Case("avx512pf", true)
4050 .Case("avx512vbmi", true)
4051 .Case("avx512ifma", true)
Eric Christopherd9832702015-06-29 21:00:05 +00004052 .Default(false);
4053}
4054
Eli Friedman3fd920a2008-08-20 02:34:37 +00004055bool
Anders Carlsson58436352009-02-28 17:11:49 +00004056X86TargetInfo::validateAsmConstraint(const char *&Name,
Chris Lattnerd9725f72009-04-26 07:16:29 +00004057 TargetInfo::ConstraintInfo &Info) const {
Anders Carlsson58436352009-02-28 17:11:49 +00004058 switch (*Name) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004059 default: return false;
Alexey Bataev91e58602015-07-20 12:08:00 +00004060 // Constant constraints.
4061 case 'e': // 32-bit signed integer constant for use with sign-extending x86_64
4062 // instructions.
4063 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
4064 // x86_64 instructions.
4065 case 's':
4066 Info.setRequiresImmediate();
4067 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004068 case 'I':
4069 Info.setRequiresImmediate(0, 31);
4070 return true;
4071 case 'J':
4072 Info.setRequiresImmediate(0, 63);
4073 return true;
4074 case 'K':
4075 Info.setRequiresImmediate(-128, 127);
4076 return true;
4077 case 'L':
Alexey Bataev91e58602015-07-20 12:08:00 +00004078 Info.setRequiresImmediate({ int(0xff), int(0xffff), int(0xffffffff) });
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00004079 return true;
4080 case 'M':
4081 Info.setRequiresImmediate(0, 3);
4082 return true;
4083 case 'N':
4084 Info.setRequiresImmediate(0, 255);
4085 return true;
4086 case 'O':
4087 Info.setRequiresImmediate(0, 127);
4088 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004089 // Register constraints.
4090 case 'Y': // 'Y' is the first character for several 2-character constraints.
4091 // Shift the pointer to the second character of the constraint.
4092 Name++;
4093 switch (*Name) {
4094 default:
4095 return false;
4096 case '0': // First SSE register.
4097 case 't': // Any SSE register, when SSE2 is enabled.
4098 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
4099 case 'm': // Any MMX register, when inter-unit moves enabled.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004100 case 'k': // AVX512 arch mask registers: k1-k7.
Alexey Bataev91e58602015-07-20 12:08:00 +00004101 Info.setAllowsRegister();
4102 return true;
4103 }
4104 case 'f': // Any x87 floating point stack register.
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004105 // Constraint 'f' cannot be used for output operands.
4106 if (Info.ConstraintStr[0] == '=')
4107 return false;
Akira Hatanaka88ef7282014-07-18 23:30:30 +00004108 Info.setAllowsRegister();
4109 return true;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004110 case 'a': // eax.
4111 case 'b': // ebx.
4112 case 'c': // ecx.
4113 case 'd': // edx.
4114 case 'S': // esi.
4115 case 'D': // edi.
4116 case 'A': // edx:eax.
Alexey Bataev91e58602015-07-20 12:08:00 +00004117 case 't': // Top of floating point stack.
4118 case 'u': // Second from top of floating point stack.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004119 case 'q': // Any register accessible as [r]l: a, b, c, and d.
Anders Carlsson83661ac2008-10-06 00:41:45 +00004120 case 'y': // Any MMX register.
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004121 case 'v': // Any {X,Y,Z}MM register (Arch & context dependent)
Anders Carlsson5f7ee682008-10-06 19:17:39 +00004122 case 'x': // Any SSE register.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004123 case 'k': // Any AVX512 mask register (same as Yk, additionaly allows k0
4124 // for intermideate k reg operations).
Eli Friedman3fd920a2008-08-20 02:34:37 +00004125 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
Dale Johannesen46742a42010-08-24 22:33:12 +00004126 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
4127 case 'l': // "Index" registers: any general register that can be used as an
4128 // index in a base+index memory access.
4129 Info.setAllowsRegister();
4130 return true;
Alexey Bataev91e58602015-07-20 12:08:00 +00004131 // Floating point constant constraints.
Dale Johannesen46742a42010-08-24 22:33:12 +00004132 case 'C': // SSE floating point constant.
4133 case 'G': // x87 floating point constant.
Eli Friedman3fd920a2008-08-20 02:34:37 +00004134 return true;
4135 }
4136}
4137
Akira Hatanaka974131e2014-09-18 18:17:18 +00004138bool X86TargetInfo::validateOutputSize(StringRef Constraint,
4139 unsigned Size) const {
4140 // Strip off constraint modifiers.
4141 while (Constraint[0] == '=' ||
4142 Constraint[0] == '+' ||
4143 Constraint[0] == '&')
4144 Constraint = Constraint.substr(1);
4145
4146 return validateOperandSize(Constraint, Size);
4147}
4148
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004149bool X86TargetInfo::validateInputSize(StringRef Constraint,
4150 unsigned Size) const {
Akira Hatanaka974131e2014-09-18 18:17:18 +00004151 return validateOperandSize(Constraint, Size);
4152}
4153
4154bool X86TargetInfo::validateOperandSize(StringRef Constraint,
4155 unsigned Size) const {
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004156 switch (Constraint[0]) {
4157 default: break;
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004158 case 'k':
4159 // Registers k0-k7 (AVX512) size limit is 64 bit.
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004160 case 'y':
4161 return Size <= 64;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004162 case 'f':
4163 case 't':
4164 case 'u':
4165 return Size <= 128;
Michael Zuckerman62f516f2016-11-01 13:16:44 +00004166 case 'v':
Hans Wennborg3c619a42014-09-18 20:24:04 +00004167 case 'x':
Alexey Bataev91e58602015-07-20 12:08:00 +00004168 if (SSELevel >= AVX512F)
4169 // 512-bit zmm registers can be used if target supports AVX512F.
4170 return Size <= 512U;
4171 else if (SSELevel >= AVX)
4172 // 256-bit ymm registers can be used if target supports AVX.
4173 return Size <= 256U;
4174 return Size <= 128U;
4175 case 'Y':
4176 // 'Y' is the first character for several 2-character constraints.
4177 switch (Constraint[1]) {
4178 default: break;
4179 case 'm':
4180 // 'Ym' is synonymous with 'y'.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004181 case 'k':
Alexey Bataev91e58602015-07-20 12:08:00 +00004182 return Size <= 64;
4183 case 'i':
4184 case 't':
4185 // 'Yi' and 'Yt' are synonymous with 'x' when SSE2 is enabled.
4186 if (SSELevel >= AVX512F)
4187 return Size <= 512U;
4188 else if (SSELevel >= AVX)
4189 return Size <= 256U;
4190 return SSELevel >= SSE2 && Size <= 128U;
4191 }
4192
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004193 }
4194
4195 return true;
4196}
Dale Johannesen7d3dfc02010-10-29 23:12:32 +00004197
Eli Friedman3fd920a2008-08-20 02:34:37 +00004198std::string
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004199X86TargetInfo::convertConstraint(const char *&Constraint) const {
4200 switch (*Constraint) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004201 case 'a': return std::string("{ax}");
4202 case 'b': return std::string("{bx}");
4203 case 'c': return std::string("{cx}");
4204 case 'd': return std::string("{dx}");
4205 case 'S': return std::string("{si}");
4206 case 'D': return std::string("{di}");
Dale Johannesen70f564e2010-10-22 21:07:10 +00004207 case 'p': // address
4208 return std::string("im");
Eli Friedman3fd920a2008-08-20 02:34:37 +00004209 case 't': // top of floating point stack.
4210 return std::string("{st}");
4211 case 'u': // second from top of floating point stack.
4212 return std::string("{st(1)}"); // second from top of floating point stack.
Michael Zuckerman849a6a52016-10-31 17:23:52 +00004213 case 'Y':
4214 switch (Constraint[1]) {
4215 default:
4216 // Break from inner switch and fall through (copy single char),
4217 // continue parsing after copying the current constraint into
4218 // the return string.
4219 break;
4220 case 'k':
4221 // "^" hints llvm that this is a 2 letter constraint.
4222 // "Constraint++" is used to promote the string iterator
4223 // to the next constraint.
4224 return std::string("^") + std::string(Constraint++, 2);
4225 }
4226 LLVM_FALLTHROUGH;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004227 default:
Stuart Hastings7fdc6702011-06-07 23:45:05 +00004228 return std::string(1, *Constraint);
Eli Friedman3fd920a2008-08-20 02:34:37 +00004229 }
4230}
Chris Lattner5ba61f02006-10-14 07:39:34 +00004231
Eli Friedman3fd920a2008-08-20 02:34:37 +00004232// X86-32 generic target
4233class X86_32TargetInfo : public X86TargetInfo {
Chris Lattner5ba61f02006-10-14 07:39:34 +00004234public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004235 X86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4236 : X86TargetInfo(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004237 DoubleAlign = LongLongAlign = 32;
4238 LongDoubleWidth = 96;
4239 LongDoubleAlign = 32;
Nick Lewyckyf243e0d2011-12-21 04:25:47 +00004240 SuitableAlign = 128;
James Y Knightb214cbc2016-03-04 19:00:41 +00004241 resetDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128");
Eli Friedman32ca82a2009-03-29 20:31:09 +00004242 SizeType = UnsignedInt;
4243 PtrDiffType = SignedInt;
4244 IntPtrType = SignedInt;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004245 RegParmMax = 3;
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004246
4247 // Use fpret for all types.
4248 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
4249 (1 << TargetInfo::Double) |
4250 (1 << TargetInfo::LongDouble));
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004251
4252 // x86-32 has atomics up to 8 bytes
4253 // FIXME: Check that we actually have cmpxchg8b before setting
4254 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
4255 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004256 }
Craig Topper3164f332014-03-11 03:39:26 +00004257 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004258 return TargetInfo::CharPtrBuiltinVaList;
Eli Friedman3fd920a2008-08-20 02:34:37 +00004259 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004260
Craig Topper3164f332014-03-11 03:39:26 +00004261 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004262 if (RegNo == 0) return 0;
4263 if (RegNo == 1) return 2;
4264 return -1;
4265 }
Akira Hatanaka974131e2014-09-18 18:17:18 +00004266 bool validateOperandSize(StringRef Constraint,
4267 unsigned Size) const override {
Bill Wendling887b4852012-11-12 06:42:51 +00004268 switch (Constraint[0]) {
4269 default: break;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004270 case 'R':
4271 case 'q':
4272 case 'Q':
Bill Wendling887b4852012-11-12 06:42:51 +00004273 case 'a':
4274 case 'b':
4275 case 'c':
4276 case 'd':
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004277 case 'S':
4278 case 'D':
Bill Wendling3c7fed82012-11-12 18:52:32 +00004279 return Size <= 32;
Akira Hatanaka31c6d3b2014-09-17 23:35:14 +00004280 case 'A':
4281 return Size <= 64;
Bill Wendling887b4852012-11-12 06:42:51 +00004282 }
4283
Akira Hatanaka974131e2014-09-18 18:17:18 +00004284 return X86TargetInfo::validateOperandSize(Constraint, Size);
Bill Wendling887b4852012-11-12 06:42:51 +00004285 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004286 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4287 return llvm::makeArrayRef(BuiltinInfoX86, clang::X86::LastX86CommonBuiltin -
4288 Builtin::FirstTSBuiltin + 1);
4289 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004290};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004291
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004292class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
4293public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004294 NetBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4295 : NetBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {}
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004296
Craig Topper3164f332014-03-11 03:39:26 +00004297 unsigned getFloatEvalMethod() const override {
Joerg Sonnenberger0e921f22013-11-11 14:00:37 +00004298 unsigned Major, Minor, Micro;
4299 getTriple().getOSVersion(Major, Minor, Micro);
4300 // New NetBSD uses the default rounding mode.
4301 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
4302 return X86_32TargetInfo::getFloatEvalMethod();
4303 // NetBSD before 6.99.26 defaults to "double" rounding.
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004304 return 1;
4305 }
4306};
Joerg Sonnenberger16237142012-01-06 18:32:26 +00004307
Eli Friedmane3aa4542009-07-05 18:47:56 +00004308class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
4309public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004310 OpenBSDI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4311 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedmane3aa4542009-07-05 18:47:56 +00004312 SizeType = UnsignedLong;
4313 IntPtrType = SignedLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004314 PtrDiffType = SignedLong;
Eli Friedmane3aa4542009-07-05 18:47:56 +00004315 }
4316};
Eli Friedmane3aa4542009-07-05 18:47:56 +00004317
Eli Friedman9fa28852012-08-08 23:57:20 +00004318class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
4319public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004320 BitrigI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4321 : BitrigTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman9fa28852012-08-08 23:57:20 +00004322 SizeType = UnsignedLong;
4323 IntPtrType = SignedLong;
4324 PtrDiffType = SignedLong;
4325 }
4326};
Eli Friedman9fa28852012-08-08 23:57:20 +00004327
Torok Edwinb2b37c62009-06-30 17:10:35 +00004328class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004329public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004330 DarwinI386TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4331 : DarwinTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman3fd920a2008-08-20 02:34:37 +00004332 LongDoubleWidth = 128;
4333 LongDoubleAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004334 SuitableAlign = 128;
Tim Northover5627d392015-10-30 16:30:45 +00004335 MaxVectorAlign = 256;
4336 // The watchOS simulator uses the builtin bool type for Objective-C.
4337 llvm::Triple T = llvm::Triple(Triple);
4338 if (T.isWatchOS())
4339 UseSignedCharForObjCBool = false;
Eli Friedman32ca82a2009-03-29 20:31:09 +00004340 SizeType = UnsignedLong;
4341 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00004342 resetDataLayout("e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128");
Daniel Dunbarbd606522010-05-27 00:35:16 +00004343 HasAlignMac68kSupport = true;
Torok Edwin4e054162009-06-30 17:00:25 +00004344 }
4345
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004346 bool handleTargetFeatures(std::vector<std::string> &Features,
4347 DiagnosticsEngine &Diags) override {
4348 if (!DarwinTargetInfo<X86_32TargetInfo>::handleTargetFeatures(Features,
4349 Diags))
4350 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004351 // We now know the features we have: we can decide how to align vectors.
4352 MaxVectorAlign =
4353 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004354 return true;
4355 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004356};
Daniel Dunbar10de9e62009-06-29 20:52:51 +00004357
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004358// x86-32 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004359class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004360public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004361 WindowsX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4362 : WindowsTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Chris Lattner46be2e12009-06-24 17:12:15 +00004363 WCharType = UnsignedShort;
Eli Friedmanebb9e4d2009-06-08 21:16:17 +00004364 DoubleAlign = LongLongAlign = 64;
Reid Kleckner7510c092015-04-01 16:45:06 +00004365 bool IsWinCOFF =
4366 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
James Y Knightb214cbc2016-03-04 19:00:41 +00004367 resetDataLayout(IsWinCOFF
4368 ? "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
4369 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32");
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004370 }
Craig Topper3164f332014-03-11 03:39:26 +00004371 void getTargetDefines(const LangOptions &Opts,
4372 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004373 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
4374 }
4375};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004376
4377// x86-32 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004378class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004379public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004380 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple,
4381 const TargetOptions &Opts)
4382 : WindowsX86_32TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004383 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004384 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004385 }
Craig Topper3164f332014-03-11 03:39:26 +00004386 void getTargetDefines(const LangOptions &Opts,
4387 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004388 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
4389 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
4390 // The value of the following reflects processor type.
4391 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
4392 // We lost the original triple, so we use the default.
4393 Builder.defineMacro("_M_IX86", "600");
4394 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004395};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004396
David Majnemerae1ed0e2015-05-28 04:36:18 +00004397static void addCygMingDefines(const LangOptions &Opts, MacroBuilder &Builder) {
Eric Christopherb093d692015-10-09 18:39:59 +00004398 // Mingw and cygwin define __declspec(a) to __attribute__((a)). Clang
4399 // supports __declspec natively under -fms-extensions, but we define a no-op
4400 // __declspec macro anyway for pre-processor compatibility.
Reid Kleckner47606832014-04-21 20:58:00 +00004401 if (Opts.MicrosoftExt)
4402 Builder.defineMacro("__declspec", "__declspec");
4403 else
4404 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
4405
4406 if (!Opts.MicrosoftExt) {
4407 // Provide macros for all the calling convention keywords. Provide both
4408 // single and double underscore prefixed variants. These are available on
4409 // x64 as well as x86, even though they have no effect.
4410 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
4411 for (const char *CC : CCs) {
Reid Kleckner70cfa662014-04-21 22:29:45 +00004412 std::string GCCSpelling = "__attribute__((__";
4413 GCCSpelling += CC;
4414 GCCSpelling += "__))";
Reid Kleckner47606832014-04-21 20:58:00 +00004415 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
4416 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
4417 }
4418 }
4419}
4420
David Majnemerae1ed0e2015-05-28 04:36:18 +00004421static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
4422 Builder.defineMacro("__MSVCRT__");
4423 Builder.defineMacro("__MINGW32__");
4424 addCygMingDefines(Opts, Builder);
4425}
4426
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004427// x86-32 MinGW target
4428class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
4429public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004430 MinGWX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4431 : WindowsX86_32TargetInfo(Triple, Opts) {}
Craig Topper3164f332014-03-11 03:39:26 +00004432 void getTargetDefines(const LangOptions &Opts,
4433 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004434 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004435 DefineStd(Builder, "WIN32", Opts);
4436 DefineStd(Builder, "WINNT", Opts);
4437 Builder.defineMacro("_X86_");
Reid Kleckner47606832014-04-21 20:58:00 +00004438 addMinGWDefines(Opts, Builder);
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004439 }
4440};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004441
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004442// x86-32 Cygwin target
4443class CygwinX86_32TargetInfo : public X86_32TargetInfo {
4444public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004445 CygwinX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4446 : X86_32TargetInfo(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004447 WCharType = UnsignedShort;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004448 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00004449 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 +00004450 }
Craig Topper3164f332014-03-11 03:39:26 +00004451 void getTargetDefines(const LangOptions &Opts,
4452 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004453 X86_32TargetInfo::getTargetDefines(Opts, Builder);
NAKAMURA Takumi02f43952012-12-14 10:17:26 +00004454 Builder.defineMacro("_X86_");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004455 Builder.defineMacro("__CYGWIN__");
4456 Builder.defineMacro("__CYGWIN32__");
David Majnemerae1ed0e2015-05-28 04:36:18 +00004457 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004458 DefineStd(Builder, "unix", Opts);
Douglas Gregor3ecc6652010-04-21 05:52:38 +00004459 if (Opts.CPlusPlus)
4460 Builder.defineMacro("_GNU_SOURCE");
Eli Friedmanaa27a872009-06-08 06:11:14 +00004461 }
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004462};
Eli Friedmanc968a6a2008-08-21 01:40:19 +00004463
Chris Lattnerb986aba2010-04-11 19:29:39 +00004464// x86-32 Haiku target
Reid Kleckner330fb172016-05-11 16:19:05 +00004465class HaikuX86_32TargetInfo : public HaikuTargetInfo<X86_32TargetInfo> {
Chris Lattnerb986aba2010-04-11 19:29:39 +00004466public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004467 HaikuX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Reid Kleckner330fb172016-05-11 16:19:05 +00004468 : HaikuTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Eli Friedman04831922010-08-22 01:00:03 +00004469 }
Craig Topper3164f332014-03-11 03:39:26 +00004470 void getTargetDefines(const LangOptions &Opts,
4471 MacroBuilder &Builder) const override {
Reid Kleckner330fb172016-05-11 16:19:05 +00004472 HaikuTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
Chris Lattnerb986aba2010-04-11 19:29:39 +00004473 Builder.defineMacro("__INTEL__");
Chris Lattnerb986aba2010-04-11 19:29:39 +00004474 }
4475};
Chris Lattnerb986aba2010-04-11 19:29:39 +00004476
Alexey Bataevc99b0492015-11-25 09:24:26 +00004477// X86-32 MCU target
4478class MCUX86_32TargetInfo : public X86_32TargetInfo {
4479public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004480 MCUX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4481 : X86_32TargetInfo(Triple, Opts) {
Alexey Bataevc99b0492015-11-25 09:24:26 +00004482 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004483 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
James Y Knightb214cbc2016-03-04 19:00:41 +00004484 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 +00004485 WIntType = UnsignedInt;
Alexey Bataevc99b0492015-11-25 09:24:26 +00004486 }
4487
4488 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4489 // On MCU we support only C calling convention.
4490 return CC == CC_C ? CCCR_OK : CCCR_Warning;
4491 }
4492
4493 void getTargetDefines(const LangOptions &Opts,
4494 MacroBuilder &Builder) const override {
4495 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4496 Builder.defineMacro("__iamcu");
4497 Builder.defineMacro("__iamcu__");
4498 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00004499
4500 bool allowsLargerPreferedTypeAlignment() const override {
4501 return false;
4502 }
Alexey Bataevc99b0492015-11-25 09:24:26 +00004503};
4504
Douglas Gregor9fabd852011-07-01 22:41:14 +00004505// RTEMS Target
4506template<typename Target>
4507class RTEMSTargetInfo : public OSTargetInfo<Target> {
4508protected:
Craig Topper3164f332014-03-11 03:39:26 +00004509 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4510 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004511 // RTEMS defines; list based off of gcc output
4512
Douglas Gregor9fabd852011-07-01 22:41:14 +00004513 Builder.defineMacro("__rtems__");
4514 Builder.defineMacro("__ELF__");
4515 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004516
Douglas Gregor9fabd852011-07-01 22:41:14 +00004517public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004518 RTEMSTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4519 : OSTargetInfo<Target>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004520 switch (Triple.getArch()) {
4521 default:
4522 case llvm::Triple::x86:
4523 // this->MCountName = ".mcount";
4524 break;
4525 case llvm::Triple::mips:
4526 case llvm::Triple::mipsel:
4527 case llvm::Triple::ppc:
4528 case llvm::Triple::ppc64:
Bill Schmidt778d3872013-07-26 01:36:11 +00004529 case llvm::Triple::ppc64le:
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004530 // this->MCountName = "_mcount";
4531 break;
4532 case llvm::Triple::arm:
4533 // this->MCountName = "__mcount";
4534 break;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004535 }
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004536 }
Douglas Gregor9fabd852011-07-01 22:41:14 +00004537};
4538
Douglas Gregor9fabd852011-07-01 22:41:14 +00004539// x86-32 RTEMS target
4540class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
4541public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004542 RTEMSX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4543 : X86_32TargetInfo(Triple, Opts) {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004544 SizeType = UnsignedLong;
4545 IntPtrType = SignedLong;
4546 PtrDiffType = SignedLong;
Douglas Gregor9fabd852011-07-01 22:41:14 +00004547 }
Craig Topper3164f332014-03-11 03:39:26 +00004548 void getTargetDefines(const LangOptions &Opts,
4549 MacroBuilder &Builder) const override {
Douglas Gregor9fabd852011-07-01 22:41:14 +00004550 X86_32TargetInfo::getTargetDefines(Opts, Builder);
4551 Builder.defineMacro("__INTEL__");
4552 Builder.defineMacro("__rtems__");
4553 }
4554};
Douglas Gregor9fabd852011-07-01 22:41:14 +00004555
Eli Friedman3fd920a2008-08-20 02:34:37 +00004556// x86-64 generic target
4557class X86_64TargetInfo : public X86TargetInfo {
4558public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004559 X86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4560 : X86TargetInfo(Triple, Opts) {
David Blaikie40f842d2014-07-10 18:46:15 +00004561 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
David Majnemer8fa8c382015-03-17 23:55:00 +00004562 bool IsWinCOFF =
4563 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
Zinovy Nis1db95732014-07-10 15:27:19 +00004564 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
Eli Friedmanb5366062008-05-20 14:21:01 +00004565 LongDoubleWidth = 128;
4566 LongDoubleAlign = 128;
Rafael Espindolae971b9a2010-06-04 23:15:27 +00004567 LargeArrayMinWidth = 128;
4568 LargeArrayAlign = 128;
Nick Lewyckyf59e1292011-12-16 22:34:14 +00004569 SuitableAlign = 128;
Zinovy Nis1db95732014-07-10 15:27:19 +00004570 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
4571 PtrDiffType = IsX32 ? SignedInt : SignedLong;
4572 IntPtrType = IsX32 ? SignedInt : SignedLong;
4573 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
Zinovy Nis1db95732014-07-10 15:27:19 +00004574 Int64Type = IsX32 ? SignedLongLong : SignedLong;
Anton Korobeynikov6953ef22009-04-03 23:38:25 +00004575 RegParmMax = 6;
Chris Lattnerd0a79b22009-02-05 07:32:46 +00004576
Eric Christopher917e9522014-11-18 22:36:15 +00004577 // Pointers are 32-bit in x32.
James Y Knightb214cbc2016-03-04 19:00:41 +00004578 resetDataLayout(IsX32
4579 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
4580 : IsWinCOFF ? "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
4581 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128");
Daniel Dunbar6f2e8392010-07-14 23:39:36 +00004582
4583 // Use fpret only for long double.
4584 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004585
Anders Carlsson2f1a6c32011-10-31 16:27:11 +00004586 // Use fp2ret for _Complex long double.
4587 ComplexLongDoubleUsesFP2Ret = true;
4588
Charles Davisc7d5c942015-09-17 20:55:33 +00004589 // Make __builtin_ms_va_list available.
4590 HasBuiltinMSVaList = true;
4591
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004592 // x86-64 has atomics up to 16 bytes.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00004593 MaxAtomicPromoteWidth = 128;
Tim Northover1471cb12014-07-02 10:25:45 +00004594 MaxAtomicInlineWidth = 128;
Chris Lattner10a5b382007-01-29 05:24:35 +00004595 }
Craig Topper3164f332014-03-11 03:39:26 +00004596 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004597 return TargetInfo::X86_64ABIBuiltinVaList;
Anders Carlsson5fa3f342007-11-24 23:38:12 +00004598 }
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004599
Craig Topper3164f332014-03-11 03:39:26 +00004600 int getEHDataRegisterNumber(unsigned RegNo) const override {
Chris Lattnerd545ad12009-09-23 06:06:36 +00004601 if (RegNo == 0) return 0;
4602 if (RegNo == 1) return 1;
4603 return -1;
4604 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004605
Craig Topper3164f332014-03-11 03:39:26 +00004606 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00004607 switch (CC) {
4608 case CC_C:
4609 case CC_Swift:
4610 case CC_X86VectorCall:
4611 case CC_IntelOclBicc:
4612 case CC_X86_64Win64:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00004613 case CC_PreserveMost:
4614 case CC_PreserveAll:
Erich Keane757d3172016-11-02 18:29:35 +00004615 case CC_X86RegCall:
John McCall477f2bb2016-03-03 06:39:32 +00004616 return CCCR_OK;
4617 default:
4618 return CCCR_Warning;
4619 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004620 }
4621
Craig Topper3164f332014-03-11 03:39:26 +00004622 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
Aaron Ballman02df2e02012-12-09 17:45:41 +00004623 return CC_C;
Aaron Ballmane91c6be2012-10-02 14:26:08 +00004624 }
4625
Pavel Chupinfd223e12014-08-04 12:39:43 +00004626 // for x32 we need it here explicitly
4627 bool hasInt128Type() const override { return true; }
Reid Klecknerf27e7522016-02-01 18:58:24 +00004628 unsigned getUnwindWordWidth() const override { return 64; }
4629 unsigned getRegisterWidth() const override { return 64; }
Akira Hatanaka8c26ea62015-11-18 00:15:28 +00004630
4631 bool validateGlobalRegisterVariable(StringRef RegName,
4632 unsigned RegSize,
4633 bool &HasSizeMismatch) const override {
4634 // rsp and rbp are the only 64-bit registers the x86 backend can currently
4635 // handle.
4636 if (RegName.equals("rsp") || RegName.equals("rbp")) {
4637 // Check that the register size is 64-bit.
4638 HasSizeMismatch = RegSize != 64;
4639 return true;
4640 }
4641
4642 // Check if the register is a 32-bit register the backend can handle.
4643 return X86TargetInfo::validateGlobalRegisterVariable(RegName, RegSize,
4644 HasSizeMismatch);
4645 }
Albert Gutowskif3a0bce2016-10-04 22:29:49 +00004646 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
4647 return llvm::makeArrayRef(BuiltinInfoX86,
4648 X86::LastTSBuiltin - Builtin::FirstTSBuiltin);
4649 }
Eli Friedman3fd920a2008-08-20 02:34:37 +00004650};
Eli Friedman3fd920a2008-08-20 02:34:37 +00004651
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004652// x86-64 Windows target
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004653class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004654public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004655 WindowsX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4656 : WindowsTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004657 WCharType = UnsignedShort;
Mike Stumpaf9afe92009-10-08 23:00:00 +00004658 LongWidth = LongAlign = 32;
Michael J. Spencerfeb799c2010-10-18 07:10:59 +00004659 DoubleAlign = LongLongAlign = 64;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004660 IntMaxType = SignedLongLong;
Nate Begeman6e8865a2010-07-21 02:02:56 +00004661 Int64Type = SignedLongLong;
Cameron Esfahanieb856502010-09-15 00:28:12 +00004662 SizeType = UnsignedLongLong;
4663 PtrDiffType = SignedLongLong;
4664 IntPtrType = SignedLongLong;
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004665 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004666
Craig Topper3164f332014-03-11 03:39:26 +00004667 void getTargetDefines(const LangOptions &Opts,
4668 MacroBuilder &Builder) const override {
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004669 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004670 Builder.defineMacro("_WIN64");
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004671 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004672
Craig Topper3164f332014-03-11 03:39:26 +00004673 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00004674 return TargetInfo::CharPtrBuiltinVaList;
NAKAMURA Takumia2e468c2011-01-17 22:56:23 +00004675 }
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004676
Craig Topper3164f332014-03-11 03:39:26 +00004677 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004678 switch (CC) {
4679 case CC_X86StdCall:
4680 case CC_X86ThisCall:
4681 case CC_X86FastCall:
4682 return CCCR_Ignore;
4683 case CC_C:
4684 case CC_X86VectorCall:
4685 case CC_IntelOclBicc:
4686 case CC_X86_64SysV:
Arnold Schwaighofer4fc955e2016-10-12 18:59:24 +00004687 case CC_Swift:
Erich Keane757d3172016-11-02 18:29:35 +00004688 case CC_X86RegCall:
Reid Kleckner9fde2e02015-02-26 19:43:46 +00004689 return CCCR_OK;
4690 default:
4691 return CCCR_Warning;
4692 }
Charles Davisb5a214e2013-08-30 04:39:01 +00004693 }
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004694};
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004695
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004696// x86-64 Windows Visual Studio target
Saleem Abdulrasool79ed5d42014-04-04 05:08:53 +00004697class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004698public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004699 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple,
4700 const TargetOptions &Opts)
4701 : WindowsX86_64TargetInfo(Triple, Opts) {
Eli Friedman015d6282011-03-22 21:25:11 +00004702 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004703 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004704 }
Craig Topper3164f332014-03-11 03:39:26 +00004705 void getTargetDefines(const LangOptions &Opts,
4706 MacroBuilder &Builder) const override {
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004707 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
4708 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
David Majnemerb856e8f2015-07-26 23:17:29 +00004709 Builder.defineMacro("_M_X64", "100");
4710 Builder.defineMacro("_M_AMD64", "100");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004711 }
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004712};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004713
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004714// x86-64 MinGW target
4715class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
4716public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004717 MinGWX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4718 : WindowsX86_64TargetInfo(Triple, Opts) {
Reid Kleckner11a17192015-10-28 22:29:52 +00004719 // Mingw64 rounds long double size and alignment up to 16 bytes, but sticks
4720 // with x86 FP ops. Weird.
4721 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00004722 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended();
Reid Kleckner11a17192015-10-28 22:29:52 +00004723 }
4724
Craig Topper3164f332014-03-11 03:39:26 +00004725 void getTargetDefines(const LangOptions &Opts,
4726 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004727 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
Michael J. Spencer54bf3c32010-10-21 08:22:51 +00004728 DefineStd(Builder, "WIN64", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00004729 Builder.defineMacro("__MINGW64__");
Reid Kleckner47606832014-04-21 20:58:00 +00004730 addMinGWDefines(Opts, Builder);
Reid Klecknere070b992014-11-14 02:01:10 +00004731
4732 // GCC defines this macro when it is using __gxx_personality_seh0.
4733 if (!Opts.SjLjExceptions)
4734 Builder.defineMacro("__SEH__");
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004735 }
4736};
Daniel Dunbar3e7a7232009-09-23 07:31:35 +00004737
Yaron Kerend030d112015-07-22 17:38:19 +00004738// x86-64 Cygwin target
4739class CygwinX86_64TargetInfo : public X86_64TargetInfo {
4740public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004741 CygwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4742 : X86_64TargetInfo(Triple, Opts) {
Yaron Kerend030d112015-07-22 17:38:19 +00004743 TLSSupported = false;
4744 WCharType = UnsignedShort;
4745 }
4746 void getTargetDefines(const LangOptions &Opts,
4747 MacroBuilder &Builder) const override {
4748 X86_64TargetInfo::getTargetDefines(Opts, Builder);
4749 Builder.defineMacro("__x86_64__");
4750 Builder.defineMacro("__CYGWIN__");
4751 Builder.defineMacro("__CYGWIN64__");
4752 addCygMingDefines(Opts, Builder);
Saleem Abdulrasool56027092017-02-07 19:00:06 +00004753 DefineStd(Builder, "unix", Opts);
Yaron Kerend030d112015-07-22 17:38:19 +00004754 if (Opts.CPlusPlus)
4755 Builder.defineMacro("_GNU_SOURCE");
4756
4757 // GCC defines this macro when it is using __gxx_personality_seh0.
4758 if (!Opts.SjLjExceptions)
4759 Builder.defineMacro("__SEH__");
4760 }
4761};
4762
Eli Friedman2857ccb2009-07-01 03:36:11 +00004763class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
4764public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004765 DarwinX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4766 : DarwinTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman2857ccb2009-07-01 03:36:11 +00004767 Int64Type = SignedLongLong;
Tim Northovera2ee4332014-03-29 15:09:45 +00004768 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
4769 llvm::Triple T = llvm::Triple(Triple);
Bob Wilson946c04c2014-10-19 02:19:27 +00004770 if (T.isiOS())
Tim Northovera2ee4332014-03-29 15:09:45 +00004771 UseSignedCharForObjCBool = false;
James Y Knightb214cbc2016-03-04 19:00:41 +00004772 resetDataLayout("e-m:o-i64:64-f80:128-n8:16:32:64-S128");
Eli Friedman2857ccb2009-07-01 03:36:11 +00004773 }
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004774
4775 bool handleTargetFeatures(std::vector<std::string> &Features,
4776 DiagnosticsEngine &Diags) override {
4777 if (!DarwinTargetInfo<X86_64TargetInfo>::handleTargetFeatures(Features,
4778 Diags))
4779 return false;
Ahmed Bougacha02b7b562015-08-27 22:42:12 +00004780 // We now know the features we have: we can decide how to align vectors.
4781 MaxVectorAlign =
4782 hasFeature("avx512f") ? 512 : hasFeature("avx") ? 256 : 128;
Ahmed Bougacha82b619e2015-08-27 22:30:38 +00004783 return true;
4784 }
Eli Friedman2857ccb2009-07-01 03:36:11 +00004785};
Eli Friedman2857ccb2009-07-01 03:36:11 +00004786
Eli Friedman245f2292009-07-05 22:31:18 +00004787class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
4788public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004789 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4790 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Eli Friedman245f2292009-07-05 22:31:18 +00004791 IntMaxType = SignedLongLong;
Eli Friedman245f2292009-07-05 22:31:18 +00004792 Int64Type = SignedLongLong;
4793 }
4794};
Eli Friedman245f2292009-07-05 22:31:18 +00004795
Eli Friedman9fa28852012-08-08 23:57:20 +00004796class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
4797public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00004798 BitrigX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
4799 : BitrigTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004800 IntMaxType = SignedLongLong;
Benjamin Kramerb1276b42013-06-29 16:37:14 +00004801 Int64Type = SignedLongLong;
Eli Friedman9fa28852012-08-08 23:57:20 +00004802 }
4803};
Tim Northover9bb857a2013-01-31 12:13:10 +00004804
Eli Friedmanf05b7722008-08-20 07:44:10 +00004805class ARMTargetInfo : public TargetInfo {
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004806 // Possible FPU choices.
4807 enum FPUMode {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00004808 VFP2FPU = (1 << 0),
4809 VFP3FPU = (1 << 1),
4810 VFP4FPU = (1 << 2),
Bernard Ogdenda13af32013-10-24 18:32:51 +00004811 NeonFPU = (1 << 3),
4812 FPARMV8 = (1 << 4)
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004813 };
4814
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004815 // Possible HWDiv features.
4816 enum HWDivMode {
4817 HWDivThumb = (1 << 0),
4818 HWDivARM = (1 << 1)
4819 };
4820
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004821 static bool FPUModeIsVFP(FPUMode Mode) {
Bernard Ogdenda13af32013-10-24 18:32:51 +00004822 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004823 }
4824
4825 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4826 static const char * const GCCRegNames[];
Daniel Dunbar1da76c42009-09-17 07:03:19 +00004827
Daniel Dunbaracde99e2009-12-18 18:42:37 +00004828 std::string ABI, CPU;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004829
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004830 StringRef CPUProfile;
4831 StringRef CPUAttr;
4832
Rafael Espindolaeb265472013-08-21 21:59:03 +00004833 enum {
4834 FP_Default,
4835 FP_VFP,
4836 FP_Neon
4837 } FPMath;
4838
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004839 unsigned ArchISA;
Renato Goline84b0002015-10-08 16:43:26 +00004840 unsigned ArchKind = llvm::ARM::AK_ARMV4T;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004841 unsigned ArchProfile;
4842 unsigned ArchVersion;
4843
Bernard Ogdenda13af32013-10-24 18:32:51 +00004844 unsigned FPU : 5;
Daniel Dunbar0def3d12009-12-21 23:28:17 +00004845
Logan Chien57086ce2012-10-10 06:56:20 +00004846 unsigned IsAAPCS : 1;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00004847 unsigned HWDiv : 2;
Daniel Dunbar893d4752009-12-19 04:15:38 +00004848
4849 // Initialized via features.
4850 unsigned SoftFloat : 1;
4851 unsigned SoftFloatABI : 1;
Daniel Dunbarb4091a92009-09-14 00:35:03 +00004852
Bernard Ogden18b57012013-10-29 09:47:51 +00004853 unsigned CRC : 1;
Tim Northover02e38602014-02-03 17:28:04 +00004854 unsigned Crypto : 1;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00004855 unsigned DSP : 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00004856 unsigned Unaligned : 1;
4857
4858 enum {
4859 LDREX_B = (1 << 0), /// byte (8-bit)
4860 LDREX_H = (1 << 1), /// half (16-bit)
4861 LDREX_W = (1 << 2), /// word (32-bit)
4862 LDREX_D = (1 << 3), /// double (64-bit)
4863 };
4864
4865 uint32_t LDREX;
Bernard Ogden18b57012013-10-29 09:47:51 +00004866
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00004867 // ACLE 6.5.1 Hardware floating point
4868 enum {
4869 HW_FP_HP = (1 << 1), /// half (16-bit)
4870 HW_FP_SP = (1 << 2), /// single (32-bit)
4871 HW_FP_DP = (1 << 3), /// double (64-bit)
4872 };
4873 uint32_t HW_FP;
4874
Chris Lattner5cc15e02010-03-03 19:03:45 +00004875 static const Builtin::Info BuiltinInfo[];
4876
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004877 void setABIAAPCS() {
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004878 IsAAPCS = true;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004879
4880 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
Rafael Espindolac418ae92014-01-03 19:22:05 +00004881 const llvm::Triple &T = getTriple();
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004882
Renato Golin0201a9e2016-09-22 19:28:20 +00004883 // size_t is unsigned long on MachO-derived environments, NetBSD,
4884 // OpenBSD and Bitrig.
Renato Golin9ba39232015-02-27 16:35:48 +00004885 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD ||
Renato Golin0201a9e2016-09-22 19:28:20 +00004886 T.getOS() == llvm::Triple::OpenBSD ||
Renato Golin9ba39232015-02-27 16:35:48 +00004887 T.getOS() == llvm::Triple::Bitrig)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004888 SizeType = UnsignedLong;
4889 else
4890 SizeType = UnsignedInt;
4891
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004892 switch (T.getOS()) {
4893 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00004894 case llvm::Triple::OpenBSD:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004895 WCharType = SignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004896 break;
4897 case llvm::Triple::Win32:
4898 WCharType = UnsignedShort;
4899 break;
4900 case llvm::Triple::Linux:
4901 default:
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004902 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
4903 WCharType = UnsignedInt;
Saleem Abdulrasool6323a2d2014-05-04 01:56:04 +00004904 break;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004905 }
4906
4907 UseBitFieldTypeAlignment = true;
4908
4909 ZeroLengthBitfieldBoundary = 0;
4910
Tim Northover147cd2f2014-10-14 22:12:21 +00004911 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
4912 // so set preferred for small types to 32.
4913 if (T.isOSBinFormatMachO()) {
James Y Knightb214cbc2016-03-04 19:00:41 +00004914 resetDataLayout(BigEndian
4915 ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4916 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Tim Northover147cd2f2014-10-14 22:12:21 +00004917 } else if (T.isOSWindows()) {
Tim Northover147cd2f2014-10-14 22:12:21 +00004918 assert(!BigEndian && "Windows on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004919 resetDataLayout("e"
4920 "-m:w"
4921 "-p:32:32"
4922 "-i64:64"
4923 "-v128:64:128"
4924 "-a:0:32"
4925 "-n32"
4926 "-S64");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00004927 } else if (T.isOSNaCl()) {
4928 assert(!BigEndian && "NaCl on ARM does not support big endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004929 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004930 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00004931 resetDataLayout(BigEndian
4932 ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
4933 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004934 }
4935
4936 // FIXME: Enumerated types are variable width in straight AAPCS.
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004937 }
4938
Tim Northover5627d392015-10-30 16:30:45 +00004939 void setABIAPCS(bool IsAAPCS16) {
Rafael Espindolac418ae92014-01-03 19:22:05 +00004940 const llvm::Triple &T = getTriple();
4941
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004942 IsAAPCS = false;
4943
Tim Northover5627d392015-10-30 16:30:45 +00004944 if (IsAAPCS16)
4945 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
4946 else
4947 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004948
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004949 // size_t is unsigned int on FreeBSD.
Rafael Espindolac418ae92014-01-03 19:22:05 +00004950 if (T.getOS() == llvm::Triple::FreeBSD)
Rafael Espindolaafa854c2013-12-18 20:24:51 +00004951 SizeType = UnsignedInt;
4952 else
Rafael Espindolad6c2b722013-12-18 19:47:32 +00004953 SizeType = UnsignedLong;
4954
4955 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
4956 WCharType = SignedInt;
4957
4958 // Do not respect the alignment of bit-field types when laying out
4959 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
4960 UseBitFieldTypeAlignment = false;
4961
4962 /// gcc forces the alignment to 4 bytes, regardless of the type of the
4963 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
4964 /// gcc.
4965 ZeroLengthBitfieldBoundary = 32;
4966
Tim Northover5627d392015-10-30 16:30:45 +00004967 if (T.isOSBinFormatMachO() && IsAAPCS16) {
4968 assert(!BigEndian && "AAPCS16 does not support big-endian");
James Y Knightb214cbc2016-03-04 19:00:41 +00004969 resetDataLayout("e-m:o-p:32:32-i64:64-a:0:32-n32-S128");
Tim Northover5627d392015-10-30 16:30:45 +00004970 } else if (T.isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00004971 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004972 BigEndian
4973 ? "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 +00004974 : "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 +00004975 else
James Y Knightb214cbc2016-03-04 19:00:41 +00004976 resetDataLayout(
Tim Northover147cd2f2014-10-14 22:12:21 +00004977 BigEndian
4978 ? "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 +00004979 : "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 +00004980
4981 // FIXME: Override "preferred align" for double and long long.
4982 }
4983
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004984 void setArchInfo() {
4985 StringRef ArchName = getTriple().getArchName();
4986
Renato Goline84b0002015-10-08 16:43:26 +00004987 ArchISA = llvm::ARM::parseArchISA(ArchName);
4988 CPU = llvm::ARM::getDefaultCPU(ArchName);
4989 unsigned AK = llvm::ARM::parseArch(ArchName);
4990 if (AK != llvm::ARM::AK_INVALID)
4991 ArchKind = AK;
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004992 setArchInfo(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004993 }
4994
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004995 void setArchInfo(unsigned Kind) {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00004996 StringRef SubArch;
4997
4998 // cache TargetParser info
Vladimir Sukharev457d3412015-08-19 14:50:18 +00004999 ArchKind = Kind;
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005000 SubArch = llvm::ARM::getSubArch(ArchKind);
5001 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
5002 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005003
5004 // cache CPU related strings
5005 CPUAttr = getCPUAttr();
5006 CPUProfile = getCPUProfile();
5007 }
5008
5009 void setAtomic() {
Eric Christopherb093d692015-10-09 18:39:59 +00005010 // when triple does not specify a sub arch,
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005011 // then we are not using inline atomics
Renato Goline84b0002015-10-08 16:43:26 +00005012 bool ShouldUseInlineAtomic =
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005013 (ArchISA == llvm::ARM::IK_ARM && ArchVersion >= 6) ||
5014 (ArchISA == llvm::ARM::IK_THUMB && ArchVersion >= 7);
Eric Christopherb093d692015-10-09 18:39:59 +00005015 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005016 if (ArchProfile == llvm::ARM::PK_M) {
5017 MaxAtomicPromoteWidth = 32;
5018 if (ShouldUseInlineAtomic)
5019 MaxAtomicInlineWidth = 32;
5020 }
5021 else {
5022 MaxAtomicPromoteWidth = 64;
5023 if (ShouldUseInlineAtomic)
5024 MaxAtomicInlineWidth = 64;
Eric Christopherb093d692015-10-09 18:39:59 +00005025 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005026 }
5027
5028 bool isThumb() const {
5029 return (ArchISA == llvm::ARM::IK_THUMB);
5030 }
5031
5032 bool supportsThumb() const {
5033 return CPUAttr.count('T') || ArchVersion >= 6;
5034 }
5035
5036 bool supportsThumb2() const {
Bradley Smithf4affc12016-03-03 13:52:22 +00005037 return CPUAttr.equals("6T2") ||
5038 (ArchVersion >= 7 && !CPUAttr.equals("8M_BASE"));
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005039 }
5040
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005041 StringRef getCPUAttr() const {
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005042 // For most sub-arches, the build attribute CPU name is enough.
5043 // For Cortex variants, it's slightly different.
5044 switch(ArchKind) {
5045 default:
Chandler Carruthd96f37a2015-08-30 07:51:18 +00005046 return llvm::ARM::getCPUAttr(ArchKind);
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005047 case llvm::ARM::AK_ARMV6M:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005048 return "6M";
Tim Northover525c73c2015-07-21 21:47:33 +00005049 case llvm::ARM::AK_ARMV7S:
5050 return "7S";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005051 case llvm::ARM::AK_ARMV7A:
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005052 return "7A";
5053 case llvm::ARM::AK_ARMV7R:
5054 return "7R";
5055 case llvm::ARM::AK_ARMV7M:
5056 return "7M";
5057 case llvm::ARM::AK_ARMV7EM:
5058 return "7EM";
5059 case llvm::ARM::AK_ARMV8A:
5060 return "8A";
5061 case llvm::ARM::AK_ARMV8_1A:
5062 return "8_1A";
Oliver Stannard3086c042016-02-11 16:05:52 +00005063 case llvm::ARM::AK_ARMV8_2A:
5064 return "8_2A";
Bradley Smithf4affc12016-03-03 13:52:22 +00005065 case llvm::ARM::AK_ARMV8MBaseline:
5066 return "8M_BASE";
5067 case llvm::ARM::AK_ARMV8MMainline:
5068 return "8M_MAIN";
Javed Absar00b74442016-10-07 12:08:41 +00005069 case llvm::ARM::AK_ARMV8R:
5070 return "8R";
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005071 }
5072 }
5073
5074 StringRef getCPUProfile() const {
5075 switch(ArchProfile) {
5076 case llvm::ARM::PK_A:
5077 return "A";
5078 case llvm::ARM::PK_R:
5079 return "R";
5080 case llvm::ARM::PK_M:
5081 return "M";
5082 default:
5083 return "";
5084 }
5085 }
5086
Chris Lattner17df24e2008-04-21 18:56:49 +00005087public:
Matt Arsenaultf333de32016-09-07 07:08:02 +00005088 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005089 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
5090 HW_FP(0) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005091
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005092 switch (getTriple().getOS()) {
5093 case llvm::Triple::NetBSD:
Renato Golin0201a9e2016-09-22 19:28:20 +00005094 case llvm::Triple::OpenBSD:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005095 PtrDiffType = SignedLong;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005096 break;
5097 default:
Joerg Sonnenberger7c7fcec2013-12-02 16:09:34 +00005098 PtrDiffType = SignedInt;
Joerg Sonnenberger84c7ca82013-11-30 00:38:16 +00005099 break;
5100 }
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005101
Renato Goline84b0002015-10-08 16:43:26 +00005102 // Cache arch related info.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005103 setArchInfo();
Chih-Hung Hsiehcda1cd52015-07-24 17:39:13 +00005104
Chris Lattner1a8f3942010-04-23 16:29:58 +00005105 // {} in inline assembly are neon specifiers, not assembly variant
5106 // specifiers.
5107 NoAsmVariants = true;
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005108
Eric Christopher0e261882014-12-05 01:06:59 +00005109 // FIXME: This duplicates code from the driver that sets the -target-abi
5110 // option - this code is used if -target-abi isn't passed and should
5111 // be unified in some way.
5112 if (Triple.isOSBinFormatMachO()) {
5113 // The backend is hardwired to assume AAPCS for M-class processors, ensure
5114 // the frontend matches that.
5115 if (Triple.getEnvironment() == llvm::Triple::EABI ||
5116 Triple.getOS() == llvm::Triple::UnknownOS ||
Zijiao Ma56a83722016-08-17 02:13:33 +00005117 ArchProfile == llvm::ARM::PK_M) {
Eric Christopher0e261882014-12-05 01:06:59 +00005118 setABI("aapcs");
Tim Northoverd88ecb32016-01-27 19:32:40 +00005119 } else if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005120 setABI("aapcs16");
Eric Christopher0e261882014-12-05 01:06:59 +00005121 } else {
5122 setABI("apcs-gnu");
5123 }
5124 } else if (Triple.isOSWindows()) {
5125 // FIXME: this is invalid for WindowsCE
5126 setABI("aapcs");
5127 } else {
5128 // Select the default based on the platform.
5129 switch (Triple.getEnvironment()) {
5130 case llvm::Triple::Android:
5131 case llvm::Triple::GNUEABI:
5132 case llvm::Triple::GNUEABIHF:
Rafael Espindola0fa66802016-06-24 21:35:06 +00005133 case llvm::Triple::MuslEABI:
5134 case llvm::Triple::MuslEABIHF:
Eric Christopher0e261882014-12-05 01:06:59 +00005135 setABI("aapcs-linux");
5136 break;
5137 case llvm::Triple::EABIHF:
5138 case llvm::Triple::EABI:
5139 setABI("aapcs");
5140 break;
Eric Christopher560cc4f2014-12-18 02:08:55 +00005141 case llvm::Triple::GNU:
Renato Goline84b0002015-10-08 16:43:26 +00005142 setABI("apcs-gnu");
5143 break;
Eric Christopher0e261882014-12-05 01:06:59 +00005144 default:
5145 if (Triple.getOS() == llvm::Triple::NetBSD)
5146 setABI("apcs-gnu");
5147 else
5148 setABI("aapcs");
5149 break;
5150 }
5151 }
John McCall86353412010-08-21 22:46:04 +00005152
5153 // ARM targets default to using the ARM C++ ABI.
John McCall359b8852013-01-25 22:30:49 +00005154 TheCXXABI.set(TargetCXXABI::GenericARM);
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005155
Renato Golin15b86152015-07-03 16:41:13 +00005156 // ARM has atomics up to 8 bytes
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005157 setAtomic();
Rafael Espindola5ab8e2e2015-07-02 15:14:10 +00005158
James Molloya7139222012-03-12 09:14:10 +00005159 // Do force alignment of members that follow zero length bitfields. If
Eric Christopher917e9522014-11-18 22:36:15 +00005160 // the alignment of the zero-length bitfield is greater than the member
5161 // that follows it, `bar', `bar' will be aligned as the type of the
James Molloya7139222012-03-12 09:14:10 +00005162 // zero length bitfield.
5163 UseZeroLengthBitfieldAlignment = true;
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005164
5165 if (Triple.getOS() == llvm::Triple::Linux ||
5166 Triple.getOS() == llvm::Triple::UnknownOS)
5167 this->MCountName =
5168 Opts.EABIVersion == "gnu" ? "\01__gnu_mcount_nc" : "\01mcount";
Eli Friedmanb5366062008-05-20 14:21:01 +00005169 }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005170
Alp Toker4925ba72014-06-07 23:30:42 +00005171 StringRef getABI() const override { return ABI; }
Alexandros Lamprineas73b07612015-07-02 13:21:34 +00005172
Craig Topper3164f332014-03-11 03:39:26 +00005173 bool setABI(const std::string &Name) override {
Daniel Dunbarb4091a92009-09-14 00:35:03 +00005174 ABI = Name;
5175
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005176 // The defaults (above) are for AAPCS, check if we need to change them.
5177 //
5178 // FIXME: We need support for -meabi... we could just mangle it into the
5179 // name.
Tim Northover756447a2015-10-30 16:30:36 +00005180 if (Name == "apcs-gnu" || Name == "aapcs16") {
Tim Northover5627d392015-10-30 16:30:45 +00005181 setABIAPCS(Name == "aapcs16");
Rafael Espindolad6c2b722013-12-18 19:47:32 +00005182 return true;
5183 }
5184 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
5185 setABIAAPCS();
5186 return true;
5187 }
5188 return false;
Daniel Dunbar125f8fb2009-09-14 00:02:24 +00005189 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005190
Renato Golinf5c4dec2015-05-27 13:33:00 +00005191 // FIXME: This should be based on Arch attributes, not CPU names.
Eric Christopher8c47b422015-10-09 18:39:55 +00005192 bool
5193 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
5194 StringRef CPU,
5195 const std::vector<std::string> &FeaturesVec) const override {
5196
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005197 std::vector<StringRef> TargetFeatures;
Bradley Smithb3501962015-11-16 11:16:36 +00005198 unsigned Arch = llvm::ARM::parseArch(getTriple().getArchName());
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005199
5200 // get default FPU features
Bradley Smithb3501962015-11-16 11:16:36 +00005201 unsigned FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005202 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
5203
5204 // get default Extension features
Bradley Smithb3501962015-11-16 11:16:36 +00005205 unsigned Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005206 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
5207
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005208 for (auto Feature : TargetFeatures)
Alexandros Lamprineas94d75db2015-09-06 16:15:45 +00005209 if (Feature[0] == '+')
Mehdi Aminia0016ec2016-10-07 08:37:29 +00005210 Features[Feature.drop_front(1)] = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005211
Eric Christopher007b0a02015-08-28 22:32:01 +00005212 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005213 }
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005214
Craig Topper3164f332014-03-11 03:39:26 +00005215 bool handleTargetFeatures(std::vector<std::string> &Features,
5216 DiagnosticsEngine &Diags) override {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005217 FPU = 0;
Bernard Ogden18b57012013-10-29 09:47:51 +00005218 CRC = 0;
Tim Northover02e38602014-02-03 17:28:04 +00005219 Crypto = 0;
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005220 DSP = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005221 Unaligned = 1;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005222 SoftFloat = SoftFloatABI = false;
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005223 HWDiv = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005224
Ranjeet Singhac08e532015-06-24 23:39:25 +00005225 // This does not diagnose illegal cases like having both
5226 // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
5227 uint32_t HW_FP_remove = 0;
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005228 for (const auto &Feature : Features) {
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005229 if (Feature == "+soft-float") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005230 SoftFloat = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005231 } else if (Feature == "+soft-float-abi") {
Daniel Dunbar893d4752009-12-19 04:15:38 +00005232 SoftFloatABI = true;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005233 } else if (Feature == "+vfp2") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005234 FPU |= VFP2FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005235 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005236 } else if (Feature == "+vfp3") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005237 FPU |= VFP3FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005238 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005239 } else if (Feature == "+vfp4") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005240 FPU |= VFP4FPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005241 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005242 } else if (Feature == "+fp-armv8") {
Bernard Ogdenda13af32013-10-24 18:32:51 +00005243 FPU |= FPARMV8;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005244 HW_FP |= HW_FP_SP | HW_FP_DP | HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005245 } else if (Feature == "+neon") {
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005246 FPU |= NeonFPU;
Ranjeet Singhac08e532015-06-24 23:39:25 +00005247 HW_FP |= HW_FP_SP | HW_FP_DP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005248 } else if (Feature == "+hwdiv") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005249 HWDiv |= HWDivThumb;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005250 } else if (Feature == "+hwdiv-arm") {
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005251 HWDiv |= HWDivARM;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005252 } else if (Feature == "+crc") {
Bernard Ogden18b57012013-10-29 09:47:51 +00005253 CRC = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005254 } else if (Feature == "+crypto") {
Tim Northover02e38602014-02-03 17:28:04 +00005255 Crypto = 1;
Artyom Skrobov05d85ae2015-10-23 17:19:02 +00005256 } else if (Feature == "+dsp") {
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005257 DSP = 1;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005258 } else if (Feature == "+fp-only-sp") {
Matt Arsenault250024f2016-06-08 01:56:42 +00005259 HW_FP_remove |= HW_FP_DP;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005260 } else if (Feature == "+strict-align") {
5261 Unaligned = 0;
5262 } else if (Feature == "+fp16") {
5263 HW_FP |= HW_FP_HP;
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005264 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00005265 }
Ranjeet Singhac08e532015-06-24 23:39:25 +00005266 HW_FP &= ~HW_FP_remove;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005267
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005268 switch (ArchVersion) {
5269 case 6:
5270 if (ArchProfile == llvm::ARM::PK_M)
5271 LDREX = 0;
5272 else if (ArchKind == llvm::ARM::AK_ARMV6K)
5273 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5274 else
5275 LDREX = LDREX_W;
5276 break;
5277 case 7:
5278 if (ArchProfile == llvm::ARM::PK_M)
5279 LDREX = LDREX_W | LDREX_H | LDREX_B ;
5280 else
5281 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5282 break;
5283 case 8:
5284 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B ;
5285 }
5286
Rafael Espindolaeb265472013-08-21 21:59:03 +00005287 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
5288 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
5289 return false;
5290 }
5291
5292 if (FPMath == FP_Neon)
5293 Features.push_back("+neonfp");
5294 else if (FPMath == FP_VFP)
5295 Features.push_back("-neonfp");
5296
Daniel Dunbar893d4752009-12-19 04:15:38 +00005297 // Remove front-end specific options which the backend handles differently.
Eric Christopher9e172d22015-05-12 01:26:21 +00005298 auto Feature =
5299 std::find(Features.begin(), Features.end(), "+soft-float-abi");
5300 if (Feature != Features.end())
5301 Features.erase(Feature);
Saleem Abdulrasool0f691c62014-09-17 14:50:23 +00005302
Rafael Espindolaeb265472013-08-21 21:59:03 +00005303 return true;
Daniel Dunbar893d4752009-12-19 04:15:38 +00005304 }
5305
Craig Topper3164f332014-03-11 03:39:26 +00005306 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005307 return llvm::StringSwitch<bool>(Feature)
5308 .Case("arm", true)
Ben Langmuir587aeaf2015-08-07 01:59:56 +00005309 .Case("aarch32", true)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005310 .Case("softfloat", SoftFloat)
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005311 .Case("thumb", isThumb())
Amara Emerson8c3de542013-09-16 18:07:35 +00005312 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005313 .Case("hwdiv", HWDiv & HWDivThumb)
5314 .Case("hwdiv-arm", HWDiv & HWDivARM)
Douglas Gregor0070c0b2012-01-30 06:38:25 +00005315 .Default(false);
5316 }
Renato Golin15b86152015-07-03 16:41:13 +00005317
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005318 bool setCPU(const std::string &Name) override {
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005319 if (Name != "generic")
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00005320 setArchInfo(llvm::ARM::parseCPUArch(Name));
Vladimir Sukharev457d3412015-08-19 14:50:18 +00005321
Renato Golin15b86152015-07-03 16:41:13 +00005322 if (ArchKind == llvm::ARM::AK_INVALID)
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005323 return false;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005324 setAtomic();
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005325 CPU = Name;
5326 return true;
5327 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005328
Craig Topper3164f332014-03-11 03:39:26 +00005329 bool setFPMath(StringRef Name) override;
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005330
Craig Topper3164f332014-03-11 03:39:26 +00005331 void getTargetDefines(const LangOptions &Opts,
5332 MacroBuilder &Builder) const override {
Chris Lattnerecd49032009-03-02 22:27:17 +00005333 // Target identification.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005334 Builder.defineMacro("__arm");
5335 Builder.defineMacro("__arm__");
Weiming Zhaob0613132016-04-18 16:25:46 +00005336 // For bare-metal none-eabi.
5337 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
5338 getTriple().getEnvironment() == llvm::Triple::EABI)
5339 Builder.defineMacro("__ELF__");
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00005340
Chris Lattnerecd49032009-03-02 22:27:17 +00005341 // Target properties.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005342 Builder.defineMacro("__REGISTER_PREFIX__", "");
Tim Northover5627d392015-10-30 16:30:45 +00005343
5344 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
5345 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
Tim Northoverd88ecb32016-01-27 19:32:40 +00005346 if (getTriple().isWatchABI())
Tim Northover5627d392015-10-30 16:30:45 +00005347 Builder.defineMacro("__ARM_ARCH_7K__", "2");
5348
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005349 if (!CPUAttr.empty())
5350 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005351
5352 // ACLE 6.4.1 ARM/Thumb instruction set architecture
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005353 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
Benjamin Kramerb42d9a52015-12-24 10:07:37 +00005354 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005355
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005356 if (ArchVersion >= 8) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005357 // ACLE 6.5.7 Crypto Extension
5358 if (Crypto)
5359 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
5360 // ACLE 6.5.8 CRC32 Extension
5361 if (CRC)
5362 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
5363 // ACLE 6.5.10 Numeric Maximum and Minimum
5364 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
5365 // ACLE 6.5.9 Directed Rounding
5366 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
James Molloy0ffb0932014-09-15 11:25:38 +00005367 }
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005368
5369 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
5370 // is not defined for the M-profile.
Bradley Smithf4affc12016-03-03 13:52:22 +00005371 // NOTE that the default profile is assumed to be 'A'
5372 if (CPUProfile.empty() || ArchProfile != llvm::ARM::PK_M)
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005373 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
5374
Bradley Smithf4affc12016-03-03 13:52:22 +00005375 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
5376 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
5377 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
5378 // v7 and v8 architectures excluding v8-M Baseline.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005379 if (supportsThumb2())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005380 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005381 else if (supportsThumb())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005382 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
5383
5384 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
5385 // instruction set such as ARM or Thumb.
5386 Builder.defineMacro("__ARM_32BIT_STATE", "1");
5387
5388 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
5389
5390 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005391 if (!CPUProfile.empty())
Saleem Abdulrasool0e3258c2014-06-15 18:35:07 +00005392 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005393
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005394 // ACLE 6.4.3 Unaligned access supported in hardware
Eric Christopherb093d692015-10-09 18:39:59 +00005395 if (Unaligned)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005396 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Eric Christopherb093d692015-10-09 18:39:59 +00005397
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005398 // ACLE 6.4.4 LDREX/STREX
5399 if (LDREX)
5400 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + llvm::utohexstr(LDREX));
5401
5402 // ACLE 6.4.5 CLZ
Eric Christopherb093d692015-10-09 18:39:59 +00005403 if (ArchVersion == 5 ||
5404 (ArchVersion == 6 && CPUProfile != "M") ||
5405 ArchVersion > 6)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005406 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
5407
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005408 // ACLE 6.5.1 Hardware Floating Point
5409 if (HW_FP)
Saleem Abdulrasoolb404cb82014-09-18 02:13:33 +00005410 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
Saleem Abdulrasool687c3b02014-09-17 14:50:27 +00005411
Yi Konga44c4d72014-06-27 21:25:42 +00005412 // ACLE predefines.
5413 Builder.defineMacro("__ARM_ACLE", "200");
5414
Oliver Stannarddc2854c2015-09-03 12:40:58 +00005415 // FP16 support (we currently only support IEEE format).
5416 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
5417 Builder.defineMacro("__ARM_FP16_ARGS", "1");
5418
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005419 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
Silviu Baranga632fdc52016-04-28 11:29:08 +00005420 if (ArchVersion >= 7 && (FPU & VFP4FPU))
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005421 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
5422
Mike Stump9d54bd72009-04-08 02:07:04 +00005423 // Subtarget options.
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005424
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005425 // FIXME: It's more complicated than this and we don't really support
5426 // interworking.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005427 // Windows on ARM does not "support" interworking
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005428 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005429 Builder.defineMacro("__THUMB_INTERWORK__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005430
David Tweed8f676532012-10-25 13:33:01 +00005431 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
Tim Northovere77f78c2013-11-11 19:11:22 +00005432 // Embedded targets on Darwin follow AAPCS, but not EABI.
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005433 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
Tim Northover862eaf82016-05-13 21:26:45 +00005434 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
Daniel Dunbarf7124da2012-10-22 18:51:13 +00005435 Builder.defineMacro("__ARM_EABI__");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005436 Builder.defineMacro("__ARM_PCS", "1");
Anton Korobeynikove98c4db2012-09-08 08:08:27 +00005437 }
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005438
Tim Northover28fc0e12016-04-28 13:59:55 +00005439 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" ||
5440 ABI == "aapcs16")
5441 Builder.defineMacro("__ARM_PCS_VFP", "1");
5442
Daniel Dunbar893d4752009-12-19 04:15:38 +00005443 if (SoftFloat)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005444 Builder.defineMacro("__SOFTFP__");
Daniel Dunbaracde99e2009-12-18 18:42:37 +00005445
Zijiao Ma56a83722016-08-17 02:13:33 +00005446 if (ArchKind == llvm::ARM::AK_XSCALE)
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005447 Builder.defineMacro("__XSCALE__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005448
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005449 if (isThumb()) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005450 Builder.defineMacro("__THUMBEL__");
5451 Builder.defineMacro("__thumb__");
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005452 if (supportsThumb2())
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005453 Builder.defineMacro("__thumb2__");
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005454 }
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005455
5456 // ACLE 6.4.9 32-bit SIMD instructions
5457 if (ArchVersion >= 6 && (CPUProfile != "M" || CPUAttr == "7EM"))
5458 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
5459
5460 // ACLE 6.4.10 Hardware Integer Divide
Eric Christopherb093d692015-10-09 18:39:59 +00005461 if (((HWDiv & HWDivThumb) && isThumb()) ||
5462 ((HWDiv & HWDivARM) && !isThumb())) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005463 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
Silviu Barangaf9671dd2013-10-21 10:54:53 +00005464 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005465 }
Daniel Dunbar2f5c75e2009-09-17 16:21:10 +00005466
5467 // Note, this is always on in gcc, even though it doesn't make sense.
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005468 Builder.defineMacro("__APCS_32__");
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005469
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005470 if (FPUModeIsVFP((FPUMode) FPU)) {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005471 Builder.defineMacro("__VFP_FP__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005472 if (FPU & VFP2FPU)
5473 Builder.defineMacro("__ARM_VFPV2__");
5474 if (FPU & VFP3FPU)
5475 Builder.defineMacro("__ARM_VFPV3__");
5476 if (FPU & VFP4FPU)
5477 Builder.defineMacro("__ARM_VFPV4__");
Tim Northoverc67803f2016-12-21 20:49:43 +00005478 if (FPU & FPARMV8)
5479 Builder.defineMacro("__ARM_FPV5__");
Bob Wilson6fc8fb82012-09-29 23:52:52 +00005480 }
Weiming Zhaofb5c21a2014-01-22 18:42:13 +00005481
Daniel Dunbar0def3d12009-12-21 23:28:17 +00005482 // This only gets set when Neon instructions are actually available, unlike
5483 // the VFP define, hence the soft float and arch check. This is subtly
5484 // different from gcc, we follow the intent which was that it should be set
5485 // when Neon instructions are actually available.
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005486 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005487 Builder.defineMacro("__ARM_NEON", "1");
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00005488 Builder.defineMacro("__ARM_NEON__");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005489 // current AArch32 NEON implementations do not support double-precision
5490 // floating-point even when it is present in VFP.
Eric Christopherb093d692015-10-09 18:39:59 +00005491 Builder.defineMacro("__ARM_NEON_FP",
5492 "0x" + llvm::utohexstr(HW_FP & ~HW_FP_DP));
Tim Northover5bb34ca2013-11-21 12:36:34 +00005493 }
Joey Gouly1e8637b2013-09-18 10:07:09 +00005494
Bradley Smith0f28f0c2014-01-20 10:52:00 +00005495 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
5496 Opts.ShortWChar ? "2" : "4");
5497
5498 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
5499 Opts.ShortEnums ? "1" : "4");
5500
Bradley Smithf4affc12016-03-03 13:52:22 +00005501 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
Weiming Zhao53a797c2013-09-30 22:51:32 +00005502 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
5503 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
5504 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
5505 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
5506 }
Sergey Dmitrouk745f5302014-11-25 08:57:36 +00005507
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005508 // ACLE 6.4.7 DSP instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005509 if (DSP) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005510 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005511 }
5512
5513 // ACLE 6.4.8 Saturation instructions
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005514 bool SAT = false;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005515 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6 ) {
5516 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005517 SAT = true;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005518 }
5519
5520 // ACLE 6.4.6 Q (saturation) flag
Artyom Skrobovd3ae09b2015-09-24 17:34:05 +00005521 if (DSP || SAT)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005522 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005523
5524 if (Opts.UnsafeFPMath)
5525 Builder.defineMacro("__ARM_FP_FAST", "1");
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005526
5527 if (ArchKind == llvm::ARM::AK_ARMV8_1A)
5528 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
Chris Lattner17df24e2008-04-21 18:56:49 +00005529 }
Alexandros Lamprineas65bc3062015-07-17 09:08:37 +00005530
Craig Topper6c03a542015-10-19 04:51:35 +00005531 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
5532 return llvm::makeArrayRef(BuiltinInfo,
5533 clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin);
Chris Lattner17df24e2008-04-21 18:56:49 +00005534 }
Craig Topper3164f332014-03-11 03:39:26 +00005535 bool isCLZForZeroUndef() const override { return false; }
5536 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northover5627d392015-10-30 16:30:45 +00005537 return IsAAPCS
5538 ? AAPCSABIBuiltinVaList
Tim Northoverd88ecb32016-01-27 19:32:40 +00005539 : (getTriple().isWatchABI() ? TargetInfo::CharPtrBuiltinVaList
5540 : TargetInfo::VoidPtrBuiltinVaList);
Chris Lattner17df24e2008-04-21 18:56:49 +00005541 }
Craig Topperf054e3a2015-10-19 03:52:27 +00005542 ArrayRef<const char *> getGCCRegNames() const override;
5543 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00005544 bool validateAsmConstraint(const char *&Name,
5545 TargetInfo::ConstraintInfo &Info) const override {
Anders Carlsson58436352009-02-28 17:11:49 +00005546 switch (*Name) {
Eric Christopher9e491882012-08-16 23:50:41 +00005547 default: break;
Nate Begeman2908fa02008-04-22 05:03:19 +00005548 case 'l': // r0-r7
5549 case 'h': // r8-r15
JF Bastien750caef2016-02-19 06:54:45 +00005550 case 't': // VFP Floating point register single precision
5551 case 'w': // VFP Floating point register double precision
Chris Lattnerd9725f72009-04-26 07:16:29 +00005552 Info.setAllowsRegister();
Nate Begeman2908fa02008-04-22 05:03:19 +00005553 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00005554 case 'I':
5555 case 'J':
5556 case 'K':
5557 case 'L':
5558 case 'M':
5559 // FIXME
5560 return true;
Eric Christopherb081ba62011-07-29 21:20:35 +00005561 case 'Q': // A memory address that is a single base register.
5562 Info.setAllowsMemory();
5563 return true;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005564 case 'U': // a memory reference...
5565 switch (Name[1]) {
5566 case 'q': // ...ARMV4 ldrsb
5567 case 'v': // ...VFP load/store (reg+constant offset)
5568 case 'y': // ...iWMMXt load/store
Eric Christopherd1048542011-06-17 01:40:49 +00005569 case 't': // address valid for load/store opaque types wider
Eric Christopherfd081ca2012-11-14 22:08:59 +00005570 // than 128-bits
Eric Christopherd1048542011-06-17 01:40:49 +00005571 case 'n': // valid address for Neon doubleword vector load/store
5572 case 'm': // valid address for Neon element and structure load/store
5573 case 's': // valid address for non-offset loads/stores of quad-word
Eric Christopherfd081ca2012-11-14 22:08:59 +00005574 // values in four ARM registers
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005575 Info.setAllowsMemory();
5576 Name++;
5577 return true;
5578 }
Nate Begeman2908fa02008-04-22 05:03:19 +00005579 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005580 return false;
5581 }
Craig Topper3164f332014-03-11 03:39:26 +00005582 std::string convertConstraint(const char *&Constraint) const override {
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005583 std::string R;
5584 switch (*Constraint) {
5585 case 'U': // Two-character constraint; add "^" hint for later parsing.
Stuart Hastings5b7b11c2011-06-08 16:06:31 +00005586 R = std::string("^") + std::string(Constraint, 2);
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005587 Constraint++;
5588 break;
Eric Christopher7d237c12011-06-17 00:40:18 +00005589 case 'p': // 'p' should be translated to 'r' by default.
5590 R = std::string("r");
5591 break;
Stuart Hastings7fdc6702011-06-07 23:45:05 +00005592 default:
5593 return std::string(1, *Constraint);
5594 }
5595 return R;
5596 }
Akira Hatanaka987f1862014-08-22 06:05:21 +00005597 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00005598 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00005599 std::string &SuggestedModifier) const override {
Bill Wendling3c6591d2012-11-30 23:18:12 +00005600 bool isOutput = (Constraint[0] == '=');
Bill Wendling05175082012-11-30 23:46:56 +00005601 bool isInOut = (Constraint[0] == '+');
Bill Wendling3c6591d2012-11-30 23:18:12 +00005602
Bill Wendling9d1ee112012-10-25 23:28:48 +00005603 // Strip off constraint modifiers.
5604 while (Constraint[0] == '=' ||
5605 Constraint[0] == '+' ||
5606 Constraint[0] == '&')
5607 Constraint = Constraint.substr(1);
5608
5609 switch (Constraint[0]) {
5610 default: break;
5611 case 'r': {
5612 switch (Modifier) {
5613 default:
Tim Northover8f24b172013-12-08 15:24:55 +00005614 return (isInOut || isOutput || Size <= 64);
Bill Wendling9d1ee112012-10-25 23:28:48 +00005615 case 'q':
5616 // A register of size 32 cannot fit a vector type.
5617 return false;
5618 }
5619 }
5620 }
5621
5622 return true;
5623 }
Craig Topper3164f332014-03-11 03:39:26 +00005624 const char *getClobbers() const override {
Eli Friedmanf05b7722008-08-20 07:44:10 +00005625 // FIXME: Is this really right?
Chris Lattner17df24e2008-04-21 18:56:49 +00005626 return "";
5627 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005628
Craig Topper3164f332014-03-11 03:39:26 +00005629 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
John McCall477f2bb2016-03-03 06:39:32 +00005630 switch (CC) {
5631 case CC_AAPCS:
5632 case CC_AAPCS_VFP:
5633 case CC_Swift:
5634 return CCCR_OK;
5635 default:
5636 return CCCR_Warning;
5637 }
Aaron Ballmane91c6be2012-10-02 14:26:08 +00005638 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00005639
Craig Topper3164f332014-03-11 03:39:26 +00005640 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00005641 if (RegNo == 0) return 0;
5642 if (RegNo == 1) return 1;
5643 return -1;
5644 }
Matthias Braund1e2fad2015-07-17 00:15:22 +00005645
5646 bool hasSjLjLowering() const override {
5647 return true;
5648 }
Chris Lattner17df24e2008-04-21 18:56:49 +00005649};
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005650
Rafael Espindolaeb265472013-08-21 21:59:03 +00005651bool ARMTargetInfo::setFPMath(StringRef Name) {
5652 if (Name == "neon") {
5653 FPMath = FP_Neon;
5654 return true;
5655 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
5656 Name == "vfp4") {
5657 FPMath = FP_VFP;
5658 return true;
5659 }
5660 return false;
5661}
5662
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005663const char * const ARMTargetInfo::GCCRegNames[] = {
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005664 // Integer registers
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005665 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005666 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
5667
5668 // Float registers
5669 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
5670 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
5671 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005672 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
Daniel Dunbar9034aa32010-08-11 02:17:20 +00005673
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005674 // Double registers
5675 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
5676 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005677 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
5678 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005679
5680 // Quad registers
Dale Johannesend2b2ad02010-10-28 01:05:37 +00005681 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
5682 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005683};
5684
Craig Topperf054e3a2015-10-19 03:52:27 +00005685ArrayRef<const char *> ARMTargetInfo::getGCCRegNames() const {
5686 return llvm::makeArrayRef(GCCRegNames);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005687}
5688
5689const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005690 { { "a1" }, "r0" },
5691 { { "a2" }, "r1" },
5692 { { "a3" }, "r2" },
5693 { { "a4" }, "r3" },
5694 { { "v1" }, "r4" },
5695 { { "v2" }, "r5" },
5696 { { "v3" }, "r6" },
5697 { { "v4" }, "r7" },
5698 { { "v5" }, "r8" },
5699 { { "v6", "rfp" }, "r9" },
5700 { { "sl" }, "r10" },
5701 { { "fp" }, "r11" },
5702 { { "ip" }, "r12" },
Daniel Dunbar256e1f32010-08-11 02:17:11 +00005703 { { "r13" }, "sp" },
5704 { { "r14" }, "lr" },
5705 { { "r15" }, "pc" },
Dale Johannesen7fd51bc2010-10-27 23:34:42 +00005706 // The S, D and Q registers overlap, but aren't really aliases; we
5707 // don't want to substitute one of these for a different-sized one.
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005708};
5709
Craig Topperf054e3a2015-10-19 03:52:27 +00005710ArrayRef<TargetInfo::GCCRegAlias> ARMTargetInfo::getGCCRegAliases() const {
5711 return llvm::makeArrayRef(GCCRegAliases);
Daniel Dunbar1da76c42009-09-17 07:03:19 +00005712}
Chris Lattner5cc15e02010-03-03 19:03:45 +00005713
5714const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00005715#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005716 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005717#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5718 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00005719#include "clang/Basic/BuiltinsNEON.def"
Tim Northoverc322f832014-01-30 14:47:51 +00005720
Craig Topper07d3b622015-08-07 05:14:44 +00005721#define BUILTIN(ID, TYPE, ATTRS) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005722 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005723#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
Eric Christopherc48497a2015-09-18 21:26:24 +00005724 { #ID, TYPE, ATTRS, nullptr, LANG, nullptr },
Craig Topper07d3b622015-08-07 05:14:44 +00005725#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
5726 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Albert Gutowski2a0621e2016-10-12 22:01:05 +00005727#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
5728 { #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
Chris Lattner5cc15e02010-03-03 19:03:45 +00005729#include "clang/Basic/BuiltinsARM.def"
5730};
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005731
5732class ARMleTargetInfo : public ARMTargetInfo {
5733public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005734 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005735 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005736 void getTargetDefines(const LangOptions &Opts,
5737 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005738 Builder.defineMacro("__ARMEL__");
5739 ARMTargetInfo::getTargetDefines(Opts, Builder);
5740 }
5741};
5742
5743class ARMbeTargetInfo : public ARMTargetInfo {
5744public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005745 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Matt Arsenaultf333de32016-09-07 07:08:02 +00005746 : ARMTargetInfo(Triple, Opts) {}
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005747 void getTargetDefines(const LangOptions &Opts,
5748 MacroBuilder &Builder) const override {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00005749 Builder.defineMacro("__ARMEB__");
5750 Builder.defineMacro("__ARM_BIG_ENDIAN");
5751 ARMTargetInfo::getTargetDefines(Opts, Builder);
5752 }
5753};
Chris Lattner17df24e2008-04-21 18:56:49 +00005754
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005755class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
5756 const llvm::Triple Triple;
5757public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005758 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5759 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005760 WCharType = UnsignedShort;
5761 SizeType = UnsignedInt;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005762 }
5763 void getVisualStudioDefines(const LangOptions &Opts,
5764 MacroBuilder &Builder) const {
5765 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
5766
5767 // FIXME: this is invalid for WindowsCE
5768 Builder.defineMacro("_M_ARM_NT", "1");
5769 Builder.defineMacro("_M_ARMT", "_M_ARM");
5770 Builder.defineMacro("_M_THUMB", "_M_ARM");
5771
5772 assert((Triple.getArch() == llvm::Triple::arm ||
5773 Triple.getArch() == llvm::Triple::thumb) &&
5774 "invalid architecture for Windows ARM target info");
5775 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
5776 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
5777
5778 // TODO map the complete set of values
5779 // 31: VFPv3 40: VFPv4
5780 Builder.defineMacro("_M_ARM_FP", "31");
5781 }
Saleem Abdulrasool521cec82014-06-29 23:05:41 +00005782 BuiltinVaListKind getBuiltinVaListKind() const override {
5783 return TargetInfo::CharPtrBuiltinVaList;
5784 }
Martell Malone7ccda3c2015-08-14 18:00:09 +00005785 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
5786 switch (CC) {
5787 case CC_X86StdCall:
5788 case CC_X86ThisCall:
5789 case CC_X86FastCall:
5790 case CC_X86VectorCall:
5791 return CCCR_Ignore;
5792 case CC_C:
5793 return CCCR_OK;
5794 default:
5795 return CCCR_Warning;
5796 }
5797 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005798};
5799
5800// Windows ARM + Itanium C++ ABI Target
5801class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
5802public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005803 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
5804 const TargetOptions &Opts)
5805 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005806 TheCXXABI.set(TargetCXXABI::GenericARM);
5807 }
5808
5809 void getTargetDefines(const LangOptions &Opts,
5810 MacroBuilder &Builder) const override {
5811 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5812
5813 if (Opts.MSVCCompat)
5814 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5815 }
5816};
5817
5818// Windows ARM, MS (C++) ABI
5819class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
5820public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005821 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
5822 const TargetOptions &Opts)
5823 : WindowsARMTargetInfo(Triple, Opts) {
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005824 TheCXXABI.set(TargetCXXABI::Microsoft);
5825 }
5826
5827 void getTargetDefines(const LangOptions &Opts,
5828 MacroBuilder &Builder) const override {
5829 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5830 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
5831 }
5832};
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005833
Yaron Keren321249c2015-07-15 13:32:23 +00005834// ARM MinGW target
5835class MinGWARMTargetInfo : public WindowsARMTargetInfo {
5836public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005837 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5838 : WindowsARMTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005839 TheCXXABI.set(TargetCXXABI::GenericARM);
5840 }
5841
5842 void getTargetDefines(const LangOptions &Opts,
5843 MacroBuilder &Builder) const override {
5844 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
5845 DefineStd(Builder, "WIN32", Opts);
5846 DefineStd(Builder, "WINNT", Opts);
5847 Builder.defineMacro("_ARM_");
5848 addMinGWDefines(Opts, Builder);
5849 }
5850};
5851
5852// ARM Cygwin target
5853class CygwinARMTargetInfo : public ARMleTargetInfo {
5854public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005855 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5856 : ARMleTargetInfo(Triple, Opts) {
Yaron Keren321249c2015-07-15 13:32:23 +00005857 TLSSupported = false;
5858 WCharType = UnsignedShort;
5859 DoubleAlign = LongLongAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00005860 resetDataLayout("e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64");
Yaron Keren321249c2015-07-15 13:32:23 +00005861 }
5862 void getTargetDefines(const LangOptions &Opts,
5863 MacroBuilder &Builder) const override {
5864 ARMleTargetInfo::getTargetDefines(Opts, Builder);
5865 Builder.defineMacro("_ARM_");
5866 Builder.defineMacro("__CYGWIN__");
5867 Builder.defineMacro("__CYGWIN32__");
Saleem Abdulrasool56027092017-02-07 19:00:06 +00005868 DefineStd(Builder, "unix", Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00005869 if (Opts.CPlusPlus)
5870 Builder.defineMacro("_GNU_SOURCE");
5871 }
5872};
5873
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005874class DarwinARMTargetInfo : public DarwinTargetInfo<ARMleTargetInfo> {
Torok Edwinb2b37c62009-06-30 17:10:35 +00005875protected:
Craig Topper3164f332014-03-11 03:39:26 +00005876 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
5877 MacroBuilder &Builder) const override {
Douglas Gregor20b2ebd2011-03-23 00:50:03 +00005878 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
Eli Friedmand88c8a12009-04-19 21:38:35 +00005879 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005880
Torok Edwinb2b37c62009-06-30 17:10:35 +00005881public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00005882 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
5883 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005884 HasAlignMac68kSupport = true;
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005885 // iOS always has 64-bit atomic instructions.
Eric Christopher917e9522014-11-18 22:36:15 +00005886 // FIXME: This should be based off of the target features in
5887 // ARMleTargetInfo.
Eli Friedman4b72fdd2011-10-14 20:59:01 +00005888 MaxAtomicInlineWidth = 64;
John McCall359b8852013-01-25 22:30:49 +00005889
Tim Northoverd88ecb32016-01-27 19:32:40 +00005890 if (Triple.isWatchABI()) {
Tim Northover5627d392015-10-30 16:30:45 +00005891 // Darwin on iOS uses a variant of the ARM C++ ABI.
5892 TheCXXABI.set(TargetCXXABI::WatchOS);
5893
5894 // The 32-bit ABI is silent on what ptrdiff_t should be, but given that
5895 // size_t is long, it's a bit weird for it to be int.
5896 PtrDiffType = SignedLong;
5897
5898 // BOOL should be a real boolean on the new ABI
5899 UseSignedCharForObjCBool = false;
5900 } else
5901 TheCXXABI.set(TargetCXXABI::iOS);
Daniel Dunbar3eeeccd2010-05-27 07:00:26 +00005902 }
Eli Friedmanf05b7722008-08-20 07:44:10 +00005903};
Eli Friedmanf05b7722008-08-20 07:44:10 +00005904
Tim Northover573cbee2014-05-24 12:52:07 +00005905class AArch64TargetInfo : public TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00005906 virtual void setDataLayout() = 0;
Tim Northovera2ee4332014-03-29 15:09:45 +00005907 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5908 static const char *const GCCRegNames[];
5909
James Molloy75f5f9e2014-04-16 15:33:48 +00005910 enum FPUModeEnum {
5911 FPUMode,
5912 NeonMode
5913 };
5914
5915 unsigned FPU;
Bradley Smith418c5932014-05-02 15:17:51 +00005916 unsigned CRC;
James Molloy75f5f9e2014-04-16 15:33:48 +00005917 unsigned Crypto;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005918 unsigned Unaligned;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00005919 unsigned V8_1A;
James Molloy75f5f9e2014-04-16 15:33:48 +00005920
Tim Northovera2ee4332014-03-29 15:09:45 +00005921 static const Builtin::Info BuiltinInfo[];
5922
5923 std::string ABI;
5924
5925public:
Saleem Abdulrasool9b5ba542016-04-10 03:19:47 +00005926 AArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Tim Northovera2ee4332014-03-29 15:09:45 +00005927 : TargetInfo(Triple), ABI("aapcs") {
Tim Northover25e8a672014-05-24 12:51:25 +00005928 if (getTriple().getOS() == llvm::Triple::NetBSD) {
5929 WCharType = SignedInt;
5930
5931 // NetBSD apparently prefers consistency across ARM targets to consistency
5932 // across 64-bit targets.
5933 Int64Type = SignedLongLong;
5934 IntMaxType = SignedLongLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005935 } else {
5936 WCharType = UnsignedInt;
5937 Int64Type = SignedLong;
5938 IntMaxType = SignedLong;
Tim Northover25e8a672014-05-24 12:51:25 +00005939 }
5940
Tim Northovera2ee4332014-03-29 15:09:45 +00005941 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Tim Northovera2ee4332014-03-29 15:09:45 +00005942 MaxVectorAlign = 128;
Tim Northovera2ee4332014-03-29 15:09:45 +00005943 MaxAtomicInlineWidth = 128;
5944 MaxAtomicPromoteWidth = 128;
5945
Tim Northovera6a19f12015-02-06 01:25:07 +00005946 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00005947 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tim Northovera2ee4332014-03-29 15:09:45 +00005948
Tim Northovera2ee4332014-03-29 15:09:45 +00005949 // {} in inline assembly are neon specifiers, not assembly variant
5950 // specifiers.
5951 NoAsmVariants = true;
5952
Tim Northover7ad87af2015-01-16 18:44:04 +00005953 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
5954 // contributes to the alignment of the containing aggregate in the same way
5955 // a plain (non bit-field) member of that type would, without exception for
5956 // zero-sized or anonymous bit-fields."
Tim Northover5627d392015-10-30 16:30:45 +00005957 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
Tim Northover7ad87af2015-01-16 18:44:04 +00005958 UseZeroLengthBitfieldAlignment = true;
5959
Tim Northover573cbee2014-05-24 12:52:07 +00005960 // AArch64 targets default to using the ARM C++ ABI.
Tim Northovera2ee4332014-03-29 15:09:45 +00005961 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Saleem Abdulrasoolc066d9c2016-04-12 03:05:03 +00005962
5963 if (Triple.getOS() == llvm::Triple::Linux ||
5964 Triple.getOS() == llvm::Triple::UnknownOS)
5965 this->MCountName = Opts.EABIVersion == "gnu" ? "\01_mcount" : "mcount";
Tim Northovera2ee4332014-03-29 15:09:45 +00005966 }
5967
Alp Toker4925ba72014-06-07 23:30:42 +00005968 StringRef getABI() const override { return ABI; }
David Blaikie1cbb9712014-11-14 19:09:44 +00005969 bool setABI(const std::string &Name) override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005970 if (Name != "aapcs" && Name != "darwinpcs")
5971 return false;
5972
5973 ABI = Name;
5974 return true;
5975 }
5976
David Blaikie1cbb9712014-11-14 19:09:44 +00005977 bool setCPU(const std::string &Name) override {
Zijiao Ma33e95212016-07-28 06:24:48 +00005978 return Name == "generic" ||
5979 llvm::AArch64::parseCPUArch(Name) !=
5980 static_cast<unsigned>(llvm::AArch64::ArchKind::AK_INVALID);
Tim Northovera2ee4332014-03-29 15:09:45 +00005981 }
5982
Alexander Kornienko34eb2072015-04-11 02:00:23 +00005983 void getTargetDefines(const LangOptions &Opts,
5984 MacroBuilder &Builder) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00005985 // Target identification.
Tim Northovera2ee4332014-03-29 15:09:45 +00005986 Builder.defineMacro("__aarch64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005987
5988 // Target properties.
5989 Builder.defineMacro("_LP64");
5990 Builder.defineMacro("__LP64__");
Tim Northovera2ee4332014-03-29 15:09:45 +00005991
5992 // ACLE predefines. Many can only have one possible value on v8 AArch64.
5993 Builder.defineMacro("__ARM_ACLE", "200");
5994 Builder.defineMacro("__ARM_ARCH", "8");
5995 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
5996
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005997 Builder.defineMacro("__ARM_64BIT_STATE", "1");
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00005998 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00005999 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006000
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006001 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
6002 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
6003 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
6004 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
James Molloy0ffb0932014-09-15 11:25:38 +00006005 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006006 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
6007 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006008
6009 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
6010
6011 // 0xe implies support for half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006012 Builder.defineMacro("__ARM_FP", "0xE");
Tim Northovera2ee4332014-03-29 15:09:45 +00006013
6014 // PCS specifies this for SysV variants, which is all we support. Other ABIs
6015 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006016 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
6017 Builder.defineMacro("__ARM_FP16_ARGS", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006018
Alexandros Lamprineasf5a8e6c2015-10-02 14:56:37 +00006019 if (Opts.UnsafeFPMath)
6020 Builder.defineMacro("__ARM_FP_FAST", "1");
Tim Northovera2ee4332014-03-29 15:09:45 +00006021
6022 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
6023
6024 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
6025 Opts.ShortEnums ? "1" : "4");
6026
James Molloy75f5f9e2014-04-16 15:33:48 +00006027 if (FPU == NeonMode) {
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006028 Builder.defineMacro("__ARM_NEON", "1");
James Molloy75f5f9e2014-04-16 15:33:48 +00006029 // 64-bit NEON supports half, single and double precision operations.
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006030 Builder.defineMacro("__ARM_NEON_FP", "0xE");
James Molloy75f5f9e2014-04-16 15:33:48 +00006031 }
Tim Northovera2ee4332014-03-29 15:09:45 +00006032
Bradley Smith418c5932014-05-02 15:17:51 +00006033 if (CRC)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006034 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
Bradley Smith418c5932014-05-02 15:17:51 +00006035
James Molloy75f5f9e2014-04-16 15:33:48 +00006036 if (Crypto)
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006037 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
6038
6039 if (Unaligned)
6040 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
Reid Klecknerd167d422015-05-06 15:31:46 +00006041
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006042 if (V8_1A)
6043 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
6044
Reid Klecknerd167d422015-05-06 15:31:46 +00006045 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
6046 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
6047 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
6048 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
6049 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Tim Northovera2ee4332014-03-29 15:09:45 +00006050 }
6051
Craig Topper6c03a542015-10-19 04:51:35 +00006052 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6053 return llvm::makeArrayRef(BuiltinInfo,
6054 clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin);
Tim Northovera2ee4332014-03-29 15:09:45 +00006055 }
6056
David Blaikie1cbb9712014-11-14 19:09:44 +00006057 bool hasFeature(StringRef Feature) const override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006058 return Feature == "aarch64" ||
6059 Feature == "arm64" ||
Ben Langmuir587aeaf2015-08-07 01:59:56 +00006060 Feature == "arm" ||
James Molloy75f5f9e2014-04-16 15:33:48 +00006061 (Feature == "neon" && FPU == NeonMode);
Tim Northovera2ee4332014-03-29 15:09:45 +00006062 }
6063
James Molloy5e73df52014-04-16 15:06:20 +00006064 bool handleTargetFeatures(std::vector<std::string> &Features,
6065 DiagnosticsEngine &Diags) override {
James Molloy75f5f9e2014-04-16 15:33:48 +00006066 FPU = FPUMode;
Bradley Smith418c5932014-05-02 15:17:51 +00006067 CRC = 0;
James Molloy75f5f9e2014-04-16 15:33:48 +00006068 Crypto = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006069 Unaligned = 1;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006070 V8_1A = 0;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006071
Eric Christopher610fe112015-08-26 08:21:55 +00006072 for (const auto &Feature : Features) {
6073 if (Feature == "+neon")
James Molloy75f5f9e2014-04-16 15:33:48 +00006074 FPU = NeonMode;
Eric Christopher610fe112015-08-26 08:21:55 +00006075 if (Feature == "+crc")
Bradley Smith418c5932014-05-02 15:17:51 +00006076 CRC = 1;
Eric Christopher610fe112015-08-26 08:21:55 +00006077 if (Feature == "+crypto")
James Molloy75f5f9e2014-04-16 15:33:48 +00006078 Crypto = 1;
Alexandros Lamprineasa448f042015-09-03 14:40:57 +00006079 if (Feature == "+strict-align")
6080 Unaligned = 0;
Alexandros Lamprineas502592c2015-11-29 10:43:59 +00006081 if (Feature == "+v8.1a")
6082 V8_1A = 1;
James Molloy75f5f9e2014-04-16 15:33:48 +00006083 }
6084
James Y Knightb214cbc2016-03-04 19:00:41 +00006085 setDataLayout();
James Molloy5e73df52014-04-16 15:06:20 +00006086
6087 return true;
6088 }
6089
John McCall477f2bb2016-03-03 06:39:32 +00006090 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
6091 switch (CC) {
6092 case CC_C:
6093 case CC_Swift:
Roman Levenstein35aa5ce2016-03-16 18:00:46 +00006094 case CC_PreserveMost:
6095 case CC_PreserveAll:
John McCall477f2bb2016-03-03 06:39:32 +00006096 return CCCR_OK;
6097 default:
6098 return CCCR_Warning;
6099 }
6100 }
6101
David Blaikie1cbb9712014-11-14 19:09:44 +00006102 bool isCLZForZeroUndef() const override { return false; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006103
David Blaikie1cbb9712014-11-14 19:09:44 +00006104 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006105 return TargetInfo::AArch64ABIBuiltinVaList;
6106 }
6107
Craig Topperf054e3a2015-10-19 03:52:27 +00006108 ArrayRef<const char *> getGCCRegNames() const override;
6109 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Tim Northovera2ee4332014-03-29 15:09:45 +00006110
Alexander Kornienko34eb2072015-04-11 02:00:23 +00006111 bool validateAsmConstraint(const char *&Name,
6112 TargetInfo::ConstraintInfo &Info) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006113 switch (*Name) {
6114 default:
6115 return false;
6116 case 'w': // Floating point and SIMD registers (V0-V31)
6117 Info.setAllowsRegister();
6118 return true;
James Molloy8bdd24b2014-04-23 10:26:19 +00006119 case 'I': // Constant that can be used with an ADD instruction
6120 case 'J': // Constant that can be used with a SUB instruction
6121 case 'K': // Constant that can be used with a 32-bit logical instruction
6122 case 'L': // Constant that can be used with a 64-bit logical instruction
6123 case 'M': // Constant that can be used as a 32-bit MOV immediate
6124 case 'N': // Constant that can be used as a 64-bit MOV immediate
6125 case 'Y': // Floating point constant zero
6126 case 'Z': // Integer constant zero
6127 return true;
6128 case 'Q': // A memory reference with base register and no offset
6129 Info.setAllowsMemory();
6130 return true;
6131 case 'S': // A symbolic address
6132 Info.setAllowsRegister();
6133 return true;
6134 case 'U':
Eric Christopher917e9522014-11-18 22:36:15 +00006135 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
6136 // Utf: A memory address suitable for ldp/stp in TF mode.
6137 // Usa: An absolute symbolic address.
6138 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
6139 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
Tim Northovera2ee4332014-03-29 15:09:45 +00006140 case 'z': // Zero register, wzr or xzr
6141 Info.setAllowsRegister();
6142 return true;
6143 case 'x': // Floating point and SIMD registers (V0-V15)
6144 Info.setAllowsRegister();
6145 return true;
Tim Northovera2ee4332014-03-29 15:09:45 +00006146 }
6147 return false;
6148 }
6149
Akira Hatanaka987f1862014-08-22 06:05:21 +00006150 bool
Aaron Ballmane9c64792014-08-22 13:26:37 +00006151 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Akira Hatanaka987f1862014-08-22 06:05:21 +00006152 std::string &SuggestedModifier) const override {
James Molloy8a157bf2014-07-25 10:19:47 +00006153 // Strip off constraint modifiers.
6154 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
6155 Constraint = Constraint.substr(1);
6156
6157 switch (Constraint[0]) {
6158 default:
6159 return true;
6160 case 'z':
6161 case 'r': {
6162 switch (Modifier) {
6163 case 'x':
6164 case 'w':
6165 // For now assume that the person knows what they're
6166 // doing with the modifier.
6167 return true;
6168 default:
6169 // By default an 'r' constraint will be in the 'x'
6170 // registers.
Akira Hatanaka987f1862014-08-22 06:05:21 +00006171 if (Size == 64)
6172 return true;
6173
6174 SuggestedModifier = "w";
6175 return false;
James Molloy8a157bf2014-07-25 10:19:47 +00006176 }
6177 }
6178 }
6179 }
6180
David Blaikie1cbb9712014-11-14 19:09:44 +00006181 const char *getClobbers() const override { return ""; }
Tim Northovera2ee4332014-03-29 15:09:45 +00006182
Fariborz Jahanian5afc8692014-10-01 16:56:40 +00006183 int getEHDataRegisterNumber(unsigned RegNo) const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006184 if (RegNo == 0)
6185 return 0;
6186 if (RegNo == 1)
6187 return 1;
6188 return -1;
6189 }
6190};
6191
Tim Northover573cbee2014-05-24 12:52:07 +00006192const char *const AArch64TargetInfo::GCCRegNames[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006193 // 32-bit Integer registers
6194 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
6195 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
6196 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
6197
6198 // 64-bit Integer registers
6199 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
6200 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
6201 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
6202
6203 // 32-bit floating point regsisters
6204 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
6205 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
6206 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
6207
6208 // 64-bit floating point regsisters
6209 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
6210 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
6211 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
6212
6213 // Vector registers
6214 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
6215 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
6216 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
6217};
6218
Craig Topperf054e3a2015-10-19 03:52:27 +00006219ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
6220 return llvm::makeArrayRef(GCCRegNames);
Tim Northovera2ee4332014-03-29 15:09:45 +00006221}
6222
Tim Northover573cbee2014-05-24 12:52:07 +00006223const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006224 { { "w31" }, "wsp" },
6225 { { "x29" }, "fp" },
6226 { { "x30" }, "lr" },
6227 { { "x31" }, "sp" },
6228 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
6229 // don't want to substitute one of these for a different-sized one.
6230};
6231
Craig Topperf054e3a2015-10-19 03:52:27 +00006232ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
6233 return llvm::makeArrayRef(GCCRegAliases);
Tim Northovera2ee4332014-03-29 15:09:45 +00006234}
6235
Tim Northover573cbee2014-05-24 12:52:07 +00006236const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
Tim Northovera2ee4332014-03-29 15:09:45 +00006237#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006238 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northovera2ee4332014-03-29 15:09:45 +00006239#include "clang/Basic/BuiltinsNEON.def"
6240
6241#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00006242 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Tim Northover573cbee2014-05-24 12:52:07 +00006243#include "clang/Basic/BuiltinsAArch64.def"
Tim Northovera2ee4332014-03-29 15:09:45 +00006244};
James Molloy5e73df52014-04-16 15:06:20 +00006245
Tim Northover573cbee2014-05-24 12:52:07 +00006246class AArch64leTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006247 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006248 if (getTriple().isOSBinFormatMachO())
James Y Knightb214cbc2016-03-04 19:00:41 +00006249 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006250 else
Chad Rosier4c077aa2016-07-07 20:02:25 +00006251 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006252 }
6253
6254public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006255 AArch64leTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6256 : AArch64TargetInfo(Triple, Opts) {
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006257 }
James Molloy5e73df52014-04-16 15:06:20 +00006258 void getTargetDefines(const LangOptions &Opts,
6259 MacroBuilder &Builder) const override {
6260 Builder.defineMacro("__AARCH64EL__");
Tim Northover573cbee2014-05-24 12:52:07 +00006261 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006262 }
6263};
6264
Tim Northover573cbee2014-05-24 12:52:07 +00006265class AArch64beTargetInfo : public AArch64TargetInfo {
James Y Knightb214cbc2016-03-04 19:00:41 +00006266 void setDataLayout() override {
James Molloy5e73df52014-04-16 15:06:20 +00006267 assert(!getTriple().isOSBinFormatMachO());
Chad Rosier4c077aa2016-07-07 20:02:25 +00006268 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
James Molloy5e73df52014-04-16 15:06:20 +00006269 }
6270
6271public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006272 AArch64beTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6273 : AArch64TargetInfo(Triple, Opts) {}
James Molloy5e73df52014-04-16 15:06:20 +00006274 void getTargetDefines(const LangOptions &Opts,
6275 MacroBuilder &Builder) const override {
6276 Builder.defineMacro("__AARCH64EB__");
6277 Builder.defineMacro("__AARCH_BIG_ENDIAN");
6278 Builder.defineMacro("__ARM_BIG_ENDIAN");
Tim Northover573cbee2014-05-24 12:52:07 +00006279 AArch64TargetInfo::getTargetDefines(Opts, Builder);
James Molloy5e73df52014-04-16 15:06:20 +00006280 }
6281};
Tim Northovera2ee4332014-03-29 15:09:45 +00006282
Tim Northover573cbee2014-05-24 12:52:07 +00006283class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
James Molloy5e73df52014-04-16 15:06:20 +00006284protected:
6285 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
6286 MacroBuilder &Builder) const override {
6287 Builder.defineMacro("__AARCH64_SIMD__");
6288 Builder.defineMacro("__ARM64_ARCH_8__");
6289 Builder.defineMacro("__ARM_NEON__");
6290 Builder.defineMacro("__LITTLE_ENDIAN__");
6291 Builder.defineMacro("__REGISTER_PREFIX__", "");
6292 Builder.defineMacro("__arm64", "1");
6293 Builder.defineMacro("__arm64__", "1");
6294
6295 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
6296 }
6297
Tim Northovera2ee4332014-03-29 15:09:45 +00006298public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006299 DarwinAArch64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6300 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
Tim Northovera2ee4332014-03-29 15:09:45 +00006301 Int64Type = SignedLongLong;
6302 WCharType = SignedInt;
6303 UseSignedCharForObjCBool = false;
6304
Tim Northovera6a19f12015-02-06 01:25:07 +00006305 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006306 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tim Northovera2ee4332014-03-29 15:09:45 +00006307
6308 TheCXXABI.set(TargetCXXABI::iOS64);
6309 }
6310
David Blaikie1cbb9712014-11-14 19:09:44 +00006311 BuiltinVaListKind getBuiltinVaListKind() const override {
Tim Northovera2ee4332014-03-29 15:09:45 +00006312 return TargetInfo::CharPtrBuiltinVaList;
6313 }
6314};
Tim Northovera2ee4332014-03-29 15:09:45 +00006315
Tony Linthicum76329bf2011-12-12 21:14:55 +00006316// Hexagon abstract base class
6317class HexagonTargetInfo : public TargetInfo {
6318 static const Builtin::Info BuiltinInfo[];
6319 static const char * const GCCRegNames[];
6320 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6321 std::string CPU;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006322 bool HasHVX, HasHVXDouble;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006323 bool UseLongCalls;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006324
Tony Linthicum76329bf2011-12-12 21:14:55 +00006325public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006326 HexagonTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6327 : TargetInfo(Triple) {
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006328 // Specify the vector alignment explicitly. For v512x1, the calculated
6329 // alignment would be 512*alignment(i1), which is 512 bytes, instead of
6330 // the required minimum of 64 bytes.
James Y Knightb214cbc2016-03-04 19:00:41 +00006331 resetDataLayout("e-m:e-p:32:32:32-a:0-n16:32-"
Krzysztof Parzyszek8e576972016-02-12 14:48:34 +00006332 "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 +00006333 "v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006334 SizeType = UnsignedInt;
6335 PtrDiffType = SignedInt;
6336 IntPtrType = SignedInt;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006337
6338 // {} in inline assembly are packet specifiers, not assembly variant
6339 // specifiers.
6340 NoAsmVariants = true;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006341
6342 LargeArrayMinWidth = 64;
6343 LargeArrayAlign = 64;
6344 UseBitFieldTypeAlignment = true;
6345 ZeroLengthBitfieldBoundary = 32;
6346 HasHVX = HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006347 UseLongCalls = false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006348 }
6349
Craig Topper6c03a542015-10-19 04:51:35 +00006350 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
6351 return llvm::makeArrayRef(BuiltinInfo,
6352 clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006353 }
6354
Craig Topper3164f332014-03-11 03:39:26 +00006355 bool validateAsmConstraint(const char *&Name,
6356 TargetInfo::ConstraintInfo &Info) const override {
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006357 switch (*Name) {
6358 case 'v':
6359 case 'q':
6360 if (HasHVX) {
6361 Info.setAllowsRegister();
6362 return true;
6363 }
6364 break;
Krzysztof Parzyszek89fb4412016-05-20 13:50:32 +00006365 case 's':
6366 // Relocatable constant.
6367 return true;
Krzysztof Parzyszeke0026e42016-05-18 14:56:14 +00006368 }
6369 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006370 }
6371
Craig Topper3164f332014-03-11 03:39:26 +00006372 void getTargetDefines(const LangOptions &Opts,
6373 MacroBuilder &Builder) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006374
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006375 bool isCLZForZeroUndef() const override { return false; }
6376
Craig Topper3164f332014-03-11 03:39:26 +00006377 bool hasFeature(StringRef Feature) const override {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006378 return llvm::StringSwitch<bool>(Feature)
6379 .Case("hexagon", true)
6380 .Case("hvx", HasHVX)
6381 .Case("hvx-double", HasHVXDouble)
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006382 .Case("long-calls", UseLongCalls)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006383 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006384 }
Craig Topper3164f332014-03-11 03:39:26 +00006385
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006386 bool initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
6387 StringRef CPU, const std::vector<std::string> &FeaturesVec)
6388 const override;
6389
6390 bool handleTargetFeatures(std::vector<std::string> &Features,
6391 DiagnosticsEngine &Diags) override;
6392
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006393 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
6394 bool Enabled) const override;
6395
Craig Topper3164f332014-03-11 03:39:26 +00006396 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006397 return TargetInfo::CharPtrBuiltinVaList;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006399 ArrayRef<const char *> getGCCRegNames() const override;
6400 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006401 const char *getClobbers() const override {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006402 return "";
6403 }
Sebastian Pop86500282012-01-13 20:37:10 +00006404
6405 static const char *getHexagonCPUSuffix(StringRef Name) {
6406 return llvm::StringSwitch<const char*>(Name)
Sebastian Pop86500282012-01-13 20:37:10 +00006407 .Case("hexagonv4", "4")
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006408 .Case("hexagonv5", "5")
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006409 .Case("hexagonv55", "55")
6410 .Case("hexagonv60", "60")
Craig Topperf1186c52014-05-08 06:41:40 +00006411 .Default(nullptr);
Sebastian Pop86500282012-01-13 20:37:10 +00006412 }
6413
Craig Topper3164f332014-03-11 03:39:26 +00006414 bool setCPU(const std::string &Name) override {
Sebastian Pop86500282012-01-13 20:37:10 +00006415 if (!getHexagonCPUSuffix(Name))
6416 return false;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006417 CPU = Name;
6418 return true;
6419 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006420
6421 int getEHDataRegisterNumber(unsigned RegNo) const override {
6422 return RegNo < 2 ? RegNo : -1;
6423 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006424};
6425
6426void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006427 MacroBuilder &Builder) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006428 Builder.defineMacro("__qdsp6__", "1");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006429 Builder.defineMacro("__hexagon__", "1");
6430
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006431 if (CPU == "hexagonv4") {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006432 Builder.defineMacro("__HEXAGON_V4__");
6433 Builder.defineMacro("__HEXAGON_ARCH__", "4");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006434 if (Opts.HexagonQdsp6Compat) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006435 Builder.defineMacro("__QDSP6_V4__");
6436 Builder.defineMacro("__QDSP6_ARCH__", "4");
6437 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006438 } else if (CPU == "hexagonv5") {
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006439 Builder.defineMacro("__HEXAGON_V5__");
6440 Builder.defineMacro("__HEXAGON_ARCH__", "5");
6441 if(Opts.HexagonQdsp6Compat) {
6442 Builder.defineMacro("__QDSP6_V5__");
6443 Builder.defineMacro("__QDSP6_ARCH__", "5");
6444 }
Krzysztof Parzyszeka58ff512016-04-21 14:30:04 +00006445 } else if (CPU == "hexagonv55") {
6446 Builder.defineMacro("__HEXAGON_V55__");
6447 Builder.defineMacro("__HEXAGON_ARCH__", "55");
6448 Builder.defineMacro("__QDSP6_V55__");
6449 Builder.defineMacro("__QDSP6_ARCH__", "55");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006450 } else if (CPU == "hexagonv60") {
6451 Builder.defineMacro("__HEXAGON_V60__");
6452 Builder.defineMacro("__HEXAGON_ARCH__", "60");
6453 Builder.defineMacro("__QDSP6_V60__");
6454 Builder.defineMacro("__QDSP6_ARCH__", "60");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00006455 }
Krzysztof Parzyszek7f0756c2016-04-18 18:38:11 +00006456
6457 if (hasFeature("hvx")) {
6458 Builder.defineMacro("__HVX__");
6459 if (hasFeature("hvx-double"))
6460 Builder.defineMacro("__HVXDBL__");
6461 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006462}
6463
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006464bool HexagonTargetInfo::initFeatureMap(llvm::StringMap<bool> &Features,
6465 DiagnosticsEngine &Diags, StringRef CPU,
6466 const std::vector<std::string> &FeaturesVec) const {
6467 // Default for v60: -hvx, -hvx-double.
6468 Features["hvx"] = false;
6469 Features["hvx-double"] = false;
6470 Features["long-calls"] = false;
6471
6472 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
6473}
6474
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006475bool HexagonTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
6476 DiagnosticsEngine &Diags) {
6477 for (auto &F : Features) {
6478 if (F == "+hvx")
6479 HasHVX = true;
6480 else if (F == "-hvx")
6481 HasHVX = HasHVXDouble = false;
6482 else if (F == "+hvx-double")
6483 HasHVX = HasHVXDouble = true;
6484 else if (F == "-hvx-double")
6485 HasHVXDouble = false;
Krzysztof Parzyszek1f269122016-08-30 13:57:50 +00006486
6487 if (F == "+long-calls")
6488 UseLongCalls = true;
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006489 else if (F == "-long-calls")
6490 UseLongCalls = false;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006491 }
6492 return true;
6493}
6494
Krzysztof Parzyszek7cd30bd2016-08-30 14:17:10 +00006495void HexagonTargetInfo::setFeatureEnabled(llvm::StringMap<bool> &Features,
6496 StringRef Name, bool Enabled) const {
6497 if (Enabled) {
6498 if (Name == "hvx-double")
6499 Features["hvx"] = true;
6500 } else {
6501 if (Name == "hvx")
6502 Features["hvx-double"] = false;
6503 }
6504 Features[Name] = Enabled;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006505}
6506
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006507const char *const HexagonTargetInfo::GCCRegNames[] = {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006508 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6509 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6510 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6511 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
6512 "p0", "p1", "p2", "p3",
6513 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
6514};
6515
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006516ArrayRef<const char*> HexagonTargetInfo::getGCCRegNames() const {
Craig Topperf054e3a2015-10-19 03:52:27 +00006517 return llvm::makeArrayRef(GCCRegNames);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006518}
6519
Tony Linthicum76329bf2011-12-12 21:14:55 +00006520const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
6521 { { "sp" }, "r29" },
6522 { { "fp" }, "r30" },
6523 { { "lr" }, "r31" },
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006524};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006525
Craig Topperf054e3a2015-10-19 03:52:27 +00006526ArrayRef<TargetInfo::GCCRegAlias> HexagonTargetInfo::getGCCRegAliases() const {
6527 return llvm::makeArrayRef(GCCRegAliases);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006528}
6529
6530
6531const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00006532#define BUILTIN(ID, TYPE, ATTRS) \
6533 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
6534#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
6535 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Tony Linthicum76329bf2011-12-12 21:14:55 +00006536#include "clang/Basic/BuiltinsHexagon.def"
6537};
Tony Linthicum76329bf2011-12-12 21:14:55 +00006538
Jacques Pienaard964cc22016-03-28 21:02:54 +00006539class LanaiTargetInfo : public TargetInfo {
6540 // Class for Lanai (32-bit).
6541 // The CPU profiles supported by the Lanai backend
6542 enum CPUKind {
6543 CK_NONE,
6544 CK_V11,
6545 } CPU;
6546
6547 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6548 static const char *const GCCRegNames[];
6549
6550public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006551 LanaiTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
6552 : TargetInfo(Triple) {
Jacques Pienaard964cc22016-03-28 21:02:54 +00006553 // Description string has to be kept in sync with backend.
6554 resetDataLayout("E" // Big endian
6555 "-m:e" // ELF name manging
6556 "-p:32:32" // 32 bit pointers, 32 bit aligned
6557 "-i64:64" // 64 bit integers, 64 bit aligned
6558 "-a:0:32" // 32 bit alignment of objects of aggregate type
6559 "-n32" // 32 bit native integer width
6560 "-S64" // 64 bit natural stack alignment
6561 );
6562
6563 // Setting RegParmMax equal to what mregparm was set to in the old
6564 // toolchain
6565 RegParmMax = 4;
6566
6567 // Set the default CPU to V11
6568 CPU = CK_V11;
6569
6570 // Temporary approach to make everything at least word-aligned and allow for
6571 // safely casting between pointers with different alignment requirements.
6572 // TODO: Remove this when there are no more cast align warnings on the
6573 // firmware.
6574 MinGlobalAlign = 32;
6575 }
6576
6577 void getTargetDefines(const LangOptions &Opts,
6578 MacroBuilder &Builder) const override {
6579 // Define __lanai__ when building for target lanai.
6580 Builder.defineMacro("__lanai__");
6581
6582 // Set define for the CPU specified.
6583 switch (CPU) {
6584 case CK_V11:
6585 Builder.defineMacro("__LANAI_V11__");
6586 break;
6587 case CK_NONE:
6588 llvm_unreachable("Unhandled target CPU");
6589 }
6590 }
6591
6592 bool setCPU(const std::string &Name) override {
6593 CPU = llvm::StringSwitch<CPUKind>(Name)
6594 .Case("v11", CK_V11)
6595 .Default(CK_NONE);
6596
6597 return CPU != CK_NONE;
6598 }
6599
6600 bool hasFeature(StringRef Feature) const override {
6601 return llvm::StringSwitch<bool>(Feature).Case("lanai", true).Default(false);
6602 }
6603
6604 ArrayRef<const char *> getGCCRegNames() const override;
6605
6606 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
6607
6608 BuiltinVaListKind getBuiltinVaListKind() const override {
6609 return TargetInfo::VoidPtrBuiltinVaList;
6610 }
6611
6612 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
6613
6614 bool validateAsmConstraint(const char *&Name,
6615 TargetInfo::ConstraintInfo &info) const override {
6616 return false;
6617 }
6618
6619 const char *getClobbers() const override { return ""; }
6620};
6621
6622const char *const LanaiTargetInfo::GCCRegNames[] = {
6623 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10",
6624 "r11", "r12", "r13", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21",
6625 "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"};
6626
6627ArrayRef<const char *> LanaiTargetInfo::getGCCRegNames() const {
6628 return llvm::makeArrayRef(GCCRegNames);
6629}
6630
6631const TargetInfo::GCCRegAlias LanaiTargetInfo::GCCRegAliases[] = {
6632 {{"pc"}, "r2"},
6633 {{"sp"}, "r4"},
6634 {{"fp"}, "r5"},
6635 {{"rv"}, "r8"},
6636 {{"rr1"}, "r10"},
6637 {{"rr2"}, "r11"},
6638 {{"rca"}, "r15"},
6639};
6640
6641ArrayRef<TargetInfo::GCCRegAlias> LanaiTargetInfo::getGCCRegAliases() const {
6642 return llvm::makeArrayRef(GCCRegAliases);
6643}
6644
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006645// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
6646class SparcTargetInfo : public TargetInfo {
Chris Lattner9b415d62009-01-27 01:58:38 +00006647 static const TargetInfo::GCCRegAlias GCCRegAliases[];
6648 static const char * const GCCRegNames[];
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006649 bool SoftFloat;
Gabor Greif49991682008-02-21 16:29:08 +00006650public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006651 SparcTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
James Y Knighta3518ad2016-01-27 01:04:51 +00006652 : TargetInfo(Triple), SoftFloat(false) {}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006653
Joerg Sonnenbergerd0be8dc2016-03-07 17:19:15 +00006654 int getEHDataRegisterNumber(unsigned RegNo) const override {
6655 if (RegNo == 0) return 24;
6656 if (RegNo == 1) return 25;
6657 return -1;
6658 }
6659
Craig Topper3164f332014-03-11 03:39:26 +00006660 bool handleTargetFeatures(std::vector<std::string> &Features,
6661 DiagnosticsEngine &Diags) override {
Jacob Baungard Hansen13a49372016-05-24 08:30:08 +00006662 // Check if software floating point is enabled
Eric Christopherfb481a42015-04-29 23:32:17 +00006663 auto Feature = std::find(Features.begin(), Features.end(), "+soft-float");
6664 if (Feature != Features.end()) {
6665 SoftFloat = true;
Eric Christopherfb481a42015-04-29 23:32:17 +00006666 }
Rafael Espindolaeb265472013-08-21 21:59:03 +00006667 return true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006668 }
Craig Topper3164f332014-03-11 03:39:26 +00006669 void getTargetDefines(const LangOptions &Opts,
6670 MacroBuilder &Builder) const override {
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006671 DefineStd(Builder, "sparc", Opts);
Benjamin Kramer2d6fda32010-01-09 17:55:51 +00006672 Builder.defineMacro("__REGISTER_PREFIX__", "");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00006673
6674 if (SoftFloat)
6675 Builder.defineMacro("SOFT_FLOAT", "1");
Gabor Greif49991682008-02-21 16:29:08 +00006676 }
Craig Topper3164f332014-03-11 03:39:26 +00006677
6678 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00006679 return llvm::StringSwitch<bool>(Feature)
6680 .Case("softfloat", SoftFloat)
6681 .Case("sparc", true)
6682 .Default(false);
6683 }
Craig Topper3164f332014-03-11 03:39:26 +00006684
Chris Dewhurst0381cd72016-06-15 12:44:47 +00006685 bool hasSjLjLowering() const override {
6686 return true;
6687 }
6688
Craig Topper6c03a542015-10-19 04:51:35 +00006689 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006690 // FIXME: Implement!
Craig Topper6c03a542015-10-19 04:51:35 +00006691 return None;
Gabor Greif49991682008-02-21 16:29:08 +00006692 }
Craig Topper3164f332014-03-11 03:39:26 +00006693 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00006694 return TargetInfo::VoidPtrBuiltinVaList;
Gabor Greif49991682008-02-21 16:29:08 +00006695 }
Craig Topperf054e3a2015-10-19 03:52:27 +00006696 ArrayRef<const char *> getGCCRegNames() const override;
6697 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00006698 bool validateAsmConstraint(const char *&Name,
6699 TargetInfo::ConstraintInfo &info) const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006700 // FIXME: Implement!
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00006701 switch (*Name) {
6702 case 'I': // Signed 13-bit constant
6703 case 'J': // Zero
6704 case 'K': // 32-bit constant with the low 12 bits clear
6705 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
6706 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
6707 case 'N': // Same as 'K' but zext (required for SIMode)
6708 case 'O': // The constant 4096
6709 return true;
6710 }
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006711 return false;
Gabor Greif49991682008-02-21 16:29:08 +00006712 }
Craig Topper3164f332014-03-11 03:39:26 +00006713 const char *getClobbers() const override {
Eli Friedmanda8f5a92008-08-20 07:28:14 +00006714 // FIXME: Implement!
6715 return "";
Gabor Greif49991682008-02-21 16:29:08 +00006716 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006717
6718 // No Sparc V7 for now, the backend doesn't support it anyway.
6719 enum CPUKind {
6720 CK_GENERIC,
6721 CK_V8,
6722 CK_SUPERSPARC,
6723 CK_SPARCLITE,
6724 CK_F934,
6725 CK_HYPERSPARC,
6726 CK_SPARCLITE86X,
6727 CK_SPARCLET,
6728 CK_TSC701,
6729 CK_V9,
6730 CK_ULTRASPARC,
6731 CK_ULTRASPARC3,
6732 CK_NIAGARA,
6733 CK_NIAGARA2,
6734 CK_NIAGARA3,
Douglas Katzman6871afc2016-03-15 22:34:02 +00006735 CK_NIAGARA4,
Douglas Katzman87da5f42016-07-25 16:36:02 +00006736 CK_MYRIAD2100,
6737 CK_MYRIAD2150,
6738 CK_MYRIAD2450,
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006739 CK_LEON2,
6740 CK_LEON2_AT697E,
6741 CK_LEON2_AT697F,
6742 CK_LEON3,
6743 CK_LEON3_UT699,
6744 CK_LEON3_GR712RC,
6745 CK_LEON4,
6746 CK_LEON4_GR740
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006747 } CPU = CK_GENERIC;
6748
6749 enum CPUGeneration {
6750 CG_V8,
6751 CG_V9,
6752 };
6753
6754 CPUGeneration getCPUGeneration(CPUKind Kind) const {
6755 switch (Kind) {
6756 case CK_GENERIC:
6757 case CK_V8:
6758 case CK_SUPERSPARC:
6759 case CK_SPARCLITE:
6760 case CK_F934:
6761 case CK_HYPERSPARC:
6762 case CK_SPARCLITE86X:
6763 case CK_SPARCLET:
6764 case CK_TSC701:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006765 case CK_MYRIAD2100:
6766 case CK_MYRIAD2150:
6767 case CK_MYRIAD2450:
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006768 case CK_LEON2:
6769 case CK_LEON2_AT697E:
6770 case CK_LEON2_AT697F:
6771 case CK_LEON3:
6772 case CK_LEON3_UT699:
6773 case CK_LEON3_GR712RC:
6774 case CK_LEON4:
6775 case CK_LEON4_GR740:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006776 return CG_V8;
6777 case CK_V9:
6778 case CK_ULTRASPARC:
6779 case CK_ULTRASPARC3:
6780 case CK_NIAGARA:
6781 case CK_NIAGARA2:
6782 case CK_NIAGARA3:
6783 case CK_NIAGARA4:
6784 return CG_V9;
6785 }
Aaron Ballmana9a72852015-11-11 13:42:02 +00006786 llvm_unreachable("Unexpected CPU kind");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006787 }
6788
6789 CPUKind getCPUKind(StringRef Name) const {
6790 return llvm::StringSwitch<CPUKind>(Name)
6791 .Case("v8", CK_V8)
6792 .Case("supersparc", CK_SUPERSPARC)
6793 .Case("sparclite", CK_SPARCLITE)
6794 .Case("f934", CK_F934)
6795 .Case("hypersparc", CK_HYPERSPARC)
6796 .Case("sparclite86x", CK_SPARCLITE86X)
6797 .Case("sparclet", CK_SPARCLET)
6798 .Case("tsc701", CK_TSC701)
6799 .Case("v9", CK_V9)
6800 .Case("ultrasparc", CK_ULTRASPARC)
6801 .Case("ultrasparc3", CK_ULTRASPARC3)
6802 .Case("niagara", CK_NIAGARA)
6803 .Case("niagara2", CK_NIAGARA2)
6804 .Case("niagara3", CK_NIAGARA3)
6805 .Case("niagara4", CK_NIAGARA4)
Douglas Katzman87da5f42016-07-25 16:36:02 +00006806 .Case("ma2100", CK_MYRIAD2100)
6807 .Case("ma2150", CK_MYRIAD2150)
6808 .Case("ma2450", CK_MYRIAD2450)
6809 // FIXME: the myriad2[.n] spellings are obsolete,
6810 // but a grace period is needed to allow updating dependent builds.
6811 .Case("myriad2", CK_MYRIAD2100)
6812 .Case("myriad2.1", CK_MYRIAD2100)
6813 .Case("myriad2.2", CK_MYRIAD2150)
Jacob Baungard Hansen1bf12822016-07-04 08:56:08 +00006814 .Case("leon2", CK_LEON2)
6815 .Case("at697e", CK_LEON2_AT697E)
6816 .Case("at697f", CK_LEON2_AT697F)
6817 .Case("leon3", CK_LEON3)
6818 .Case("ut699", CK_LEON3_UT699)
6819 .Case("gr712rc", CK_LEON3_GR712RC)
6820 .Case("leon4", CK_LEON4)
6821 .Case("gr740", CK_LEON4_GR740)
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006822 .Default(CK_GENERIC);
6823 }
6824
6825 bool setCPU(const std::string &Name) override {
6826 CPU = getCPUKind(Name);
6827 return CPU != CK_GENERIC;
6828 }
Gabor Greif49991682008-02-21 16:29:08 +00006829};
6830
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006831const char * const SparcTargetInfo::GCCRegNames[] = {
Chris Lattner9b415d62009-01-27 01:58:38 +00006832 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6833 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
6834 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
6835 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
6836};
6837
Craig Topperf054e3a2015-10-19 03:52:27 +00006838ArrayRef<const char *> SparcTargetInfo::getGCCRegNames() const {
6839 return llvm::makeArrayRef(GCCRegNames);
Chris Lattner9b415d62009-01-27 01:58:38 +00006840}
6841
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006842const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
Anton Korobeynikov9d026dd2009-05-03 13:42:53 +00006843 { { "g0" }, "r0" },
6844 { { "g1" }, "r1" },
6845 { { "g2" }, "r2" },
6846 { { "g3" }, "r3" },
6847 { { "g4" }, "r4" },
6848 { { "g5" }, "r5" },
6849 { { "g6" }, "r6" },
6850 { { "g7" }, "r7" },
6851 { { "o0" }, "r8" },
6852 { { "o1" }, "r9" },
6853 { { "o2" }, "r10" },
6854 { { "o3" }, "r11" },
6855 { { "o4" }, "r12" },
6856 { { "o5" }, "r13" },
6857 { { "o6", "sp" }, "r14" },
6858 { { "o7" }, "r15" },
6859 { { "l0" }, "r16" },
6860 { { "l1" }, "r17" },
6861 { { "l2" }, "r18" },
6862 { { "l3" }, "r19" },
6863 { { "l4" }, "r20" },
6864 { { "l5" }, "r21" },
6865 { { "l6" }, "r22" },
6866 { { "l7" }, "r23" },
6867 { { "i0" }, "r24" },
6868 { { "i1" }, "r25" },
6869 { { "i2" }, "r26" },
6870 { { "i3" }, "r27" },
6871 { { "i4" }, "r28" },
6872 { { "i5" }, "r29" },
6873 { { "i6", "fp" }, "r30" },
6874 { { "i7" }, "r31" },
Chris Lattner9b415d62009-01-27 01:58:38 +00006875};
6876
Craig Topperf054e3a2015-10-19 03:52:27 +00006877ArrayRef<TargetInfo::GCCRegAlias> SparcTargetInfo::getGCCRegAliases() const {
6878 return llvm::makeArrayRef(GCCRegAliases);
Chris Lattner9b415d62009-01-27 01:58:38 +00006879}
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006880
6881// SPARC v8 is the 32-bit mode selected by Triple::sparc.
6882class SparcV8TargetInfo : public SparcTargetInfo {
6883public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006884 SparcV8TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6885 : SparcTargetInfo(Triple, Opts) {
James Y Knightb214cbc2016-03-04 19:00:41 +00006886 resetDataLayout("E-m:e-p:32:32-i64:64-f128:64-n32-S64");
Brad Smith73859112015-08-13 21:45:57 +00006887 // NetBSD / OpenBSD use long (same as llvm default); everyone else uses int.
6888 switch (getTriple().getOS()) {
6889 default:
James Y Knight4b4d19e2015-06-04 15:36:29 +00006890 SizeType = UnsignedInt;
6891 IntPtrType = SignedInt;
6892 PtrDiffType = SignedInt;
Brad Smith73859112015-08-13 21:45:57 +00006893 break;
6894 case llvm::Triple::NetBSD:
6895 case llvm::Triple::OpenBSD:
6896 SizeType = UnsignedLong;
6897 IntPtrType = SignedLong;
6898 PtrDiffType = SignedLong;
6899 break;
Brad Smith56495d52015-08-13 22:00:53 +00006900 }
Douglas Katzman13f4a912016-11-09 15:43:51 +00006901 // Up to 32 bits are lock-free atomic, but we're willing to do atomic ops
6902 // on up to 64 bits.
6903 MaxAtomicPromoteWidth = 64;
6904 MaxAtomicInlineWidth = 32;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006905 }
6906
Craig Topper3164f332014-03-11 03:39:26 +00006907 void getTargetDefines(const LangOptions &Opts,
6908 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006909 SparcTargetInfo::getTargetDefines(Opts, Builder);
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006910 switch (getCPUGeneration(CPU)) {
6911 case CG_V8:
6912 Builder.defineMacro("__sparcv8");
6913 if (getTriple().getOS() != llvm::Triple::Solaris)
6914 Builder.defineMacro("__sparcv8__");
6915 break;
6916 case CG_V9:
6917 Builder.defineMacro("__sparcv9");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006918 if (getTriple().getOS() != llvm::Triple::Solaris) {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006919 Builder.defineMacro("__sparcv9__");
Joerg Sonnenberger4ecfa622015-11-10 19:28:17 +00006920 Builder.defineMacro("__sparc_v9__");
6921 }
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00006922 break;
6923 }
Douglas Katzman6871afc2016-03-15 22:34:02 +00006924 if (getTriple().getVendor() == llvm::Triple::Myriad) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006925 std::string MyriadArchValue, Myriad2Value;
6926 Builder.defineMacro("__sparc_v8__");
6927 Builder.defineMacro("__leon__");
Douglas Katzman6871afc2016-03-15 22:34:02 +00006928 switch (CPU) {
Douglas Katzman87da5f42016-07-25 16:36:02 +00006929 case CK_MYRIAD2150:
6930 MyriadArchValue = "__ma2150";
6931 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006932 break;
Douglas Katzman87da5f42016-07-25 16:36:02 +00006933 case CK_MYRIAD2450:
6934 MyriadArchValue = "__ma2450";
6935 Myriad2Value = "2";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006936 break;
6937 default:
Douglas Katzman87da5f42016-07-25 16:36:02 +00006938 MyriadArchValue = "__ma2100";
6939 Myriad2Value = "1";
Douglas Katzman6871afc2016-03-15 22:34:02 +00006940 break;
6941 }
Douglas Katzman87da5f42016-07-25 16:36:02 +00006942 Builder.defineMacro(MyriadArchValue, "1");
6943 Builder.defineMacro(MyriadArchValue+"__", "1");
6944 Builder.defineMacro("__myriad2__", Myriad2Value);
6945 Builder.defineMacro("__myriad2", Myriad2Value);
Douglas Katzman6871afc2016-03-15 22:34:02 +00006946 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006947 }
Chris Dewhurst69fa1922016-05-04 09:33:30 +00006948
6949 bool hasSjLjLowering() const override {
6950 return true;
6951 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006952};
6953
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006954// SPARCV8el is the 32-bit little-endian mode selected by Triple::sparcel.
6955class SparcV8elTargetInfo : public SparcV8TargetInfo {
6956 public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006957 SparcV8elTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6958 : SparcV8TargetInfo(Triple, Opts) {
6959 resetDataLayout("e-m:e-p:32:32-i64:64-f128:64-n32-S64");
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00006960 }
6961};
6962
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006963// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
6964class SparcV9TargetInfo : public SparcTargetInfo {
6965public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00006966 SparcV9TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
6967 : SparcTargetInfo(Triple, Opts) {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006968 // FIXME: Support Sparc quad-precision long double?
James Y Knightb214cbc2016-03-04 19:00:41 +00006969 resetDataLayout("E-m:e-i64:64-n32:64-S128");
Jakob Stoklund Olesen248520b2013-05-15 03:22:33 +00006970 // This is an LP64 platform.
6971 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006972
6973 // OpenBSD uses long long for int64_t and intmax_t.
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006974 if (getTriple().getOS() == llvm::Triple::OpenBSD)
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006975 IntMaxType = SignedLongLong;
Joerg Sonnenberger9b7060e2014-07-14 21:00:38 +00006976 else
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006977 IntMaxType = SignedLong;
Jakob Stoklund Olesen826df142013-05-19 17:53:37 +00006978 Int64Type = IntMaxType;
Jakob Stoklund Olesen497332c2014-01-16 16:43:19 +00006979
6980 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
6981 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
6982 LongDoubleWidth = 128;
6983 LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00006984 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Jakob Stoklund Olesen5b630b42014-01-30 04:48:04 +00006985 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006986 }
6987
Craig Topper3164f332014-03-11 03:39:26 +00006988 void getTargetDefines(const LangOptions &Opts,
6989 MacroBuilder &Builder) const override {
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006990 SparcTargetInfo::getTargetDefines(Opts, Builder);
6991 Builder.defineMacro("__sparcv9");
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006992 Builder.defineMacro("__arch64__");
Rafael Espindola76483742014-08-14 15:14:51 +00006993 // Solaris doesn't need these variants, but the BSDs do.
6994 if (getTriple().getOS() != llvm::Triple::Solaris) {
Jakob Stoklund Olesenf7599892013-04-24 04:36:38 +00006995 Builder.defineMacro("__sparc64__");
6996 Builder.defineMacro("__sparc_v9__");
6997 Builder.defineMacro("__sparcv9__");
6998 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00006999 }
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007000
Craig Topper3164f332014-03-11 03:39:26 +00007001 bool setCPU(const std::string &Name) override {
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007002 if (!SparcTargetInfo::setCPU(Name))
7003 return false;
7004 return getCPUGeneration(CPU) == CG_V9;
Roman Divackyb1ae3d42014-02-25 18:35:30 +00007005 }
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00007006};
7007
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007008class SystemZTargetInfo : public TargetInfo {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007009 static const Builtin::Info BuiltinInfo[];
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007010 static const char *const GCCRegNames[];
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007011 std::string CPU;
7012 bool HasTransactionalExecution;
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007013 bool HasVector;
Ulrich Weigand47445072013-05-06 16:26:41 +00007014
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007015public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007016 SystemZTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Eric Christopherb093d692015-10-09 18:39:59 +00007017 : TargetInfo(Triple), CPU("z10"), HasTransactionalExecution(false),
7018 HasVector(false) {
Ulrich Weigand881497a2015-03-30 13:50:21 +00007019 IntMaxType = SignedLong;
7020 Int64Type = SignedLong;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007021 TLSSupported = true;
7022 IntWidth = IntAlign = 32;
7023 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
7024 PointerWidth = PointerAlign = 64;
7025 LongDoubleWidth = 128;
7026 LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007027 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Ulrich Weigandca3cb7f2015-04-21 17:29:35 +00007028 DefaultAlignForAttributeAligned = 64;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007029 MinGlobalAlign = 16;
James Y Knightb214cbc2016-03-04 19:00:41 +00007030 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 +00007031 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7032 }
7033 void getTargetDefines(const LangOptions &Opts,
7034 MacroBuilder &Builder) const override {
7035 Builder.defineMacro("__s390__");
7036 Builder.defineMacro("__s390x__");
7037 Builder.defineMacro("__zarch__");
7038 Builder.defineMacro("__LONG_DOUBLE_128__");
Ulrich Weigandb038a522016-02-05 21:34:28 +00007039
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007040 const std::string ISARev = llvm::StringSwitch<std::string>(CPU)
7041 .Cases("arch8", "z10", "8")
7042 .Cases("arch9", "z196", "9")
7043 .Cases("arch10", "zEC12", "10")
7044 .Cases("arch11", "z13", "11")
7045 .Default("");
7046 if (!ISARev.empty())
7047 Builder.defineMacro("__ARCH__", ISARev);
7048
Ulrich Weigandb038a522016-02-05 21:34:28 +00007049 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7050 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7051 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
7052 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
7053
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007054 if (HasTransactionalExecution)
7055 Builder.defineMacro("__HTM__");
Ulrich Weigand82a86cb2017-02-06 17:04:22 +00007056 if (HasVector)
7057 Builder.defineMacro("__VX__");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00007058 if (Opts.ZVector)
7059 Builder.defineMacro("__VEC__", "10301");
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007060 }
Craig Topper6c03a542015-10-19 04:51:35 +00007061 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7062 return llvm::makeArrayRef(BuiltinInfo,
7063 clang::SystemZ::LastTSBuiltin-Builtin::FirstTSBuiltin);
Ulrich Weigand47445072013-05-06 16:26:41 +00007064 }
7065
Craig Topperf054e3a2015-10-19 03:52:27 +00007066 ArrayRef<const char *> getGCCRegNames() const override;
7067 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007068 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007069 return None;
Ulrich Weigand47445072013-05-06 16:26:41 +00007070 }
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007071 bool validateAsmConstraint(const char *&Name,
7072 TargetInfo::ConstraintInfo &info) const override;
7073 const char *getClobbers() const override {
7074 // FIXME: Is this really right?
7075 return "";
7076 }
7077 BuiltinVaListKind getBuiltinVaListKind() const override {
7078 return TargetInfo::SystemZBuiltinVaList;
7079 }
7080 bool setCPU(const std::string &Name) override {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007081 CPU = Name;
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007082 bool CPUKnown = llvm::StringSwitch<bool>(Name)
7083 .Case("z10", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007084 .Case("arch8", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007085 .Case("z196", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007086 .Case("arch9", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007087 .Case("zEC12", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007088 .Case("arch10", true)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007089 .Case("z13", true)
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007090 .Case("arch11", true)
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007091 .Default(false);
7092
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007093 return CPUKnown;
7094 }
Eric Christopher8c47b422015-10-09 18:39:55 +00007095 bool
7096 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7097 StringRef CPU,
7098 const std::vector<std::string> &FeaturesVec) const override {
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007099 if (CPU == "zEC12" || CPU == "arch10")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007100 Features["transactional-execution"] = true;
Ulrich Weigand30354eb2016-10-31 14:38:05 +00007101 if (CPU == "z13" || CPU == "arch11") {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007102 Features["transactional-execution"] = true;
7103 Features["vector"] = true;
7104 }
Eric Christopher007b0a02015-08-28 22:32:01 +00007105 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007106 }
7107
7108 bool handleTargetFeatures(std::vector<std::string> &Features,
7109 DiagnosticsEngine &Diags) override {
7110 HasTransactionalExecution = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007111 for (const auto &Feature : Features) {
7112 if (Feature == "+transactional-execution")
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007113 HasTransactionalExecution = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007114 else if (Feature == "+vector")
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007115 HasVector = true;
7116 }
7117 // If we use the vector ABI, vector types are 64-bit aligned.
7118 if (HasVector) {
7119 MaxVectorAlign = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00007120 resetDataLayout("E-m:e-i1:8:16-i8:8:16-i64:64-f128:64"
7121 "-v128:64-a:8:16-n32:64");
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007122 }
7123 return true;
7124 }
7125
7126 bool hasFeature(StringRef Feature) const override {
7127 return llvm::StringSwitch<bool>(Feature)
Ulrich Weigandcc673442015-04-01 14:15:35 +00007128 .Case("systemz", true)
7129 .Case("htm", HasTransactionalExecution)
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007130 .Case("vx", HasVector)
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007131 .Default(false);
7132 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007133
Bryan Chane3f1ed52016-04-28 13:56:43 +00007134 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
7135 switch (CC) {
7136 case CC_C:
7137 case CC_Swift:
7138 return CCCR_OK;
7139 default:
7140 return CCCR_Warning;
7141 }
7142 }
7143
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00007144 StringRef getABI() const override {
7145 if (HasVector)
7146 return "vector";
7147 return "";
7148 }
Ulrich Weigand47fd2532015-06-16 15:21:47 +00007149
7150 bool useFloat128ManglingForLongDouble() const override {
7151 return true;
7152 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007153};
7154
7155const Builtin::Info SystemZTargetInfo::BuiltinInfo[] = {
7156#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00007157 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
Jonas Paulsson3ace74a2016-03-30 15:51:24 +00007158#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
7159 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00007160#include "clang/Basic/BuiltinsSystemZ.def"
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007161};
7162
7163const char *const SystemZTargetInfo::GCCRegNames[] = {
7164 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7165 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
7166 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
7167 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
7168};
7169
Craig Topperf054e3a2015-10-19 03:52:27 +00007170ArrayRef<const char *> SystemZTargetInfo::getGCCRegNames() const {
7171 return llvm::makeArrayRef(GCCRegNames);
Richard Sandifordd03f7b72014-04-10 09:56:24 +00007172}
7173
7174bool SystemZTargetInfo::
7175validateAsmConstraint(const char *&Name,
7176 TargetInfo::ConstraintInfo &Info) const {
7177 switch (*Name) {
7178 default:
7179 return false;
7180
7181 case 'a': // Address register
7182 case 'd': // Data register (equivalent to 'r')
7183 case 'f': // Floating-point register
7184 Info.setAllowsRegister();
7185 return true;
7186
7187 case 'I': // Unsigned 8-bit constant
7188 case 'J': // Unsigned 12-bit constant
7189 case 'K': // Signed 16-bit constant
7190 case 'L': // Signed 20-bit displacement (on all targets we support)
7191 case 'M': // 0x7fffffff
7192 return true;
7193
7194 case 'Q': // Memory with base and unsigned 12-bit displacement
7195 case 'R': // Likewise, plus an index
7196 case 'S': // Memory with base and signed 20-bit displacement
7197 case 'T': // Likewise, plus an index
7198 Info.setAllowsMemory();
7199 return true;
7200 }
7201}
Ulrich Weigand47445072013-05-06 16:26:41 +00007202
Eric Christopherc48497a2015-09-18 21:26:24 +00007203class MSP430TargetInfo : public TargetInfo {
7204 static const char *const GCCRegNames[];
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007205
Eric Christopherc48497a2015-09-18 21:26:24 +00007206public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007207 MSP430TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7208 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007209 TLSSupported = false;
7210 IntWidth = 16;
7211 IntAlign = 16;
7212 LongWidth = 32;
7213 LongLongWidth = 64;
7214 LongAlign = LongLongAlign = 16;
7215 PointerWidth = 16;
7216 PointerAlign = 16;
7217 SuitableAlign = 16;
7218 SizeType = UnsignedInt;
7219 IntMaxType = SignedLongLong;
7220 IntPtrType = SignedInt;
7221 PtrDiffType = SignedInt;
7222 SigAtomicType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00007223 resetDataLayout("e-m:e-p:16:16-i32:16:32-a:16-n8:16");
Anton Korobeynikova0f54372009-05-03 13:43:08 +00007224 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007225 void getTargetDefines(const LangOptions &Opts,
7226 MacroBuilder &Builder) const override {
7227 Builder.defineMacro("MSP430");
7228 Builder.defineMacro("__MSP430__");
7229 // FIXME: defines for different 'flavours' of MCU
7230 }
Craig Topper6c03a542015-10-19 04:51:35 +00007231 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007232 // FIXME: Implement.
Craig Topper6c03a542015-10-19 04:51:35 +00007233 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007234 }
7235 bool hasFeature(StringRef Feature) const override {
7236 return Feature == "msp430";
7237 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007238 ArrayRef<const char *> getGCCRegNames() const override;
7239 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
Eric Christopherc48497a2015-09-18 21:26:24 +00007240 // No aliases.
Craig Topperf054e3a2015-10-19 03:52:27 +00007241 return None;
Eric Christopherc48497a2015-09-18 21:26:24 +00007242 }
7243 bool validateAsmConstraint(const char *&Name,
7244 TargetInfo::ConstraintInfo &info) const override {
7245 // FIXME: implement
7246 switch (*Name) {
7247 case 'K': // the constant 1
7248 case 'L': // constant -1^20 .. 1^19
7249 case 'M': // constant 1-4:
Eli Friedmana9c3d712009-08-19 20:47:07 +00007250 return true;
7251 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007252 // No target constraints for now.
7253 return false;
7254 }
7255 const char *getClobbers() const override {
7256 // FIXME: Is this really right?
7257 return "";
7258 }
7259 BuiltinVaListKind getBuiltinVaListKind() const override {
7260 // FIXME: implement
7261 return TargetInfo::CharPtrBuiltinVaList;
7262 }
7263};
7264
7265const char *const MSP430TargetInfo::GCCRegNames[] = {
7266 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
7267 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"};
7268
Craig Topperf054e3a2015-10-19 03:52:27 +00007269ArrayRef<const char *> MSP430TargetInfo::getGCCRegNames() const {
7270 return llvm::makeArrayRef(GCCRegNames);
Eric Christopherc48497a2015-09-18 21:26:24 +00007271}
7272
7273// LLVM and Clang cannot be used directly to output native binaries for
7274// target, but is used to compile C code to llvm bitcode with correct
7275// type and alignment information.
7276//
7277// TCE uses the llvm bitcode as input and uses it for generating customized
7278// target processor and program binary. TCE co-design environment is
7279// publicly available in http://tce.cs.tut.fi
7280
7281static const unsigned TCEOpenCLAddrSpaceMap[] = {
7282 3, // opencl_global
7283 4, // opencl_local
7284 5, // opencl_constant
7285 // FIXME: generic has to be added to the target
7286 0, // opencl_generic
7287 0, // cuda_device
7288 0, // cuda_constant
7289 0 // cuda_shared
7290};
7291
7292class TCETargetInfo : public TargetInfo {
7293public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007294 TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7295 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00007296 TLSSupported = false;
7297 IntWidth = 32;
7298 LongWidth = LongLongWidth = 32;
7299 PointerWidth = 32;
7300 IntAlign = 32;
7301 LongAlign = LongLongAlign = 32;
7302 PointerAlign = 32;
7303 SuitableAlign = 32;
7304 SizeType = UnsignedInt;
7305 IntMaxType = SignedLong;
7306 IntPtrType = SignedInt;
7307 PtrDiffType = SignedInt;
7308 FloatWidth = 32;
7309 FloatAlign = 32;
7310 DoubleWidth = 32;
7311 DoubleAlign = 32;
7312 LongDoubleWidth = 32;
7313 LongDoubleAlign = 32;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007314 FloatFormat = &llvm::APFloat::IEEEsingle();
7315 DoubleFormat = &llvm::APFloat::IEEEsingle();
7316 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007317 resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-"
7318 "i16:16:32-i32:32:32-i64:32:32-"
7319 "f32:32:32-f64:32:32-v64:32:32-"
7320 "v128:32:32-v256:32:32-v512:32:32-"
7321 "v1024:32:32-a0:0:32-n32");
Eric Christopherc48497a2015-09-18 21:26:24 +00007322 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
7323 UseAddrSpaceMapMangling = true;
7324 }
7325
7326 void getTargetDefines(const LangOptions &Opts,
7327 MacroBuilder &Builder) const override {
7328 DefineStd(Builder, "tce", Opts);
7329 Builder.defineMacro("__TCE__");
7330 Builder.defineMacro("__TCE_V1__");
7331 }
7332 bool hasFeature(StringRef Feature) const override { return Feature == "tce"; }
7333
Craig Topper6c03a542015-10-19 04:51:35 +00007334 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007335 const char *getClobbers() const override { return ""; }
7336 BuiltinVaListKind getBuiltinVaListKind() const override {
7337 return TargetInfo::VoidPtrBuiltinVaList;
7338 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007339 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00007340 bool validateAsmConstraint(const char *&Name,
7341 TargetInfo::ConstraintInfo &info) const override {
7342 return true;
7343 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007344 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7345 return None;
7346 }
Eric Christopherc48497a2015-09-18 21:26:24 +00007347};
Eli Friedmana9c3d712009-08-19 20:47:07 +00007348
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00007349class TCELETargetInfo : public TCETargetInfo {
7350public:
7351 TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7352 : TCETargetInfo(Triple, Opts) {
7353 BigEndian = false;
7354
7355 resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-"
7356 "i16:16:32-i32:32:32-i64:32:32-"
7357 "f32:32:32-f64:32:32-v64:32:32-"
7358 "v128:32:32-v256:32:32-v512:32:32-"
7359 "v1024:32:32-a0:0:32-n32");
7360
7361 }
7362
7363 virtual void getTargetDefines(const LangOptions &Opts,
7364 MacroBuilder &Builder) const {
7365 DefineStd(Builder, "tcele", Opts);
7366 Builder.defineMacro("__TCE__");
7367 Builder.defineMacro("__TCE_V1__");
7368 Builder.defineMacro("__TCELE__");
7369 Builder.defineMacro("__TCELE_V1__");
7370 }
7371
7372};
7373
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007374class BPFTargetInfo : public TargetInfo {
7375public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007376 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
7377 : TargetInfo(Triple) {
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007378 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
7379 SizeType = UnsignedLong;
7380 PtrDiffType = SignedLong;
7381 IntPtrType = SignedLong;
7382 IntMaxType = SignedLong;
7383 Int64Type = SignedLong;
7384 RegParmMax = 5;
7385 if (Triple.getArch() == llvm::Triple::bpfeb) {
James Y Knightb214cbc2016-03-04 19:00:41 +00007386 resetDataLayout("E-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007387 } else {
James Y Knightb214cbc2016-03-04 19:00:41 +00007388 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007389 }
7390 MaxAtomicPromoteWidth = 64;
7391 MaxAtomicInlineWidth = 64;
7392 TLSSupported = false;
7393 }
7394 void getTargetDefines(const LangOptions &Opts,
7395 MacroBuilder &Builder) const override {
7396 DefineStd(Builder, "bpf", Opts);
7397 Builder.defineMacro("__BPF__");
7398 }
7399 bool hasFeature(StringRef Feature) const override {
7400 return Feature == "bpf";
7401 }
7402
Craig Topper6c03a542015-10-19 04:51:35 +00007403 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007404 const char *getClobbers() const override {
7405 return "";
7406 }
7407 BuiltinVaListKind getBuiltinVaListKind() const override {
7408 return TargetInfo::VoidPtrBuiltinVaList;
7409 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007410 ArrayRef<const char *> getGCCRegNames() const override {
7411 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007412 }
7413 bool validateAsmConstraint(const char *&Name,
7414 TargetInfo::ConstraintInfo &info) const override {
7415 return true;
7416 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007417 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7418 return None;
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00007419 }
7420};
7421
Daniel Sanders4672af62016-05-27 11:51:02 +00007422class MipsTargetInfo : public TargetInfo {
7423 void setDataLayout() {
Daniel Sanders55e40692016-06-03 10:11:01 +00007424 StringRef Layout;
7425
7426 if (ABI == "o32")
7427 Layout = "m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
7428 else if (ABI == "n32")
Daniel Sanders6a738832016-07-19 10:49:03 +00007429 Layout = "m:e-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007430 else if (ABI == "n64")
Daniel Sanders6a738832016-07-19 10:49:03 +00007431 Layout = "m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128";
Daniel Sanders55e40692016-06-03 10:11:01 +00007432 else
7433 llvm_unreachable("Invalid ABI");
7434
7435 if (BigEndian)
7436 resetDataLayout(("E-" + Layout).str());
7437 else
7438 resetDataLayout(("e-" + Layout).str());
Daniel Sanders4672af62016-05-27 11:51:02 +00007439 }
7440
Akira Hatanaka9064e362013-10-29 18:30:33 +00007441
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007442 static const Builtin::Info BuiltinInfo[];
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007443 std::string CPU;
Simon Atanasyan72244b62012-07-05 16:06:06 +00007444 bool IsMips16;
Simon Atanasyan60777612013-04-14 14:07:51 +00007445 bool IsMicromips;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007446 bool IsNan2008;
Simon Atanasyan16071912013-04-14 14:07:30 +00007447 bool IsSingleFloat;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007448 enum MipsFloatABI {
Simon Atanasyan16071912013-04-14 14:07:30 +00007449 HardFloat, SoftFloat
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007450 } FloatABI;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007451 enum DspRevEnum {
7452 NoDSP, DSP1, DSP2
7453 } DspRev;
Jack Carter44ff1e52013-08-12 17:20:29 +00007454 bool HasMSA;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007455
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007456protected:
Akira Hatanaka618b2982013-10-29 19:00:35 +00007457 bool HasFP64;
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007458 std::string ABI;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007459
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007460public:
Daniel Sanders4672af62016-05-27 11:51:02 +00007461 MipsTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007462 : TargetInfo(Triple), IsMips16(false), IsMicromips(false),
7463 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
7464 DspRev(NoDSP), HasMSA(false), HasFP64(false) {
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007465 TheCXXABI.set(TargetCXXABI::GenericMIPS);
Daniel Sanders4672af62016-05-27 11:51:02 +00007466
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007467 setABI((getTriple().getArch() == llvm::Triple::mips ||
7468 getTriple().getArch() == llvm::Triple::mipsel)
7469 ? "o32"
7470 : "n64");
7471
7472 CPU = ABI == "o32" ? "mips32r2" : "mips64r2";
Zoran Jovanovic26a12162015-02-18 15:21:35 +00007473 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007474
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007475 bool isNaN2008Default() const {
7476 return CPU == "mips32r6" || CPU == "mips64r6";
7477 }
7478
7479 bool isFP64Default() const {
7480 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
7481 }
7482
Petar Jovanovicd55ae6b2015-02-26 18:19:22 +00007483 bool isNan2008() const override {
7484 return IsNan2008;
7485 }
7486
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007487 bool processorSupportsGPR64() const {
7488 return llvm::StringSwitch<bool>(CPU)
7489 .Case("mips3", true)
7490 .Case("mips4", true)
7491 .Case("mips5", true)
7492 .Case("mips64", true)
7493 .Case("mips64r2", true)
7494 .Case("mips64r3", true)
7495 .Case("mips64r5", true)
7496 .Case("mips64r6", true)
7497 .Case("octeon", true)
7498 .Default(false);
7499 return false;
7500 }
7501
Alp Toker4925ba72014-06-07 23:30:42 +00007502 StringRef getABI() const override { return ABI; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007503 bool setABI(const std::string &Name) override {
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007504 if (Name == "o32") {
7505 setO32ABITypes();
7506 ABI = Name;
7507 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007508 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007509
7510 if (Name == "n32") {
7511 setN32ABITypes();
7512 ABI = Name;
7513 return true;
7514 }
7515 if (Name == "n64") {
7516 setN64ABITypes();
7517 ABI = Name;
7518 return true;
Daniel Sanders4672af62016-05-27 11:51:02 +00007519 }
7520 return false;
7521 }
7522
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007523 void setO32ABITypes() {
7524 Int64Type = SignedLongLong;
7525 IntMaxType = Int64Type;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007526 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007527 LongDoubleWidth = LongDoubleAlign = 64;
7528 LongWidth = LongAlign = 32;
7529 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
7530 PointerWidth = PointerAlign = 32;
7531 PtrDiffType = SignedInt;
7532 SizeType = UnsignedInt;
7533 SuitableAlign = 64;
7534 }
7535
7536 void setN32N64ABITypes() {
7537 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007538 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007539 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
7540 LongDoubleWidth = LongDoubleAlign = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00007541 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007542 }
7543 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
7544 SuitableAlign = 128;
7545 }
7546
Daniel Sanders4672af62016-05-27 11:51:02 +00007547 void setN64ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007548 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007549 Int64Type = SignedLong;
7550 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007551 LongWidth = LongAlign = 64;
7552 PointerWidth = PointerAlign = 64;
7553 PtrDiffType = SignedLong;
7554 SizeType = UnsignedLong;
Daniel Sanders4672af62016-05-27 11:51:02 +00007555 }
7556
7557 void setN32ABITypes() {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007558 setN32N64ABITypes();
Daniel Sanders4672af62016-05-27 11:51:02 +00007559 Int64Type = SignedLongLong;
7560 IntMaxType = Int64Type;
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007561 LongWidth = LongAlign = 32;
7562 PointerWidth = PointerAlign = 32;
7563 PtrDiffType = SignedInt;
7564 SizeType = UnsignedInt;
Daniel Sanders4672af62016-05-27 11:51:02 +00007565 }
7566
Craig Topper3164f332014-03-11 03:39:26 +00007567 bool setCPU(const std::string &Name) override {
Eric Christopher0b26a612010-03-02 02:41:08 +00007568 CPU = Name;
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007569 return llvm::StringSwitch<bool>(Name)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007570 .Case("mips1", true)
7571 .Case("mips2", true)
Simon Atanasyan26610c52014-07-04 12:36:56 +00007572 .Case("mips3", true)
7573 .Case("mips4", true)
7574 .Case("mips5", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007575 .Case("mips32", true)
7576 .Case("mips32r2", true)
7577 .Case("mips32r3", true)
7578 .Case("mips32r5", true)
7579 .Case("mips32r6", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007580 .Case("mips64", true)
7581 .Case("mips64r2", true)
Simon Atanasyan162feb52015-02-20 23:37:40 +00007582 .Case("mips64r3", true)
7583 .Case("mips64r5", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007584 .Case("mips64r6", true)
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007585 .Case("octeon", true)
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007586 .Case("p5600", true)
Simon Atanasyan6b3544e2014-07-03 08:31:23 +00007587 .Default(false);
Eric Christopher0b26a612010-03-02 02:41:08 +00007588 }
Matheus Almeidab84b37d2014-06-05 14:59:18 +00007589 const std::string& getCPU() const { return CPU; }
Eric Christopher8c47b422015-10-09 18:39:55 +00007590 bool
7591 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
7592 StringRef CPU,
7593 const std::vector<std::string> &FeaturesVec) const override {
Bhushan D. Attardebacb988732016-03-04 06:56:29 +00007594 if (CPU.empty())
7595 CPU = getCPU();
Simon Atanasyan4e16a422014-07-04 12:37:04 +00007596 if (CPU == "octeon")
7597 Features["mips64r2"] = Features["cnmips"] = true;
7598 else
7599 Features[CPU] = true;
Eric Christopher007b0a02015-08-28 22:32:01 +00007600 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
Eric Christopher0b26a612010-03-02 02:41:08 +00007601 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007602
Craig Topper3164f332014-03-11 03:39:26 +00007603 void getTargetDefines(const LangOptions &Opts,
7604 MacroBuilder &Builder) const override {
Daniel Sanders4672af62016-05-27 11:51:02 +00007605 if (BigEndian) {
7606 DefineStd(Builder, "MIPSEB", Opts);
7607 Builder.defineMacro("_MIPSEB");
7608 } else {
7609 DefineStd(Builder, "MIPSEL", Opts);
7610 Builder.defineMacro("_MIPSEL");
7611 }
7612
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007613 Builder.defineMacro("__mips__");
Simon Atanasyan683535b2012-08-29 19:14:58 +00007614 Builder.defineMacro("_mips");
Simon Atanasyan26292cc2014-01-27 13:59:11 +00007615 if (Opts.GNUMode)
7616 Builder.defineMacro("mips");
7617
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007618 if (ABI == "o32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007619 Builder.defineMacro("__mips", "32");
7620 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
7621 } else {
7622 Builder.defineMacro("__mips", "64");
7623 Builder.defineMacro("__mips64");
7624 Builder.defineMacro("__mips64__");
7625 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
7626 }
7627
7628 const std::string ISARev = llvm::StringSwitch<std::string>(getCPU())
7629 .Cases("mips32", "mips64", "1")
7630 .Cases("mips32r2", "mips64r2", "2")
7631 .Cases("mips32r3", "mips64r3", "3")
7632 .Cases("mips32r5", "mips64r5", "5")
7633 .Cases("mips32r6", "mips64r6", "6")
7634 .Default("");
7635 if (!ISARev.empty())
7636 Builder.defineMacro("__mips_isa_rev", ISARev);
7637
7638 if (ABI == "o32") {
7639 Builder.defineMacro("__mips_o32");
7640 Builder.defineMacro("_ABIO32", "1");
7641 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
Daniel Sanders07c86542016-05-27 14:30:23 +00007642 } else if (ABI == "n32") {
Daniel Sanders4672af62016-05-27 11:51:02 +00007643 Builder.defineMacro("__mips_n32");
7644 Builder.defineMacro("_ABIN32", "2");
7645 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
7646 } else if (ABI == "n64") {
7647 Builder.defineMacro("__mips_n64");
7648 Builder.defineMacro("_ABI64", "3");
7649 Builder.defineMacro("_MIPS_SIM", "_ABI64");
7650 } else
7651 llvm_unreachable("Invalid ABI.");
7652
Simon Atanasyan683535b2012-08-29 19:14:58 +00007653 Builder.defineMacro("__REGISTER_PREFIX__", "");
7654
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007655 switch (FloatABI) {
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007656 case HardFloat:
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007657 Builder.defineMacro("__mips_hard_float", Twine(1));
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007658 break;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007659 case SoftFloat:
7660 Builder.defineMacro("__mips_soft_float", Twine(1));
7661 break;
Simon Atanasyand3d173d2012-06-05 13:06:56 +00007662 }
Simon Atanasyan26f19672012-04-05 19:28:31 +00007663
Simon Atanasyan16071912013-04-14 14:07:30 +00007664 if (IsSingleFloat)
7665 Builder.defineMacro("__mips_single_float", Twine(1));
7666
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007667 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
7668 Builder.defineMacro("_MIPS_FPSET",
7669 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
7670
Simon Atanasyan72244b62012-07-05 16:06:06 +00007671 if (IsMips16)
7672 Builder.defineMacro("__mips16", Twine(1));
7673
Simon Atanasyan60777612013-04-14 14:07:51 +00007674 if (IsMicromips)
7675 Builder.defineMacro("__mips_micromips", Twine(1));
7676
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007677 if (IsNan2008)
7678 Builder.defineMacro("__mips_nan2008", Twine(1));
7679
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007680 switch (DspRev) {
7681 default:
7682 break;
7683 case DSP1:
7684 Builder.defineMacro("__mips_dsp_rev", Twine(1));
7685 Builder.defineMacro("__mips_dsp", Twine(1));
7686 break;
7687 case DSP2:
7688 Builder.defineMacro("__mips_dsp_rev", Twine(2));
7689 Builder.defineMacro("__mips_dspr2", Twine(1));
7690 Builder.defineMacro("__mips_dsp", Twine(1));
7691 break;
7692 }
7693
Jack Carter44ff1e52013-08-12 17:20:29 +00007694 if (HasMSA)
7695 Builder.defineMacro("__mips_msa", Twine(1));
7696
Simon Atanasyan26f19672012-04-05 19:28:31 +00007697 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
7698 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
7699 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
Simon Atanasyan5a0642f2012-08-29 15:17:29 +00007700
7701 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
7702 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
Daniel Sanders5176f7e2015-12-22 12:59:30 +00007703
7704 // These shouldn't be defined for MIPS-I but there's no need to check
7705 // for that since MIPS-I isn't supported.
7706 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
7707 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
7708 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007709
7710 // 32-bit MIPS processors don't have the necessary lld/scd instructions
7711 // found in 64-bit processors. In the case of O32 on a 64-bit processor,
7712 // the instructions exist but using them violates the ABI since they
7713 // require 64-bit GPRs and O32 only supports 32-bit GPRs.
7714 if (ABI == "n32" || ABI == "n64")
Daniel Sanders4672af62016-05-27 11:51:02 +00007715 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007716 }
7717
Craig Topper6c03a542015-10-19 04:51:35 +00007718 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
7719 return llvm::makeArrayRef(BuiltinInfo,
7720 clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin);
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007721 }
Craig Topper3164f332014-03-11 03:39:26 +00007722 bool hasFeature(StringRef Feature) const override {
Akira Hatanaka618b2982013-10-29 19:00:35 +00007723 return llvm::StringSwitch<bool>(Feature)
7724 .Case("mips", true)
7725 .Case("fp64", HasFP64)
7726 .Default(false);
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007727 }
Craig Topper3164f332014-03-11 03:39:26 +00007728 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007729 return TargetInfo::VoidPtrBuiltinVaList;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007730 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007731 ArrayRef<const char *> getGCCRegNames() const override {
Daniel Sanders8b59af12013-11-12 12:56:01 +00007732 static const char *const GCCRegNames[] = {
Eric Christopher8b6d0512012-03-27 19:56:11 +00007733 // CPU register names
7734 // Must match second column of GCCRegAliases
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007735 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
7736 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
7737 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007738 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
7739 // Floating point register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007740 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
7741 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
7742 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
7743 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
Eric Christopher8b6d0512012-03-27 19:56:11 +00007744 // Hi/lo and condition register names
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007745 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
Hrvoje Varga14c42ee2016-03-29 12:46:16 +00007746 "$fcc5","$fcc6","$fcc7","$ac1hi","$ac1lo","$ac2hi","$ac2lo",
7747 "$ac3hi","$ac3lo",
Daniel Sanders8b59af12013-11-12 12:56:01 +00007748 // MSA register names
7749 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
7750 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
7751 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
7752 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
7753 // MSA control register names
7754 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
7755 "$msarequest", "$msamap", "$msaunmap"
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007756 };
Craig Topperf054e3a2015-10-19 03:52:27 +00007757 return llvm::makeArrayRef(GCCRegNames);
Akira Hatanakaf6da3312011-09-20 19:00:23 +00007758 }
Craig Topper3164f332014-03-11 03:39:26 +00007759 bool validateAsmConstraint(const char *&Name,
7760 TargetInfo::ConstraintInfo &Info) const override {
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007761 switch (*Name) {
7762 default:
Douglas Gregor07216d12011-11-02 20:52:01 +00007763 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007764 case 'r': // CPU registers.
7765 case 'd': // Equivalent to "r" unless generating MIPS16 code.
Alp Toker958027b2014-07-14 19:42:55 +00007766 case 'y': // Equivalent to "r", backward compatibility only.
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007767 case 'f': // floating-point registers.
Eric Christopherb7e28cc2012-04-03 01:16:32 +00007768 case 'c': // $25 for indirect jumps
7769 case 'l': // lo register
7770 case 'x': // hilo register pair
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007771 Info.setAllowsRegister();
7772 return true;
Saleem Abdulrasoola2823572015-01-06 04:26:34 +00007773 case 'I': // Signed 16-bit constant
7774 case 'J': // Integer 0
7775 case 'K': // Unsigned 16-bit constant
7776 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
7777 case 'M': // Constants not loadable via lui, addiu, or ori
7778 case 'N': // Constant -1 to -65535
7779 case 'O': // A signed 15-bit constant
7780 case 'P': // A constant between 1 go 65535
7781 return true;
Jack Carterbeaccdd2013-03-05 19:10:54 +00007782 case 'R': // An address that can be used in a non-macro load or store
Jack Carter427b4042013-03-04 21:36:11 +00007783 Info.setAllowsMemory();
7784 return true;
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007785 case 'Z':
7786 if (Name[1] == 'C') { // An address usable by ll, and sc.
7787 Info.setAllowsMemory();
7788 Name++; // Skip over 'Z'.
7789 return true;
7790 }
7791 return false;
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007792 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007793 }
7794
Daniel Sanders48fa39e2015-03-30 13:47:23 +00007795 std::string convertConstraint(const char *&Constraint) const override {
7796 std::string R;
7797 switch (*Constraint) {
7798 case 'Z': // Two-character constraint; add "^" hint for later parsing.
7799 if (Constraint[1] == 'C') {
7800 R = std::string("^") + std::string(Constraint, 2);
7801 Constraint++;
7802 return R;
7803 }
7804 break;
7805 }
7806 return TargetInfo::convertConstraint(Constraint);
7807 }
7808
Craig Topper3164f332014-03-11 03:39:26 +00007809 const char *getClobbers() const override {
Toma Tabacucfab40f2015-01-12 14:41:30 +00007810 // In GCC, $1 is not widely used in generated code (it's used only in a few
7811 // specific situations), so there is no real need for users to add it to
7812 // the clobbers list if they want to use it in their inline assembly code.
7813 //
7814 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
7815 // code generation, so using it in inline assembly without adding it to the
7816 // clobbers list can cause conflicts between the inline assembly code and
7817 // the surrounding generated code.
7818 //
7819 // Another problem is that LLVM is allowed to choose $1 for inline assembly
7820 // operands, which will conflict with the ".set at" assembler option (which
7821 // we use only for inline assembly, in order to maintain compatibility with
7822 // GCC) and will also conflict with the user's usage of $1.
7823 //
7824 // The easiest way to avoid these conflicts and keep $1 as an allocatable
7825 // register for generated code is to automatically clobber $1 for all inline
7826 // assembly code.
7827 //
7828 // FIXME: We should automatically clobber $1 only for inline assembly code
7829 // which actually uses it. This would allow LLVM to use $1 for inline
7830 // assembly operands if the user's assembly code doesn't use it.
Toma Tabacu99411952014-12-17 12:02:58 +00007831 return "~{$1}";
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007832 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007833
Craig Topper3164f332014-03-11 03:39:26 +00007834 bool handleTargetFeatures(std::vector<std::string> &Features,
7835 DiagnosticsEngine &Diags) override {
Simon Atanasyan72244b62012-07-05 16:06:06 +00007836 IsMips16 = false;
Simon Atanasyan60777612013-04-14 14:07:51 +00007837 IsMicromips = false;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007838 IsNan2008 = isNaN2008Default();
Simon Atanasyan16071912013-04-14 14:07:30 +00007839 IsSingleFloat = false;
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007840 FloatABI = HardFloat;
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007841 DspRev = NoDSP;
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007842 HasFP64 = isFP64Default();
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007843
Eric Christopher610fe112015-08-26 08:21:55 +00007844 for (const auto &Feature : Features) {
7845 if (Feature == "+single-float")
Simon Atanasyan16071912013-04-14 14:07:30 +00007846 IsSingleFloat = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007847 else if (Feature == "+soft-float")
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007848 FloatABI = SoftFloat;
Eric Christopher610fe112015-08-26 08:21:55 +00007849 else if (Feature == "+mips16")
Simon Atanasyan72244b62012-07-05 16:06:06 +00007850 IsMips16 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007851 else if (Feature == "+micromips")
Simon Atanasyan60777612013-04-14 14:07:51 +00007852 IsMicromips = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007853 else if (Feature == "+dsp")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007854 DspRev = std::max(DspRev, DSP1);
Eric Christopher610fe112015-08-26 08:21:55 +00007855 else if (Feature == "+dspr2")
Simon Atanasyan9780e4a2012-07-05 20:16:22 +00007856 DspRev = std::max(DspRev, DSP2);
Eric Christopher610fe112015-08-26 08:21:55 +00007857 else if (Feature == "+msa")
Jack Carter44ff1e52013-08-12 17:20:29 +00007858 HasMSA = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007859 else if (Feature == "+fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007860 HasFP64 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007861 else if (Feature == "-fp64")
Simon Atanasyan2c97a812013-10-18 13:13:53 +00007862 HasFP64 = false;
Eric Christopher610fe112015-08-26 08:21:55 +00007863 else if (Feature == "+nan2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00007864 IsNan2008 = true;
Eric Christopher610fe112015-08-26 08:21:55 +00007865 else if (Feature == "-nan2008")
Daniel Sanders9500d2d2014-07-09 13:56:23 +00007866 IsNan2008 = false;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007867 }
Simon Atanasyan9f444d52012-07-05 15:32:46 +00007868
James Y Knightb214cbc2016-03-04 19:00:41 +00007869 setDataLayout();
Akira Hatanaka9064e362013-10-29 18:30:33 +00007870
Rafael Espindolaeb265472013-08-21 21:59:03 +00007871 return true;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00007872 }
Logan Chien5a5a96b2013-02-23 04:24:36 +00007873
Craig Topper3164f332014-03-11 03:39:26 +00007874 int getEHDataRegisterNumber(unsigned RegNo) const override {
Logan Chien5a5a96b2013-02-23 04:24:36 +00007875 if (RegNo == 0) return 4;
7876 if (RegNo == 1) return 5;
7877 return -1;
7878 }
Daniel Sanderscfbb71d2014-07-09 13:43:19 +00007879
7880 bool isCLZForZeroUndef() const override { return false; }
Daniel Sanders4672af62016-05-27 11:51:02 +00007881
7882 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
7883 static const TargetInfo::GCCRegAlias O32RegAliases[] = {
7884 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7885 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7886 {{"a3"}, "$7"}, {{"t0"}, "$8"}, {{"t1"}, "$9"},
7887 {{"t2"}, "$10"}, {{"t3"}, "$11"}, {{"t4"}, "$12"},
7888 {{"t5"}, "$13"}, {{"t6"}, "$14"}, {{"t7"}, "$15"},
7889 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7890 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7891 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7892 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7893 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7894 {{"ra"}, "$31"}};
7895 static const TargetInfo::GCCRegAlias NewABIRegAliases[] = {
7896 {{"at"}, "$1"}, {{"v0"}, "$2"}, {{"v1"}, "$3"},
7897 {{"a0"}, "$4"}, {{"a1"}, "$5"}, {{"a2"}, "$6"},
7898 {{"a3"}, "$7"}, {{"a4"}, "$8"}, {{"a5"}, "$9"},
7899 {{"a6"}, "$10"}, {{"a7"}, "$11"}, {{"t0"}, "$12"},
7900 {{"t1"}, "$13"}, {{"t2"}, "$14"}, {{"t3"}, "$15"},
7901 {{"s0"}, "$16"}, {{"s1"}, "$17"}, {{"s2"}, "$18"},
7902 {{"s3"}, "$19"}, {{"s4"}, "$20"}, {{"s5"}, "$21"},
7903 {{"s6"}, "$22"}, {{"s7"}, "$23"}, {{"t8"}, "$24"},
7904 {{"t9"}, "$25"}, {{"k0"}, "$26"}, {{"k1"}, "$27"},
7905 {{"gp"}, "$28"}, {{"sp", "$sp"}, "$29"}, {{"fp", "$fp"}, "$30"},
7906 {{"ra"}, "$31"}};
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007907 if (ABI == "o32")
Daniel Sanders4672af62016-05-27 11:51:02 +00007908 return llvm::makeArrayRef(O32RegAliases);
7909 return llvm::makeArrayRef(NewABIRegAliases);
7910 }
7911
7912 bool hasInt128Type() const override {
Daniel Sanders26a56ad2016-06-06 09:07:08 +00007913 return ABI == "n32" || ABI == "n64";
Daniel Sanders4672af62016-05-27 11:51:02 +00007914 }
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00007915
7916 bool validateTarget(DiagnosticsEngine &Diags) const override {
7917 // FIXME: It's valid to use O32 on a 64-bit CPU but the backend can't handle
7918 // this yet. It's better to fail here than on the backend assertion.
7919 if (processorSupportsGPR64() && ABI == "o32") {
7920 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7921 return false;
7922 }
7923
7924 // 64-bit ABI's require 64-bit CPU's.
7925 if (!processorSupportsGPR64() && (ABI == "n32" || ABI == "n64")) {
7926 Diags.Report(diag::err_target_unsupported_abi) << ABI << CPU;
7927 return false;
7928 }
7929
7930 // FIXME: It's valid to use O32 on a mips64/mips64el triple but the backend
7931 // can't handle this yet. It's better to fail here than on the
7932 // backend assertion.
7933 if ((getTriple().getArch() == llvm::Triple::mips64 ||
7934 getTriple().getArch() == llvm::Triple::mips64el) &&
7935 ABI == "o32") {
7936 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7937 << ABI << getTriple().str();
7938 return false;
7939 }
7940
7941 // FIXME: It's valid to use N32/N64 on a mips/mipsel triple but the backend
7942 // can't handle this yet. It's better to fail here than on the
7943 // backend assertion.
7944 if ((getTriple().getArch() == llvm::Triple::mips ||
7945 getTriple().getArch() == llvm::Triple::mipsel) &&
7946 (ABI == "n32" || ABI == "n64")) {
7947 Diags.Report(diag::err_target_unsupported_abi_for_triple)
7948 << ABI << getTriple().str();
7949 return false;
7950 }
7951
7952 return true;
7953 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00007954};
7955
Daniel Sanders4672af62016-05-27 11:51:02 +00007956const Builtin::Info MipsTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00007957#define BUILTIN(ID, TYPE, ATTRS) \
7958 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
7959#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
7960 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Simon Atanasyan07ce7d8f2012-06-28 18:23:16 +00007961#include "clang/Basic/BuiltinsMips.def"
7962};
7963
Ivan Krasindd7403e2011-08-24 20:22:22 +00007964class PNaClTargetInfo : public TargetInfo {
7965public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00007966 PNaClTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
7967 : TargetInfo(Triple) {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007968 this->LongAlign = 32;
7969 this->LongWidth = 32;
7970 this->PointerAlign = 32;
7971 this->PointerWidth = 32;
7972 this->IntMaxType = TargetInfo::SignedLongLong;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007973 this->Int64Type = TargetInfo::SignedLongLong;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007974 this->DoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007975 this->LongDoubleWidth = 64;
Ivan Krasin69a990b2011-08-29 22:39:12 +00007976 this->LongDoubleAlign = 64;
Ivan Krasin96a80612011-09-20 14:56:54 +00007977 this->SizeType = TargetInfo::UnsignedInt;
7978 this->PtrDiffType = TargetInfo::SignedInt;
7979 this->IntPtrType = TargetInfo::SignedInt;
Eli Bendersky4f6791c2013-04-08 21:31:01 +00007980 this->RegParmMax = 0; // Disallow regparm
Ivan Krasindd7403e2011-08-24 20:22:22 +00007981 }
7982
Craig Toppere6f17d02014-03-11 04:07:52 +00007983 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007984 Builder.defineMacro("__le32__");
7985 Builder.defineMacro("__pnacl__");
7986 }
Craig Topper3164f332014-03-11 03:39:26 +00007987 void getTargetDefines(const LangOptions &Opts,
7988 MacroBuilder &Builder) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00007989 getArchDefines(Opts, Builder);
7990 }
Craig Topper3164f332014-03-11 03:39:26 +00007991 bool hasFeature(StringRef Feature) const override {
Douglas Gregor0070c0b2012-01-30 06:38:25 +00007992 return Feature == "pnacl";
7993 }
Craig Topper6c03a542015-10-19 04:51:35 +00007994 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Craig Topper3164f332014-03-11 03:39:26 +00007995 BuiltinVaListKind getBuiltinVaListKind() const override {
Meador Inge5d3fb222012-06-16 03:34:49 +00007996 return TargetInfo::PNaClABIBuiltinVaList;
Ivan Krasindd7403e2011-08-24 20:22:22 +00007997 }
Craig Topperf054e3a2015-10-19 03:52:27 +00007998 ArrayRef<const char *> getGCCRegNames() const override;
7999 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
Craig Topper3164f332014-03-11 03:39:26 +00008000 bool validateAsmConstraint(const char *&Name,
8001 TargetInfo::ConstraintInfo &Info) const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008002 return false;
8003 }
8004
Craig Topper3164f332014-03-11 03:39:26 +00008005 const char *getClobbers() const override {
Ivan Krasindd7403e2011-08-24 20:22:22 +00008006 return "";
8007 }
8008};
8009
Craig Topperf054e3a2015-10-19 03:52:27 +00008010ArrayRef<const char *> PNaClTargetInfo::getGCCRegNames() const {
8011 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008012}
8013
Craig Topperf054e3a2015-10-19 03:52:27 +00008014ArrayRef<TargetInfo::GCCRegAlias> PNaClTargetInfo::getGCCRegAliases() const {
8015 return None;
Ivan Krasindd7403e2011-08-24 20:22:22 +00008016}
Ivan Krasindd7403e2011-08-24 20:22:22 +00008017
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008018// We attempt to use PNaCl (le32) frontend and Mips32EL backend.
Daniel Sanders4672af62016-05-27 11:51:02 +00008019class NaClMips32TargetInfo : public MipsTargetInfo {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008020public:
Daniel Sanders4672af62016-05-27 11:51:02 +00008021 NaClMips32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8022 : MipsTargetInfo(Triple, Opts) {}
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008023
8024 BuiltinVaListKind getBuiltinVaListKind() const override {
8025 return TargetInfo::PNaClABIBuiltinVaList;
8026 }
8027};
8028
JF Bastien643817d2014-09-12 17:52:47 +00008029class Le64TargetInfo : public TargetInfo {
8030 static const Builtin::Info BuiltinInfo[];
8031
8032public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008033 Le64TargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8034 : TargetInfo(Triple) {
JF Bastien643817d2014-09-12 17:52:47 +00008035 NoAsmVariants = true;
8036 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
8037 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
James Y Knightb214cbc2016-03-04 19:00:41 +00008038 resetDataLayout("e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128");
JF Bastien643817d2014-09-12 17:52:47 +00008039 }
8040
8041 void getTargetDefines(const LangOptions &Opts,
8042 MacroBuilder &Builder) const override {
Saleem Abdulrasool56027092017-02-07 19:00:06 +00008043 DefineStd(Builder, "unix", Opts);
JF Bastien643817d2014-09-12 17:52:47 +00008044 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
8045 Builder.defineMacro("__ELF__");
8046 }
Craig Topper6c03a542015-10-19 04:51:35 +00008047 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8048 return llvm::makeArrayRef(BuiltinInfo,
8049 clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin);
JF Bastien643817d2014-09-12 17:52:47 +00008050 }
8051 BuiltinVaListKind getBuiltinVaListKind() const override {
8052 return TargetInfo::PNaClABIBuiltinVaList;
8053 }
8054 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008055 ArrayRef<const char *> getGCCRegNames() const override {
8056 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008057 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008058 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8059 return None;
JF Bastien643817d2014-09-12 17:52:47 +00008060 }
8061 bool validateAsmConstraint(const char *&Name,
8062 TargetInfo::ConstraintInfo &Info) const override {
8063 return false;
8064 }
8065
8066 bool hasProtectedVisibility() const override { return false; }
JF Bastien643817d2014-09-12 17:52:47 +00008067};
Dan Gohmanc2853072015-09-03 22:51:53 +00008068
8069class WebAssemblyTargetInfo : public TargetInfo {
8070 static const Builtin::Info BuiltinInfo[];
8071
8072 enum SIMDEnum {
8073 NoSIMD,
8074 SIMD128,
8075 } SIMDLevel;
8076
8077public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008078 explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
Dan Gohmanc2853072015-09-03 22:51:53 +00008079 : TargetInfo(T), SIMDLevel(NoSIMD) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008080 NoAsmVariants = true;
8081 SuitableAlign = 128;
8082 LargeArrayMinWidth = 128;
8083 LargeArrayAlign = 128;
8084 SimdDefaultAlign = 128;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008085 SigAtomicType = SignedLong;
Dan Gohman6db46402015-11-10 21:01:46 +00008086 LongDoubleWidth = LongDoubleAlign = 128;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008087 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Derek Schuffacdc8e62016-09-01 22:38:37 +00008088 SizeType = UnsignedInt;
8089 PtrDiffType = SignedInt;
8090 IntPtrType = SignedInt;
Dan Gohmanc2853072015-09-03 22:51:53 +00008091 }
8092
8093protected:
8094 void getTargetDefines(const LangOptions &Opts,
8095 MacroBuilder &Builder) const override {
8096 defineCPUMacros(Builder, "wasm", /*Tuning=*/false);
8097 if (SIMDLevel >= SIMD128)
8098 Builder.defineMacro("__wasm_simd128__");
8099 }
8100
8101private:
Eric Christopher8c47b422015-10-09 18:39:55 +00008102 bool
8103 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
8104 StringRef CPU,
8105 const std::vector<std::string> &FeaturesVec) const override {
Dan Gohmanc2853072015-09-03 22:51:53 +00008106 if (CPU == "bleeding-edge")
8107 Features["simd128"] = true;
8108 return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
8109 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008110 bool hasFeature(StringRef Feature) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008111 return llvm::StringSwitch<bool>(Feature)
8112 .Case("simd128", SIMDLevel >= SIMD128)
8113 .Default(false);
8114 }
8115 bool handleTargetFeatures(std::vector<std::string> &Features,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008116 DiagnosticsEngine &Diags) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008117 for (const auto &Feature : Features) {
8118 if (Feature == "+simd128") {
8119 SIMDLevel = std::max(SIMDLevel, SIMD128);
8120 continue;
8121 }
8122 if (Feature == "-simd128") {
8123 SIMDLevel = std::min(SIMDLevel, SIMDEnum(SIMD128 - 1));
8124 continue;
8125 }
8126
8127 Diags.Report(diag::err_opt_not_valid_with_opt) << Feature
8128 << "-target-feature";
8129 return false;
8130 }
8131 return true;
8132 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008133 bool setCPU(const std::string &Name) final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008134 return llvm::StringSwitch<bool>(Name)
8135 .Case("mvp", true)
8136 .Case("bleeding-edge", true)
8137 .Case("generic", true)
8138 .Default(false);
8139 }
Craig Topper6c03a542015-10-19 04:51:35 +00008140 ArrayRef<Builtin::Info> getTargetBuiltins() const final {
8141 return llvm::makeArrayRef(BuiltinInfo,
8142 clang::WebAssembly::LastTSBuiltin - Builtin::FirstTSBuiltin);
Dan Gohmanc2853072015-09-03 22:51:53 +00008143 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008144 BuiltinVaListKind getBuiltinVaListKind() const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008145 return VoidPtrBuiltinVaList;
8146 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008147 ArrayRef<const char *> getGCCRegNames() const final {
8148 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008149 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008150 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const final {
8151 return None;
Dan Gohmanc2853072015-09-03 22:51:53 +00008152 }
8153 bool
8154 validateAsmConstraint(const char *&Name,
Hans Wennborg7eb54642015-09-10 17:07:54 +00008155 TargetInfo::ConstraintInfo &Info) const final {
Dan Gohmanc2853072015-09-03 22:51:53 +00008156 return false;
8157 }
Hans Wennborg7eb54642015-09-10 17:07:54 +00008158 const char *getClobbers() const final { return ""; }
8159 bool isCLZForZeroUndef() const final { return false; }
8160 bool hasInt128Type() const final { return true; }
Dan Gohmanab0e31f2015-09-14 21:49:41 +00008161 IntType getIntTypeByWidth(unsigned BitWidth,
8162 bool IsSigned) const final {
8163 // WebAssembly prefers long long for explicitly 64-bit integers.
8164 return BitWidth == 64 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8165 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8166 }
8167 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8168 bool IsSigned) const final {
8169 // WebAssembly uses long long for int_least64_t and int_fast64_t.
8170 return BitWidth == 64
8171 ? (IsSigned ? SignedLongLong : UnsignedLongLong)
8172 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8173 }
Dan Gohmanc2853072015-09-03 22:51:53 +00008174};
8175
8176const Builtin::Info WebAssemblyTargetInfo::BuiltinInfo[] = {
8177#define BUILTIN(ID, TYPE, ATTRS) \
8178 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8179#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8180 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
8181#include "clang/Basic/BuiltinsWebAssembly.def"
8182};
8183
8184class WebAssembly32TargetInfo : public WebAssemblyTargetInfo {
8185public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008186 explicit WebAssembly32TargetInfo(const llvm::Triple &T,
8187 const TargetOptions &Opts)
8188 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008189 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
James Y Knightb214cbc2016-03-04 19:00:41 +00008190 resetDataLayout("e-m:e-p:32:32-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008191 }
8192
8193protected:
8194 void getTargetDefines(const LangOptions &Opts,
8195 MacroBuilder &Builder) const override {
8196 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8197 defineCPUMacros(Builder, "wasm32", /*Tuning=*/false);
8198 }
8199};
8200
8201class WebAssembly64TargetInfo : public WebAssemblyTargetInfo {
8202public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008203 explicit WebAssembly64TargetInfo(const llvm::Triple &T,
8204 const TargetOptions &Opts)
8205 : WebAssemblyTargetInfo(T, Opts) {
Dan Gohmanc2853072015-09-03 22:51:53 +00008206 LongAlign = LongWidth = 64;
8207 PointerAlign = PointerWidth = 64;
Dan Gohmanf1c34e62015-09-14 21:56:37 +00008208 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
Derek Schuffacdc8e62016-09-01 22:38:37 +00008209 SizeType = UnsignedLong;
8210 PtrDiffType = SignedLong;
8211 IntPtrType = SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008212 resetDataLayout("e-m:e-p:64:64-i64:64-n32:64-S128");
Dan Gohmanc2853072015-09-03 22:51:53 +00008213 }
8214
8215protected:
8216 void getTargetDefines(const LangOptions &Opts,
8217 MacroBuilder &Builder) const override {
8218 WebAssemblyTargetInfo::getTargetDefines(Opts, Builder);
8219 defineCPUMacros(Builder, "wasm64", /*Tuning=*/false);
8220 }
8221};
8222
JF Bastien643817d2014-09-12 17:52:47 +00008223const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
8224#define BUILTIN(ID, TYPE, ATTRS) \
Craig Topper07d3b622015-08-07 05:14:44 +00008225 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
JF Bastien643817d2014-09-12 17:52:47 +00008226#include "clang/Basic/BuiltinsLe64.def"
8227};
8228
Eric Christopherc48497a2015-09-18 21:26:24 +00008229static const unsigned SPIRAddrSpaceMap[] = {
8230 1, // opencl_global
8231 3, // opencl_local
8232 2, // opencl_constant
8233 4, // opencl_generic
8234 0, // cuda_device
8235 0, // cuda_constant
8236 0 // cuda_shared
8237};
8238class SPIRTargetInfo : public TargetInfo {
8239public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008240 SPIRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8241 : TargetInfo(Triple) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008242 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
8243 "SPIR target must use unknown OS");
8244 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
8245 "SPIR target must use unknown environment type");
Eric Christopherc48497a2015-09-18 21:26:24 +00008246 TLSSupported = false;
8247 LongWidth = LongAlign = 64;
8248 AddrSpaceMap = &SPIRAddrSpaceMap;
8249 UseAddrSpaceMapMangling = true;
8250 // Define available target features
8251 // These must be defined in sorted order!
8252 NoAsmVariants = true;
8253 }
8254 void getTargetDefines(const LangOptions &Opts,
8255 MacroBuilder &Builder) const override {
8256 DefineStd(Builder, "SPIR", Opts);
8257 }
8258 bool hasFeature(StringRef Feature) const override {
8259 return Feature == "spir";
8260 }
Craig Topper3164f332014-03-11 03:39:26 +00008261
Craig Topper6c03a542015-10-19 04:51:35 +00008262 ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008263 const char *getClobbers() const override { return ""; }
Craig Topperf054e3a2015-10-19 03:52:27 +00008264 ArrayRef<const char *> getGCCRegNames() const override { return None; }
Eric Christopherc48497a2015-09-18 21:26:24 +00008265 bool validateAsmConstraint(const char *&Name,
8266 TargetInfo::ConstraintInfo &info) const override {
8267 return true;
8268 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008269 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8270 return None;
8271 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008272 BuiltinVaListKind getBuiltinVaListKind() const override {
8273 return TargetInfo::VoidPtrBuiltinVaList;
8274 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008275
Eric Christopherc48497a2015-09-18 21:26:24 +00008276 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Nikolay Haustov8c6538b2016-06-30 09:06:33 +00008277 return (CC == CC_SpirFunction || CC == CC_OpenCLKernel) ? CCCR_OK
8278 : CCCR_Warning;
Eric Christopherc48497a2015-09-18 21:26:24 +00008279 }
Alexander Kornienko21de0ae2015-01-20 11:20:41 +00008280
Eric Christopherc48497a2015-09-18 21:26:24 +00008281 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
8282 return CC_SpirFunction;
8283 }
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008284
8285 void setSupportedOpenCLOpts() override {
8286 // Assume all OpenCL extensions and optional core features are supported
8287 // for SPIR since it is a generic target.
Yaxun Liu5b746652016-12-18 05:18:55 +00008288 getSupportedOpenCLOpts().supportAll();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00008289 }
Eric Christopherc48497a2015-09-18 21:26:24 +00008290};
Guy Benyeib798fc92012-12-11 21:38:14 +00008291
Eric Christopherc48497a2015-09-18 21:26:24 +00008292class SPIR32TargetInfo : public SPIRTargetInfo {
8293public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008294 SPIR32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8295 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008296 PointerWidth = PointerAlign = 32;
8297 SizeType = TargetInfo::UnsignedInt;
8298 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
James Y Knightb214cbc2016-03-04 19:00:41 +00008299 resetDataLayout("e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
8300 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008301 }
8302 void getTargetDefines(const LangOptions &Opts,
8303 MacroBuilder &Builder) const override {
8304 DefineStd(Builder, "SPIR32", Opts);
8305 }
8306};
Guy Benyeib798fc92012-12-11 21:38:14 +00008307
Eric Christopherc48497a2015-09-18 21:26:24 +00008308class SPIR64TargetInfo : public SPIRTargetInfo {
8309public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008310 SPIR64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8311 : SPIRTargetInfo(Triple, Opts) {
Eric Christopherc48497a2015-09-18 21:26:24 +00008312 PointerWidth = PointerAlign = 64;
8313 SizeType = TargetInfo::UnsignedLong;
8314 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
James Y Knightb214cbc2016-03-04 19:00:41 +00008315 resetDataLayout("e-i64:64-v16:16-v24:32-v32:32-v48:64-"
8316 "v96:128-v192:256-v256:256-v512:512-v1024:1024");
Eric Christopherc48497a2015-09-18 21:26:24 +00008317 }
8318 void getTargetDefines(const LangOptions &Opts,
8319 MacroBuilder &Builder) const override {
8320 DefineStd(Builder, "SPIR64", Opts);
8321 }
8322};
Guy Benyeib798fc92012-12-11 21:38:14 +00008323
Robert Lytton0e076492013-08-13 09:43:10 +00008324class XCoreTargetInfo : public TargetInfo {
8325 static const Builtin::Info BuiltinInfo[];
8326public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008327 XCoreTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8328 : TargetInfo(Triple) {
Robert Lytton0e076492013-08-13 09:43:10 +00008329 NoAsmVariants = true;
8330 LongLongAlign = 32;
8331 SuitableAlign = 32;
8332 DoubleAlign = LongDoubleAlign = 32;
Robert Lyttoncc424662013-11-12 10:09:30 +00008333 SizeType = UnsignedInt;
8334 PtrDiffType = SignedInt;
8335 IntPtrType = SignedInt;
8336 WCharType = UnsignedChar;
8337 WIntType = UnsignedInt;
Robert Lytton0e076492013-08-13 09:43:10 +00008338 UseZeroLengthBitfieldAlignment = true;
James Y Knightb214cbc2016-03-04 19:00:41 +00008339 resetDataLayout("e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
8340 "-f64:32-a:0:32-n32");
Robert Lytton0e076492013-08-13 09:43:10 +00008341 }
Craig Topper3164f332014-03-11 03:39:26 +00008342 void getTargetDefines(const LangOptions &Opts,
8343 MacroBuilder &Builder) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008344 Builder.defineMacro("__XS1B__");
8345 }
Craig Topper6c03a542015-10-19 04:51:35 +00008346 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8347 return llvm::makeArrayRef(BuiltinInfo,
8348 clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin);
Robert Lytton0e076492013-08-13 09:43:10 +00008349 }
Craig Topper3164f332014-03-11 03:39:26 +00008350 BuiltinVaListKind getBuiltinVaListKind() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008351 return TargetInfo::VoidPtrBuiltinVaList;
8352 }
Craig Topper3164f332014-03-11 03:39:26 +00008353 const char *getClobbers() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008354 return "";
8355 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008356 ArrayRef<const char *> getGCCRegNames() const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008357 static const char * const GCCRegNames[] = {
8358 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8359 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
8360 };
Craig Topperf054e3a2015-10-19 03:52:27 +00008361 return llvm::makeArrayRef(GCCRegNames);
Robert Lytton0e076492013-08-13 09:43:10 +00008362 }
Craig Topperf054e3a2015-10-19 03:52:27 +00008363 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8364 return None;
Robert Lytton0e076492013-08-13 09:43:10 +00008365 }
Craig Topper3164f332014-03-11 03:39:26 +00008366 bool validateAsmConstraint(const char *&Name,
8367 TargetInfo::ConstraintInfo &Info) const override {
Robert Lytton0e076492013-08-13 09:43:10 +00008368 return false;
8369 }
Craig Topper3164f332014-03-11 03:39:26 +00008370 int getEHDataRegisterNumber(unsigned RegNo) const override {
Robert Lytton1a229262014-01-27 17:56:25 +00008371 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
8372 return (RegNo < 2)? RegNo : -1;
8373 }
Andrey Turetskiydb6655f2016-02-10 11:58:46 +00008374 bool allowsLargerPreferedTypeAlignment() const override {
8375 return false;
8376 }
Robert Lytton0e076492013-08-13 09:43:10 +00008377};
8378
8379const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
Craig Topper07d3b622015-08-07 05:14:44 +00008380#define BUILTIN(ID, TYPE, ATTRS) \
8381 { #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr },
8382#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
8383 { #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
Robert Lytton0e076492013-08-13 09:43:10 +00008384#include "clang/Basic/BuiltinsXCore.def"
8385};
Robert Lytton0e076492013-08-13 09:43:10 +00008386
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008387// x86_32 Android target
8388class AndroidX86_32TargetInfo : public LinuxTargetInfo<X86_32TargetInfo> {
8389public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008390 AndroidX86_32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8391 : LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts) {
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008392 SuitableAlign = 32;
8393 LongDoubleWidth = 64;
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008394 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008395 }
8396};
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008397
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008398// x86_64 Android target
8399class AndroidX86_64TargetInfo : public LinuxTargetInfo<X86_64TargetInfo> {
8400public:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008401 AndroidX86_64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
8402 : LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts) {
Stephan Bergmann17c7f702016-12-14 11:57:17 +00008403 LongDoubleFormat = &llvm::APFloat::IEEEquad();
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008404 }
Chih-Hung Hsieh0b0eeaa2015-07-24 18:12:54 +00008405
8406 bool useFloat128ManglingForLongDouble() const override {
8407 return true;
8408 }
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008409};
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008410
8411// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
8412class RenderScript32TargetInfo : public ARMleTargetInfo {
8413public:
8414 RenderScript32TargetInfo(const llvm::Triple &Triple,
8415 const TargetOptions &Opts)
8416 : ARMleTargetInfo(llvm::Triple("armv7", Triple.getVendorName(),
8417 Triple.getOSName(),
8418 Triple.getEnvironmentName()),
8419 Opts) {
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008420 IsRenderScriptTarget = true;
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008421 LongWidth = LongAlign = 64;
8422 }
8423 void getTargetDefines(const LangOptions &Opts,
8424 MacroBuilder &Builder) const override {
8425 Builder.defineMacro("__RENDERSCRIPT__");
8426 ARMleTargetInfo::getTargetDefines(Opts, Builder);
8427 }
8428};
8429
8430// 64-bit RenderScript is aarch64
8431class RenderScript64TargetInfo : public AArch64leTargetInfo {
8432public:
8433 RenderScript64TargetInfo(const llvm::Triple &Triple,
8434 const TargetOptions &Opts)
8435 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
8436 Triple.getOSName(),
8437 Triple.getEnvironmentName()),
Pirama Arumuga Nainarbb846a32016-07-27 19:01:51 +00008438 Opts) {
8439 IsRenderScriptTarget = true;
8440 }
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00008441
8442 void getTargetDefines(const LangOptions &Opts,
8443 MacroBuilder &Builder) const override {
8444 Builder.defineMacro("__RENDERSCRIPT__");
8445 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
8446 }
8447};
8448
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008449/// Information about a specific microcontroller.
8450struct MCUInfo {
8451 const char *Name;
8452 const char *DefineName;
8453};
8454
8455// This list should be kept up-to-date with AVRDevices.td in LLVM.
8456static ArrayRef<MCUInfo> AVRMcus = {
8457 { "at90s1200", "__AVR_AT90S1200__" },
8458 { "attiny11", "__AVR_ATtiny11" },
8459 { "attiny12", "__AVR_ATtiny12" },
8460 { "attiny15", "__AVR_ATtiny15" },
8461 { "attiny28", "__AVR_ATtiny28" },
8462 { "at90s2313", "__AVR_AT90S2313" },
8463 { "at90s2323", "__AVR_AT90S2323" },
8464 { "at90s2333", "__AVR_AT90S2333" },
8465 { "at90s2343", "__AVR_AT90S2343" },
8466 { "attiny22", "__AVR_ATtiny22" },
8467 { "attiny26", "__AVR_ATtiny26" },
8468 { "at86rf401", "__AVR_AT86RF401" },
8469 { "at90s4414", "__AVR_AT90S4414" },
8470 { "at90s4433", "__AVR_AT90S4433" },
8471 { "at90s4434", "__AVR_AT90S4434" },
8472 { "at90s8515", "__AVR_AT90S8515" },
8473 { "at90c8534", "__AVR_AT90c8534" },
8474 { "at90s8535", "__AVR_AT90S8535" },
8475 { "ata5272", "__AVR_ATA5272" },
8476 { "attiny13", "__AVR_ATtiny13" },
8477 { "attiny13a", "__AVR_ATtiny13A" },
8478 { "attiny2313", "__AVR_ATtiny2313" },
8479 { "attiny2313a", "__AVR_ATtiny2313A" },
8480 { "attiny24", "__AVR_ATtiny24" },
8481 { "attiny24a", "__AVR_ATtiny24A" },
8482 { "attiny4313", "__AVR_ATtiny4313" },
8483 { "attiny44", "__AVR_ATtiny44" },
8484 { "attiny44a", "__AVR_ATtiny44A" },
8485 { "attiny84", "__AVR_ATtiny84" },
8486 { "attiny84a", "__AVR_ATtiny84A" },
8487 { "attiny25", "__AVR_ATtiny25" },
8488 { "attiny45", "__AVR_ATtiny45" },
8489 { "attiny85", "__AVR_ATtiny85" },
8490 { "attiny261", "__AVR_ATtiny261" },
8491 { "attiny261a", "__AVR_ATtiny261A" },
8492 { "attiny461", "__AVR_ATtiny461" },
8493 { "attiny461a", "__AVR_ATtiny461A" },
8494 { "attiny861", "__AVR_ATtiny861" },
8495 { "attiny861a", "__AVR_ATtiny861A" },
8496 { "attiny87", "__AVR_ATtiny87" },
8497 { "attiny43u", "__AVR_ATtiny43U" },
8498 { "attiny48", "__AVR_ATtiny48" },
8499 { "attiny88", "__AVR_ATtiny88" },
8500 { "attiny828", "__AVR_ATtiny828" },
8501 { "at43usb355", "__AVR_AT43USB355" },
8502 { "at76c711", "__AVR_AT76C711" },
8503 { "atmega103", "__AVR_ATmega103" },
8504 { "at43usb320", "__AVR_AT43USB320" },
8505 { "attiny167", "__AVR_ATtiny167" },
8506 { "at90usb82", "__AVR_AT90USB82" },
8507 { "at90usb162", "__AVR_AT90USB162" },
8508 { "ata5505", "__AVR_ATA5505" },
8509 { "atmega8u2", "__AVR_ATmega8U2" },
8510 { "atmega16u2", "__AVR_ATmega16U2" },
8511 { "atmega32u2", "__AVR_ATmega32U2" },
8512 { "attiny1634", "__AVR_ATtiny1634" },
8513 { "atmega8", "__AVR_ATmega8" },
8514 { "ata6289", "__AVR_ATA6289" },
8515 { "atmega8a", "__AVR_ATmega8A" },
8516 { "ata6285", "__AVR_ATA6285" },
8517 { "ata6286", "__AVR_ATA6286" },
8518 { "atmega48", "__AVR_ATmega48" },
8519 { "atmega48a", "__AVR_ATmega48A" },
8520 { "atmega48pa", "__AVR_ATmega48PA" },
8521 { "atmega48p", "__AVR_ATmega48P" },
8522 { "atmega88", "__AVR_ATmega88" },
8523 { "atmega88a", "__AVR_ATmega88A" },
8524 { "atmega88p", "__AVR_ATmega88P" },
8525 { "atmega88pa", "__AVR_ATmega88PA" },
8526 { "atmega8515", "__AVR_ATmega8515" },
8527 { "atmega8535", "__AVR_ATmega8535" },
8528 { "atmega8hva", "__AVR_ATmega8HVA" },
8529 { "at90pwm1", "__AVR_AT90PWM1" },
8530 { "at90pwm2", "__AVR_AT90PWM2" },
8531 { "at90pwm2b", "__AVR_AT90PWM2B" },
8532 { "at90pwm3", "__AVR_AT90PWM3" },
8533 { "at90pwm3b", "__AVR_AT90PWM3B" },
8534 { "at90pwm81", "__AVR_AT90PWM81" },
8535 { "ata5790", "__AVR_ATA5790" },
8536 { "ata5795", "__AVR_ATA5795" },
8537 { "atmega16", "__AVR_ATmega16" },
8538 { "atmega16a", "__AVR_ATmega16A" },
8539 { "atmega161", "__AVR_ATmega161" },
8540 { "atmega162", "__AVR_ATmega162" },
8541 { "atmega163", "__AVR_ATmega163" },
8542 { "atmega164a", "__AVR_ATmega164A" },
8543 { "atmega164p", "__AVR_ATmega164P" },
8544 { "atmega164pa", "__AVR_ATmega164PA" },
8545 { "atmega165", "__AVR_ATmega165" },
8546 { "atmega165a", "__AVR_ATmega165A" },
8547 { "atmega165p", "__AVR_ATmega165P" },
8548 { "atmega165pa", "__AVR_ATmega165PA" },
8549 { "atmega168", "__AVR_ATmega168" },
8550 { "atmega168a", "__AVR_ATmega168A" },
8551 { "atmega168p", "__AVR_ATmega168P" },
8552 { "atmega168pa", "__AVR_ATmega168PA" },
8553 { "atmega169", "__AVR_ATmega169" },
8554 { "atmega169a", "__AVR_ATmega169A" },
8555 { "atmega169p", "__AVR_ATmega169P" },
8556 { "atmega169pa", "__AVR_ATmega169PA" },
8557 { "atmega32", "__AVR_ATmega32" },
8558 { "atmega32a", "__AVR_ATmega32A" },
8559 { "atmega323", "__AVR_ATmega323" },
8560 { "atmega324a", "__AVR_ATmega324A" },
8561 { "atmega324p", "__AVR_ATmega324P" },
8562 { "atmega324pa", "__AVR_ATmega324PA" },
8563 { "atmega325", "__AVR_ATmega325" },
8564 { "atmega325a", "__AVR_ATmega325A" },
8565 { "atmega325p", "__AVR_ATmega325P" },
8566 { "atmega325pa", "__AVR_ATmega325PA" },
8567 { "atmega3250", "__AVR_ATmega3250" },
8568 { "atmega3250a", "__AVR_ATmega3250A" },
8569 { "atmega3250p", "__AVR_ATmega3250P" },
8570 { "atmega3250pa", "__AVR_ATmega3250PA" },
8571 { "atmega328", "__AVR_ATmega328" },
8572 { "atmega328p", "__AVR_ATmega328P" },
8573 { "atmega329", "__AVR_ATmega329" },
8574 { "atmega329a", "__AVR_ATmega329A" },
8575 { "atmega329p", "__AVR_ATmega329P" },
8576 { "atmega329pa", "__AVR_ATmega329PA" },
8577 { "atmega3290", "__AVR_ATmega3290" },
8578 { "atmega3290a", "__AVR_ATmega3290A" },
8579 { "atmega3290p", "__AVR_ATmega3290P" },
8580 { "atmega3290pa", "__AVR_ATmega3290PA" },
8581 { "atmega406", "__AVR_ATmega406" },
8582 { "atmega64", "__AVR_ATmega64" },
8583 { "atmega64a", "__AVR_ATmega64A" },
8584 { "atmega640", "__AVR_ATmega640" },
8585 { "atmega644", "__AVR_ATmega644" },
8586 { "atmega644a", "__AVR_ATmega644A" },
8587 { "atmega644p", "__AVR_ATmega644P" },
8588 { "atmega644pa", "__AVR_ATmega644PA" },
8589 { "atmega645", "__AVR_ATmega645" },
8590 { "atmega645a", "__AVR_ATmega645A" },
8591 { "atmega645p", "__AVR_ATmega645P" },
8592 { "atmega649", "__AVR_ATmega649" },
8593 { "atmega649a", "__AVR_ATmega649A" },
8594 { "atmega649p", "__AVR_ATmega649P" },
8595 { "atmega6450", "__AVR_ATmega6450" },
8596 { "atmega6450a", "__AVR_ATmega6450A" },
8597 { "atmega6450p", "__AVR_ATmega6450P" },
8598 { "atmega6490", "__AVR_ATmega6490" },
8599 { "atmega6490a", "__AVR_ATmega6490A" },
8600 { "atmega6490p", "__AVR_ATmega6490P" },
8601 { "atmega64rfr2", "__AVR_ATmega64RFR2" },
8602 { "atmega644rfr2", "__AVR_ATmega644RFR2" },
8603 { "atmega16hva", "__AVR_ATmega16HVA" },
8604 { "atmega16hva2", "__AVR_ATmega16HVA2" },
8605 { "atmega16hvb", "__AVR_ATmega16HVB" },
8606 { "atmega16hvbrevb", "__AVR_ATmega16HVBREVB" },
8607 { "atmega32hvb", "__AVR_ATmega32HVB" },
8608 { "atmega32hvbrevb", "__AVR_ATmega32HVBREVB" },
8609 { "atmega64hve", "__AVR_ATmega64HVE" },
8610 { "at90can32", "__AVR_AT90CAN32" },
8611 { "at90can64", "__AVR_AT90CAN64" },
8612 { "at90pwm161", "__AVR_AT90PWM161" },
8613 { "at90pwm216", "__AVR_AT90PWM216" },
8614 { "at90pwm316", "__AVR_AT90PWM316" },
8615 { "atmega32c1", "__AVR_ATmega32C1" },
8616 { "atmega64c1", "__AVR_ATmega64C1" },
8617 { "atmega16m1", "__AVR_ATmega16M1" },
8618 { "atmega32m1", "__AVR_ATmega32M1" },
8619 { "atmega64m1", "__AVR_ATmega64M1" },
8620 { "atmega16u4", "__AVR_ATmega16U4" },
8621 { "atmega32u4", "__AVR_ATmega32U4" },
8622 { "atmega32u6", "__AVR_ATmega32U6" },
8623 { "at90usb646", "__AVR_AT90USB646" },
8624 { "at90usb647", "__AVR_AT90USB647" },
8625 { "at90scr100", "__AVR_AT90SCR100" },
8626 { "at94k", "__AVR_AT94K" },
8627 { "m3000", "__AVR_AT000" },
8628 { "atmega128", "__AVR_ATmega128" },
8629 { "atmega128a", "__AVR_ATmega128A" },
8630 { "atmega1280", "__AVR_ATmega1280" },
8631 { "atmega1281", "__AVR_ATmega1281" },
8632 { "atmega1284", "__AVR_ATmega1284" },
8633 { "atmega1284p", "__AVR_ATmega1284P" },
8634 { "atmega128rfa1", "__AVR_ATmega128RFA1" },
8635 { "atmega128rfr2", "__AVR_ATmega128RFR2" },
8636 { "atmega1284rfr2", "__AVR_ATmega1284RFR2" },
8637 { "at90can128", "__AVR_AT90CAN128" },
8638 { "at90usb1286", "__AVR_AT90USB1286" },
8639 { "at90usb1287", "__AVR_AT90USB1287" },
8640 { "atmega2560", "__AVR_ATmega2560" },
8641 { "atmega2561", "__AVR_ATmega2561" },
8642 { "atmega256rfr2", "__AVR_ATmega256RFR2" },
8643 { "atmega2564rfr2", "__AVR_ATmega2564RFR2" },
8644 { "atxmega16a4", "__AVR_ATxmega16A4" },
8645 { "atxmega16a4u", "__AVR_ATxmega16a4U" },
8646 { "atxmega16c4", "__AVR_ATxmega16C4" },
8647 { "atxmega16d4", "__AVR_ATxmega16D4" },
8648 { "atxmega32a4", "__AVR_ATxmega32A4" },
8649 { "atxmega32a4u", "__AVR_ATxmega32A4U" },
8650 { "atxmega32c4", "__AVR_ATxmega32C4" },
8651 { "atxmega32d4", "__AVR_ATxmega32D4" },
8652 { "atxmega32e5", "__AVR_ATxmega32E5" },
8653 { "atxmega16e5", "__AVR_ATxmega16E5" },
8654 { "atxmega8e5", "__AVR_ATxmega8E5" },
8655 { "atxmega32x1", "__AVR_ATxmega32X1" },
8656 { "atxmega64a3", "__AVR_ATxmega64A3" },
8657 { "atxmega64a3u", "__AVR_ATxmega64A3U" },
8658 { "atxmega64a4u", "__AVR_ATxmega64A4U" },
8659 { "atxmega64b1", "__AVR_ATxmega64B1" },
8660 { "atxmega64b3", "__AVR_ATxmega64B3" },
8661 { "atxmega64c3", "__AVR_ATxmega64C3" },
8662 { "atxmega64d3", "__AVR_ATxmega64D3" },
8663 { "atxmega64d4", "__AVR_ATxmega64D4" },
8664 { "atxmega64a1", "__AVR_ATxmega64A1" },
8665 { "atxmega64a1u", "__AVR_ATxmega64A1U" },
8666 { "atxmega128a3", "__AVR_ATxmega128A3" },
8667 { "atxmega128a3u", "__AVR_ATxmega128A3U" },
8668 { "atxmega128b1", "__AVR_ATxmega128B1" },
8669 { "atxmega128b3", "__AVR_ATxmega128B3" },
8670 { "atxmega128c3", "__AVR_ATxmega128C3" },
8671 { "atxmega128d3", "__AVR_ATxmega128D3" },
8672 { "atxmega128d4", "__AVR_ATxmega128D4" },
8673 { "atxmega192a3", "__AVR_ATxmega192A3" },
8674 { "atxmega192a3u", "__AVR_ATxmega192A3U" },
8675 { "atxmega192c3", "__AVR_ATxmega192C3" },
8676 { "atxmega192d3", "__AVR_ATxmega192D3" },
8677 { "atxmega256a3", "__AVR_ATxmega256A3" },
8678 { "atxmega256a3u", "__AVR_ATxmega256A3U" },
8679 { "atxmega256a3b", "__AVR_ATxmega256A3B" },
8680 { "atxmega256a3bu", "__AVR_ATxmega256A3BU" },
8681 { "atxmega256c3", "__AVR_ATxmega256C3" },
8682 { "atxmega256d3", "__AVR_ATxmega256D3" },
8683 { "atxmega384c3", "__AVR_ATxmega384C3" },
8684 { "atxmega384d3", "__AVR_ATxmega384D3" },
8685 { "atxmega128a1", "__AVR_ATxmega128A1" },
8686 { "atxmega128a1u", "__AVR_ATxmega128A1U" },
8687 { "atxmega128a4u", "__AVR_ATxmega128a4U" },
8688 { "attiny4", "__AVR_ATtiny4" },
8689 { "attiny5", "__AVR_ATtiny5" },
8690 { "attiny9", "__AVR_ATtiny9" },
8691 { "attiny10", "__AVR_ATtiny10" },
8692 { "attiny20", "__AVR_ATtiny20" },
8693 { "attiny40", "__AVR_ATtiny40" },
8694 { "attiny102", "__AVR_ATtiny102" },
8695 { "attiny104", "__AVR_ATtiny104" },
8696};
Dylan McKay924fa3a2017-01-05 05:20:27 +00008697
8698// AVR Target
8699class AVRTargetInfo : public TargetInfo {
8700public:
8701 AVRTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
8702 : TargetInfo(Triple) {
8703 TLSSupported = false;
8704 PointerWidth = 16;
8705 PointerAlign = 8;
8706 IntWidth = 16;
8707 IntAlign = 8;
8708 LongWidth = 32;
8709 LongAlign = 8;
8710 LongLongWidth = 64;
8711 LongLongAlign = 8;
8712 SuitableAlign = 8;
8713 DefaultAlignForAttributeAligned = 8;
8714 HalfWidth = 16;
8715 HalfAlign = 8;
8716 FloatWidth = 32;
8717 FloatAlign = 8;
8718 DoubleWidth = 32;
8719 DoubleAlign = 8;
8720 DoubleFormat = &llvm::APFloat::IEEEsingle();
8721 LongDoubleWidth = 32;
8722 LongDoubleAlign = 8;
8723 LongDoubleFormat = &llvm::APFloat::IEEEsingle();
8724 SizeType = UnsignedInt;
8725 PtrDiffType = SignedInt;
8726 IntPtrType = SignedInt;
8727 Char16Type = UnsignedInt;
8728 WCharType = SignedInt;
8729 WIntType = SignedInt;
8730 Char32Type = UnsignedLong;
8731 SigAtomicType = SignedChar;
8732 resetDataLayout("e-p:16:16:16-i8:8:8-i16:16:16-i32:32:32-i64:64:64"
8733 "-f32:32:32-f64:64:64-n8");
8734 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008735
Dylan McKay924fa3a2017-01-05 05:20:27 +00008736 void getTargetDefines(const LangOptions &Opts,
8737 MacroBuilder &Builder) const override {
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008738 Builder.defineMacro("AVR");
8739 Builder.defineMacro("__AVR");
Dylan McKay924fa3a2017-01-05 05:20:27 +00008740 Builder.defineMacro("__AVR__");
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008741
8742 if (!this->CPU.empty()) {
8743 auto It = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8744 [&](const MCUInfo &Info) { return Info.Name == this->CPU; });
8745
8746 if (It != AVRMcus.end())
8747 Builder.defineMacro(It->DefineName);
8748 }
Dylan McKay924fa3a2017-01-05 05:20:27 +00008749 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008750
Dylan McKay924fa3a2017-01-05 05:20:27 +00008751 ArrayRef<Builtin::Info> getTargetBuiltins() const override {
8752 return None;
8753 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008754
Dylan McKay924fa3a2017-01-05 05:20:27 +00008755 BuiltinVaListKind getBuiltinVaListKind() const override {
8756 return TargetInfo::VoidPtrBuiltinVaList;
8757 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008758
Dylan McKay924fa3a2017-01-05 05:20:27 +00008759 const char *getClobbers() const override {
8760 return "";
8761 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008762
Dylan McKay924fa3a2017-01-05 05:20:27 +00008763 ArrayRef<const char *> getGCCRegNames() const override {
8764 static const char * const GCCRegNames[] = {
8765 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
8766 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
8767 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
Dylan McKay95aa2652017-01-05 07:17:46 +00008768 "r24", "r25", "X", "Y", "Z", "SP"
Dylan McKay924fa3a2017-01-05 05:20:27 +00008769 };
8770 return llvm::makeArrayRef(GCCRegNames);
8771 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008772
Dylan McKay924fa3a2017-01-05 05:20:27 +00008773 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
8774 return None;
8775 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008776
Dylan McKay924fa3a2017-01-05 05:20:27 +00008777 ArrayRef<TargetInfo::AddlRegName> getGCCAddlRegNames() const override {
8778 static const TargetInfo::AddlRegName AddlRegNames[] = {
8779 { { "r26", "r27"}, 26 },
8780 { { "r28", "r29"}, 27 },
8781 { { "r30", "r31"}, 28 },
8782 { { "SPL", "SPH"}, 29 },
8783 };
8784 return llvm::makeArrayRef(AddlRegNames);
8785 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008786
Dylan McKay924fa3a2017-01-05 05:20:27 +00008787 bool validateAsmConstraint(const char *&Name,
8788 TargetInfo::ConstraintInfo &Info) const override {
Dylan McKayd31534c2017-02-06 09:01:59 +00008789 // There aren't any multi-character AVR specific constraints.
8790 if (StringRef(Name).size() > 1) return false;
8791
8792 switch (*Name) {
8793 default: return false;
8794 case 'a': // Simple upper registers
8795 case 'b': // Base pointer registers pairs
8796 case 'd': // Upper register
8797 case 'l': // Lower registers
8798 case 'e': // Pointer register pairs
8799 case 'q': // Stack pointer register
8800 case 'r': // Any register
8801 case 'w': // Special upper register pairs
8802 case 't': // Temporary register
8803 case 'x': case 'X': // Pointer register pair X
8804 case 'y': case 'Y': // Pointer register pair Y
8805 case 'z': case 'Z': // Pointer register pair Z
8806 Info.setAllowsRegister();
8807 return true;
8808 case 'I': // 6-bit positive integer constant
8809 Info.setRequiresImmediate(0, 63);
8810 return true;
8811 case 'J': // 6-bit negative integer constant
8812 Info.setRequiresImmediate(-63, 0);
8813 return true;
8814 case 'K': // Integer constant (Range: 2)
8815 Info.setRequiresImmediate(2);
8816 return true;
8817 case 'L': // Integer constant (Range: 0)
8818 Info.setRequiresImmediate(0);
8819 return true;
8820 case 'M': // 8-bit integer constant
8821 Info.setRequiresImmediate(0, 0xff);
8822 return true;
8823 case 'N': // Integer constant (Range: -1)
8824 Info.setRequiresImmediate(-1);
8825 return true;
8826 case 'O': // Integer constant (Range: 8, 16, 24)
8827 Info.setRequiresImmediate({8, 16, 24});
8828 return true;
8829 case 'P': // Integer constant (Range: 1)
8830 Info.setRequiresImmediate(1);
8831 return true;
8832 case 'R': // Integer constant (Range: -6 to 5)
8833 Info.setRequiresImmediate(-6, 5);
8834 return true;
8835 case 'G': // Floating point constant
8836 case 'Q': // A memory address based on Y or Z pointer with displacement.
8837 return true;
8838 }
8839
Dylan McKay924fa3a2017-01-05 05:20:27 +00008840 return false;
8841 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008842
Dylan McKay924fa3a2017-01-05 05:20:27 +00008843 IntType getIntTypeByWidth(unsigned BitWidth,
8844 bool IsSigned) const final {
8845 // AVR prefers int for 16-bit integers.
8846 return BitWidth == 16 ? (IsSigned ? SignedInt : UnsignedInt)
8847 : TargetInfo::getIntTypeByWidth(BitWidth, IsSigned);
8848 }
Dylan McKayf0f33a82017-01-05 05:31:12 +00008849
Dylan McKay924fa3a2017-01-05 05:20:27 +00008850 IntType getLeastIntTypeByWidth(unsigned BitWidth,
8851 bool IsSigned) const final {
8852 // AVR uses int for int_least16_t and int_fast16_t.
8853 return BitWidth == 16
8854 ? (IsSigned ? SignedInt : UnsignedInt)
8855 : TargetInfo::getLeastIntTypeByWidth(BitWidth, IsSigned);
8856 }
Dylan McKayecb6e7b2017-02-07 06:04:18 +00008857
8858 bool setCPU(const std::string &Name) override {
8859 bool IsFamily = llvm::StringSwitch<bool>(Name)
8860 .Case("avr1", true)
8861 .Case("avr2", true)
8862 .Case("avr25", true)
8863 .Case("avr3", true)
8864 .Case("avr31", true)
8865 .Case("avr35", true)
8866 .Case("avr4", true)
8867 .Case("avr5", true)
8868 .Case("avr51", true)
8869 .Case("avr6", true)
8870 .Case("avrxmega1", true)
8871 .Case("avrxmega2", true)
8872 .Case("avrxmega3", true)
8873 .Case("avrxmega4", true)
8874 .Case("avrxmega5", true)
8875 .Case("avrxmega6", true)
8876 .Case("avrxmega7", true)
8877 .Case("avrtiny", true)
8878 .Default(false);
8879
8880 if (IsFamily) this->CPU = Name;
8881
8882 bool IsMCU = std::find_if(AVRMcus.begin(), AVRMcus.end(),
8883 [&](const MCUInfo &Info) { return Info.Name == Name; }) != AVRMcus.end();
8884
8885 if (IsMCU) this->CPU = Name;
8886
8887 return IsFamily || IsMCU;
8888 }
8889
8890protected:
8891 std::string CPU;
Dylan McKay924fa3a2017-01-05 05:20:27 +00008892};
8893
Tamas Berghammer6373cee2015-03-25 10:38:50 +00008894} // end anonymous namespace
8895
Chris Lattner5ba61f02006-10-14 07:39:34 +00008896//===----------------------------------------------------------------------===//
8897// Driver code
8898//===----------------------------------------------------------------------===//
8899
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008900static TargetInfo *AllocateTarget(const llvm::Triple &Triple,
8901 const TargetOptions &Opts) {
Daniel Dunbar52322032009-08-18 05:47:58 +00008902 llvm::Triple::OSType os = Triple.getOS();
Eli Friedmanb5366062008-05-20 14:21:01 +00008903
Daniel Dunbar52322032009-08-18 05:47:58 +00008904 switch (Triple.getArch()) {
8905 default:
Craig Topperf1186c52014-05-08 06:41:40 +00008906 return nullptr;
Eli Friedmanb5366062008-05-20 14:21:01 +00008907
Tim Northover2a0783d2014-05-30 14:14:07 +00008908 case llvm::Triple::xcore:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008909 return new XCoreTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008910
8911 case llvm::Triple::hexagon:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008912 return new HexagonTargetInfo(Triple, Opts);
Tim Northover2a0783d2014-05-30 14:14:07 +00008913
Jacques Pienaard964cc22016-03-28 21:02:54 +00008914 case llvm::Triple::lanai:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008915 return new LanaiTargetInfo(Triple, Opts);
Jacques Pienaard964cc22016-03-28 21:02:54 +00008916
Tim Northover2a0783d2014-05-30 14:14:07 +00008917 case llvm::Triple::aarch64:
Tim Northovera2ee4332014-03-29 15:09:45 +00008918 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008919 return new DarwinAArch64TargetInfo(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008920
8921 switch (os) {
Ed Schoutenea9448e2015-10-15 15:07:07 +00008922 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008923 return new CloudABITargetInfo<AArch64leTargetInfo>(Triple, Opts);
Ed Maste6a9eda52014-11-13 16:55:42 +00008924 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008925 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008926 case llvm::Triple::Fuchsia:
8927 return new FuchsiaTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008928 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008929 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008930 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008931 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple, Opts);
Tim Northovera2ee4332014-03-29 15:09:45 +00008932 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008933 return new AArch64leTargetInfo(Triple, Opts);
James Molloy5e73df52014-04-16 15:06:20 +00008934 }
8935
Christian Pirker9b019ae2014-02-25 13:51:00 +00008936 case llvm::Triple::aarch64_be:
8937 switch (os) {
Ed Maste6a9eda52014-11-13 16:55:42 +00008938 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008939 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00008940 case llvm::Triple::Fuchsia:
8941 return new FuchsiaTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008942 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008943 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008944 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008945 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple, Opts);
Christian Pirker9b019ae2014-02-25 13:51:00 +00008946 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008947 return new AArch64beTargetInfo(Triple, Opts);
Tim Northover9bb857a2013-01-31 12:13:10 +00008948 }
8949
Daniel Dunbar52322032009-08-18 05:47:58 +00008950 case llvm::Triple::arm:
Daniel Dunbar33a004e2009-09-11 01:14:50 +00008951 case llvm::Triple::thumb:
Tim Northover157d9112014-01-16 08:48:16 +00008952 if (Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008953 return new DarwinARMTargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00008954
Daniel Dunbar52322032009-08-18 05:47:58 +00008955 switch (os) {
Ed Schoutenc6d1a732016-09-05 18:38:34 +00008956 case llvm::Triple::CloudABI:
8957 return new CloudABITargetInfo<ARMleTargetInfo>(Triple, Opts);
Rafael Espindolaad8fed52010-06-10 00:46:51 +00008958 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008959 return new LinuxTargetInfo<ARMleTargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00008960 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008961 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00008962 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008963 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00008964 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008965 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00008966 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008967 return new BitrigTargetInfo<ARMleTargetInfo>(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00008968 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008969 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00008970 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008971 return new NaClTargetInfo<ARMleTargetInfo>(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008972 case llvm::Triple::Win32:
8973 switch (Triple.getEnvironment()) {
Yaron Keren321249c2015-07-15 13:32:23 +00008974 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008975 return new CygwinARMTargetInfo(Triple, Opts);
Yaron Keren321249c2015-07-15 13:32:23 +00008976 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008977 return new MinGWARMTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008978 case llvm::Triple::Itanium:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008979 return new ItaniumWindowsARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008980 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00008981 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008982 return new MicrosoftARMleTargetInfo(Triple, Opts);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00008983 }
Daniel Dunbar52322032009-08-18 05:47:58 +00008984 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008985 return new ARMleTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008986 }
8987
8988 case llvm::Triple::armeb:
8989 case llvm::Triple::thumbeb:
8990 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008991 return new DarwinARMTargetInfo(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008992
8993 switch (os) {
8994 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008995 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008996 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008997 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008998 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00008999 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009000 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009001 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009002 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009003 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009004 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009005 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009006 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009007 return new NaClTargetInfo<ARMbeTargetInfo>(Triple, Opts);
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00009008 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009009 return new ARMbeTargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009010 }
Eli Friedmanb5366062008-05-20 14:21:01 +00009011
Dylan McKay924fa3a2017-01-05 05:20:27 +00009012 case llvm::Triple::avr:
9013 return new AVRTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009014 case llvm::Triple::bpfeb:
9015 case llvm::Triple::bpfel:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009016 return new BPFTargetInfo(Triple, Opts);
Alexei Starovoitovf657ca82015-06-10 22:59:13 +00009017
Daniel Dunbar52322032009-08-18 05:47:58 +00009018 case llvm::Triple::msp430:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009019 return new MSP430TargetInfo(Triple, Opts);
Eli Friedmanb5366062008-05-20 14:21:01 +00009020
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009021 case llvm::Triple::mips:
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009022 switch (os) {
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009023 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009024 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009025 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009026 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009027 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009028 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009029 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009030 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009031 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009032 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenbergerd60cccf2011-07-05 18:05:54 +00009033 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009034
9035 case llvm::Triple::mipsel:
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009036 switch (os) {
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009037 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009038 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009039 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009040 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009041 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009042 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009043 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009044 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Petar Jovanovicc19a2842013-09-21 01:27:01 +00009045 case llvm::Triple::NaCl:
Daniel Sanders4672af62016-05-27 11:51:02 +00009046 return new NaClTargetInfo<NaClMips32TargetInfo>(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009047 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009048 return new MipsTargetInfo(Triple, Opts);
Joerg Sonnenberger8360e522011-07-05 18:24:04 +00009049 }
Edward O'Callaghane9a58b12009-11-15 10:22:07 +00009050
Akira Hatanakabef17452011-09-20 19:21:49 +00009051 case llvm::Triple::mips64:
9052 switch (os) {
9053 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009054 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009055 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009056 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009057 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009058 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009059 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009060 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009061 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009062 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009063 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009064 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009065 }
9066
9067 case llvm::Triple::mips64el:
9068 switch (os) {
9069 case llvm::Triple::Linux:
Daniel Sanders4672af62016-05-27 11:51:02 +00009070 return new LinuxTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009071 case llvm::Triple::RTEMS:
Daniel Sanders4672af62016-05-27 11:51:02 +00009072 return new RTEMSTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009073 case llvm::Triple::FreeBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009074 return new FreeBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009075 case llvm::Triple::NetBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009076 return new NetBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009077 case llvm::Triple::OpenBSD:
Daniel Sanders4672af62016-05-27 11:51:02 +00009078 return new OpenBSDTargetInfo<MipsTargetInfo>(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009079 default:
Daniel Sanders4672af62016-05-27 11:51:02 +00009080 return new MipsTargetInfo(Triple, Opts);
Akira Hatanakabef17452011-09-20 19:21:49 +00009081 }
9082
Ivan Krasindd7403e2011-08-24 20:22:22 +00009083 case llvm::Triple::le32:
9084 switch (os) {
Douglas Katzman78d7c542015-05-12 21:18:10 +00009085 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009086 return new NaClTargetInfo<PNaClTargetInfo>(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009087 default:
9088 return nullptr;
Ivan Krasindd7403e2011-08-24 20:22:22 +00009089 }
9090
JF Bastien643817d2014-09-12 17:52:47 +00009091 case llvm::Triple::le64:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009092 return new Le64TargetInfo(Triple, Opts);
JF Bastien643817d2014-09-12 17:52:47 +00009093
Daniel Dunbar52322032009-08-18 05:47:58 +00009094 case llvm::Triple::ppc:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009095 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009096 return new DarwinPPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009097 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009098 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009099 return new LinuxTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009100 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009101 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009102 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009103 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009104 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009105 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009106 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009107 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009108 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009109 return new PPC32TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009110 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009111
9112 case llvm::Triple::ppc64:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009113 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009114 return new DarwinPPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009115 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009116 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009117 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009118 case llvm::Triple::Lv2:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009119 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009120 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009121 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009122 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009123 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009124 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009125 return new PPC64TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009126 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009127
Bill Schmidt778d3872013-07-26 01:36:11 +00009128 case llvm::Triple::ppc64le:
9129 switch (os) {
9130 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009131 return new LinuxTargetInfo<PPC64TargetInfo>(Triple, Opts);
Joerg Sonnenberger22a2d992015-04-10 20:53:48 +00009132 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009133 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009134 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009135 return new PPC64TargetInfo(Triple, Opts);
Bill Schmidt778d3872013-07-26 01:36:11 +00009136 }
9137
Peter Collingbournec947aae2012-05-20 23:28:41 +00009138 case llvm::Triple::nvptx:
Justin Lebarb6626592017-01-05 16:53:21 +00009139 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/32);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009140 case llvm::Triple::nvptx64:
Justin Lebarb6626592017-01-05 16:53:21 +00009141 return new NVPTXTargetInfo(Triple, Opts, /*TargetPointerWidth=*/64);
Peter Collingbournec947aae2012-05-20 23:28:41 +00009142
Tom Stellardd8e38a32015-01-06 20:34:47 +00009143 case llvm::Triple::amdgcn:
Eli Friedmand13b41e2012-10-12 23:32:00 +00009144 case llvm::Triple::r600:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009145 return new AMDGPUTargetInfo(Triple, Opts);
Eli Friedmand13b41e2012-10-12 23:32:00 +00009146
Daniel Dunbar52322032009-08-18 05:47:58 +00009147 case llvm::Triple::sparc:
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009148 switch (os) {
Anton Korobeynikov804dd052011-10-12 09:30:58 +00009149 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009150 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009151 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009152 return new SolarisTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009153 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009154 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Hans Wennborg0bb84622012-08-02 13:45:48 +00009155 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009156 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009157 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009158 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009159 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009160 return new SparcV8TargetInfo(Triple, Opts);
Joerg Sonnenberger025949c2011-07-04 21:59:44 +00009161 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009162
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009163 // The 'sparcel' architecture copies all the above cases except for Solaris.
9164 case llvm::Triple::sparcel:
9165 switch (os) {
9166 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009167 return new LinuxTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009168 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009169 return new NetBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009170 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009171 return new OpenBSDTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009172 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009173 return new RTEMSTargetInfo<SparcV8elTargetInfo>(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009174 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009175 return new SparcV8elTargetInfo(Triple, Opts);
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00009176 }
9177
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009178 case llvm::Triple::sparcv9:
9179 switch (os) {
9180 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009181 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009182 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009183 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009184 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009185 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009186 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009187 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009188 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009189 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009190 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009191 return new SparcV9TargetInfo(Triple, Opts);
Jakob Stoklund Olesen4dda1522013-04-16 15:17:49 +00009192 }
9193
Ulrich Weigand47445072013-05-06 16:26:41 +00009194 case llvm::Triple::systemz:
9195 switch (os) {
9196 case llvm::Triple::Linux:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009197 return new LinuxTargetInfo<SystemZTargetInfo>(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009198 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009199 return new SystemZTargetInfo(Triple, Opts);
Ulrich Weigand47445072013-05-06 16:26:41 +00009200 }
9201
Eli Friedmana9c3d712009-08-19 20:47:07 +00009202 case llvm::Triple::tce:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009203 return new TCETargetInfo(Triple, Opts);
Eli Friedmana9c3d712009-08-19 20:47:07 +00009204
Pekka Jaaskelainen67354482016-11-16 15:22:31 +00009205 case llvm::Triple::tcele:
9206 return new TCELETargetInfo(Triple, Opts);
9207
Daniel Dunbar52322032009-08-18 05:47:58 +00009208 case llvm::Triple::x86:
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009209 if (Triple.isOSDarwin())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009210 return new DarwinI386TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009211
Daniel Dunbar52322032009-08-18 05:47:58 +00009212 switch (os) {
Ed Schouten7893e682015-06-13 21:33:49 +00009213 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009214 return new CloudABITargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009215 case llvm::Triple::Linux: {
9216 switch (Triple.getEnvironment()) {
9217 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009218 return new LinuxTargetInfo<X86_32TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009219 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009220 return new AndroidX86_32TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009221 }
9222 }
Daniel Dunbar52322032009-08-18 05:47:58 +00009223 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009224 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009225 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009226 return new NetBSDI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009227 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009228 return new OpenBSDI386TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009229 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009230 return new BitrigI386TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009231 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009232 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009233 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009234 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple, Opts);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009235 case llvm::Triple::Minix:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009236 return new MinixTargetInfo<X86_32TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009237 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009238 return new SolarisTargetInfo<X86_32TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009239 case llvm::Triple::Win32: {
9240 switch (Triple.getEnvironment()) {
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009241 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009242 return new CygwinX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009243 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009244 return new MinGWX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool24bd7da2014-06-28 23:34:11 +00009245 case llvm::Triple::Itanium:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009246 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009247 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009248 return new MicrosoftX86_32TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009249 }
9250 }
Chris Lattnerb986aba2010-04-11 19:29:39 +00009251 case llvm::Triple::Haiku:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009252 return new HaikuX86_32TargetInfo(Triple, Opts);
Douglas Gregor9fabd852011-07-01 22:41:14 +00009253 case llvm::Triple::RTEMS:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009254 return new RTEMSX86_32TargetInfo(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009255 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009256 return new NaClTargetInfo<X86_32TargetInfo>(Triple, Opts);
Alexey Bataevc99b0492015-11-25 09:24:26 +00009257 case llvm::Triple::ELFIAMCU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009258 return new MCUX86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009259 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009260 return new X86_32TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009261 }
9262
9263 case llvm::Triple::x86_64:
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009264 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009265 return new DarwinX86_64TargetInfo(Triple, Opts);
Daniel Dunbar14ad22f2011-04-19 21:43:27 +00009266
Daniel Dunbar52322032009-08-18 05:47:58 +00009267 switch (os) {
Ed Schoutenf33c6072015-03-11 08:42:46 +00009268 case llvm::Triple::CloudABI:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009269 return new CloudABITargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009270 case llvm::Triple::Linux: {
9271 switch (Triple.getEnvironment()) {
9272 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009273 return new LinuxTargetInfo<X86_64TargetInfo>(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009274 case llvm::Triple::Android:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009275 return new AndroidX86_64TargetInfo(Triple, Opts);
Tamas Berghammer6373cee2015-03-25 10:38:50 +00009276 }
9277 }
Chris Lattner002ba6b2010-01-09 05:41:14 +00009278 case llvm::Triple::DragonFly:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009279 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009280 case llvm::Triple::NetBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009281 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009282 case llvm::Triple::OpenBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009283 return new OpenBSDX86_64TargetInfo(Triple, Opts);
Eli Friedman9fa28852012-08-08 23:57:20 +00009284 case llvm::Triple::Bitrig:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009285 return new BitrigX86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009286 case llvm::Triple::FreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009287 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Petr Hosek9834fcd2016-10-24 22:55:57 +00009288 case llvm::Triple::Fuchsia:
9289 return new FuchsiaTargetInfo<X86_64TargetInfo>(Triple, Opts);
Sylvestre Ledru4afe74a2013-09-05 13:47:07 +00009290 case llvm::Triple::KFreeBSD:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009291 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009292 case llvm::Triple::Solaris:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009293 return new SolarisTargetInfo<X86_64TargetInfo>(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009294 case llvm::Triple::Win32: {
9295 switch (Triple.getEnvironment()) {
Yaron Kerend030d112015-07-22 17:38:19 +00009296 case llvm::Triple::Cygnus:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009297 return new CygwinX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009298 case llvm::Triple::GNU:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009299 return new MinGWX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009300 case llvm::Triple::MSVC:
Saleem Abdulrasool94f49512015-07-17 21:26:41 +00009301 default: // Assume MSVC for unknown environments
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009302 return new MicrosoftX86_64TargetInfo(Triple, Opts);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00009303 }
9304 }
Reid Kleckner330fb172016-05-11 16:19:05 +00009305 case llvm::Triple::Haiku:
9306 return new HaikuTargetInfo<X86_64TargetInfo>(Triple, Opts);
Eli Benderskyd7c92032012-12-04 18:38:10 +00009307 case llvm::Triple::NaCl:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009308 return new NaClTargetInfo<X86_64TargetInfo>(Triple, Opts);
Alex Rosenberg12207fa2015-01-27 14:47:44 +00009309 case llvm::Triple::PS4:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009310 return new PS4OSTargetInfo<X86_64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009311 default:
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009312 return new X86_64TargetInfo(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009313 }
Guy Benyeib798fc92012-12-11 21:38:14 +00009314
Douglas Katzman78d7c542015-05-12 21:18:10 +00009315 case llvm::Triple::spir: {
9316 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9317 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9318 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009319 return new SPIR32TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009320 }
9321 case llvm::Triple::spir64: {
9322 if (Triple.getOS() != llvm::Triple::UnknownOS ||
9323 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
9324 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009325 return new SPIR64TargetInfo(Triple, Opts);
Douglas Katzman78d7c542015-05-12 21:18:10 +00009326 }
Dan Gohmanc2853072015-09-03 22:51:53 +00009327 case llvm::Triple::wasm32:
Dan Gohman839f2152017-01-17 21:46:38 +00009328 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9329 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9330 Triple.getOS() != llvm::Triple::UnknownOS ||
9331 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9332 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009333 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009334 return new WebAssemblyOSTargetInfo<WebAssembly32TargetInfo>(Triple, Opts);
Dan Gohmanc2853072015-09-03 22:51:53 +00009335 case llvm::Triple::wasm64:
Dan Gohman839f2152017-01-17 21:46:38 +00009336 if (Triple.getSubArch() != llvm::Triple::NoSubArch ||
9337 Triple.getVendor() != llvm::Triple::UnknownVendor ||
9338 Triple.getOS() != llvm::Triple::UnknownOS ||
9339 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment ||
9340 !(Triple.isOSBinFormatELF() || Triple.isOSBinFormatWasm()))
Dan Gohmanc2853072015-09-03 22:51:53 +00009341 return nullptr;
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009342 return new WebAssemblyOSTargetInfo<WebAssembly64TargetInfo>(Triple, Opts);
Pirama Arumuga Nainar54a213d2016-07-02 00:05:42 +00009343
9344 case llvm::Triple::renderscript32:
9345 return new LinuxTargetInfo<RenderScript32TargetInfo>(Triple, Opts);
9346 case llvm::Triple::renderscript64:
9347 return new LinuxTargetInfo<RenderScript64TargetInfo>(Triple, Opts);
Daniel Dunbar52322032009-08-18 05:47:58 +00009348 }
Chris Lattner5ba61f02006-10-14 07:39:34 +00009349}
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009350
9351/// CreateTargetInfo - Return the target info object for the specified target
Eric Christophere4f73b32015-08-07 19:07:08 +00009352/// options.
Alp Toker80758082014-07-06 05:26:44 +00009353TargetInfo *
9354TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
Saleem Abdulrasool10a49722016-04-08 16:52:00 +00009355 const std::shared_ptr<TargetOptions> &Opts) {
Douglas Gregorf8715de2012-11-16 04:24:59 +00009356 llvm::Triple Triple(Opts->Triple);
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009357
9358 // Construct the target
Saleem Abdulrasoole86dd022016-04-09 19:09:25 +00009359 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple, *Opts));
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009360 if (!Target) {
9361 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
Craig Topperf1186c52014-05-08 06:41:40 +00009362 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009363 }
Alp Toker80758082014-07-06 05:26:44 +00009364 Target->TargetOpts = Opts;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009365
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009366 // Set the target CPU if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009367 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
9368 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
Craig Topperf1186c52014-05-08 06:41:40 +00009369 return nullptr;
Daniel Dunbaracde99e2009-12-18 18:42:37 +00009370 }
9371
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009372 // Set the target ABI if specified.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009373 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
9374 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
Craig Topperf1186c52014-05-08 06:41:40 +00009375 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009376 }
9377
Rafael Espindolaeb265472013-08-21 21:59:03 +00009378 // Set the fp math unit.
9379 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
9380 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
Craig Topperf1186c52014-05-08 06:41:40 +00009381 return nullptr;
Rafael Espindolaeb265472013-08-21 21:59:03 +00009382 }
9383
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009384 // Compute the default target features, we need the target to handle this
9385 // because features may have dependencies on one another.
9386 llvm::StringMap<bool> Features;
Eric Christopher007b0a02015-08-28 22:32:01 +00009387 if (!Target->initFeatureMap(Features, Diags, Opts->CPU,
9388 Opts->FeaturesAsWritten))
Eric Christopher6b454372015-08-25 13:45:24 +00009389 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009390
9391 // Add the features to the compile options.
Douglas Gregorf8715de2012-11-16 04:24:59 +00009392 Opts->Features.clear();
Aaron Ballmanb226d3d2015-08-12 13:38:59 +00009393 for (const auto &F : Features)
9394 Opts->Features.push_back((F.getValue() ? "+" : "-") + F.getKey().str());
9395
Eric Christopher3ff21b32013-10-16 21:26:26 +00009396 if (!Target->handleTargetFeatures(Opts->Features, Diags))
Craig Topperf1186c52014-05-08 06:41:40 +00009397 return nullptr;
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009398
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009399 Target->setSupportedOpenCLOpts();
Alexey Bader0ea07532016-11-01 15:50:52 +00009400 Target->setOpenCLExtensionOpts();
Yaxun Liu39cf40f2016-05-16 17:06:34 +00009401
Daniel Sanders32b2d6b2016-06-14 08:58:50 +00009402 if (!Target->validateTarget(Diags))
9403 return nullptr;
9404
Ahmed Charles9a16beb2014-03-07 19:33:25 +00009405 return Target.release();
Daniel Dunbarb9bbd542009-11-15 06:48:46 +00009406}